--- src/radwho.c.orig 2003-12-09 01:10:24.000000000 +0900 +++ src/radwho.c 2011-10-19 10:22:04.000000000 +0900 @@ -20,6 +20,7 @@ #include #include #include +#include #include #include #include @@ -40,18 +41,20 @@ * Header above output and format. */ char *hdr1 = -"Login Name What TTY When From Location"; -char *ufmt1 = "%-10.10s %-17.17s %-5.5s %-4.4s %-9.9s %-9.9s %-.16s%s"; -char *ufmt1r = "%s,%s,%s,%s,%s,%s,%s%s"; -char *rfmt1 = "%-10.10s %-17.17s %-5.5s %s%-3d %-9.9s %-9.9s %-.19s%s"; -char *rfmt1r = "%s,%s,%s,%s%u,%s,%s,%s%s"; +"Login Name What TTY When From Location"; +char *ufmt1 = "%-16.16s %-17.17s %-5.5s %-4.4s %-9.9s %-9.9s %-.*s%s"; +char *ufmt1r = "%s,%s,%s,%s,%s,%s,%*s%s"; +char *rfmt1 = "%-16.16s %-17.17s %-5.5s %s%-3d %-9.9s %-9.9s %-.*s%s"; +char *rfmt1r = "%s,%s,%s,%s%u,%s,%s,%*s%s"; +#define FMT1_HOST_SIZE 13 char *hdr2 = -"Login Port What When From Location"; -char *ufmt2 = "%-10.10s %-6.6d %-7.7s %-13.13s %-10.10s %-.16s%s"; -char *ufmt2r = "%s,%u,%s,%s,%s,%s%s"; -char *rfmt2 = "%-10.10s %s%-5d %-6.6s %-13.13s %-10.10s %-.28s%s"; -char *rfmt2r = "%s,%s%u,%s,%s,%s,%s%s"; +"Login Port What When From Location"; +char *ufmt2 = "%-16.16s %-6.6d %-7.7s %-13.13s %-10.10s %-.*s%s"; +char *ufmt2r = "%s,%u,%s,%s,%s,%*s%s"; +char *rfmt2 = "%-16.16s %s%-5d %-6.6s %-13.13s %-10.10s %-.*s%s"; +char *rfmt2r = "%s,%s%u,%s,%s,%s,%*s%s"; +#define FMT2_HOST_SIZE 19 char *eol = "\n"; NAS *naslist; @@ -307,7 +310,8 @@ return tmp; } if (strncmp(tty, "cu", 2) == 0) { - return tmp + 2; + sprintf(tmp, "%.15s", tty + 2); + return tmp; } return "??"; } @@ -371,6 +375,8 @@ */ int main(int argc, char **argv) { + struct winsize ws; + int extra_width = 0; FILE *fp; struct radutmp rt; struct utmp ut; @@ -389,6 +395,11 @@ char *p, *q, *portind; int c, portno; + ioctl(0, TIOCGWINSZ, &ws); + if (ws.ws_col >= 80) { + extra_width = ws.ws_col - 80; + } + while((c = getopt(argc, argv, "Dd:flhnsipcru:")) != EOF) switch(c) { case 'D': use_dns = 0; @@ -471,6 +482,55 @@ if (*p) sys_finger(p); } +#if defined(__FreeBSD__) && __FreeBSD_version > 900007 + if (showlocal) { + struct utmpx *utx; + + if (rawoutput == 0) + { + fputs(showname ? hdr1 : hdr2, stdout); + fputs(eol, stdout); + } + hdrdone = 1; + + /* + * Show the logged in UNIX users. + */ + gethostname(myname, 128); + setutxent(); + for (;;) { + utx = getutxent(); + if (utx == NULL) + break; + if (utx->ut_user[0] && utx->ut_line[0] && + utx->ut_type == USER_PROCESS) { + strncpy(inbuf, utx->ut_name, UT_NAMESIZE); + inbuf[UT_NAMESIZE] = '\0'; + if (showname) + printf((rawoutput == 0? ufmt1: ufmt1r), + inbuf, + fullname(inbuf), + "shell", + ttyshort(utx->ut_line), + dotime(utx->ut_tv.tv_sec), + utx->ut_host, + (rawoutput == 0 ? FMT1_HOST_SIZE + extra_width : 0), + myname, eol); + else + printf((rawoutput==0? ufmt2:ufmt2r), + inbuf, + ttyshort(utx->ut_line), + "shell", + dotime(utx->ut_tv.tv_sec), + utx->ut_host, + (rawoutput == 0 ? FMT2_HOST_SIZE + extra_width : 0), + myname, eol); + } + + } + endutxent(); + } +#else if (showlocal && (fp = fopen(UTMP_FILE, "r"))) { if (rawoutput == 0) { @@ -486,14 +546,17 @@ while(fread(&ut, sizeof(ut), 1, fp) == 1) { #ifdef USER_PROCESS if (ut.ut_user[0] && ut.ut_line[0] && - ut.ut_type == USER_PROCESS) { + ut.ut_type == USER_PROCESS) #else - if (ut.ut_user[0] && ut.ut_line[0]) { + if (ut.ut_user[0] && ut.ut_line[0]) #endif - if (showname) + { + strncpy(inbuf, ut.ut_name, UT_NAMESIZE); + inbuf[UT_NAMESIZE] = '\0'; + if (showname) printf((rawoutput == 0? ufmt1: ufmt1r), - ut.ut_name, - fullname(ut.ut_name), + inbuf, + fullname(inbuf), "shell", ttyshort(ut.ut_line), #ifdef __svr4__ @@ -502,10 +565,11 @@ dotime(ut.ut_time), #endif ut.ut_host, + (rawoutput == 0 ? FMT1_HOST_SIZE + extra_width : 0), myname, eol); else printf((rawoutput==0? ufmt2:ufmt2r), - ut.ut_name, + inbuf, ttyshort(ut.ut_line), "shell", #ifdef __svr4__ @@ -514,11 +578,13 @@ dotime(ut.ut_time), #endif ut.ut_host, + (rawoutput == 0 ? FMT2_HOST_SIZE + extra_width : 0), myname, eol); } } fclose(fp); } +#endif /* * Show the users logged in on the terminal server(s). @@ -560,6 +626,7 @@ portind, portno, dotime(rt.time), nasname(ntohl(rt.nas_address)), + (rawoutput == 0 ? FMT1_HOST_SIZE + extra_width : 0), hostname(rt.framed_address), eol); else printf((rawoutput == 0? rfmt2: rfmt2r), @@ -568,6 +635,7 @@ proto(rt.proto, rt.porttype), dotime(rt.time), nasname(ntohl(rt.nas_address)), + (rawoutput == 0 ? FMT2_HOST_SIZE + extra_width : 0), hostname(rt.framed_address), eol); } }