+/* uid */
+char *
+uid(const char *null)
+{
+ register uid_t uid;
+
+ /* get the values */
+ uid = geteuid();
+
+ /* if it worked, return */
+ if (uid) {
+ return smprintf("%d", uid);
+ } else {
+ fprintf(stderr, "Could not get uid.\n");
+ return smprintf(unknowntext);
+ }
+
+ return smprintf(unknowntext);
+}
+
+
+/* alsa volume percentage */
+char *
+vol_perc(const char *soundcard)
+{
+ int mute = 0;
+ long vol = 0, max = 0, min = 0;
+ snd_mixer_t *handle;
+ snd_mixer_elem_t *pcm_mixer, *mas_mixer;
+ snd_mixer_selem_id_t *vol_info, *mute_info;
+
+ /* open everything */
+ snd_mixer_open(&handle, 0);
+ snd_mixer_attach(handle, soundcard);
+ snd_mixer_selem_register(handle, NULL, NULL);
+ snd_mixer_load(handle);
+
+ /* prepare everything */
+ snd_mixer_selem_id_malloc(&vol_info);
+ snd_mixer_selem_id_malloc(&mute_info);
+ /* check */
+ if (vol_info == NULL || mute_info == NULL) {
+ fprintf(stderr, "Could not get alsa volume.\n");
+ return smprintf(unknowntext);
+ }
+ snd_mixer_selem_id_set_name(vol_info, channel);
+ snd_mixer_selem_id_set_name(mute_info, channel);
+ pcm_mixer = snd_mixer_find_selem(handle, vol_info);
+ mas_mixer = snd_mixer_find_selem(handle, mute_info);
+
+ /* get the info */
+ snd_mixer_selem_get_playback_volume_range((snd_mixer_elem_t *)pcm_mixer, &min, &max);
+ snd_mixer_selem_get_playback_volume((snd_mixer_elem_t *)pcm_mixer, SND_MIXER_SCHN_MONO, &vol);
+ snd_mixer_selem_get_playback_switch(mas_mixer, SND_MIXER_SCHN_MONO, &mute);
+
+ /* clean up */
+ if (vol_info) {
+ snd_mixer_selem_id_free(vol_info);
+ }
+ if (mute_info) {
+ snd_mixer_selem_id_free(mute_info);
+ }
+ if (handle) {
+ snd_mixer_close(handle);
+ }
+
+ /* return the string (mute) */
+ if (!mute) {
+ return smprintf("mute");
+ } else {
+ return smprintf("%d%%", (vol * 100) / max);
+ }
+}
+
+/* wifi percentage */
+char *
+wifi_perc(const char *wificard)
+{
+ int bufsize = 255;
+ int strength;
+ char buf[bufsize];
+ char *datastart;
+ char path[64];
+ char status[5];
+ char needle[sizeof wificard + 1];
+ FILE *fp;
+
+ /* generate the path name */
+ memset(path, 0, sizeof path);
+ strcat(path, "/sys/class/net/");
+ strcat(path, wificard);
+ strcat(path, "/operstate");
+
+ /* open wifi file */
+ if(!(fp = fopen(path, "r"))) {
+ fprintf(stderr, "Error opening wifi operstate file.\n");
+ return smprintf(unknowntext);
+ }
+
+ /* read the status */
+ fgets(status, 5, fp);
+
+ /* close wifi file */
+ fclose(fp);
+
+ /* check if interface down */
+ if(strcmp(status, "up\n") != 0) {
+ return smprintf(unknowntext);
+ }
+
+ /* open wifi file */
+ if (!(fp = fopen("/proc/net/wireless", "r"))) {
+ fprintf(stderr, "Error opening wireless file.\n");
+ return smprintf(unknowntext);
+ }
+
+ /* extract the signal strength */
+ strcpy(needle, wificard);
+ strcat(needle, ":");
+ fgets(buf, bufsize, fp);
+ fgets(buf, bufsize, fp);
+ fgets(buf, bufsize, fp);
+ if ((datastart = strstr(buf, needle)) != NULL) {
+ datastart = strstr(buf, ":");
+ sscanf(datastart + 1, " %*d %d %*d %*d %*d %*d %*d %*d %*d %*d", &strength);
+ }
+
+ /* close wifi file */
+ fclose(fp);
+
+ /* return strength in percent */
+ return smprintf("%d%%", strength);
+}
+
+/* wifi essid */
+char *
+wifi_essid(const char *wificard)
+{
+ char id[IW_ESSID_MAX_SIZE+1];
+ int sockfd;
+ struct iwreq wreq;
+
+ /* prepare */
+ memset(&wreq, 0, sizeof(struct iwreq));
+ wreq.u.essid.length = IW_ESSID_MAX_SIZE+1;
+
+ /* set the interface */
+ sprintf(wreq.ifr_name, wificard);
+
+ /* check */
+ if((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) == -1) {
+ fprintf(stderr, "Cannot open socket for interface: %s\n", wificard);
+ return smprintf(unknowntext);
+ }
+ wreq.u.essid.pointer = id;
+ if (ioctl(sockfd,SIOCGIWESSID, &wreq) == -1) {
+ fprintf(stderr, "Get ESSID ioctl failed for interface %s\n", wificard);
+ return smprintf(unknowntext);
+ }
+
+ /* return the essid */
+ if (strcmp((char *)wreq.u.essid.pointer, "") == 0) {
+ return smprintf(unknowntext);
+ } else {
+ return smprintf("%s", (char *)wreq.u.essid.pointer);
+ }
+}
+
+/* main function */
+int
+main(void)
+{
+ char status_string[1024];
+ struct arg argument;
+
+ /* try to open display */
+ if (!(dpy = XOpenDisplay(0x0))) {
+ fprintf(stderr, "Cannot open display!\n");
+ exit(1);
+ }
+
+ /* return status every interval */
+ for (;;) {
+ /* clear the string */
+ memset(status_string, 0, sizeof(status_string));
+
+ /* generate status_string */
+ for (size_t i = 0; i < sizeof(args) / sizeof(args[0]); ++i) {
+ argument = args[i];
+ char *res = argument.func(argument.args);
+ char *element = smprintf(argument.format, res);
+ if (element == NULL) {
+ element = smprintf(unknowntext);
+ fprintf(stderr, "Failed to format output.\n");
+ }
+ strcat(status_string, element);
+ free(res);
+ free(element);
+ }
+
+ /* return the statusbar */
+ setstatus(status_string);
+
+ /* wait, "update_interval - 1" because of get_cpu_usage() which uses 1 second */
+ sleep(update_interval -1);
+ }
+
+ /* close display */
+ XCloseDisplay(dpy);
+
+ /* exit successfully */
+ return 0;