- /* open stat file */
- if (!(fp = fopen("/proc/stat","r"))) {
- fprintf(stderr, "Error opening stat file.");
- return smprintf("n/a");
- }
-
- /* read values */
- fscanf(fp, "%*s %Lf %Lf %Lf %Lf", &a[0], &a[1], &a[2], &a[3]);
-
- /* close stat file */
- fclose(fp);
-
- /* wait a second (for avg values) */
- sleep(1);
-
- /* open stat file */
- if (!(fp = fopen("/proc/stat","r"))) {
- fprintf(stderr, "Error opening stat file.");
- return smprintf("n/a");
- }
-
- /* read values */
- fscanf(fp, "%*s %Lf %Lf %Lf %Lf", &b[0], &b[1], &b[2], &b[3]);
-
- /* close stat file */
- fclose(fp);
-
- /* calculate avg in this second */
- perc = 100 * ((b[0]+b[1]+b[2]) - (a[0]+a[1]+a[2])) / ((b[0]+b[1]+b[2]+b[3]) - (a[0]+a[1]+a[2]+a[3]));
-
- /* return perc as string */
- return smprintf("%d%%", perc);
-}
-
-/* date and time */
-char *
-datetime(const char *timeformat)
-{
- time_t tm;
- size_t bufsize = 64;
- char *buf = malloc(bufsize);
-
- /* get time in format */
- time(&tm);
- setlocale(LC_TIME, "");
- if(!strftime(buf, bufsize, timeformat, localtime(&tm))) {
- setlocale(LC_TIME, "C");
- fprintf(stderr, "Strftime failed.\n");
- return smprintf("n/a");
- }
-
- setlocale(LC_TIME, "C");
- /* return time */
- char *ret = smprintf("%s", buf);
- free(buf);
- return ret;
-}
-
-/* disk usage percentage */
-char *
-disk_perc(const char *mountpoint)
-{
- int perc = 0;
- struct statvfs fs;
-
- /* try to open mountpoint */
- if (statvfs(mountpoint, &fs) < 0) {
- fprintf(stderr, "Could not get filesystem info.\n");
- return smprintf("n/a");
- }
-
- /* calculate percent */
- perc = 100 * (1.0f - ((float)fs.f_bavail / (float)fs.f_blocks));
-
- /* return perc */
- return smprintf("%d%%", perc);
-}
-
-/* entropy available */
-char *
-entropy(const char *null)
-{
- int entropy = 0;
- FILE *fp;
-
- /* open entropy file */
- if (!(fp = fopen("/proc/sys/kernel/random/entropy_avail", "r"))) {
- fprintf(stderr, "Could not open entropy file.\n");
- return smprintf("n/a");
- }
-
- /* extract entropy */
- fscanf(fp, "%d", &entropy);
-
- /* close entropy file */
- fclose(fp);
-
- /* return entropy */
- return smprintf("%d", entropy);
-}
-
-/* ip address */
-char *
-ip(const char *interface)
-{
- struct ifaddrs *ifaddr, *ifa;
- int s;
- char host[NI_MAXHOST];
-
- /* check if getting ip address works */
- if (getifaddrs(&ifaddr) == -1)
- {
- fprintf(stderr, "Error getting IP address.");
- return smprintf("n/a");
- }
-
- /* get the ip address */
- for (ifa = ifaddr; ifa != NULL; ifa = ifa->ifa_next)
- {
- if (ifa->ifa_addr == NULL)
- continue;
-
- s = getnameinfo(ifa->ifa_addr, sizeof(struct sockaddr_in), host, NI_MAXHOST, NULL, 0, NI_NUMERICHOST);
-
- if ((strcmp(ifa->ifa_name, interface) == 0) && (ifa->ifa_addr->sa_family == AF_INET))
- {
- if (s != 0)
- {
- fprintf(stderr, "Error getting IP address.");
- return smprintf("n/a");
- }
- return smprintf("%s", host);
- }
- }
-
- /* free the address */
- freeifaddrs(ifaddr);
-
- /* return n/a if nothing works */
- return smprintf("n/a");
-}
-
-/* ram percentage */
-char *
-ram_perc(const char *null)
-{
- int perc;
- long total, free, buffers, cached;
- FILE *fp;
-
- /* open meminfo file */
- if (!(fp = fopen("/proc/meminfo", "r"))) {
- fprintf(stderr, "Error opening meminfo file.");
- return smprintf("n/a");
- }
-
- /* 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 */
- perc = 100 * ((total - free) - (buffers + cached)) / total;
-
- /* return perc as string */
- return smprintf("%d%%", perc);
-}