X-Git-Url: https://granicus.if.org/sourcecode?a=blobdiff_plain;f=count.c;h=0c49be0eb0cff36e62f83de78f71663f1c7eb189;hb=ee919f007fd759211927fc1a989619229e6dfc48;hp=da1f336b9412a6984f1894bd22660155b47153db;hpb=1cf65800b12d015ed9add350a6e2b40e6bcd5267;p=sysstat diff --git a/count.c b/count.c index da1f336..0c49be0 100644 --- a/count.c +++ b/count.c @@ -1,6 +1,6 @@ /* * count.c: Count items for which statistics will be collected. - * (C) 1999-2014 by Sebastien GODARD (sysstat orange.fr) + * (C) 1999-2021 by Sebastien GODARD (sysstat orange.fr) * *************************************************************************** * This program is free software; you can redistribute it and/or modify it * @@ -15,7 +15,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 * + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335 USA * *************************************************************************** */ @@ -73,8 +73,8 @@ int get_sys_cpu_nr(int highest) while ((drd = readdir(dir)) != NULL) { if (!strncmp(drd->d_name, "cpu", 3) && isdigit(drd->d_name[3])) { - snprintf(line, MAX_PF_NAME, "%s/%s", SYSFS_DEVCPU, drd->d_name); - line[MAX_PF_NAME - 1] = '\0'; + snprintf(line, sizeof(line), "%s/%s", SYSFS_DEVCPU, drd->d_name); + line[sizeof(line) - 1] = '\0'; if (stat(line, &buf) < 0) continue; if (S_ISDIR(buf.st_mode)) { @@ -131,7 +131,8 @@ int get_proc_cpu_nr(void) fclose(fp); - return (proc_nr + 1); + proc_nr++; + return proc_nr; } /* @@ -153,11 +154,14 @@ int get_proc_cpu_nr(void) * one have been disabled, we get the total number of proc since we use * /sys to count them). * 2: two proc... + * + * USED BY: + * sadc, cifsiostat, iostat, mpstat, pidstat, tapestat *************************************************************************** */ -int get_cpu_nr(unsigned int max_nr_cpus, int highest) +__nr_t get_cpu_nr(unsigned int max_nr_cpus, int highest) { - int cpu_nr; + __nr_t cpu_nr; if ((cpu_nr = get_sys_cpu_nr(highest)) == 0) { /* /sys may be not mounted. Use /proc/stat instead */ @@ -184,14 +188,17 @@ int get_cpu_nr(unsigned int max_nr_cpus, int highest) * @cpu_nr Number of processors. * * RETURNS: - * Number of interrupts per processor + a pre-allocation constant. + * Number of interrupts per processor. + * + * USED BY: + * sadc, mpstat *************************************************************************** */ -int get_irqcpu_nr(char *file, int max_nr_irqcpu, int cpu_nr) +__nr_t get_irqcpu_nr(char *file, int max_nr_irqcpu, int cpu_nr) { FILE *fp; char *line = NULL; - unsigned int irq = 0; + __nr_t irq = 0; int p; if ((fp = fopen(file, "r")) == NULL) @@ -214,6 +221,9 @@ int get_irqcpu_nr(char *file, int max_nr_irqcpu, int cpu_nr) return irq; } +#ifdef SOURCE_SADC +/*---------------- BEGIN: FUNCTIONS USED BY SADC ONLY ---------------------*/ + /* *************************************************************************** * Find number of devices and partitions available in /proc/diskstats. @@ -228,12 +238,13 @@ int get_irqcpu_nr(char *file, int max_nr_irqcpu, int cpu_nr) * Number of devices (and partitions). *************************************************************************** */ -int get_diskstats_dev_nr(int count_part, int only_used_dev) +__nr_t get_diskstats_dev_nr(int count_part, int only_used_dev) { FILE *fp; char line[256]; char dev_name[MAX_NAME_LEN]; - int dev = 0, i; + __nr_t dev = 0; + int i; unsigned long rd_ios, wr_ios; if ((fp = fopen(DISKSTATS, "r")) == NULL) @@ -248,7 +259,7 @@ int get_diskstats_dev_nr(int count_part, int only_used_dev) if (!count_part) { i = sscanf(line, "%*d %*d %s %lu %*u %*u %*u %lu", dev_name, &rd_ios, &wr_ios); - if ((i == 2) || !is_device(dev_name, ACCEPT_VIRTUAL_DEVICES)) + if ((i == 2) || !is_device(SLASH_SYS, dev_name, ACCEPT_VIRTUAL_DEVICES)) /* It was a partition and not a device */ continue; if (only_used_dev && !rd_ios && !wr_ios) @@ -263,43 +274,6 @@ int get_diskstats_dev_nr(int count_part, int only_used_dev) return dev; } -#ifdef SOURCE_SADC -/*---------------- BEGIN: FUNCTIONS USED BY SADC ONLY ---------------------*/ - -/* - *************************************************************************** - * Count number of interrupts that are in /proc/stat file. - * - * RETURNS: - * Number of interrupts, including total number of interrupts. - *************************************************************************** - */ -int get_irq_nr(void) -{ - FILE *fp; - char line[8192]; - int in = 0; - int pos = 4; - - if ((fp = fopen(STAT, "r")) == NULL) - return 0; - - while (fgets(line, sizeof(line), fp) != NULL) { - - if (!strncmp(line, "intr ", 5)) { - - while (pos < strlen(line)) { - in++; - pos += strcspn(line + pos + 1, " ") + 1; - } - } - } - - fclose(fp); - - return in; -} - /* *************************************************************************** * Find number of serial lines that support tx/rx accounting @@ -309,11 +283,11 @@ int get_irq_nr(void) * Number of serial lines supporting tx/rx accouting. *************************************************************************** */ -int get_serial_nr(void) +__nr_t get_serial_nr(void) { FILE *fp; char line[256]; - int sl = 0; + __nr_t sl = 0; if ((fp = fopen(SERIAL, "r")) == NULL) return 0; /* No SERIAL file */ @@ -342,11 +316,11 @@ int get_serial_nr(void) * Number of network interfaces. *************************************************************************** */ -int get_iface_nr(void) +__nr_t get_iface_nr(void) { FILE *fp; char line[128]; - int iface = 0; + __nr_t iface = 0; if ((fp = fopen(NET_DEV, "r")) == NULL) return 0; /* No network device file */ @@ -374,9 +348,9 @@ int get_iface_nr(void) * Number of devices. *************************************************************************** */ -int get_disk_nr(unsigned int f) +__nr_t get_disk_nr(unsigned int f) { - int disk_nr; + __nr_t disk_nr; /* * Partitions are taken into account by sar -d only with @@ -395,12 +369,12 @@ int get_disk_nr(unsigned int f) * Number of frequencies. *************************************************************************** */ -int get_freq_nr(void) +__nr_t get_freq_nr(void) { FILE *fp; char filename[MAX_PF_NAME]; char line[128]; - int freq = 0; + __nr_t freq = 0; snprintf(filename, MAX_PF_NAME, "%s/cpu0/%s", SYSFS_DEVCPU, SYSFS_TIME_IN_STATE); @@ -426,11 +400,11 @@ int get_freq_nr(void) * Return -1 if directory doesn't exist in sysfs. *************************************************************************** */ -int get_usb_nr(void) +__nr_t get_usb_nr(void) { DIR *dir; struct dirent *drd; - int usb = 0; + __nr_t usb = 0; /* Open relevant /sys directory */ if ((dir = opendir(SYSFS_USBDEV)) == NULL) @@ -458,11 +432,13 @@ int get_usb_nr(void) * Number of filesystems. *************************************************************************** */ -int get_filesystem_nr(void) +__nr_t get_filesystem_nr(void) { FILE *fp; - char line[512], fs_name[MAX_FS_LEN], mountp[256]; - int fs = 0; + char line[512], fs_name[MAX_FS_LEN], mountp[256], type[128]; + char *pos = 0, *pos2 = 0; + __nr_t fs = 0; + int skip = 0, skip_next = 0; struct statvfs buf; if ((fp = fopen(MTAB, "r")) == NULL) @@ -471,17 +447,44 @@ int get_filesystem_nr(void) /* Get current filesystem */ while (fgets(line, sizeof(line), fp) != NULL) { + /* + * Ignore line if the preceding line did not contain '\n'. + * (Some very long lines may be found for instance when + * overlay2 filesystem with docker is used). + */ + skip = skip_next; + skip_next = (strchr(line, '\n') == NULL); + if (skip) + continue; + if (line[0] == '/') { + /* Find field separator position */ + pos = strchr(line, ' '); + if (pos == NULL) + continue; + + /* + * Find second field separator position, + * read filesystem type, + * if filesystem type is autofs, skip it + */ + pos2 = strchr(pos + 1, ' '); + if (pos2 == NULL) + continue; + + sscanf(pos2 + 1, "%127s", type); + if(strcmp(type, "autofs") == 0) + continue; /* Read filesystem name and mount point */ sscanf(line, "%127s", fs_name); - sscanf(strchr(line, ' ') + 1, "%255s", mountp); + sscanf(pos + 1, "%255s", mountp); /* Replace octal codes */ oct2chr(mountp); - /* Check that total size is not null */ - if (statvfs(mountp, &buf) < 0) + /* Check that total size is not zero */ + if (__statvfs(mountp, &buf) < 0) continue; if (buf.f_blocks) { @@ -495,5 +498,38 @@ int get_filesystem_nr(void) return fs; } +/* + *************************************************************************** + * Find number of fibre channel hosts in /sys/class/fc_host/. + * + * RETURNS: + * Number of FC hosts. + * Return -1 if directory doesn't exist in sysfs. + *************************************************************************** + */ +__nr_t get_fchost_nr(void) +{ + DIR *dir; + struct dirent *drd; + __nr_t fc = 0; + + if ((dir = opendir(SYSFS_FCHOST)) == NULL) { + /* Directory non-existent */ + return -1; + } + + while ((drd = readdir(dir)) != NULL) { + + if (!strncmp(drd->d_name, "host", 4)) { + fc++; + } + } + + /* Close directory */ + closedir(dir); + + return fc; +} + /*------------------ END: FUNCTIONS USED BY SADC ONLY ---------------------*/ #endif /* SOURCE_SADC */