- time_t tm;
- size_t bufsize = 19;
- char *buf = malloc(bufsize);
-
- /* get time in format */
- time(&tm);
- if(!strftime(buf, bufsize, timeformat, localtime(&tm))) {
- fprintf(stderr, "Strftime failed.\n");
- exit(1);
- }
-
- /* return time */
- return buf;
-}
-
-/* ram percentage */
-char *
-get_ram_usage()
-{
- int ram_perc;
- long total, free, buffers, cached;
- FILE *fp;
-
- /* open meminfo file */
- if (!(fp = fopen("/proc/meminfo", "r"))) {
- fprintf(stderr, "Error opening meminfo file.");
- exit(1);
- }
-
- /* read the values */
- fscanf(fp, "MemTotal: %ld kB\n", &total);
- fscanf(fp, "MemFree: %ld kB\n", &free);
- fscanf(fp, "MemAvailable: %ld kB\nBuffers: %ld kB\n", &buffers, &buffers);
- fscanf(fp, "Cached: %ld kB\n", &cached);
-
- /* close meminfo file */
- fclose(fp);
-
- /* calculate percentage */
- ram_perc = 100 * ((total - free) - (buffers + cached)) / total;
-
- /* return ram_perc as string */
- return smprintf("%d%%",ram_perc);
-}
-
-/* alsa volume percentage */
-char *
-get_volume()
-{
- int mute = 0;
- long vol = 0, max = 0, min = 0;
-
- /* get volume from alsa */
- snd_mixer_t *handle;
- snd_mixer_elem_t *pcm_mixer, *mas_mixer;
- snd_mixer_selem_id_t *vol_info, *mute_info;
- snd_mixer_open(&handle, 0);
- snd_mixer_attach(handle, soundcard);
- snd_mixer_selem_register(handle, NULL, NULL);
- snd_mixer_load(handle);
- snd_mixer_selem_id_malloc(&vol_info);
- snd_mixer_selem_id_malloc(&mute_info);
- 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);
- 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);
- 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 *
-get_wifi_signal()
-{
- int bufsize = 255;
- int strength;
- char buf[bufsize];
- char *datastart;
- char path_start[16] = "/sys/class/net/";
- char path_end[11] = "/operstate";
- char path[32];
- char status[5];
- char needle[sizeof wificard + 1];
- FILE *fp;
-
- /* generate the path name */
-
- memset(path, 0, sizeof path);
- strcat(path, path_start);
- strcat(path, wificard);
- strcat(path, path_end);
-
- /* open wifi file */
- if(!(fp = fopen(path, "r"))) {
- fprintf(stderr, "Error opening wifi operstate file.");
- exit(1);
- }
-
- /* read the status */
- fgets(status, 5, fp);
-
- /* close wifi file */
- fclose(fp);
-
- /* check if interface down */
- if(strcmp(status, "up\n") != 0){
- return "n/a";
- }
-
- /* open wifi file */
- if (!(fp = fopen("/proc/net/wireless", "r"))) {
- fprintf(stderr, "Error opening wireless file.");
- exit(1);
- }
-
- /* 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);
-}
-
-/* main function */
+ long free, total, buffers, cached;
+ FILE *fp;
+
+ fp = fopen("/proc/meminfo", "r");
+ if (fp == NULL) {
+ warn("Failed to open file /proc/meminfo");
+ return UNKNOWN_STR;
+ }
+ fscanf(fp, "MemTotal: %ld kB\n", &total);
+ fscanf(fp, "MemFree: %ld kB\n", &free);
+ fscanf(fp, "MemAvailable: %ld kB\nBuffers: %ld kB\n", &buffers, &buffers);
+ fscanf(fp, "Cached: %ld kB\n", &cached);
+ fclose(fp);
+
+ return bprintf("%f", (float)(total - free - buffers - cached) / 1024 / 1024);
+}
+
+static const char *
+run_command(const char *cmd)
+{
+ char *nlptr;
+ FILE *fp;
+
+ fp = popen(cmd, "r");
+ if (fp == NULL) {
+ warn("Failed to get command output for %s", cmd);
+ return UNKNOWN_STR;
+ }
+ fgets(buf, sizeof(buf) - 1, fp);
+ pclose(fp);
+ if ((nlptr = strrchr(buf, '\n')) != NULL)
+ nlptr[0] = '\0';
+
+ return buf[0] ? buf : UNKNOWN_STR;
+}
+
+static const char *
+swap_free(void)
+{
+ long total, free;
+ FILE *fp;
+ size_t bytes_read;
+ char *match;
+
+ fp = fopen("/proc/meminfo", "r");
+ if (fp == NULL) {
+ warn("Failed to open file /proc/meminfo");
+ return UNKNOWN_STR;
+ }
+
+ if ((bytes_read = fread(buf, sizeof(char), sizeof(buf) - 1, fp)) == 0) {
+ warn("swap_free: read error");
+ fclose(fp);
+ return UNKNOWN_STR;
+ }
+ fclose(fp);
+
+ if ((match = strstr(buf, "SwapTotal")) == NULL)
+ return UNKNOWN_STR;
+ sscanf(match, "SwapTotal: %ld kB\n", &total);
+
+ if ((match = strstr(buf, "SwapFree")) == NULL)
+ return UNKNOWN_STR;
+ sscanf(match, "SwapFree: %ld kB\n", &free);
+
+ return bprintf("%f", (float)free / 1024 / 1024);
+}
+
+static const char *
+swap_perc(void)
+{
+ long total, free, cached;
+ FILE *fp;
+ size_t bytes_read;
+ char *match;
+
+ fp = fopen("/proc/meminfo", "r");
+ if (fp == NULL) {
+ warn("Failed to open file /proc/meminfo");
+ return UNKNOWN_STR;
+ }
+
+ if ((bytes_read = fread(buf, sizeof(char), sizeof(buf) - 1, fp)) == 0) {
+ warn("swap_perc: read error");
+ fclose(fp);
+ return UNKNOWN_STR;
+ }
+ fclose(fp);
+
+ if ((match = strstr(buf, "SwapTotal")) == NULL)
+ return UNKNOWN_STR;
+ sscanf(match, "SwapTotal: %ld kB\n", &total);
+
+ if ((match = strstr(buf, "SwapCached")) == NULL)
+ return UNKNOWN_STR;
+ sscanf(match, "SwapCached: %ld kB\n", &cached);
+
+ if ((match = strstr(buf, "SwapFree")) == NULL)
+ return UNKNOWN_STR;
+ sscanf(match, "SwapFree: %ld kB\n", &free);
+
+ return bprintf("%d", 100 * (total - free - cached) / total);
+}
+
+static const char *
+swap_total(void)
+{
+ long total;
+ FILE *fp;
+ size_t bytes_read;
+ char *match;
+
+ fp = fopen("/proc/meminfo", "r");
+ if (fp == NULL) {
+ warn("Failed to open file /proc/meminfo");
+ return UNKNOWN_STR;
+ }
+ if ((bytes_read = fread(buf, sizeof(char), sizeof(buf) - 1, fp)) == 0) {
+ warn("swap_total: read error");
+ fclose(fp);
+ return UNKNOWN_STR;
+ }
+ fclose(fp);
+
+ if ((match = strstr(buf, "SwapTotal")) == NULL)
+ return UNKNOWN_STR;
+ sscanf(match, "SwapTotal: %ld kB\n", &total);
+
+ return bprintf("%f", (float)total / 1024 / 1024);
+}
+
+static const char *
+swap_used(void)
+{
+ long total, free, cached;
+ FILE *fp;
+ size_t bytes_read;
+ char *match;
+
+ fp = fopen("/proc/meminfo", "r");
+ if (fp == NULL) {
+ warn("Failed to open file /proc/meminfo");
+ return UNKNOWN_STR;
+ }
+ if ((bytes_read = fread(buf, sizeof(char), sizeof(buf) - 1, fp)) == 0) {
+ warn("swap_used: read error");
+ fclose(fp);
+ return UNKNOWN_STR;
+ }
+ fclose(fp);
+
+ if ((match = strstr(buf, "SwapTotal")) == NULL)
+ return UNKNOWN_STR;
+ sscanf(match, "SwapTotal: %ld kB\n", &total);
+
+ if ((match = strstr(buf, "SwapCached")) == NULL)
+ return UNKNOWN_STR;
+ sscanf(match, "SwapCached: %ld kB\n", &cached);
+
+ if ((match = strstr(buf, "SwapFree")) == NULL)
+ return UNKNOWN_STR;
+ sscanf(match, "SwapFree: %ld kB\n", &free);
+
+ return bprintf("%f", (float)(total - free - cached) / 1024 / 1024);
+}
+
+static const char *
+temp(const char *file)
+{
+ int temp;
+ FILE *fp;
+
+ fp = fopen(file, "r");
+ if (fp == NULL) {
+ warn("Failed to open file %s", file);
+ return UNKNOWN_STR;
+ }
+ fscanf(fp, "%d", &temp);
+ fclose(fp);
+
+ return bprintf("%d", temp / 1000);
+}
+
+static const char *
+uptime(void)
+{
+ struct sysinfo info;
+ int h = 0;
+ int m = 0;
+
+ sysinfo(&info);
+ h = info.uptime / 3600;
+ m = (info.uptime - h * 3600 ) / 60;
+
+ return bprintf("%dh %dm", h, m);
+}
+
+static const char *
+username(void)
+{
+ struct passwd *pw = getpwuid(geteuid());
+
+ if (pw == NULL) {
+ warn("Failed to get username");
+ return UNKNOWN_STR;
+ }
+
+ return bprintf("%s", pw->pw_name);
+}
+
+static const char *
+uid(void)
+{
+ return bprintf("%d", geteuid());
+}
+
+
+static const char *
+vol_perc(const char *card)
+{
+ unsigned int i;
+ int v, afd, devmask;
+ char *vnames[] = SOUND_DEVICE_NAMES;
+
+ afd = open(card, O_RDONLY | O_NONBLOCK);
+ if (afd == -1) {
+ warn("Cannot open %s", card);
+ return UNKNOWN_STR;
+ }
+
+ if (ioctl(afd, SOUND_MIXER_READ_DEVMASK, &devmask) == -1) {
+ warn("Cannot get volume for %s", card);
+ close(afd);
+ return UNKNOWN_STR;
+ }
+ for (i = 0; i < (sizeof(vnames) / sizeof((vnames[0]))); i++) {
+ if (devmask & (1 << i) && !strcmp("vol", vnames[i])) {
+ if (ioctl(afd, MIXER_READ(i), &v) == -1) {
+ warn("vol_perc: ioctl");
+ close(afd);
+ return UNKNOWN_STR;
+ }
+ }
+ }
+
+ close(afd);
+
+ return bprintf("%d", v & 0xff);
+}
+
+static const char *
+wifi_perc(const char *iface)
+{
+ int perc;
+ char *datastart;
+ char path[PATH_MAX];
+ char status[5];
+ FILE *fp;
+
+ snprintf(path, sizeof(path), "%s%s%s", "/sys/class/net/", iface, "/operstate");
+ fp = fopen(path, "r");
+ if (fp == NULL) {
+ warn("Failed to open file %s", path);
+ return UNKNOWN_STR;
+ }
+ fgets(status, 5, fp);
+ fclose(fp);
+ if(strcmp(status, "up\n") != 0) {
+ return UNKNOWN_STR;
+ }
+
+ fp = fopen("/proc/net/wireless", "r");
+ if (fp == NULL) {
+ warn("Failed to open file /proc/net/wireless");
+ return UNKNOWN_STR;
+ }
+
+ fgets(buf, sizeof(buf) - 1, fp);
+ fgets(buf, sizeof(buf) - 1, fp);
+ fgets(buf, sizeof(buf) - 1, fp);
+ fclose(fp);
+
+ if ((datastart = strstr(buf, iface)) == NULL)
+ return UNKNOWN_STR;
+
+ datastart = (datastart+(strlen(iface)+1));
+ sscanf(datastart + 1, " %*d %d %*d %*d %*d %*d %*d %*d %*d %*d", &perc);
+
+ return bprintf("%d", perc);
+}
+
+static const char *
+wifi_essid(const char *iface)
+{
+ static 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;
+ snprintf(wreq.ifr_name, sizeof(wreq.ifr_name), "%s", iface);
+
+ if (sockfd == -1) {
+ warn("Failed to get ESSID for interface %s", iface);
+ return UNKNOWN_STR;
+ }
+ wreq.u.essid.pointer = id;
+ if (ioctl(sockfd,SIOCGIWESSID, &wreq) == -1) {
+ warn("Failed to get ESSID for interface %s", iface);
+ return UNKNOWN_STR;
+ }
+
+ close(sockfd);
+
+ if (strcmp(id, "") == 0)
+ return UNKNOWN_STR;
+ else
+ return id;
+}
+
+static void
+sighandler(const int signo)
+{
+ if (signo == SIGTERM || signo == SIGINT) {
+ done = 1;
+ }
+}
+
+static void
+usage(const int eval)
+{
+ fprintf(stderr, "usage: %s [-d] [-o] [-n] [-v] [-h]\n", argv0);
+ exit(eval);
+}
+