- /* try to open mountpoint */
- if (statvfs(mountpoint, &fs) < 0) {
- fprintf(stderr, "Could not get filesystem info.\n");
- return smprintf("n/a");
- }
-
- /* return used */
- return smprintf("%f", (float)fs.f_bsize * ((float)fs.f_blocks - (float)fs.f_bfree) / 1024 / 1024 / 1024);
-}
-
-/* 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);
-}
-
-/* gid */
-char *
-gid(const char *null)
-{
- gid_t gid;
-
- if ((gid = getgid()) < 0) {
- fprintf(stderr, "Could no get gid.");
- return smprintf("n/a");
- } else {
- return smprintf("%d", gid);
- }
-
- return smprintf("n/a");
-}
-
-/* hostname */
-char *
-hostname(const char *null)
-{
- char hostname[HOST_NAME_MAX];
- FILE *fp;
-
- /* open hostname file */
- if (!(fp = fopen("/proc/sys/kernel/hostname", "r"))) {
- fprintf(stderr, "Could not open hostname file.\n");
- return smprintf("n/a");
- }
-
- /* extract hostname */
- fscanf(fp, "%s\n", hostname);
-
- /* close hostname file */
- fclose(fp);
-
- /* return entropy */
- return smprintf("%s", hostname);
-}
-
-/* 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 free */
-char *
-ram_free(const char *null)
-{
- long free;
- 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, "MemFree: %ld kB\n", &free);
-
- /* close meminfo file */
- fclose(fp);
-
- /* return free ram as string */
- return smprintf("%f", (float)free / 1024 / 1024);
-}
-
-/* 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);
-}
-
-/* ram total */
-char *
-ram_total(const char *null)
-{
- long total;
- 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);
-
- /* close meminfo file */
- fclose(fp);
-
- /* return total ram as string */
- return smprintf("%f", (float)total / 1024 / 1024);
-}
-
-/* ram used */
-char *
-ram_used(const char *null)
-{
- long free, total, buffers, cached, used;
- 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 used */
- used = total - free - buffers - cached;
-
- /* return used ram as string */
- return smprintf("%f", (float)used / 1024 / 1024);
-}
-
-/* custom shell command */
-char *
-run_command(const char* command)
-{
- int good;
- FILE *fp;
- char buffer[64];
-
- /* try to open the command output */
- if (!(fp = popen(command, "r"))) {
- fprintf(stderr, "Could not get command output for: %s.\n", command);
- return smprintf("n/a");
- }
-
- /* get command output text, save it to buffer */
- fgets(buffer, sizeof(buffer)-1, fp);
-
- /* close it again */
- pclose(fp);
-
- /* add nullchar at the end */
- for (int i = 0 ; i != sizeof(buffer) ; i++) {
- if (buffer[i] == '\0') {
- good = 1;
- break;
- }
- }
- if (good) {
- buffer[strlen(buffer) - 1] = '\0';
- }
-
- /* return the output */
- return smprintf("%s", buffer);
-}
-
-/* temperature */
-char *
-temp(const char *file)
-{
- int temperature;
- FILE *fp;
-
- /* open temperature file */
- if (!(fp = fopen(file, "r"))) {
- fprintf(stderr, "Could not open temperature file.\n");
- return smprintf("n/a");
- }
-
- /* extract temperature */
- fscanf(fp, "%d", &temperature);
-
- /* close temperature file */
- fclose(fp);
-
- /* return temperature in degrees */
- return smprintf("%d°C", temperature / 1000);
-}
-
-/* username */
-char *
-username(const char *null)
-{
- register struct passwd *pw;
- register uid_t uid;
-
- /* get the values */
- uid = geteuid ();
- pw = getpwuid (uid);
-
- /* if it worked, return */
- if (pw) {
- return smprintf("%s", pw->pw_name);
- }
- else {
- fprintf(stderr, "Could not get username.\n");
- return smprintf("n/a");
- }
-
- return smprintf("n/a");
-}
-
-/* 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("n/a");
- }
-
- return smprintf("n/a");
-}