From c6a1f841a7c2e3c87e0ef03c688bd66f224da214 Mon Sep 17 00:00:00 2001 From: marschap Date: Sun, 7 May 2006 17:32:35 +0000 Subject: [PATCH] cleanup iface.c (thanks M. Dolze) --- clients/lcdproc/chrono.c | 2 +- clients/lcdproc/cpu_smp.c | 6 +- clients/lcdproc/disk.c | 2 +- clients/lcdproc/iface.c | 510 +++--------------------------- clients/lcdproc/iface.h | 11 - clients/lcdproc/load.c | 2 +- clients/lcdproc/machine_Darwin.c | 14 +- clients/lcdproc/machine_FreeBSD.c | 12 +- clients/lcdproc/machine_NetBSD.c | 12 +- clients/lcdproc/machine_OpenBSD.c | 12 +- clients/lcdproc/machine_SunOS.c | 2 +- clients/lcdproc/main.c | 22 +- clients/lcdproc/mem.c | 4 +- clients/lcdproc/util.c | 46 ++- clients/lcdproc/util.h | 3 + 15 files changed, 132 insertions(+), 528 deletions(-) diff --git a/clients/lcdproc/chrono.c b/clients/lcdproc/chrono.c index 3762d6c..d5e66ce 100644 --- a/clients/lcdproc/chrono.c +++ b/clients/lcdproc/chrono.c @@ -182,7 +182,7 @@ time_screen (int rep, int display, int *flags_ptr) sprintf (buffer, "widget_set T three %i 4 {%s}\n", xoffs, tmp); if (display) sock_send_string (sock, buffer); - } + } else { // 2 line version of the screen if (lcd_wid >= 20) // 20+x columns sprintf(tmp, "%02d.%02d.%04d %s", diff --git a/clients/lcdproc/cpu_smp.c b/clients/lcdproc/cpu_smp.c index 2a0e5e9..db67fac 100644 --- a/clients/lcdproc/cpu_smp.c +++ b/clients/lcdproc/cpu_smp.c @@ -24,18 +24,18 @@ * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. -* +* * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. -* +* * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * --- -* +* * $Source$ * $Revision$ $Date$ * Checked in by: $Author$ diff --git a/clients/lcdproc/disk.c b/clients/lcdproc/disk.c index fd5b17f..749a4c6 100644 --- a/clients/lcdproc/disk.c +++ b/clients/lcdproc/disk.c @@ -20,7 +20,7 @@ /////////////////////////////////////////////////////////////////////////// -// Gives disk stats. +// Gives disk stats. // // Stays onscreen until it is done; rolls over all mounted file systems // +--------------------+ +--------------------+ diff --git a/clients/lcdproc/iface.c b/clients/lcdproc/iface.c index f94d8f2..4d14b3c 100644 --- a/clients/lcdproc/iface.c +++ b/clients/lcdproc/iface.c @@ -1,7 +1,7 @@ -/* +/* netlcdclient - Client for LCDproc which shows networks statistics - Copyright (C) 2002 Luis Llorente Campo + Copyright (C) 2002 Luis Llorente Campo Multiinterface Extension by Stephan Skrodzki Adaptions to lcdproc by Andrew Foss with fixes by M. Dolze Cleanup, reorganization by Peter Marschall @@ -18,7 +18,7 @@ You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, - Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ @@ -30,30 +30,18 @@ #include #include -#include "iface.h" -#ifdef NETLCDCLIENT -#include "sockets.h" -#else #include "shared/sockets.h" #include "shared/debug.h" #include "shared/report.h" #include "shared/configfile.h" #include "main.h" -#define UNSET_INT -1 +#include "util.h" +#include "iface.h" + +#define UNSET_INT -1 #define UNSET_STR "\01" -#endif //NETLCDCLIENT -#ifdef NETLCDCLIENT -/* Option flags and global variables */ - -char *program_name; /* the name the program was run with */ -int port = 13666; /* default port */ -char server[256] = "localhost"; /* default server */ -int daemon_mode = 0; /* by default, no daemon mode */ -int sock = 0; /* socket handler */ -#endif //NETLCDCLIENT - int iface_count = 0; /* number of interfaces */ char unit_label[10] = "B"; /* default unit label is Bytes */ @@ -75,255 +63,6 @@ static struct option const long_options[] = }; -#ifdef NETLCDCLIENT -/************************************************************************* - * MAIN PROGRAM FUNCTION - ************************************************************************* - */ - -int -main (int argc, char **argv) -{ - - IfaceInfo iface[MAX_INTERFACES]; /* interface info */ - - int len; /* bytes read from server */ - - char readbuff[MAXMSG]; /* read buffer from server */ - - unsigned int sleep_time = 1; /* interval between updates (1 second) */ - - int pid; /* child process identificator for daemon mode */ - - int iface_nmbr; /* loop variable for the interface */ - - /* Capture signals to exit program cleanly */ - signal(SIGINT, exit_program); /* Ctrl-C */ - signal(SIGTERM, exit_program); /* kill */ - signal(SIGHUP, exit_program); /* kill -HUP */ - signal(SIGKILL, exit_program); /* kill -KILL */ - - /* get program name from command line */ - program_name = argv[0]; - - /* parse command line parameters */ - decode_switches (argc, argv); - - /* check if any interface name has been introduced */ - - if (iface_count == 0) { - /* no one has been introduced, so exit the program showing help */ - printf("No interface selected, please, use --interface option\n"); - usage (1); - } - - /* check if we go to daemon mode */ - if (daemon_mode) { - signal(SIGTTOU, SIG_IGN); - signal(SIGTTIN, SIG_IGN); - signal(SIGTSTP, SIG_IGN); - - /* create child process */ - pid = fork(); - /* create new session */ - setsid(); - signal(SIGHUP, SIG_IGN); - - if (pid != 0) { /* we are the parent process and exit */ - exit(0); - } - /* from here, we are the child process */ - } - - /* Try to connect to server */ - sock = sock_connect(server, port); - - if (sock < 0) { /* there was some error and exit */ - fprintf(stderr, "Error: Could not connect to %s:%d\n", server, port); - exit(0); - } - - /* Say "hello" to server */ - sock_send_string(sock, "hello\n"); - - /* Wait the server to be prepared */ - usleep(500000); - - /* Read server response */ - len = sock_recv(sock, readbuff, MAXMSG); - - /* Now we are ready to send commands to server */ - - /* set initial speed screen with widgets */ - initialize_speed_screen(); - - /* set initial transfer screen if needed */ - if (transfer_screen) { - initialize_transfer_screen(); - } - - /* initialize all interface structs */ - for (iface_nmbr = 0; iface_nmbr < iface_count; iface_nmbr++) { - iface[iface_nmbr].last_online = 0; - iface[iface_nmbr].status = down; - } - - - /* main loop */ - while (1) { - /* read server responses */ - len = sock_recv(sock, readbuff, MAXMSG); - - /* for each interface do */ - for (iface_nmbr = 0; iface_nmbr < iface_count; iface_nmbr++) { - /*read iface_parameter stats */ - if (!get_iface_stats(&iface[iface_nmbr])) { - /* there was an error, so we exit the loop */ - break; - } - - /* actualize speed values in display */ - actualize_speed_screen(&iface[iface_nmbr], sleep_time, iface_nmbr); - - /* if needed, actualize transfer values in display */ - if (transfer_screen) - actualize_transfer_screen(&iface[iface_nmbr], iface_nmbr); - - /* Actual values are the old ones in the next loop */ - iface[iface_nmbr].rc_byte_old = iface[iface_nmbr].rc_byte; - iface[iface_nmbr].tr_byte_old = iface[iface_nmbr].tr_byte; - iface[iface_nmbr].rc_pkt_old = iface[iface_nmbr].rc_pkt; - iface[iface_nmbr].tr_pkt_old = iface[iface_nmbr].tr_pkt; - } - - /* Wait some time to do the main loop again */ - sleep(sleep_time); - } - - /* Before exit the program, close the socket */ - sock_close(sock); - - exit (0); - -} /* main() */ - -/************************************************************************* - * END MAIN PROGRAM FUNCTION - **************************************************************************/ - - -/************************************************************************* - * Set all the option flags according to the switches specified. - * Return the index of the first non-option argument. - ************************************************************************* - */ - -static int -decode_switches (int argc, char **argv) -{ - int c; - - while ((c = getopt_long (argc, argv, "i:a:s:p:u:tdhV", \ - long_options, (int *) 0)) != EOF) { - - switch (c) { - case 'i': - /* Check number of interfaces introduced */ - if (iface_count >= MAX_INTERFACES) { - fprintf(stderr, "Too many interfaces introduced. " - "Only %d are supported.\n", MAX_INTERFACES); - exit(0); - } - iface[iface_count].name = strdup(optarg); - // make alias point to the same string as the interface name - iface[iface_count].alias = iface[iface_count].name; - iface_count++; - break; - case 'a': - iface[iface_count-1].alias = strdup(optarg); - break; - case 's': - strncpy(server, optarg, sizeof(server)); - server[sizeof(server)-1] = '\0'; - break; - case 'p': - port = atoi(optarg); - break; - case 'u': - /* check for valid values */ - if (strstr(optarg, "byte")) - strncpy(unit_label, "B", sizeof(unit_label)); - else if (strstr(optarg, "bit")) - strncpy(unit_label, "b", sizeof(unit_label)); - else if (strstr(optarg, "packet")) - strncpy(unit_label, "pkt", sizeof(unit_label)); - else { - fprintf(stderr, "netlcdclient: argument '%s' for -u parameter is not valid\n", optarg); - usage(0); - } - unit_label[sizeof(unit_label)-1] = '\0'; - break; - case 't': - transfer_screen = 1; /* show transfer screen */ - break; - case 'd': - daemon_mode = 1; /* go to daemon mode */ - break; - case 'V': /* show version */ - fprintf(stdout, "netlcdclient v%s\n", VERSION); - exit(0); - case 'h': /* show help */ - usage(0); - exit(0); - } - } - - return optind; - -} /* decode_switches() */ - - -/************************************************************************* - * Show program help and exit. - ************************************************************************* - */ - -static void -usage (int status) -{ - printf ("\n" -"netlcdclient v%s for LCDproc, by Luis Llorente\n", VERSION); - printf ("\n" -"Usage: %s -i [-a alias] [ -tdhV ] [ -s server ] [ -p port ] [-u unit]\n", program_name); - printf ("\n" -"Options in []'s are optional.\n" -" -i , --interface=INTERFACE show INTERFACE statistics\n" -" -a , --alias=ALIAS alias name for the interface (-a has to \n" -" follow -i)\n" -" -s, --server=SERVER connect to SERVER (default is localhost)\n" -" -p, --port=NUMBER connect to specified port number (default\n" -" is 13666)\n" -" -u, --unit=TYPE speed measure unit. Available units are:\n" -" byte (default)\n" -" bit\n" -" packet\n" -" -t, --transfer add screen with transferred traffic\n" -" -d, --daemon run in the background\n" -" -h, --help display this help and exit\n" -" -V, --version output version information and exit\n" -); - printf("\n" -"Example:\n" -" %s -s my.server.org -p 2300 -u bit -i eth0 -a LAN\n", program_name); - - exit (status); - -} /* usage() */ - - -#else - - /* reads and parses configuration file */ static int iface_process_configfile() @@ -429,11 +168,11 @@ iface_screen(int rep, int display, int *flags_ptr) /* actualize speed values in display */ actualize_speed_screen(&iface[iface_nmbr], interval, iface_nmbr); - + /* if needed, actualize transfer values in display */ if (transfer_screen) actualize_transfer_screen(&iface[iface_nmbr], iface_nmbr); - + /* Actual values are the old ones in the next loop */ iface[iface_nmbr].rc_byte_old = iface[iface_nmbr].rc_byte; iface[iface_nmbr].tr_byte_old = iface[iface_nmbr].tr_byte; @@ -444,13 +183,12 @@ iface_screen(int rep, int display, int *flags_ptr) return 0; } // End iface_screen() -#endif //NETLCDCLIENT /************************************************************************* - * Read interface statistics from system and store in the struct - * passed as a pointer. If there are no errors, it returns 1. If errors, + * Read interface statistics from system and store in the struct + * passed as a pointer. If there are no errors, it returns 1. If errors, * returns 0. - ************************************************************************* + ************************************************************************* */ int @@ -491,8 +229,8 @@ get_iface_stats (IfaceInfo *interface) &interface->tr_byte, &interface->tr_pkt); - /* if is the first time we call this function, - * old values are the same as new so we don't + /* if is the first time we call this function, + * old values are the same as new so we don't * get big speeds when calculating */ if (first_time) { @@ -510,7 +248,7 @@ get_iface_stats (IfaceInfo *interface) } else { /* error when opening the file */ - fprintf(stderr,"Error: Could not open %s\n", DEVFILE); + report(RPT_CRIT, "Error: Could not open %s\n", DEVFILE); return 0; /* something went wrong */ } #endif @@ -542,7 +280,7 @@ get_iface_stats (IfaceInfo *interface) name[4] = rows; /* set the interface index */ /* retrive the ifmibdata for the current index */ if (sysctl(name, 6, &ifmd, &len, NULL, 0) == -1) { - perror("sysctl_read"); + report(RPT_ERR, "Reading ifmibdata failed"); break; } /* check if its interface name matches */ @@ -568,10 +306,10 @@ get_iface_stats (IfaceInfo *interface) } } /* if we are here there is no interface with the given name */ - fprintf(stderr, "There is no interface named %s\n", interface->name); + report(RPT_CRIT, "There is no interface named %s", interface->name); return 0; } else { - perror("get_iface_stats"); + report(RPT_CRIT, "Reading interface count via sysctl failed"); return 0; } @@ -600,7 +338,7 @@ initialize_speed_screen(void) if ((iface_count == 1) && (lcd_hgt >= 4 )) { /* Single interface mode */ /* Set title */ sock_printf(sock, "widget_set I title {Net Load: %s}\n", iface[0].alias); - + /* Add and set download, upload and total string widgets */ sock_send_string(sock, "widget_add I dl string\n"); sock_send_string(sock, "widget_set I dl 1 2 {DL:}\n"); @@ -637,7 +375,7 @@ initialize_speed_screen(void) iface_nmbr, iface_nmbr+1, iface[iface_nmbr].alias); } } - + } /* initialize_speed_screen() */ /************************************************************************* @@ -646,75 +384,25 @@ initialize_speed_screen(void) * variable 'buff' passed as pointer. ************************************************************************* */ -void +void format_value (char *buff, double value, char *unit) { - float formated_value; - - /* if the measure unit is in 'b' (bits), the value passed must - * be converted to bits (from bytes) - */ - if (strstr(unit, "b")) { + /* Convert bytes to bits, if necessary */ + if (strstr(unit, "b")) value *= 8; - } - /* bytes, bits or packets */ - if (value < 1024) { - sprintf(buff, "%8ld %s",(long)value, unit); - return; - } - - /* Kilobytes, Kilobits of Kilopackets */ - if (value < 1000000.0f) { - if (strstr(unit, "B")) { /* 1 KB = 1024 */ - formated_value = (float) value / 1024.0f; - } - else { /* 1 K = 1000 */ - formated_value = (float) value / 1000.0f; - } + /* If units are bytes, then divide by 2^10, otherwise by 10^3 */ + char *mag = convert_double(&value, (strstr(unit, "B")) ? 1024 : 1000, 1.0f); - sprintf(buff, "%8.3f K%s", formated_value, unit); - return; - } + /* Formatting rules: + * - if original value was < 1000, output decimal value only + * - otherwise format with 3 precision + */ + if (mag[0] == 0) + sprintf(buff, "%8ld %s", (long) value, unit); + else + sprintf(buff, "%7.3f %s%s", value, mag, unit); - /* Megabytes, Megabits or Megapackets */ - if (value < 1000000000.0f) { - if (strstr(unit, "B")) { /* 1 MB = 1024 KB */ - formated_value = (float) value / 1048576.0f; /* 1024 ^ 2 */ - } - else { /* 1 M = 1000 K */ - formated_value = (float) value / 1000000.0f; /* 1000 ^ 2 */ - } - - sprintf(buff, "%8.3f M%s", formated_value, unit); - return; - } - - /* Gigabytes, Gigabits or Gigapackets */ - if (value < 1000000000000.0f) { - if (strstr(unit, "B")) { /* 1 GB = 1024 MB */ - formated_value = (float) value / 1073741824.0f; /* 1024 ^ 3 */ - } - else { /* 1 G = 1000 M */ - formated_value = (float) value / 1000000000.0f; /* 1000 ^ 3 */ - } - - sprintf(buff, "%8.3f G%s", formated_value, unit); - return; - } - - /* Terabytes, Terabits or Terapackets */ - if (value >= 1000000000000.0f) { - if (strstr(unit, "B")) { /* 1 TB = 1024 GB */ - formated_value = (float) value / 1099511627776.0f; /* 1024 ^ 4 */ - } - else { /* 1 T = 1000 G */ - formated_value = (float) value / 1000000000000.0f; /* 1000 ^ 4 */ - } - - sprintf(buff, "%8.3f T%s", formated_value, unit); - return; - } } /* format_value() */ /************************************************************************* @@ -723,107 +411,33 @@ format_value (char *buff, double value, char *unit) * variable 'buff' passed as pointer. Version for multi-interfaces mode ************************************************************************* */ -void +void format_value_multi_interface (char *buff, double value, char *unit) { - char mybuff[20]; /* temp buffer */ - float formated_value; - - /* if the measure unit is in 'b' (bits), the value passed must - * be converted to bits (from bytes) - */ - if (strstr(unit, "b")) { + if (strstr(unit, "b")) value *= 8; - } - /* bytes, bits or packets */ - if (value < 1000) { - sprintf(buff, "%3ld ", (long)value); - return; - } - - /* Kilobytes, Kilobits of Kilopackets */ - if (value < 1000000) { - if (strstr(unit, "B")) { /* 1 KB = 1024 */ - formated_value = (float) value / 1024.0f; - } - else { /* 1 K = 1000 */ - formated_value = (float) value / 1000.0f; - } + char *mag = convert_double(&value, (strstr(unit, "B")) ? 1024 : 1000, 1.0f); - sprintf(mybuff, "%3.1f", formated_value); - if (mybuff[2] != '.') { - sprintf(buff, "%.3sK", mybuff); - } - else { - sprintf(buff, " %.2sK", mybuff); - } - return; - } + /* Formatting rules: + * - if original value was < 1000, output decimal value only + * - with 1 precision if <10 + * - decimal value with magnitude otherwise + */ + if (mag[0] == 0) + sprintf(buff, "%4ld", (long) value); + else if (value < 10) + sprintf(buff, "%3.1f%s", value, mag); + else + sprintf(buff, "%3.f%s", value, mag); - /* Megabytes, Megabits or Megapackets */ - if (value < 1000000000.0f) { - if (strstr(unit, "B")) { /* 1 MB = 1024 KB */ - formated_value = (float) value / 1048576.0f; /* 1024 ^ 2 */ - } - else { /* 1 M = 1000 K */ - formated_value = (float) value / 1000000.0f; /* 1000 ^ 2 */ - } - - sprintf(mybuff, "%3.1f", formated_value); - if (mybuff[2] != '.') { - sprintf(buff, "%.3sM", mybuff); - } - else { - sprintf(buff, " %.2sM", mybuff); - } - return; - } - - /* Gigabytes, Gigabits or Gigapackets */ - if (value < 1000000000000.0f) { - if (strstr(unit, "B")) { /* 1 GB = 1024 MB */ - formated_value = (float) value / 1073741824.0f; /* 1024 ^ 3 */ - } - else { /* 1 G = 1000 M */ - formated_value = (float) value / 1000000000.0f; /* 1000 ^ 3 */ - } - - sprintf(mybuff, "%3.1f", formated_value); - if (mybuff[2] != '.') { - sprintf(buff, "%.3sG", mybuff); - } - else { - sprintf(buff, " %.2sG", mybuff); - } - return; - } - - /* Terabytes, Terabits or Terapackets */ - if (value >= 1000000000000.0f) { - if (strstr(unit, "B")) { /* 1 TB = 1024 GB */ - formated_value = (float) value / 1099511627776.0f; /* 1024 ^ 4 */ - } - else { /* 1 T = 1000 G */ - formated_value = (float) value / 1000000000000.0f; /* 1000 ^ 4 */ - } - - sprintf(mybuff, "%3.1f", formated_value); - if (mybuff[2] != '.') { - sprintf(buff, "%.3sT", mybuff); - } - else { - sprintf(buff, " %.2sT", mybuff); - } - return; - } } /* format_value_multi_interface() */ /************************************************************************* * Format the time in ASCII, depending on the elapsed time ************************************************************************* */ -void +void get_time_string (char *buff, time_t last_online) { @@ -854,7 +468,7 @@ get_time_string (char *buff, time_t last_online) /************************************************************************* * Actualize values in display, calculating speeds in the defined interval - * of time and sending proper commands to server. If measure unit is + * of time and sending proper commands to server. If measure unit is * 'pkt', we don't format this speed. Is always XXXX pkt/s ************************************************************************* */ @@ -970,7 +584,7 @@ initialize_transfer_screen(void) /* Set title (transfer screen is always in "bytes") */ sock_send_string(sock, "widget_set NT title {Net Transfer (bytes)}\n"); sock_send_string(sock, "widget_add NT f frame\n"); - + // frame from (2, left) to (width, height) that is iface_count lines high sock_printf(sock, "widget_set NT f 1 2 %d %d %d %d v 16\n", lcd_wid, lcd_hgt, lcd_wid, iface_count, @@ -986,7 +600,7 @@ initialize_transfer_screen(void) } /* initialize_transfer_screen() */ /************************************************************************* - * Actualize values in display, formatting transfer measures and sending + * Actualize values in display, formatting transfer measures and sending * proper commands to server. Traffic is shown in "bytes" unit ************************************************************************* */ @@ -1028,27 +642,7 @@ actualize_transfer_screen(IfaceInfo *iface, int index) else { /* Interface is down */ get_time_string(transfer, iface->last_online); sock_printf(sock, "widget_set NT i%1d 1 %1d {%5.5s NA (%s)}\n", - index, index+1, iface[index].alias, transfer); + index, index+1, iface[index].alias, transfer); } } } /* actualize_transfer_screen() */ - -#ifdef NETLCDCLIENT -/************************************************************************* - * Exit the program in a clean way - ************************************************************************* - */ -void -exit_program (int val) -{ - /* check if socket is open and close it */ - if (sock != 0) { - sock_close(sock); - } - - fprintf(stderr, "\nExiting netlcdclient....\n"); - - exit(0); - -} /* exit_program() */ -#endif //NETLCDCLIENT diff --git a/clients/lcdproc/iface.h b/clients/lcdproc/iface.h index e0f4426..f6526b0 100644 --- a/clients/lcdproc/iface.h +++ b/clients/lcdproc/iface.h @@ -61,12 +61,6 @@ IfaceInfo iface[MAX_INTERFACES]; /* interface info */ /* Functions prototipes */ /************************/ -/* show usage options */ -static void usage (int status); - -/* parse command line parameters */ -static int decode_switches (int argc, char **argv); - /* read interface stats from /proc/net/dev */ int get_iface_stats (IfaceInfo *interface); @@ -92,9 +86,4 @@ void actualize_speed_screen (IfaceInfo *iface, unsigned int interval, int index) /* actualize widgets values in transfer screen */ void actualize_transfer_screen (IfaceInfo *iface, int index); -#ifdef NETLCDCLIENT -/* exit the program cleanly */ -void exit_program (int val); -#endif //NETLCDCLIENT - #endif diff --git a/clients/lcdproc/load.c b/clients/lcdproc/load.c index 1fedda0..eab2ac2 100644 --- a/clients/lcdproc/load.c +++ b/clients/lcdproc/load.c @@ -86,7 +86,7 @@ xload_screen (int rep, int display, int *flags_ptr) factor = (double) (lcd_cellhgt * gauge_hgt) / (double) loadtop; - // display load + // display load sprintf (tmp, "widget_set X top %i %i %i\n", lcd_wid, (lcd_hgt + 1 - gauge_hgt), loadtop); sock_send_string (sock, tmp); diff --git a/clients/lcdproc/machine_Darwin.c b/clients/lcdproc/machine_Darwin.c index be89b68..f9a3e09 100644 --- a/clients/lcdproc/machine_Darwin.c +++ b/clients/lcdproc/machine_Darwin.c @@ -15,7 +15,7 @@ * 3. Neither the name of the author nor the names of its contributors * may be used to endorse or promote products derived from this * software without specific prior written permission. - * + * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS @@ -127,7 +127,7 @@ int machine_get_battstat(int *acstat, int *battflag, int *percent) } else if (CFDictionaryGetValueIfPresent(pSource, CFSTR(kIOPSIsChargingKey), &psValue)) { - /* We are running on an AC power source, + /* We are running on an AC power source, but we also have a battery power source present. */ if (CFBooleanGetValue(psValue) > 0) @@ -149,7 +149,7 @@ int machine_get_battstat(int *acstat, int *battflag, int *percent) *percent = (int)((double)curCapacity/(double)maxCapacity * 100); - /* There is a way to check this through the IOKit, + /* There is a way to check this through the IOKit, but I am not sure what gets for kIOPSLowWarnLevelKey and kIOPSDeadWarnLevelKey, and this is easier. */ if (*battflag == LCDP_BATT_UNKNOWN) { @@ -176,11 +176,11 @@ int machine_get_fs(mounts_type fs[], int *cnt) { struct statfs *mntbuf; struct statfs *pp; - int statcnt, fscnt, i; + int statcnt, fscnt, i; fscnt = getmntinfo(&mntbuf, MNT_WAIT); - if (fscnt == 0) - { + if (fscnt == 0) + { perror("getmntinfo"); return(FALSE); } @@ -393,7 +393,7 @@ int machine_get_uptime(double *up, double *idle) else *idle = 100.*curr_load.idle/curr_load.total; - return(TRUE); + return(TRUE); } static int swapmode(int *rettotal, int *retfree) diff --git a/clients/lcdproc/machine_FreeBSD.c b/clients/lcdproc/machine_FreeBSD.c index 4bcfed0..dd4f29b 100644 --- a/clients/lcdproc/machine_FreeBSD.c +++ b/clients/lcdproc/machine_FreeBSD.c @@ -15,7 +15,7 @@ * 3. Neither the name of the author nor the names of its contributors * may be used to endorse or promote products derived from this * software without specific prior written permission. - * + * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS @@ -146,11 +146,11 @@ int machine_get_fs(mounts_type fs[], int *cnt) { struct statfs *mntbuf; struct statfs *pp; - int statcnt, fscnt, i; + int statcnt, fscnt, i; fscnt = getmntinfo(&mntbuf, MNT_WAIT); - if (fscnt == 0) - { + if (fscnt == 0) + { perror("getmntinfo"); return(FALSE); } @@ -295,7 +295,7 @@ int machine_get_procs(LinkedList *procs) kprocs = kvm_getprocs(kvmd, KERN_PROC_ALL, 0, &nproc); if (kprocs == NULL) - { + { perror("kvm_getprocs"); kvm_close(kvmd); return(FALSE); @@ -382,7 +382,7 @@ int machine_get_uptime(double *up, double *idle) else *idle = 100.*curr_load.idle/curr_load.total; - return(TRUE); + return(TRUE); } static int swapmode(int *retavail, int *retfree) diff --git a/clients/lcdproc/machine_NetBSD.c b/clients/lcdproc/machine_NetBSD.c index 221256f..395f1a2 100644 --- a/clients/lcdproc/machine_NetBSD.c +++ b/clients/lcdproc/machine_NetBSD.c @@ -15,7 +15,7 @@ * 3. Neither the name of the author nor the names of its contributors * may be used to endorse or promote products derived from this * software without specific prior written permission. - * + * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS @@ -103,7 +103,7 @@ int machine_get_battstat(int *acstat, int *battflag, int *percent) memset(&apmi, 0, sizeof(apmi)); if (ioctl(apmd, APM_IOC_GETPOWER, &apmi) == -1) - { + { perror("APM_IOC_GETPOWER failed in get_batt_stat()"); return(FALSE); } @@ -141,11 +141,11 @@ int machine_get_fs(mounts_type fs[], int *cnt) struct statfs *mntbuf; struct statfs *pp; #endif - int statcnt, fscnt, i; + int statcnt, fscnt, i; fscnt = getmntinfo(&mntbuf, MNT_WAIT); - if (fscnt == 0) - { + if (fscnt == 0) + { perror("getmntinfo"); return(FALSE); } @@ -367,7 +367,7 @@ int machine_get_uptime(double *up, double *idle) else *idle = 100.*curr_load.idle/curr_load.total; - return(TRUE); + return(TRUE); } #endif /* __NetBSD__ */ diff --git a/clients/lcdproc/machine_OpenBSD.c b/clients/lcdproc/machine_OpenBSD.c index 058059a..b32c88f 100644 --- a/clients/lcdproc/machine_OpenBSD.c +++ b/clients/lcdproc/machine_OpenBSD.c @@ -15,7 +15,7 @@ * 3. Neither the name of the author nor the names of its contributors * may be used to endorse or promote products derived from this * software without specific prior written permission. - * + * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS @@ -149,11 +149,11 @@ int machine_get_fs(mounts_type fs[], int *cnt) { struct statfs *mntbuf; struct statfs *pp; - int statcnt, fscnt, i; + int statcnt, fscnt, i; fscnt = getmntinfo(&mntbuf, MNT_WAIT); - if (fscnt == 0) - { + if (fscnt == 0) + { perror("getmntinfo"); return(FALSE); } @@ -292,7 +292,7 @@ int machine_get_procs(LinkedList *procs) kprocs = kvm_getprocs(kvmd, KERN_PROC_ALL, 0, &nproc); if (kprocs == NULL) - { + { perror("kvm_getprocs"); kvm_close(kvmd); return(FALSE); @@ -375,7 +375,7 @@ int machine_get_uptime(double *up, double *idle) else *idle = 100.*curr_load.idle/curr_load.total; - return(TRUE); + return(TRUE); } #endif /* __OpenBSD__ */ diff --git a/clients/lcdproc/machine_SunOS.c b/clients/lcdproc/machine_SunOS.c index bd83d45..6916310 100644 --- a/clients/lcdproc/machine_SunOS.c +++ b/clients/lcdproc/machine_SunOS.c @@ -436,7 +436,7 @@ int machine_get_uptime(double *up, double *idle) else *idle = 100.*curr_load.idle/curr_load.total; - return(TRUE); + return(TRUE); } #endif /* sun */ diff --git a/clients/lcdproc/main.c b/clients/lcdproc/main.c index 80a13c6..01549bd 100644 --- a/clients/lcdproc/main.c +++ b/clients/lcdproc/main.c @@ -61,14 +61,14 @@ static int process_configfile(char *cfgfile); // 1/8th second is a single time unit... -#define TIME_UNIT 125000 +#define TIME_UNIT 125000 #if !defined(SYSCONFDIR) -# define SYSCONFDIR "/etc" +# define SYSCONFDIR "/etc" #endif -#define UNSET_INT -1 -#define UNSET_STR "\01" +#define UNSET_INT -1 +#define UNSET_STR "\01" #define DEFAULT_SERVER "127.0.0.1" #define DEFAULT_CONFIGFILE SYSCONFDIR "/lcdproc.conf" #define DEFAULT_REPORTDEST RPT_DEST_STDERR @@ -78,7 +78,7 @@ static int process_configfile(char *cfgfile); mode sequence[] = { // flags default ACTIVE will run by default - // longname which on off inv timer flags + // longname which on off inv timer flags { "CPU", 'C', 1, 2, 0, 0xffff, ACTIVE, cpu_screen }, // [C]PU { "Iface", 'I', 1, 2, 0, 0xffff, 0, iface_screen }, // [I]face { "Memory", 'M', 4, 16, 0, 0xffff, ACTIVE, mem_screen }, // [M]emory @@ -87,13 +87,13 @@ mode sequence[] = { "About", 'A', 999, 9999, 0, 0xffff, ACTIVE, credit_screen }, // [A]bout (credits) { "SMP-CPU", 'P', 1, 2, 0, 0xffff, 0, cpu_smp_screen }, // CPU_SM[P] { "OldTime", 'O', 4, 64, 0, 0xffff, 0, clock_screen }, // [O]ld Timescreen - { "BigClock", 'K', 4, 64, 0, 0xffff, 0, big_clock_screen }, // big cloc[K] + { "BigClock", 'K', 4, 64, 0, 0xffff, 0, big_clock_screen }, // big cloc[K] { "Uptime", 'U', 4, 128, 0, 0xffff, 0, uptime_screen }, // Old [U]ptime Screen { "Battery", 'B', 32, 256, 1, 0xffff, 0, battery_screen }, // [B]attery Status { "CPUGraph", 'G', 1, 2, 0, 0xffff, 0, cpu_graph_screen }, // CPU histogram [G]raph { "ProcSize", 'S', 16, 256, 1, 0xffff, 0, mem_top_screen }, // [S]ize of biggest processes { "Disk", 'D', 256, 256, 1, 0xffff, 0, disk_screen }, // [D]isk stats - { "MiniClock", 'N', 4, 64, 0, 0xffff, 0, mini_clock_screen }, // Mi[n]i clock + { "MiniClock", 'N', 4, 64, 0, 0xffff, 0, mini_clock_screen }, // Mi[n]i clock { NULL, 0, 0, 0, 0, 0, 0, NULL}, // No more.. all done. }; @@ -136,12 +136,12 @@ int set_mode(int shortname, char *longname, int state) /* ignore already selected modes */ for (k = 0; sequence[k].which != 0; k++) { if (((sequence[k].longname != NULL) && - (0 == strcasecmp(longname, sequence[k].longname))) || + (0 == strcasecmp(longname, sequence[k].longname))) || (toupper(shortname) == sequence[k].which)) { if (!state) { - /* clean both the active and inititialized bits since we delete the screen */ + /* clean both the active and initialized bits since we delete the screen */ sequence[k].flags &= (~ACTIVE & ~INITIALIZED); - /* delte the screen if we are connected */ + /* delete the screen if we are connected */ if (sock >= 0) { sock_printf(sock, "screen_del %c\n", sequence[k].which); } @@ -262,7 +262,7 @@ main(int argc, char **argv) int state = (*argv[i] == '!') ? 0 : 1; char *name = (state) ? argv[i] : argv[i]+1; int shortname = (strlen(name) == 1) ? name[0] : '\0'; -fprintf(stderr, "%s%s\n", (state) ? "" : "!", name); + // debug: fprintf(stderr, "%s%s\n", (state) ? "" : "!", name); int found = set_mode(shortname, name, state); if (!found) { diff --git a/clients/lcdproc/mem.c b/clients/lcdproc/mem.c index 25277e1..1c0bb28 100644 --- a/clients/lcdproc/mem.c +++ b/clients/lcdproc/mem.c @@ -147,7 +147,7 @@ mem_screen (int rep, int display, int *flags_ptr) double value = 1.0 - ((double) mem[1].free / (double) mem[1].total); //printf(".0f", val) only prints the integer part - sprintf(buffer, "widget_set M swapgauge %i 4 %.0f\n", + sprintf(buffer, "widget_set M swapgauge %i 4 %.0f\n", lcd_wid - gauge_wid, lcd_cellwid * gauge_wid * value); if (display) sock_send_string(sock, buffer); @@ -194,7 +194,7 @@ mem_screen (int rep, int display, int *flags_ptr) if (gauge_wid > 0) { //printf(".0f", val) only prints the integer part - sprintf(buffer, "widget_set M swapgauge %i 2 %.0f\n", + sprintf(buffer, "widget_set M swapgauge %i 2 %.0f\n", gauge_offs, lcd_cellwid * gauge_wid * value); if (display) sock_send_string(sock, buffer); diff --git a/clients/lcdproc/util.c b/clients/lcdproc/util.c index a06a453..97d16c8 100644 --- a/clients/lcdproc/util.c +++ b/clients/lcdproc/util.c @@ -9,18 +9,18 @@ * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. -* +* * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. -* +* * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * --- -* +* * $Source$ * $Revision$ * Checked in by: $Author$ @@ -35,25 +35,16 @@ char * sprintf_memory(char *dst, double value, double roundlimit) { if (dst != NULL) { - static char *units[] = { "", "k", "M", "G", "T", "P", "E", "Z", "Y", NULL }; - int offs = 0; char *format = "%.1f%s"; - if ((roundlimit <= 0.0) || (roundlimit > 1.0)) - roundlimit = 0.5; + char *unit = convert_double(&value, 1024, roundlimit); - while (units[offs] != NULL) { - if (value <= 1024 * roundlimit) - break; - offs++; - value /= 1024; - } if (value < 100) format = "%.2f%s"; if (value < 10) format = "%.3f%s"; - sprintf(dst, format, value, units[offs]); + sprintf(dst, format, value, unit); } return dst; } @@ -72,4 +63,31 @@ sprintf_percent(char *dst, double percent) return dst; } +/** converts a value with unit value + * does not do formatting + * base : should be 1000 for decimal and 1024 for binary units + * roundlimit : set < 1.0 if precision of original input value is not sufficient + */ +char * +convert_double(double *value, int base, double roundlimit) +{ + static char *units[] = { "", "k", "M", "G", "T", "P", "E", "Z", "Y", NULL }; + int off = 0; + + if ((roundlimit <= 0.0) || (roundlimit > 1.0)) + roundlimit = 0.5; + + /* Get value's order of magnitude */ + while (units[off] != NULL) { + /* Note: the check for 1000 is to idenfity the number of + * characters in the output needed, not to decide if to scale value. + */ + if (*value < 1000 * roundlimit) + break; + off++; + *value /= base; + } + return units[off]; +} + /* EOF */ diff --git a/clients/lcdproc/util.h b/clients/lcdproc/util.h index 3ad1429..4f01d7a 100644 --- a/clients/lcdproc/util.h +++ b/clients/lcdproc/util.h @@ -40,6 +40,9 @@ char *sprintf_memory(char *dst, double value, double roundlimit); /** print a percentage value to a given string */ char *sprintf_percent(char *dst, double percent); +/** converts value into power-of-x representation */ +char *convert_double(double *value, int base, double roundlimit); + #endif /* LCDPROC_UTIL_H */ /* EOF */