From 4aca87515a5083ae0e31ce3177189fd43b6d05ac Mon Sep 17 00:00:00 2001 From: Andreas Baumann Date: Sat, 3 Jan 2015 13:58:15 +0100 Subject: patch to Vanilla Tomato 1.28 --- release/src/router/busybox/coreutils/who.c | 118 ++++++++++++++--------------- 1 file changed, 57 insertions(+), 61 deletions(-) (limited to 'release/src/router/busybox/coreutils/who.c') diff --git a/release/src/router/busybox/coreutils/who.c b/release/src/router/busybox/coreutils/who.c index 1bf55205..85a0025c 100644 --- a/release/src/router/busybox/coreutils/who.c +++ b/release/src/router/busybox/coreutils/who.c @@ -1,6 +1,6 @@ /* vi: set sw=4 ts=4: */ /*---------------------------------------------------------------------- - * Mini who is used to display user name, login time, + * Mini who is used to display user name, login time, * idle time and host name. * * Author: Da Chen @@ -10,74 +10,70 @@ * as published by the Free Software Foundation: * http://www.gnu.org/copyleft/gpl.html * - * Copyright (c) 2002 AYR Networks, Inc. + * Copyright (c) 2002 AYR Networks, Inc. + * + * Licensed under GPLv2 or later, see file LICENSE in this tarball for details. + * *---------------------------------------------------------------------- */ +/* BB_AUDIT SUSv3 _NOT_ compliant -- missing options -b, -d, -H, -l, -m, -p, -q, -r, -s, -t, -T, -u; Missing argument 'file'. */ -#include -#include -#include -#include +#include "libbb.h" #include -#include -#include -#include -#include -#include "busybox.h" -extern int who_main(int argc, char **argv) +static void idle_string(char *str6, time_t t) { - struct utmp *ut; - struct stat st; - int devlen, len; - time_t now, idle; - - if (argc > 1) - bb_show_usage(); + t = time(NULL) - t; - setutent(); - devlen = sizeof("/dev/") - 1; - printf("USER TTY IDLE FROM HOST\n"); - - while ((ut = getutent()) != NULL) { - char name[40]; + /*if (t < 60) { + str6[0] = '.'; + str6[1] = '\0'; + return; + }*/ + if (t >= 0 && t < (24 * 60 * 60)) { + sprintf(str6, "%02d:%02d", + (int) (t / (60 * 60)), + (int) ((t % (60 * 60)) / 60)); + return; + } + strcpy(str6, "old"); +} - if (ut->ut_user[0] && ut->ut_type == USER_PROCESS) { - len = strlen(ut->ut_line); - if (ut->ut_line[0] == '/') { - strncpy(name, ut->ut_line, len); - name[len] = '\0'; - strcpy(ut->ut_line, ut->ut_line + devlen); - } else { - strcpy(name, "/dev/"); - strncpy(name+devlen, ut->ut_line, len); - name[devlen+len] = '\0'; - } - - printf("%-10s %-8s ", ut->ut_user, ut->ut_line); +int who_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; +int who_main(int argc UNUSED_PARAM, char **argv) +{ + char str6[6]; + struct utmp *ut; + struct stat st; + char *name; + unsigned opt; - if (stat(name, &st) == 0) { - now = time(NULL); - idle = now - st.st_atime; - - if (idle < 60) - printf("00:00m "); - else if (idle < (60 * 60)) - printf("00:%02dm ", (int)(idle / 60)); - else if (idle < (24 * 60 * 60)) - printf("%02d:%02dm ", (int)(idle / (60 * 60)), - (int)(idle % (60 * 60)) / 60); - else if (idle < (24 * 60 * 60 * 365)) - printf("%03ddays ", (int)(idle / (24 * 60 * 60))); - else - printf("%02dyears ", (int) (idle / (24 * 60 * 60 * 365))); - } else - printf("%-8s ", "?"); - - printf("%-12.12s %s\n", ctime(&(ut->ut_tv.tv_sec)) + 4, ut->ut_host); - } - } - endutent(); + opt_complementary = "=0"; + opt = getopt32(argv, "a"); - return 0; + setutent(); + printf("USER TTY IDLE TIME HOST\n"); + while ((ut = getutent()) != NULL) { + if (ut->ut_user[0] && (opt || ut->ut_type == USER_PROCESS)) { + time_t tmp; + /* ut->ut_line is device name of tty - "/dev/" */ + name = concat_path_file("/dev", ut->ut_line); + str6[0] = '?'; + str6[1] = '\0'; + if (stat(name, &st) == 0) + idle_string(str6, st.st_atime); + /* manpages say ut_tv.tv_sec *is* time_t, + * but some systems have it wrong */ + tmp = ut->ut_tv.tv_sec; + /* 15 chars for time: Nov 10 19:33:20 */ + printf("%-10s %-8s %-9s %-15.15s %s\n", + ut->ut_user, ut->ut_line, str6, + ctime(&tmp) + 4, ut->ut_host); + if (ENABLE_FEATURE_CLEAN_UP) + free(name); + } + } + if (ENABLE_FEATURE_CLEAN_UP) + endutent(); + return EXIT_SUCCESS; } -- cgit v1.2.3-54-g00ecf