1/* This is a trivial uptime program. I hereby release this program 2 * into the public domain. I disclaim any responsibility for this 3 * program --- use it at your own risk. (as if there were any.. ;-) 4 * -michaelkjohnson (johnsonm@sunsite.unc.edu) 5 * 6 * Modified by Larry Greenfield to give a more traditional output, 7 * count users, etc. (greenfie@gauss.rutgers.edu) 8 * 9 * Modified by mkj again to fix a few tiny buglies. 10 * 11 * Modified by J. Cowley to add printing the uptime message to a 12 * string (for top) and to optimize file handling. 19 Mar 1993. 13 * 14 */ 15 16#include <stdio.h> 17#include <stdlib.h> 18#include <string.h> 19#include <fcntl.h> 20#include <unistd.h> 21#include <time.h> 22#include <utmp.h> 23#include <sys/ioctl.h> 24#include "whattime.h" 25#include "sysinfo.h" 26 27static char buf[128]; 28static double av[3]; 29 30char *sprint_uptime(void) 31{ 32 struct utmp *utmpstruct; 33 int upminutes, uphours, updays; 34 int pos; 35 struct tm *realtime; 36 time_t realseconds; 37 int numuser; 38 double uptime_secs, idle_secs; 39 40/* first get the current time */ 41 42 time(&realseconds); 43 realtime = localtime(&realseconds); 44 pos = sprintf(buf, " %02d:%02d:%02d ", 45 realtime->tm_hour, realtime->tm_min, realtime->tm_sec); 46 47/* read and calculate the amount of uptime */ 48 49 uptime(&uptime_secs, &idle_secs); 50 51 updays = (int)uptime_secs / (60 * 60 * 24); 52 strcat(buf, "up "); 53 pos += 3; 54 if (updays) 55 pos += 56 sprintf(buf + pos, "%d day%s, ", updays, 57 (updays != 1) ? "s" : ""); 58 upminutes = (int)uptime_secs / 60; 59 uphours = upminutes / 60; 60 uphours = uphours % 24; 61 upminutes = upminutes % 60; 62 if (uphours) 63 pos += sprintf(buf + pos, "%2d:%02d, ", uphours, upminutes); 64 else 65 pos += sprintf(buf + pos, "%d min, ", upminutes); 66 67/* count the number of users */ 68 69 numuser = 0; 70 setutent(); 71 while ((utmpstruct = getutent())) { 72 if ((utmpstruct->ut_type == USER_PROCESS) && 73 (utmpstruct->ut_name[0] != '\0')) 74 numuser++; 75 } 76 endutent(); 77 78 pos += 79 sprintf(buf + pos, "%2d user%s, ", numuser, 80 numuser == 1 ? "" : "s"); 81 82 loadavg(&av[0], &av[1], &av[2]); 83 84 pos += sprintf(buf + pos, " load average: %.2f, %.2f, %.2f", 85 av[0], av[1], av[2]); 86 87 return buf; 88} 89 90void print_uptime(void) 91{ 92 printf("%s\n", sprint_uptime()); 93} 94