who: stop using static buffer, small size optimizations
authorDenis Vlasenko <vda.linux@googlemail.com>
Wed, 7 Mar 2007 00:07:42 +0000 (00:07 -0000)
committerDenis Vlasenko <vda.linux@googlemail.com>
Wed, 7 Mar 2007 00:07:42 +0000 (00:07 -0000)
coreutils/who.c

index 25d35fa..a5d3b02 100644 (file)
 #include <utmp.h>
 #include <time.h>
 
-static const char * idle_string (time_t t)
+static void idle_string(char *str6, time_t t)
 {
-       static char str[6];
+       t = time(NULL) - t;
 
-       time_t s = time(NULL) - t;
-
-       if (s < 60)
-               return ".";
-       if (s < (24 * 60 * 60)) {
-               sprintf(str, "%02d:%02d",
-                               (int) (s / (60 * 60)),
-                               (int) ((s % (60 * 60)) / 60));
-               return str;
+       /*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;
        }
-       return "old";
+       strcpy(str6, "old");
 }
 
 int who_main(int argc, char **argv);
 int who_main(int argc, char **argv)
 {
+       char str6[6];
        struct utmp *ut;
        struct stat st;
        char *name;
@@ -57,12 +59,18 @@ int who_main(int argc, char **argv)
 
                        /* ut->ut_line is device name of tty - "/dev/" */
                        name = concat_path_file("/dev", ut->ut_line);
-                       printf("%-10s %-8s %-8s  %-12.12s   %s\n", ut->ut_user, ut->ut_line,
-                                                                       (stat(name, &st)) ?  "?" : idle_string(st.st_atime),
-                                                                       ctime(&thyme) + 4, ut->ut_host);
-                       if (ENABLE_FEATURE_CLEAN_UP) free(name);
+                       str6[0] = '?';
+                       str6[1] = '\0';
+                       if (stat(name, &st) == 0)
+                               idle_string(str6, st.st_atime);
+                       printf("%-10s %-8s %-9s %-14.14s %s\n",
+                                       ut->ut_user, ut->ut_line, str6,
+                                       ctime(&thyme) + 4, ut->ut_host);
+                       if (ENABLE_FEATURE_CLEAN_UP)
+                               free(name);
                }
        }
-       if (ENABLE_FEATURE_CLEAN_UP) endutent();
+       if (ENABLE_FEATURE_CLEAN_UP)
+               endutent();
        return 0;
 }