diff options
author | Jim Meyering <jim@meyering.net> | 1997-07-13 02:18:14 +0000 |
---|---|---|
committer | Jim Meyering <jim@meyering.net> | 1997-07-13 02:18:14 +0000 |
commit | 65738c91624f7db41df6eb8fb706a5e419cc0622 (patch) | |
tree | fc1e3dd650eb690da9b408ed396ede5834780e0d /src/users.c | |
parent | 6341f011d7565509b3e94faed23b5158c95d59b8 (diff) | |
download | coreutils-65738c91624f7db41df6eb8fb706a5e419cc0622.tar.xz |
.
Diffstat (limited to 'src/users.c')
-rw-r--r-- | src/users.c | 170 |
1 files changed, 170 insertions, 0 deletions
diff --git a/src/users.c b/src/users.c new file mode 100644 index 000000000..423bce2a1 --- /dev/null +++ b/src/users.c @@ -0,0 +1,170 @@ +/* GNU's users. + Copyright (C) 92, 93, 94, 95, 96, 1997 Free Software Foundation, Inc. + + 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. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +/* Written by jla; revised by djm */ + +#include <config.h> +#include <getopt.h> + +#include "system.h" +#include "error.h" +#include "readutmp.h" + +/* The name this program was run with. */ +char *program_name; + +/* If nonzero, display usage information and exit. */ +static int show_help; + +/* If nonzero, print the version on standard output and exit. */ +static int show_version; + +static struct option const longopts[] = +{ + {"help", no_argument, &show_help, 1}, + {"version", no_argument, &show_version, 1}, + {NULL, 0, NULL, 0} +}; + +static int +userid_compare (const void *v_a, const void *v_b) +{ + char **a = (char **) v_a; + char **b = (char **) v_b; + return strcmp (*a, *b); +} + +static void +list_entries_users (int n) +{ + register STRUCT_UTMP *this = utmp_contents; + char **u; + int i; + int n_entries; + + n_entries = 0; + u = (char **) xmalloc (n * sizeof (u[0])); + for (i = 0; i < n; i++) + { + if (this->ut_name[0] +#ifdef USER_PROCESS + && this->ut_type == USER_PROCESS +#endif + ) + { + char *trimmed_name; + + trimmed_name = extract_trimmed_name (this); + + u[n_entries] = trimmed_name; + ++n_entries; + } + this++; + } + + qsort (u, n_entries, sizeof (u[0]), userid_compare); + + for (i = 0; i < n_entries; i++) + { + int c; + fputs (u[i], stdout); + c = (i < n_entries-1 ? ' ' : '\n'); + putchar (c); + } + + for (i = 0; i < n_entries; i++) + free (u[i]); + free (u); +} + +/* Display a list of users on the system, according to utmp file FILENAME. */ + +static void +users (const char *filename) +{ + int users = read_utmp (filename); + list_entries_users (users); +} + +static void +usage (int status) +{ + if (status != 0) + fprintf (stderr, _("Try `%s --help' for more information.\n"), + program_name); + else + { + printf (_("Usage: %s [OPTION]... [ FILE ]\n"), program_name); + printf (_("\ +Output who is currently logged in according to FILE.\n\ +If FILE is not specified, use %s. %s as FILE is common.\n\ +\n\ + --help display this help and exit\n\ + --version output version information and exit\n"), + UTMP_FILE, WTMP_FILE); + puts (_("\nReport bugs to <sh-utils-bugs@gnu.ai.mit.edu>.")); + } + exit (status); +} + +int +main (int argc, char **argv) +{ + int optc, longind; + program_name = argv[0]; + setlocale (LC_ALL, ""); + bindtextdomain (PACKAGE, LOCALEDIR); + textdomain (PACKAGE); + + while ((optc = getopt_long (argc, argv, "", longopts, &longind)) != -1) + { + switch (optc) + { + case 0: + break; + + default: + usage (1); + } + } + + if (show_version) + { + printf ("users (%s) %s\n", GNU_PACKAGE, VERSION); + exit (0); + } + + if (show_help) + usage (0); + + switch (argc - optind) + { + case 0: /* users */ + users (UTMP_FILE); + break; + + case 1: /* users <utmp file> */ + users (argv[optind]); + break; + + default: /* lose */ + error (0, 0, _("too many arguments")); + usage (1); + } + + exit (0); +} |