static void summarize(FILE * fp, const char *fmt, char **command, resource_t * resp) { unsigned long r; /* Elapsed real milliseconds. */ unsigned long v; /* Elapsed virtual (CPU) milliseconds. */ if (WIFSTOPPED(resp->waitstatus)) fprintf(fp, "Command stopped by signal %d\n", WSTOPSIG(resp->waitstatus)); else if (WIFSIGNALED(resp->waitstatus)) fprintf(fp, "Command terminated by signal %d\n", WTERMSIG(resp->waitstatus)); else if (WIFEXITED(resp->waitstatus) && WEXITSTATUS(resp->waitstatus)) fprintf(fp, "Command exited with non-zero status %d\n", WEXITSTATUS(resp->waitstatus)); /* Convert all times to milliseconds. Occasionally, one of these values comes out as zero. Dividing by zero causes problems, so we first check the time value. If it is zero, then we take `evasive action' instead of calculating a value. */ r = resp->elapsed.tv_sec * 1000 + resp->elapsed.tv_usec / 1000; v = resp->ru.ru_utime.tv_sec * 1000 + resp->ru.ru_utime.TV_MSEC + resp->ru.ru_stime.tv_sec * 1000 + resp->ru.ru_stime.TV_MSEC; while (*fmt) { switch (*fmt) { case '%': switch (*++fmt) { case '%': /* Literal '%'. */ putc('%', fp); break; case 'C': /* The command that got timed. */ fprintargv(fp, command, " "); break; case 'D': /* Average unshared data size. */ fprintf(fp, "%lu", MSEC_TO_TICKS(v) == 0 ? 0 : ptok((UL) resp->ru.ru_idrss) / MSEC_TO_TICKS(v) + ptok((UL) resp->ru.ru_isrss) / MSEC_TO_TICKS(v)); break; case 'E': /* Elapsed real (wall clock) time. */ if (resp->elapsed.tv_sec >= 3600) /* One hour -> h:m:s. */ fprintf(fp, "%ldh %ldm %02lds", resp->elapsed.tv_sec / 3600, (resp->elapsed.tv_sec % 3600) / 60, resp->elapsed.tv_sec % 60); else fprintf(fp, "%ldm %ld.%02lds", /* -> m:s. */ resp->elapsed.tv_sec / 60, resp->elapsed.tv_sec % 60, resp->elapsed.tv_usec / 10000); break; case 'F': /* Major page faults. */ fprintf(fp, "%ld", resp->ru.ru_majflt); break; case 'I': /* Inputs. */ fprintf(fp, "%ld", resp->ru.ru_inblock); break; case 'K': /* Average mem usage == data+stack+text. */ fprintf(fp, "%lu", MSEC_TO_TICKS(v) == 0 ? 0 : ptok((UL) resp->ru.ru_idrss) / MSEC_TO_TICKS(v) + ptok((UL) resp->ru.ru_isrss) / MSEC_TO_TICKS(v) + ptok((UL) resp->ru.ru_ixrss) / MSEC_TO_TICKS(v)); break; case 'M': /* Maximum resident set size. */ fprintf(fp, "%lu", ptok((UL) resp->ru.ru_maxrss)); break; case 'O': /* Outputs. */ fprintf(fp, "%ld", resp->ru.ru_oublock); break; case 'P': /* Percent of CPU this job got. */ /* % cpu is (total cpu time)/(elapsed time). */ if (r > 0) fprintf(fp, "%lu%%", (v * 100 / r)); else fprintf(fp, "?%%"); break; case 'R': /* Minor page faults (reclaims). */ fprintf(fp, "%ld", resp->ru.ru_minflt); break; case 'S': /* System time. */ fprintf(fp, "%ld.%02ld", resp->ru.ru_stime.tv_sec, resp->ru.ru_stime.TV_MSEC / 10); break; case 'T': /* System time. */ if (resp->ru.ru_stime.tv_sec >= 3600) /* One hour -> h:m:s. */ fprintf(fp, "%ldh %ldm %02lds", resp->ru.ru_stime.tv_sec / 3600, (resp->ru.ru_stime.tv_sec % 3600) / 60, resp->ru.ru_stime.tv_sec % 60); else fprintf(fp, "%ldm %ld.%02lds", /* -> m:s. */ resp->ru.ru_stime.tv_sec / 60, resp->ru.ru_stime.tv_sec % 60, resp->ru.ru_stime.tv_usec / 10000); break; case 'U': /* User time. */ fprintf(fp, "%ld.%02ld", resp->ru.ru_utime.tv_sec, resp->ru.ru_utime.TV_MSEC / 10); break; case 'u': /* User time. */ if (resp->ru.ru_utime.tv_sec >= 3600) /* One hour -> h:m:s. */ fprintf(fp, "%ldh %ldm %02lds", resp->ru.ru_utime.tv_sec / 3600, (resp->ru.ru_utime.tv_sec % 3600) / 60, resp->ru.ru_utime.tv_sec % 60); else fprintf(fp, "%ldm %ld.%02lds", /* -> m:s. */ resp->ru.ru_utime.tv_sec / 60, resp->ru.ru_utime.tv_sec % 60, resp->ru.ru_utime.tv_usec / 10000); break; case 'W': /* Times swapped out. */ fprintf(fp, "%ld", resp->ru.ru_nswap); break; case 'X': /* Average shared text size. */ fprintf(fp, "%lu", MSEC_TO_TICKS(v) == 0 ? 0 : ptok((UL) resp->ru.ru_ixrss) / MSEC_TO_TICKS(v)); break; case 'Z': /* Page size. */ fprintf(fp, "%d", getpagesize()); break; case 'c': /* Involuntary context switches. */ fprintf(fp, "%ld", resp->ru.ru_nivcsw); break; case 'e': /* Elapsed real time in seconds. */ fprintf(fp, "%ld.%02ld", resp->elapsed.tv_sec, resp->elapsed.tv_usec / 10000); break; case 'k': /* Signals delivered. */ fprintf(fp, "%ld", resp->ru.ru_nsignals); break; case 'p': /* Average stack segment. */ fprintf(fp, "%lu", MSEC_TO_TICKS(v) == 0 ? 0 : ptok((UL) resp->ru.ru_isrss) / MSEC_TO_TICKS(v)); break; case 'r': /* Incoming socket messages received. */ fprintf(fp, "%ld", resp->ru.ru_msgrcv); break; case 's': /* Outgoing socket messages sent. */ fprintf(fp, "%ld", resp->ru.ru_msgsnd); break; case 't': /* Average resident set size. */ fprintf(fp, "%lu", MSEC_TO_TICKS(v) == 0 ? 0 : ptok((UL) resp->ru.ru_idrss) / MSEC_TO_TICKS(v)); break; case 'w': /* Voluntary context switches. */ fprintf(fp, "%ld", resp->ru.ru_nvcsw); break; case 'x': /* Exit status. */ fprintf(fp, "%d", WEXITSTATUS(resp->waitstatus)); break; case '\0': putc('?', fp); return; default: putc('?', fp); putc(*fmt, fp); } ++fmt; break; case '\\': /* Format escape. */ switch (*++fmt) { case 't': putc('\t', fp); break; case 'n': putc('\n', fp); break; case '\\': putc('\\', fp); break; default: putc('?', fp); putc('\\', fp); putc(*fmt, fp); } ++fmt; break; default: putc(*fmt++, fp); } if (ferror(fp)) bb_error_msg_and_die(bb_msg_write_error); } putc('\n', fp); if (ferror(fp)) bb_error_msg_and_die(bb_msg_write_error); }
static void summarize(const char *fmt, char **command, resource_t *resp) { unsigned vv_ms; /* Elapsed virtual (CPU) milliseconds */ unsigned cpu_ticks; /* Same, in "CPU ticks" */ unsigned pagesize = getpagesize(); /* Impossible: we do not use WUNTRACED flag in wait()... if (WIFSTOPPED(resp->waitstatus)) printf("Command stopped by signal %u\n", WSTOPSIG(resp->waitstatus)); else */ if (WIFSIGNALED(resp->waitstatus)) printf("Command terminated by signal %u\n", WTERMSIG(resp->waitstatus)); else if (WIFEXITED(resp->waitstatus) && WEXITSTATUS(resp->waitstatus)) printf("Command exited with non-zero status %u\n", WEXITSTATUS(resp->waitstatus)); vv_ms = (resp->ru.ru_utime.tv_sec + resp->ru.ru_stime.tv_sec) * 1000 + (resp->ru.ru_utime.tv_usec + resp->ru.ru_stime.tv_usec) / 1000; #if (1000 / TICKS_PER_SEC) * TICKS_PER_SEC == 1000 /* 1000 is exactly divisible by TICKS_PER_SEC (typical) */ cpu_ticks = vv_ms / (1000 / TICKS_PER_SEC); #else cpu_ticks = vv_ms * (unsigned long long)TICKS_PER_SEC / 1000; #endif if (!cpu_ticks) cpu_ticks = 1; /* we divide by it, must be nonzero */ while (*fmt) { /* Handle leading literal part */ int n = strcspn(fmt, "%\\"); if (n) { printf("%.*s", n, fmt); fmt += n; continue; } switch (*fmt) { #ifdef NOT_NEEDED /* Handle literal char */ /* Usually we optimize for size, but there is a limit * for everything. With this we do a lot of 1-byte writes */ default: bb_putchar(*fmt); break; #endif case '%': switch (*++fmt) { #ifdef NOT_NEEDED_YET /* Our format strings do not have these */ /* and we do not take format str from user */ default: bb_putchar('%'); /*FALLTHROUGH*/ case '%': if (!*fmt) goto ret; bb_putchar(*fmt); break; #endif case 'C': /* The command that got timed. */ printargv(command); break; case 'D': /* Average unshared data size. */ printf("%lu", (ptok(pagesize, (UL) resp->ru.ru_idrss) + ptok(pagesize, (UL) resp->ru.ru_isrss)) / cpu_ticks); break; case 'E': { /* Elapsed real (wall clock) time. */ unsigned seconds = resp->elapsed_ms / 1000; if (seconds >= 3600) /* One hour -> h:m:s. */ printf("%uh %um %02us", seconds / 3600, (seconds % 3600) / 60, seconds % 60); else printf("%um %u.%02us", /* -> m:s. */ seconds / 60, seconds % 60, (unsigned)(resp->elapsed_ms / 10) % 100); break; } case 'F': /* Major page faults. */ printf("%lu", resp->ru.ru_majflt); break; case 'I': /* Inputs. */ printf("%lu", resp->ru.ru_inblock); break; case 'K': /* Average mem usage == data+stack+text. */ printf("%lu", (ptok(pagesize, (UL) resp->ru.ru_idrss) + ptok(pagesize, (UL) resp->ru.ru_isrss) + ptok(pagesize, (UL) resp->ru.ru_ixrss)) / cpu_ticks); break; case 'M': /* Maximum resident set size. */ printf("%lu", ptok(pagesize, (UL) resp->ru.ru_maxrss)); break; case 'O': /* Outputs. */ printf("%lu", resp->ru.ru_oublock); break; case 'P': /* Percent of CPU this job got. */ /* % cpu is (total cpu time)/(elapsed time). */ if (resp->elapsed_ms > 0) printf("%u%%", (unsigned)(vv_ms * 100 / resp->elapsed_ms)); else printf("?%%"); break; case 'R': /* Minor page faults (reclaims). */ printf("%lu", resp->ru.ru_minflt); break; case 'S': /* System time. */ printf("%u.%02u", (unsigned)resp->ru.ru_stime.tv_sec, (unsigned)(resp->ru.ru_stime.tv_usec / 10000)); break; case 'T': /* System time. */ if (resp->ru.ru_stime.tv_sec >= 3600) /* One hour -> h:m:s. */ printf("%uh %um %02us", (unsigned)(resp->ru.ru_stime.tv_sec / 3600), (unsigned)(resp->ru.ru_stime.tv_sec % 3600) / 60, (unsigned)(resp->ru.ru_stime.tv_sec % 60)); else printf("%um %u.%02us", /* -> m:s. */ (unsigned)(resp->ru.ru_stime.tv_sec / 60), (unsigned)(resp->ru.ru_stime.tv_sec % 60), (unsigned)(resp->ru.ru_stime.tv_usec / 10000)); break; case 'U': /* User time. */ printf("%u.%02u", (unsigned)resp->ru.ru_utime.tv_sec, (unsigned)(resp->ru.ru_utime.tv_usec / 10000)); break; case 'u': /* User time. */ if (resp->ru.ru_utime.tv_sec >= 3600) /* One hour -> h:m:s. */ printf("%uh %um %02us", (unsigned)(resp->ru.ru_utime.tv_sec / 3600), (unsigned)(resp->ru.ru_utime.tv_sec % 3600) / 60, (unsigned)(resp->ru.ru_utime.tv_sec % 60)); else printf("%um %u.%02us", /* -> m:s. */ (unsigned)(resp->ru.ru_utime.tv_sec / 60), (unsigned)(resp->ru.ru_utime.tv_sec % 60), (unsigned)(resp->ru.ru_utime.tv_usec / 10000)); break; case 'W': /* Times swapped out. */ printf("%lu", resp->ru.ru_nswap); break; case 'X': /* Average shared text size. */ printf("%lu", ptok(pagesize, (UL) resp->ru.ru_ixrss) / cpu_ticks); break; case 'Z': /* Page size. */ printf("%u", pagesize); break; case 'c': /* Involuntary context switches. */ printf("%lu", resp->ru.ru_nivcsw); break; case 'e': /* Elapsed real time in seconds. */ printf("%u.%02u", (unsigned)resp->elapsed_ms / 1000, (unsigned)(resp->elapsed_ms / 10) % 100); break; case 'k': /* Signals delivered. */ printf("%lu", resp->ru.ru_nsignals); break; case 'p': /* Average stack segment. */ printf("%lu", ptok(pagesize, (UL) resp->ru.ru_isrss) / cpu_ticks); break; case 'r': /* Incoming socket messages received. */ printf("%lu", resp->ru.ru_msgrcv); break; case 's': /* Outgoing socket messages sent. */ printf("%lu", resp->ru.ru_msgsnd); break; case 't': /* Average resident set size. */ printf("%lu", ptok(pagesize, (UL) resp->ru.ru_idrss) / cpu_ticks); break; case 'w': /* Voluntary context switches. */ printf("%lu", resp->ru.ru_nvcsw); break; case 'x': /* Exit status. */ printf("%u", WEXITSTATUS(resp->waitstatus)); break; } break; #ifdef NOT_NEEDED_YET case '\\': /* Format escape. */ switch (*++fmt) { default: bb_putchar('\\'); /*FALLTHROUGH*/ case '\\': if (!*fmt) goto ret; bb_putchar(*fmt); break; case 't': bb_putchar('\t'); break; case 'n': bb_putchar('\n'); break; } break; #endif } ++fmt; } /* ret: */ bb_putchar('\n'); }
unsigned char * var_extensible_vmstat(struct variable *vp, oid * name, size_t * length, int exact, size_t * var_len, WriteMethod ** write_method) { int loop; time_t time_new = getuptime(); static time_t time_old; static time_t time_diff; #if defined(KERN_CP_TIME) static uint64_t cpu_old[CPUSTATES]; static uint64_t cpu_new[CPUSTATES]; static uint64_t cpu_diff[CPUSTATES]; static uint64_t cpu_total; #elif defined(KERN_CPTIME) static long cpu_old[CPUSTATES]; static long cpu_new[CPUSTATES]; static long cpu_diff[CPUSTATES]; static long cpu_total; #else static long cpu_old[CPUSTATES]; static long cpu_new[CPUSTATES]; static long cpu_diff[CPUSTATES]; static long cpu_total; #endif long cpu_sum; double cpu_prc; static struct uvmexp mem_old, mem_new; int mem_mib[] = { CTL_VM, VM_UVMEXP }; int mem_size = sizeof(struct uvmexp); static long long_ret; static char errmsg[300]; long_ret = 0; /* set to 0 as default */ if (header_generic(vp, name, length, exact, var_len, write_method)) return (NULL); /* * Update structures (only if time has passed) */ if (time_new != time_old) { #ifdef KERN_CP_TIME int mib[2] = { CTL_KERN, KERN_CP_TIME }; int ssize = sizeof(cpu_new); if (sysctl(mib, 2, cpu_new, &ssize, NULL, 0) < 0) memset(cpu_new, 0, sizeof(cpu_new)); #elif defined(KERN_CPTIME) int mib[2] = { CTL_KERN, KERN_CPTIME }; int ssize = sizeof(cpu_new); if (sysctl(mib, 2, cpu_new, &ssize, NULL, 0) < 0) memset(cpu_new, 0, sizeof(cpu_new)); #else /* * CPU usage */ auto_nlist(CPTIME_SYMBOL, (char *) cpu_new, sizeof(cpu_new)); #endif time_diff = time_new - time_old; time_old = time_new; cpu_total = 0; for (loop = 0; loop < CPUSTATES; loop++) { cpu_diff[loop] = cpu_new[loop] - cpu_old[loop]; cpu_old[loop] = cpu_new[loop]; cpu_total += cpu_diff[loop]; } if (cpu_total == 0) cpu_total = 1; /* * Memory info */ mem_old = mem_new; sysctl(mem_mib, 2, &mem_new, &mem_size, NULL, 0); } /* * Rate macro */ #define rate(x) (((x)+ time_diff/2) / time_diff) /* * Page-to-kb macro */ #define ptok(p) ((p) * (mem_new.pagesize >> 10)) switch (vp->magic) { case MIBINDEX: long_ret = 1; return ((u_char *) (&long_ret)); case ERRORNAME: /* dummy name */ sprintf(errmsg, "systemStats"); *var_len = strlen(errmsg); return ((u_char *) (errmsg)); case SWAPIN: long_ret = ptok(mem_new.swapins - mem_old.swapins); long_ret = rate(long_ret); return ((u_char *) (&long_ret)); case SWAPOUT: long_ret = ptok(mem_new.swapouts - mem_old.swapouts); long_ret = rate(long_ret); return ((u_char *) (&long_ret)); case IOSENT: #if NETSNMP_NO_DUMMY_VALUES return NULL; #endif long_ret = -1; return ((u_char *) (&long_ret)); case IORECEIVE: #if NETSNMP_NO_DUMMY_VALUES return NULL; #endif long_ret = -1; return ((u_char *) (&long_ret)); case SYSINTERRUPTS: long_ret = rate(mem_new.intrs - mem_old.intrs); return ((u_char *) (&long_ret)); case SYSCONTEXT: long_ret = rate(mem_new.swtch - mem_old.swtch); return ((u_char *) (&long_ret)); case CPUUSER: cpu_sum = cpu_diff[CP_USER] + cpu_diff[CP_NICE]; cpu_prc = (float) cpu_sum / (float) cpu_total; long_ret = cpu_prc * CPU_PRC; return ((u_char *) (&long_ret)); case CPUSYSTEM: cpu_sum = cpu_diff[CP_SYS] + cpu_diff[CP_INTR]; cpu_prc = (float) cpu_sum / (float) cpu_total; long_ret = cpu_prc * CPU_PRC; return ((u_char *) (&long_ret)); case CPUIDLE: cpu_sum = cpu_diff[CP_IDLE]; cpu_prc = (float) cpu_sum / (float) cpu_total; long_ret = cpu_prc * CPU_PRC; return ((u_char *) (&long_ret)); case CPURAWUSER: long_ret = cpu_new[CP_USER]; return ((u_char *) (&long_ret)); case CPURAWNICE: long_ret = cpu_new[CP_NICE]; return ((u_char *) (&long_ret)); case CPURAWSYSTEM: long_ret = cpu_new[CP_SYS] + cpu_new[CP_INTR]; return ((u_char *) (&long_ret)); case CPURAWIDLE: long_ret = cpu_new[CP_IDLE]; return ((u_char *) (&long_ret)); case CPURAWKERNEL: long_ret = cpu_new[CP_SYS]; return ((u_char *) (&long_ret)); case CPURAWINTR: long_ret = cpu_new[CP_INTR]; return ((u_char *) (&long_ret)); /* * reserved for future use */ /* * case ERRORFLAG: * return((u_char *) (&long_ret)); * case ERRORMSG: * return((u_char *) (&long_ret)); */ } return NULL; }
static void summarize(const char *fmt, char **command, resource_t * resp) { unsigned long r; /* Elapsed real milliseconds. */ unsigned long v; /* Elapsed virtual (CPU) milliseconds. */ if (WIFSTOPPED(resp->waitstatus)) printf("Command stopped by signal %d\n", WSTOPSIG(resp->waitstatus)); else if (WIFSIGNALED(resp->waitstatus)) printf("Command terminated by signal %d\n", WTERMSIG(resp->waitstatus)); else if (WIFEXITED(resp->waitstatus) && WEXITSTATUS(resp->waitstatus)) printf("Command exited with non-zero status %d\n", WEXITSTATUS(resp->waitstatus)); /* Convert all times to milliseconds. Occasionally, one of these values comes out as zero. Dividing by zero causes problems, so we first check the time value. If it is zero, then we take `evasive action' instead of calculating a value. */ r = resp->elapsed.tv_sec * 1000 + resp->elapsed.tv_usec / 1000; v = resp->ru.ru_utime.tv_sec * 1000 + resp->ru.ru_utime.TV_MSEC + resp->ru.ru_stime.tv_sec * 1000 + resp->ru.ru_stime.TV_MSEC; /* putchar() != putc(stdout) in glibc! */ while (*fmt) { /* Handle leading literal part */ int n = strcspn(fmt, "%\\"); if (n) { printf("%.*s", n, fmt); fmt += n; continue; } switch (*fmt) { #ifdef NOT_NEEDED /* Handle literal char */ /* Usually we optimize for size, but there is a limit * for everything. With this we do a lot of 1-byte writes */ default: putc(*fmt, stdout); break; #endif case '%': switch (*++fmt) { #ifdef NOT_NEEDED_YET /* Our format strings do not have these */ /* and we do not take format str from user */ default: putc('%', stdout); /*FALLTHROUGH*/ case '%': if (!*fmt) goto ret; putc(*fmt, stdout); break; #endif case 'C': /* The command that got timed. */ printargv(command, " "); break; case 'D': /* Average unshared data size. */ printf("%lu", MSEC_TO_TICKS(v) == 0 ? 0 : ptok((UL) resp->ru.ru_idrss) / MSEC_TO_TICKS(v) + ptok((UL) resp->ru.ru_isrss) / MSEC_TO_TICKS(v)); break; case 'E': /* Elapsed real (wall clock) time. */ if (resp->elapsed.tv_sec >= 3600) /* One hour -> h:m:s. */ printf("%ldh %ldm %02lds", resp->elapsed.tv_sec / 3600, (resp->elapsed.tv_sec % 3600) / 60, resp->elapsed.tv_sec % 60); else printf("%ldm %ld.%02lds", /* -> m:s. */ resp->elapsed.tv_sec / 60, resp->elapsed.tv_sec % 60, resp->elapsed.tv_usec / 10000); break; case 'F': /* Major page faults. */ printf("%ld", resp->ru.ru_majflt); break; case 'I': /* Inputs. */ printf("%ld", resp->ru.ru_inblock); break; case 'K': /* Average mem usage == data+stack+text. */ printf("%lu", MSEC_TO_TICKS(v) == 0 ? 0 : ptok((UL) resp->ru.ru_idrss) / MSEC_TO_TICKS(v) + ptok((UL) resp->ru.ru_isrss) / MSEC_TO_TICKS(v) + ptok((UL) resp->ru.ru_ixrss) / MSEC_TO_TICKS(v)); break; case 'M': /* Maximum resident set size. */ printf("%lu", ptok((UL) resp->ru.ru_maxrss)); break; case 'O': /* Outputs. */ printf("%ld", resp->ru.ru_oublock); break; case 'P': /* Percent of CPU this job got. */ /* % cpu is (total cpu time)/(elapsed time). */ if (r > 0) printf("%lu%%", (v * 100 / r)); else printf("?%%"); break; case 'R': /* Minor page faults (reclaims). */ printf("%ld", resp->ru.ru_minflt); break; case 'S': /* System time. */ printf("%ld.%02ld", resp->ru.ru_stime.tv_sec, resp->ru.ru_stime.TV_MSEC / 10); break; case 'T': /* System time. */ if (resp->ru.ru_stime.tv_sec >= 3600) /* One hour -> h:m:s. */ printf("%ldh %ldm %02lds", resp->ru.ru_stime.tv_sec / 3600, (resp->ru.ru_stime.tv_sec % 3600) / 60, resp->ru.ru_stime.tv_sec % 60); else printf("%ldm %ld.%02lds", /* -> m:s. */ resp->ru.ru_stime.tv_sec / 60, resp->ru.ru_stime.tv_sec % 60, resp->ru.ru_stime.tv_usec / 10000); break; case 'U': /* User time. */ printf("%ld.%02ld", resp->ru.ru_utime.tv_sec, resp->ru.ru_utime.TV_MSEC / 10); break; case 'u': /* User time. */ if (resp->ru.ru_utime.tv_sec >= 3600) /* One hour -> h:m:s. */ printf("%ldh %ldm %02lds", resp->ru.ru_utime.tv_sec / 3600, (resp->ru.ru_utime.tv_sec % 3600) / 60, resp->ru.ru_utime.tv_sec % 60); else printf("%ldm %ld.%02lds", /* -> m:s. */ resp->ru.ru_utime.tv_sec / 60, resp->ru.ru_utime.tv_sec % 60, resp->ru.ru_utime.tv_usec / 10000); break; case 'W': /* Times swapped out. */ printf("%ld", resp->ru.ru_nswap); break; case 'X': /* Average shared text size. */ printf("%lu", MSEC_TO_TICKS(v) == 0 ? 0 : ptok((UL) resp->ru.ru_ixrss) / MSEC_TO_TICKS(v)); break; case 'Z': /* Page size. */ printf("%d", getpagesize()); break; case 'c': /* Involuntary context switches. */ printf("%ld", resp->ru.ru_nivcsw); break; case 'e': /* Elapsed real time in seconds. */ printf("%ld.%02ld", resp->elapsed.tv_sec, resp->elapsed.tv_usec / 10000); break; case 'k': /* Signals delivered. */ printf("%ld", resp->ru.ru_nsignals); break; case 'p': /* Average stack segment. */ printf("%lu", MSEC_TO_TICKS(v) == 0 ? 0 : ptok((UL) resp->ru.ru_isrss) / MSEC_TO_TICKS(v)); break; case 'r': /* Incoming socket messages received. */ printf("%ld", resp->ru.ru_msgrcv); break; case 's': /* Outgoing socket messages sent. */ printf("%ld", resp->ru.ru_msgsnd); break; case 't': /* Average resident set size. */ printf("%lu", MSEC_TO_TICKS(v) == 0 ? 0 : ptok((UL) resp->ru.ru_idrss) / MSEC_TO_TICKS(v)); break; case 'w': /* Voluntary context switches. */ printf("%ld", resp->ru.ru_nvcsw); break; case 'x': /* Exit status. */ printf("%d", WEXITSTATUS(resp->waitstatus)); break; } break; #ifdef NOT_NEEDED_YET case '\\': /* Format escape. */ switch (*++fmt) { default: putc('\\', stdout); /*FALLTHROUGH*/ case '\\': if (!*fmt) goto ret; putc(*fmt, stdout); break; case 't': putc('\t', stdout); break; case 'n': putc('\n', stdout); break; } break; #endif } ++fmt; } /* ret: */ putc('\n', stdout); }
static unsigned char *var_extensible_mem (struct variable *vp, oid * name, size_t * length, int exact, size_t * var_len, WriteMethod ** write_method) { static long long_ret; static char errmsg[1024]; static struct uvmexp uvmexp; int uvmexp_size = sizeof (uvmexp); int uvmexp_mib[] = { CTL_VM, VM_UVMEXP }; static struct vmtotal total; size_t total_size = sizeof (total); int total_mib[] = { CTL_VM, VM_METER }; long phys_mem; size_t phys_mem_size = sizeof (phys_mem); int phys_mem_mib[] = { CTL_HW, HW_PHYSMEM }; if (header_generic (vp, name, length, exact, var_len, write_method)) return (NULL); /* * Memory info */ sysctl (uvmexp_mib, 2, &uvmexp, &uvmexp_size, NULL, 0); sysctl (total_mib, 2, &total, &total_size, NULL, 0); /* * Physical memory */ sysctl (phys_mem_mib, 2, &phys_mem, &phys_mem_size, NULL, 0); long_ret = 0; /* set to 0 as default */ /* * Page-to-kb macro */ #define ptok(p) ((p) * (uvmexp.pagesize >> 10)) switch (vp->magic) { case MIBINDEX: long_ret = 0; return ((u_char *) (&long_ret)); case ERRORNAME: /* dummy name */ sprintf (errmsg, "swap"); *var_len = strlen (errmsg); return ((u_char *) (errmsg)); case MEMTOTALSWAP: long_ret = ptok (uvmexp.swpages); return ((u_char *) (&long_ret)); case MEMAVAILSWAP: /* FREE swap memory */ long_ret = ptok (uvmexp.swpages - uvmexp.swpginuse); return ((u_char *) (&long_ret)); case MEMTOTALREAL: long_ret = phys_mem >> 10; return ((u_char *) (&long_ret)); case MEMAVAILREAL: /* FREE real memory */ long_ret = ptok (uvmexp.free); return ((u_char *) (&long_ret)); /* * these are not implemented */ case MEMTOTALSWAPTXT: case MEMUSEDSWAPTXT: case MEMTOTALREALTXT: case MEMUSEDREALTXT: #if NETSNMP_NO_DUMMY_VALUES return NULL; #endif long_ret = -1; return ((u_char *) (&long_ret)); case MEMTOTALFREE: long_ret = ptok ((int) total.t_free); return ((u_char *) (&long_ret)); case MEMSWAPMINIMUM: long_ret = minimumswap; return ((u_char *) (&long_ret)); case MEMSHARED: return ((u_char *) (&long_ret)); case MEMBUFFER: return NULL; case MEMCACHED: return NULL; case ERRORFLAG: long_ret = (swapFree > minimumswap) ? 0 : 1; return ((u_char *) (&long_ret)); case ERRORMSG: if (swapFree < minimumswap) sprintf (errmsg, "Running out of swap space (%qd)", swapFree); else errmsg[0] = 0; *var_len = strlen (errmsg); return ((u_char *) (errmsg)); } return NULL; }
static unsigned char * var_extensible_mem(struct variable *vp, oid * name, size_t * length, int exact, size_t * var_len, WriteMethod ** write_method) { static long long_ret; static char errmsg[1024]; #ifdef dragonfly static struct vmstats mem; size_t vmstats_size = sizeof(mem); #endif static struct vmmeter mem; #endif static struct vmtotal total; size_t total_size = sizeof(total); int total_mib[] = { CTL_VM, VM_METER }; u_long phys_mem; size_t phys_mem_size = sizeof(phys_mem); int phys_mem_mib[] = { CTL_HW, HW_PHYSMEM }; #ifdef BUFSPACE_SYMBOL long bufspace; #endif if (header_generic(vp, name, length, exact, var_len, write_method)) return (NULL); /* * Memory info */ #ifdef dragonfly sysctlbyname("vm.vmstats", &vmstats, &vmstats_size, NULL, 0); #else auto_nlist(SUM_SYMBOL, (char *) &mem, sizeof(mem)); #endif sysctl(total_mib, 2, &total, &total_size, NULL, 0); /* * Swap info */ swapmode(); /* * getSwap(); */ /* * Physical memory */ sysctl(phys_mem_mib, 2, &phys_mem, &phys_mem_size, NULL, 0); #ifdef BUFSPACE_SYMBOL /* * Buffer space */ auto_nlist(BUFSPACE_SYMBOL, (char *) &bufspace, sizeof(bufspace)); #endif long_ret = 0; /* set to 0 as default */ /* * Page-to-kb macro */ #define ptok(p) ((p) * (mem.v_page_size >> 10)) switch (vp->magic) { case MIBINDEX: long_ret = 0; return ((u_char *) (&long_ret)); case ERRORNAME: /* dummy name */ sprintf(errmsg, "swap"); *var_len = strlen(errmsg); return ((u_char *) (errmsg)); case MEMTOTALSWAP: long_ret = swapTotal; return ((u_char *) (&long_ret)); case MEMAVAILSWAP: /* FREE swap memory */ long_ret = swapFree; return ((u_char *) (&long_ret)); case MEMTOTALREAL: long_ret = phys_mem >> 10; return ((u_char *) (&long_ret)); case MEMAVAILREAL: /* FREE real memory */ long_ret = ptok(mem.v_free_count); return ((u_char *) (&long_ret)); /* * these are not implemented */ case MEMTOTALSWAPTXT: case MEMUSEDSWAPTXT: case MEMTOTALREALTXT: case MEMUSEDREALTXT: #if NETSNMP_NO_DUMMY_VALUES return NULL; #endif long_ret = -1; return ((u_char *) (&long_ret)); case MEMTOTALFREE: long_ret = ptok((int) total.t_free); return ((u_char *) (&long_ret)); case MEMSWAPMINIMUM: long_ret = minimumswap; return ((u_char *) (&long_ret)); case MEMSHARED: long_ret = ptok(total.t_vmshr + total.t_avmshr + total.t_rmshr + total.t_armshr); return ((u_char *) (&long_ret)); #ifdef BUFSPACE_SYMBOL case MEMBUFFER: long_ret = bufspace >> 10; return ((u_char *) (&long_ret)); #endif #ifndef openbsd2 case MEMCACHED: #ifdef darwin long_ret = ptok(mem.v_lookups); #elif defined(dragonfly) long_ret = ptok(mem.v_cache_count); #else long_ret = ptok(mem.v_cache_count) + ptok(mem.v_inactive_count); #endif return ((u_char *) (&long_ret)); #endif case ERRORFLAG: long_ret = (swapFree > minimumswap) ? 0 : 1; return ((u_char *) (&long_ret)); case ERRORMSG: if (swapFree < minimumswap) sprintf(errmsg, "Running out of swap space (%qd)", swapFree); else errmsg[0] = 0; *var_len = strlen(errmsg); return ((u_char *) (errmsg)); } return NULL; }
unsigned char * var_extensible_vmstat(struct variable *vp, oid * name, size_t * length, int exact, size_t * var_len, WriteMethod ** write_method) { int loop; time_t time_new = getuptime(); static time_t time_old; static time_t time_diff; /* static long cpu_old[CPUSTATES]; static long cpu_new[CPUSTATES]; static long cpu_diff[CPUSTATES]; */ static long cpu_total; long cpu_sum; double cpu_prc; static struct vmmeter mem_old, mem_new; static long long_ret; static char errmsg[300]; long_ret = 0; /* set to 0 as default */ if (header_generic(vp, name, length, exact, var_len, write_method)) return (NULL); /* * Update structures (only if time has passed) * we only update every 30 seconds so that we don't * get strange results, especially with cpu information */ if (time_new > time_old + 30) { time_diff = time_new - time_old; time_old = time_new; /* * CPU usage */ /* auto_nlist(CPTIME_SYMBOL, (char *) cpu_new, sizeof(cpu_new)); */ cpu_total = 0; /* for (loop = 0; loop < CPUSTATES; loop++) { cpu_diff[loop] = cpu_new[loop] - cpu_old[loop]; cpu_old[loop] = cpu_new[loop]; cpu_total += cpu_diff[loop]; } */ if (cpu_total == 0) cpu_total = 1; /* * Memory info */ mem_old = mem_new; auto_nlist(SUM_SYMBOL, (char *) &mem_new, sizeof(mem_new)); } /* * Rate macro */ #define rate(x) (((x)+ time_diff/2) / time_diff) /* * Page-to-kb macro */ #define ptok(p) ((p) * (mem_new.v_page_size >> 10)) switch (vp->magic) { case MIBINDEX: long_ret = 1; return ((u_char *) (&long_ret)); case ERRORNAME: /* dummy name */ sprintf(errmsg, "systemStats"); *var_len = strlen(errmsg); return ((u_char *) (errmsg)); case SWAPIN: #if defined(openbsd2) || defined(darwin) long_ret = ptok(mem_new.v_swpin - mem_old.v_swpin); #else long_ret = ptok(mem_new.v_swappgsin - mem_old.v_swappgsin + mem_new.v_vnodepgsin - mem_old.v_vnodepgsin); #endif long_ret = rate(long_ret); return ((u_char *) (&long_ret)); case SWAPOUT: #if defined(openbsd2) || defined(darwin) long_ret = ptok(mem_new.v_swpout - mem_old.v_swpout); #else long_ret = ptok(mem_new.v_swappgsout - mem_old.v_swappgsout + mem_new.v_vnodepgsout - mem_old.v_vnodepgsout); #endif long_ret = rate(long_ret); return ((u_char *) (&long_ret)); case IOSENT: #if NO_DUMMY_VALUES return NULL; #endif long_ret = -1; return ((u_char *) (&long_ret)); case IORECEIVE: #if NO_DUMMY_VALUES return NULL; #endif long_ret = -1; return ((u_char *) (&long_ret)); case SYSINTERRUPTS: long_ret = rate(mem_new.v_intr - mem_old.v_intr); return ((u_char *) (&long_ret)); case SYSCONTEXT: long_ret = rate(mem_new.v_swtch - mem_old.v_swtch); return ((u_char *) (&long_ret)); case CPUUSER: /* cpu_sum = cpu_diff[CP_USER] + cpu_diff[CP_NICE]; cpu_prc = (float) cpu_sum / (float) cpu_total; long_ret = cpu_prc * CPU_PRC; */ return ((u_char *) (&long_ret)); case CPUSYSTEM: /* cpu_sum = cpu_diff[CP_SYS] + cpu_diff[CP_INTR]; cpu_prc = (float) cpu_sum / (float) cpu_total; long_ret = cpu_prc * CPU_PRC; */ return ((u_char *) (&long_ret)); case CPUIDLE: /* cpu_sum = cpu_diff[CP_IDLE]; cpu_prc = (float) cpu_sum / (float) cpu_total; long_ret = cpu_prc * CPU_PRC; */ return ((u_char *) (&long_ret)); case CPURAWUSER: /* long_ret = cpu_new[CP_USER]; */ return ((u_char *) (&long_ret)); case CPURAWNICE: /* long_ret = cpu_new[CP_NICE]; */ return ((u_char *) (&long_ret)); case CPURAWSYSTEM: /* long_ret = cpu_new[CP_SYS] + cpu_new[CP_INTR]; */ return ((u_char *) (&long_ret)); case CPURAWIDLE: /* long_ret = cpu_new[CP_IDLE]; */ return ((u_char *) (&long_ret)); case CPURAWKERNEL: /* long_ret = cpu_new[CP_SYS]; */ return ((u_char *) (&long_ret)); case CPURAWINTR: /* long_ret = cpu_new[CP_INTR]; */ return ((u_char *) (&long_ret)); case SYSRAWINTERRUPTS: long_ret = mem_new.v_intr; return ((u_char *) (&long_ret)); case SYSRAWCONTEXT: long_ret = mem_new.v_swtch; return ((u_char *) (&long_ret)); /* * reserved for future use */ /* * case ERRORFLAG: * return((u_char *) (&long_ret)); * case ERRORMSG: * return((u_char *) (&long_ret)); */ } return NULL; }