X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;f=src%2Fzone.c;h=188fbe3db3dc89108eb9ef45431d7aabb9108d58;hb=edb3002086ef96755804b2d155728cb9a0428935;hp=185a57e944f53d2409d771ec4d37444cc824aec9;hpb=1b826769a20045c6abb8d22e6f46368095db4c1e;p=collectd.git diff --git a/src/zone.c b/src/zone.c index 185a57e9..188fbe3d 100644 --- a/src/zone.c +++ b/src/zone.c @@ -17,9 +17,18 @@ * * Authors: * Mathijs Mohlmann + * Dagobert Michelsen (forward-porting) **/ -#define _BSD_SOURCE +#if HAVE_CONFIG_H +# include "config.h" +# undef HAVE_CONFIG_H +#endif +/* avoid procfs.h error "Cannot use procfs in the large file compilation environment" */ +#if !defined(_LP64) && _FILE_OFFSET_BITS == 64 +# undef _FILE_OFFSET_BITS +# undef _LARGEFILE64_SOURCE +#endif #include "collectd.h" #include "common.h" @@ -33,7 +42,6 @@ #include "utils_avltree.h" #define MAX_PROCFS_PATH 40 -#define MAX_ZONE_NAME 20 #define FRC2PCT(pp)(((float)(pp))/0x8000*100) typedef struct zone_stats { @@ -43,6 +51,12 @@ typedef struct zone_stats { static long pagesize; +static int zone_init (void) +{ + pagesize = sysconf(_SC_PAGESIZE); + return (0); +} + static int zone_compare(const zoneid_t *a, const zoneid_t *b) { @@ -59,11 +73,9 @@ zone_read_procfile(char *pidstr, char *file, void *buf, size_t bufsize) int fd; char procfile[MAX_PROCFS_PATH]; - (void)snprintf(procfile, MAX_PROCFS_PATH, "/proc/%s/%s", pidstr, file); - while ((fd = open(procfile, O_RDONLY)) == -1) { - if ((errno != EMFILE) || (errno != ENFILE)) { - return(1); - } + (void)snprintf(procfile, sizeof(procfile), "/proc/%s/%s", pidstr, file); + if ((fd = open(procfile, O_RDONLY)) == -1) { + return (1); } if (pread(fd, buf, bufsize, 0) != bufsize) { @@ -100,16 +112,16 @@ zone_find_stats(c_avl_tree_t *tree, zoneid_t zoneid) if (c_avl_get(tree, (void **)&zoneid, (void **)&ret)) { if (!(ret = malloc(sizeof(zone_stats_t)))) { - WARNING("no memory"); + WARNING("zone plugin: no memory"); return(NULL); } if (!(key = malloc(sizeof(zoneid_t)))) { - WARNING("no memory"); + WARNING("zone plugin: no memory"); return(NULL); } *key = zoneid; if (c_avl_insert(tree, key, ret)) { - WARNING("error inserting into tree"); + WARNING("zone plugin: error inserting into tree"); return(NULL); } } @@ -119,14 +131,17 @@ zone_find_stats(c_avl_tree_t *tree, zoneid_t zoneid) static void zone_submit_values(c_avl_tree_t *tree) { - char zonename[MAX_ZONE_NAME]; + char zonename[ZONENAME_MAX]; zoneid_t *zoneid = NULL; zone_stats_t *stats = NULL; while (c_avl_pick (tree, (void **)&zoneid, (void **)&stats) == 0) { - getzonenamebyid(*zoneid, zonename, MAX_ZONE_NAME-1); - zone_submit_value(zonename, (gauge_t)FRC2PCT(stats->pctcpu)); + if (getzonenamebyid(*zoneid, zonename, sizeof( zonename )) == -1) { + WARNING("zone plugin: error retreiving zonename"); + } else { + zone_submit_value(zonename, (gauge_t)FRC2PCT(stats->pctcpu)); + } free(stats); free(zoneid); } @@ -142,14 +157,14 @@ zone_scandir(DIR *procdir) psinfo_t psinfo; c_avl_tree_t *tree; zone_stats_t *stats; -/* size_t physmem = sysconf(_SC_PHYS_PAGES) * pagesize;*/ if (!(tree=c_avl_create((void *) zone_compare))) { - WARNING("Failed to create tree"); + WARNING("zone plugin: Failed to create tree"); return(NULL); } - for (rewinddir(procdir); (direntp = readdir(procdir)); ) { + rewinddir(procdir); + while ((direntp = readdir(procdir))) { pidstr = direntp->d_name; if (pidstr[0] == '.') /* skip "." and ".." */ continue; @@ -160,8 +175,10 @@ zone_scandir(DIR *procdir) sizeof(psinfo_t)) != 0) continue; stats = zone_find_stats(tree, psinfo.pr_zoneid); - stats->pctcpu += psinfo.pr_pctcpu; - stats->pctmem += psinfo.pr_pctmem; + if( stats ) { + stats->pctcpu += psinfo.pr_pctcpu; + stats->pctmem += psinfo.pr_pctmem; + } } return(tree); } @@ -172,19 +189,22 @@ static int zone_read (void) DIR *procdir; c_avl_tree_t *tree; - pagesize = sysconf(_SC_PAGESIZE); if ((procdir = opendir("/proc")) == NULL) { - ERROR("cannot open /proc directory\n"); - exit(1); + ERROR("zone plugin: cannot open /proc directory\n"); + return (-1); } tree=zone_scandir(procdir); closedir(procdir); + if (tree == NULL) { + return (-1); + } zone_submit_values(tree); /* this also frees tree */ return (0); } void module_register (void) { + plugin_register_init ("zone", zone_init); plugin_register_read ("zone", zone_read); } /* void module_register */