mirror of https://github.com/containers/podman.git
				
				
				
			
		
			
				
	
	
		
			160 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			160 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			C
		
	
	
	
| #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;
 | |
| }
 |