diff options
author | Lorry Tar Creator <lorry-tar-importer@lorry> | 2016-01-20 10:55:18 +0000 |
---|---|---|
committer | Lorry Tar Creator <lorry-tar-importer@lorry> | 2016-01-20 10:55:18 +0000 |
commit | 70e9163c9c18e995515598085cb824e554eb7ae7 (patch) | |
tree | a42dc8b2a6c031354bf31472de888bfc8a060132 /src/uptime.c | |
parent | cbf5993c43f49281173f185863577d86bfac6eae (diff) | |
download | coreutils-tarball-master.tar.gz |
coreutils-8.25HEADcoreutils-8.25master
Diffstat (limited to 'src/uptime.c')
-rw-r--r-- | src/uptime.c | 124 |
1 files changed, 68 insertions, 56 deletions
diff --git a/src/uptime.c b/src/uptime.c index 6b2a724..74ea87d 100644 --- a/src/uptime.c +++ b/src/uptime.c @@ -1,10 +1,10 @@ /* GNU's uptime. - Copyright (C) 1992-2002, 2004, 2005, 2006 Free Software Foundation, Inc. + Copyright (C) 1992-2016 Free Software Foundation, Inc. - This program is free software; you can redistribute it and/or modify + This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2, or (at your option) - any later version. + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of @@ -12,8 +12,7 @@ GNU General Public License for more details. You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software Foundation, - Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ + along with this program. If not, see <http://www.gnu.org/licenses/>. */ /* Created by hacking who.c by Kaveh Ghazi ghazi@caip.rutgers.edu. */ @@ -37,16 +36,15 @@ #include "long-options.h" #include "quote.h" #include "readutmp.h" +#include "fprintftime.h" -/* The official name of this program (e.g., no `g' prefix). */ +/* The official name of this program (e.g., no 'g' prefix). */ #define PROGRAM_NAME "uptime" -#define AUTHORS "Joseph Arceneaux", "David MacKenzie", "Kaveh Ghazi" - -int getloadavg (); - -/* The name this program was run with. */ -char *program_name; +#define AUTHORS \ + proper_name ("Joseph Arceneaux"), \ + proper_name ("David MacKenzie"), \ + proper_name ("Kaveh Ghazi") static void print_uptime (size_t n, const STRUCT_UTMP *this) @@ -70,13 +68,13 @@ print_uptime (size_t n, const STRUCT_UTMP *this) char buf[BUFSIZ]; char *b = fgets (buf, BUFSIZ, fp); if (b == buf) - { - char *end_ptr; - double upsecs = c_strtod (buf, &end_ptr); - if (buf != end_ptr) - uptime = (0 <= upsecs && upsecs < TYPE_MAXIMUM (time_t) - ? upsecs : -1); - } + { + char *end_ptr; + double upsecs = c_strtod (buf, &end_ptr); + if (buf != end_ptr) + uptime = (0 <= upsecs && upsecs < TYPE_MAXIMUM (time_t) + ? upsecs : -1); + } fclose (fp); } @@ -110,61 +108,63 @@ print_uptime (size_t n, const STRUCT_UTMP *this) { entries += IS_USER_PROCESS (this); if (UT_TYPE_BOOT_TIME (this)) - boot_time = UT_TIME_MEMBER (this); + boot_time = UT_TIME_MEMBER (this); ++this; } +#else + (void) n; + (void) this; #endif + time_now = time (NULL); #if defined HAVE_PROC_UPTIME if (uptime == 0) #endif { if (boot_time == 0) - error (EXIT_FAILURE, errno, _("couldn't get boot time")); + error (EXIT_FAILURE, errno, _("couldn't get boot time")); uptime = time_now - boot_time; } updays = uptime / 86400; uphours = (uptime - (updays * 86400)) / 3600; upmins = (uptime - (updays * 86400) - (uphours * 3600)) / 60; tmn = localtime (&time_now); + /* procps' version of uptime also prints the seconds field, but + previous versions of coreutils don't. */ if (tmn) - printf (_(" %2d:%02d%s up "), - ((tmn->tm_hour % 12) == 0 ? 12 : tmn->tm_hour % 12), - /* FIXME: use strftime, not am, pm. Uli reports that - the german translation is meaningless. */ - tmn->tm_min, (tmn->tm_hour < 12 ? _("am") : _("pm"))); + /* TRANSLATORS: This prints the current clock time. */ + fprintftime (stdout, _(" %H:%M%P "), tmn, 0, 0); else - printf (_(" ??:???? up ")); + printf (_(" ??:???? ")); if (uptime == (time_t) -1) - printf (_("???? days ??:??, ")); + printf (_("up ???? days ??:??, ")); else { if (0 < updays) - printf (ngettext ("%ld day", "%ld days", select_plural (updays)), - updays); - printf (" %2d:%02d, ", uphours, upmins); + printf (ngettext ("up %ld day %2d:%02d, ", + "up %ld days %2d:%02d, ", + select_plural (updays)), + updays, uphours, upmins); + else + printf (_("up %2d:%02d, "), uphours, upmins); } - printf (ngettext ("%lu user", "%lu users", entries), - (unsigned long int) entries); + printf (ngettext ("%lu user", "%lu users", select_plural (entries)), + (unsigned long int) entries); -#if defined HAVE_GETLOADAVG || defined C_GETLOADAVG loads = getloadavg (avg, 3); -#else - loads = -1; -#endif if (loads == -1) putchar ('\n'); else { if (loads > 0) - printf (_(", load average: %.2f"), avg[0]); + printf (_(", load average: %.2f"), avg[0]); if (loads > 1) - printf (", %.2f", avg[1]); + printf (", %.2f", avg[1]); if (loads > 2) - printf (", %.2f", avg[2]); + printf (", %.2f", avg[2]); if (loads > 0) - putchar ('\n'); + putchar ('\n'); } } @@ -176,36 +176,48 @@ static void uptime (const char *filename, int options) { size_t n_users; - STRUCT_UTMP *utmp_buf; + STRUCT_UTMP *utmp_buf = NULL; #if HAVE_UTMPX_H || HAVE_UTMP_H if (read_utmp (filename, &n_users, &utmp_buf, options) != 0) - error (EXIT_FAILURE, errno, "%s", filename); + error (EXIT_FAILURE, errno, "%s", quotef (filename)); #endif print_uptime (n_users, utmp_buf); + + IF_LINT (free (utmp_buf)); } void usage (int status) { if (status != EXIT_SUCCESS) - fprintf (stderr, _("Try `%s --help' for more information.\n"), - program_name); + emit_try_help (); else { - printf (_("Usage: %s [OPTION]... [ FILE ]\n"), program_name); + printf (_("Usage: %s [OPTION]... [FILE]\n"), program_name); printf (_("\ Print the current time, the length of time the system has been up,\n\ the number of users on the system, and the average number of jobs\n\ -in the run queue over the last 1, 5 and 15 minutes.\n\ +in the run queue over the last 1, 5 and 15 minutes.")); +#ifdef __linux__ + /* It would be better to introduce a configure test for this, + but such a test is hard to write. For the moment then, we + have a hack which depends on the preprocessor used at compile + time to tell us what the running kernel is. Ugh. */ + printf (_(" \ +Processes in\n\ +an uninterruptible sleep state also contribute to the load average.\n")); +#else + printf (_("\n")); +#endif + printf (_("\ If FILE is not specified, use %s. %s as FILE is common.\n\ -\n\ -"), - UTMP_FILE, WTMP_FILE); +\n"), + UTMP_FILE, WTMP_FILE); fputs (HELP_OPTION_DESCRIPTION, stdout); fputs (VERSION_OPTION_DESCRIPTION, stdout); - printf (_("\nReport bugs to <%s>.\n"), PACKAGE_BUGREPORT); + emit_ancillary_info (PROGRAM_NAME); } exit (status); } @@ -214,15 +226,15 @@ int main (int argc, char **argv) { initialize_main (&argc, &argv); - program_name = argv[0]; + set_program_name (argv[0]); setlocale (LC_ALL, ""); bindtextdomain (PACKAGE, LOCALEDIR); textdomain (PACKAGE); atexit (close_stdout); - parse_long_options (argc, argv, PROGRAM_NAME, GNU_PACKAGE, VERSION, - usage, AUTHORS, (char const *) NULL); + parse_long_options (argc, argv, PROGRAM_NAME, PACKAGE_NAME, Version, + usage, AUTHORS, (char const *) NULL); if (getopt_long (argc, argv, "", NULL, NULL) != -1) usage (EXIT_FAILURE); @@ -241,5 +253,5 @@ main (int argc, char **argv) usage (EXIT_FAILURE); } - exit (EXIT_SUCCESS); + return EXIT_SUCCESS; } |