summaryrefslogtreecommitdiff
path: root/vendor/github.com/power-devops/perfstat/c_helpers.c
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/github.com/power-devops/perfstat/c_helpers.c')
-rw-r--r--vendor/github.com/power-devops/perfstat/c_helpers.c159
1 files changed, 159 insertions, 0 deletions
diff --git a/vendor/github.com/power-devops/perfstat/c_helpers.c b/vendor/github.com/power-devops/perfstat/c_helpers.c
new file mode 100644
index 0000000..49ba1ad
--- /dev/null
+++ b/vendor/github.com/power-devops/perfstat/c_helpers.c
@@ -0,0 +1,159 @@
+#include "c_helpers.h"
+
+GETFUNC(cpu)
+GETFUNC(disk)
+GETFUNC(diskadapter)
+GETFUNC(diskpath)
+GETFUNC(fcstat)
+GETFUNC(logicalvolume)
+GETFUNC(memory_page)
+GETFUNC(netadapter)
+GETFUNC(netbuffer)
+GETFUNC(netinterface)
+GETFUNC(pagingspace)
+GETFUNC(process)
+GETFUNC(thread)
+GETFUNC(volumegroup)
+
+double get_partition_mhz(perfstat_partition_config_t pinfo) {
+ return pinfo.processorMHz;
+}
+
+char *get_ps_hostname(perfstat_pagingspace_t *ps) {
+ return ps->u.nfs_paging.hostname;
+}
+
+char *get_ps_filename(perfstat_pagingspace_t *ps) {
+ return ps->u.nfs_paging.filename;
+}
+
+char *get_ps_vgname(perfstat_pagingspace_t *ps) {
+ return ps->u.lv_paging.vgname;
+}
+
+time_t boottime()
+{
+ register struct utmpx *utmp;
+
+ setutxent();
+ while ( (utmp = getutxent()) != NULL ) {
+ if (utmp->ut_type == BOOT_TIME) {
+ return utmp->ut_tv.tv_sec;
+ }
+ }
+ endutxent();
+ return -1;
+}
+
+struct fsinfo *get_filesystem_stat(struct fsinfo *fs_all, int n) {
+ if (!fs_all) return NULL;
+ return &(fs_all[n]);
+}
+
+int get_mounts(struct vmount **vmountpp) {
+ int size;
+ struct vmount *vm;
+ int nmounts;
+
+ size = BUFSIZ;
+
+ while (1) {
+ if ((vm = (struct vmount *)malloc((size_t)size)) == NULL) {
+ perror("malloc failed");
+ exit(-1);
+ }
+ if ((nmounts = mntctl(MCTL_QUERY, size, (caddr_t)vm)) > 0) {
+ *vmountpp = vm;
+ return nmounts;
+ } else if (nmounts == 0) {
+ size = *(int *)vm;
+ free((void *)vm);
+ } else {
+ free((void *)vm);
+ return -1;
+ }
+ }
+}
+
+void fill_fsinfo(struct statfs statbuf, struct fsinfo *fs) {
+ fsblkcnt_t freeblks, totblks, usedblks;
+ fsblkcnt_t tinodes, ninodes, ifree;
+ uint cfactor;
+
+ if (statbuf.f_blocks == -1) {
+ fs->totalblks = 0;
+ fs->freeblks = 0;
+ fs->totalinodes = 0;
+ fs->freeinodes = 0;
+ return;
+ }
+
+ cfactor = statbuf.f_bsize / 512;
+ fs->freeblks = statbuf.f_bavail * cfactor;
+ fs->totalblks = statbuf.f_blocks * cfactor;
+
+ fs->freeinodes = statbuf.f_ffree;
+ fs->totalinodes = statbuf.f_files;
+
+ if (fs->freeblks < 0)
+ fs->freeblks = 0;
+}
+
+int getfsinfo(char *fsname, char *devname, char *host, char *options, int flags, int fstype, struct fsinfo *fs) {
+ struct statfs statbuf;
+ int devname_size = strlen(devname);
+ int fsname_size = strlen(fsname);
+ char buf[BUFSIZ];
+ char *p;
+
+ if (fs == NULL) {
+ return 1;
+ }
+
+ for (p = strtok(options, ","); p != NULL; p = strtok(NULL, ","))
+ if (strcmp(p, "ignore") == 0)
+ return 0;
+
+ if (*host != 0 && strcmp(host, "-") != 0) {
+ sprintf(buf, "%s:%s", host, devname);
+ devname = buf;
+ }
+ fs->devname = (char *)calloc(devname_size+1, 1);
+ fs->fsname = (char *)calloc(fsname_size+1, 1);
+ strncpy(fs->devname, devname, devname_size);
+ strncpy(fs->fsname, fsname, fsname_size);
+ fs->flags = flags;
+ fs->fstype = fstype;
+
+ if (statfs(fsname,&statbuf) < 0) {
+ return 1;
+ }
+
+ fill_fsinfo(statbuf, fs);
+ return 0;
+}
+
+struct fsinfo *get_all_fs(int *rc) {
+ struct vmount *mnt;
+ struct fsinfo *fs_all;
+ int nmounts;
+
+ *rc = -1;
+ if ((nmounts = get_mounts(&mnt)) <= 0) {
+ perror("Can't get mount table info");
+ return NULL;
+ }
+
+ fs_all = (struct fsinfo *)calloc(sizeof(struct fsinfo), nmounts);
+ while ((*rc)++, nmounts--) {
+ getfsinfo(vmt2dataptr(mnt, VMT_STUB),
+ vmt2dataptr(mnt, VMT_OBJECT),
+ vmt2dataptr(mnt, VMT_HOST),
+ vmt2dataptr(mnt, VMT_ARGS),
+ mnt->vmt_flags,
+ mnt->vmt_gfstype,
+ &fs_all[*rc]);
+ mnt = (struct vmount *)((char *)mnt + mnt->vmt_length);
+ }
+ return fs_all;
+}