+static char *
+uid(void)
+{
+ return smprintf("%d", geteuid());
+}
+
+
+static char *
+vol_perc(const char *card)
+{
+ long int vol, max, min;
+ snd_mixer_t *handle;
+ snd_mixer_elem_t *elem;
+ snd_mixer_selem_id_t *s_elem;
+
+ snd_mixer_open(&handle, 0);
+ snd_mixer_attach(handle, card);
+ snd_mixer_selem_register(handle, NULL, NULL);
+ snd_mixer_load(handle);
+ snd_mixer_selem_id_malloc(&s_elem);
+ snd_mixer_selem_id_set_name(s_elem, "Master");
+ elem = snd_mixer_find_selem(handle, s_elem);
+
+ if (elem == NULL) {
+ snd_mixer_selem_id_free(s_elem);
+ snd_mixer_close(handle);
+ warn("Failed to get volume percentage for %s", card);
+ return smprintf(UNKNOWN_STR);
+ }
+
+ snd_mixer_handle_events(handle);
+ snd_mixer_selem_get_playback_volume_range(elem, &min, &max);
+ snd_mixer_selem_get_playback_volume(elem, 0, &vol);
+
+ snd_mixer_selem_id_free(s_elem);
+ snd_mixer_close(handle);
+
+ return smprintf("%d%%", ((uint_fast16_t)(vol * 100) / max));
+}
+
+static char *
+wifi_perc(const char *iface)
+{
+ int perc;
+ char buf[255];
+ char *datastart;
+ char status[5];
+ FILE *fp;
+
+ ccat(3, "/sys/class/net/", iface, "/operstate");
+ fp = fopen(concat, "r");
+ if (fp == NULL) {
+ warn("Failed to open file %s", concat);
+ return smprintf(UNKNOWN_STR);
+ }
+ fgets(status, 5, fp);
+ fclose(fp);
+ if(strcmp(status, "up\n") != 0) {
+ return smprintf(UNKNOWN_STR);
+ }
+
+ fp = fopen("/proc/net/wireless", "r");
+ if (fp == NULL) {
+ warn("Failed to open file /proc/net/wireless");
+ return smprintf(UNKNOWN_STR);
+ }
+ ccat(2, iface, ":");
+ fgets(buf, sizeof(buf), fp);
+ fgets(buf, sizeof(buf), fp);
+ fgets(buf, sizeof(buf), fp);
+ fclose(fp);
+
+ datastart = strstr(buf, concat);
+ if (datastart != NULL) {
+ datastart = strstr(buf, ":");
+ sscanf(datastart + 1, " %*d %d %*d %*d %*d %*d %*d %*d %*d %*d", &perc);
+ }
+
+ return smprintf("%d%%", perc);
+}
+
+static char *
+wifi_essid(const char *iface)
+{
+ char id[IW_ESSID_MAX_SIZE+1];
+ int sockfd = socket(AF_INET, SOCK_DGRAM, 0);
+ struct iwreq wreq;
+
+ memset(&wreq, 0, sizeof(struct iwreq));
+ wreq.u.essid.length = IW_ESSID_MAX_SIZE+1;
+ sprintf(wreq.ifr_name, iface);
+ if (sockfd == -1) {
+ warn("Failed to get ESSID for interface %s", iface);
+ return smprintf(UNKNOWN_STR);
+ }
+ wreq.u.essid.pointer = id;
+ if (ioctl(sockfd,SIOCGIWESSID, &wreq) == -1) {
+ warn("Failed to get ESSID for interface %s", iface);
+ return smprintf(UNKNOWN_STR);
+ }
+
+ close(sockfd);
+
+ if (strcmp((char *)wreq.u.essid.pointer, "") == 0)
+ return smprintf(UNKNOWN_STR);
+ else
+ return smprintf("%s", (char *)wreq.u.essid.pointer);
+}
+
+static void
+set_status(const char *str)
+{
+ XStoreName(dpy, DefaultRootWindow(dpy), str);
+ XSync(dpy, False);
+}