aboutsummaryrefslogtreecommitdiff
path: root/miscutils
diff options
context:
space:
mode:
authorEric Andersen <andersen@codepoet.org>2003-08-08 22:26:06 +0000
committerEric Andersen <andersen@codepoet.org>2003-08-08 22:26:06 +0000
commit2e9c25700061b23982f8600288178c1f6a370c1e (patch)
treeb9523c8010e85f5879a89e2a4b7e202d674e1e1c /miscutils
parentf1c56a9306680874577abf01749c4b33877eb89a (diff)
downloadbusybox-w32-2e9c25700061b23982f8600288178c1f6a370c1e.tar.gz
busybox-w32-2e9c25700061b23982f8600288178c1f6a370c1e.tar.bz2
busybox-w32-2e9c25700061b23982f8600288178c1f6a370c1e.zip
Implement a minimalist 'last' which allows the LEAF project to
no longer need dumtp. Remove the 'dumtp' applet. -Erik
Diffstat (limited to 'miscutils')
-rw-r--r--miscutils/Config.in10
-rw-r--r--miscutils/Makefile.in2
-rw-r--r--miscutils/dutmp.c66
-rw-r--r--miscutils/last.c107
4 files changed, 111 insertions, 74 deletions
diff --git a/miscutils/Config.in b/miscutils/Config.in
index a994c5096..701af9c2d 100644
--- a/miscutils/Config.in
+++ b/miscutils/Config.in
@@ -40,15 +40,11 @@ config CONFIG_DC
40 Dc is a reverse-polish desk calculator which supports unlimited 40 Dc is a reverse-polish desk calculator which supports unlimited
41 precision arithmetic. 41 precision arithmetic.
42 42
43config CONFIG_DUTMP 43config CONFIG_LAST
44 bool "dutmp" 44 bool "last"
45 default n 45 default n
46 help 46 help
47 'dutmp' is a utility used by the Linux Router Project (as far as I 47 'last' displays a list of the last users that logged into the system.
48 know nobody else uses it). It dumps the contents of the utmp file to
49 STDOUT with each field seperated by a colon. IP addresses are are
50 given in hex in native byte order. It is intended that this format
51 can then be parsed by shell scripts.
52 48
53config CONFIG_HDPARM 49config CONFIG_HDPARM
54 bool "hdparm" 50 bool "hdparm"
diff --git a/miscutils/Makefile.in b/miscutils/Makefile.in
index 0f200f4fb..66370f015 100644
--- a/miscutils/Makefile.in
+++ b/miscutils/Makefile.in
@@ -28,8 +28,8 @@ MISCUTILS-$(CONFIG_ADJTIMEX) += adjtimex.o
28MISCUTILS-$(CONFIG_CROND) += crond.o 28MISCUTILS-$(CONFIG_CROND) += crond.o
29MISCUTILS-$(CONFIG_CRONTAB) += crontab.o 29MISCUTILS-$(CONFIG_CRONTAB) += crontab.o
30MISCUTILS-$(CONFIG_DC) += dc.o 30MISCUTILS-$(CONFIG_DC) += dc.o
31MISCUTILS-$(CONFIG_DUTMP) += dutmp.o
32MISCUTILS-$(CONFIG_HDPARM) += hdparm.o 31MISCUTILS-$(CONFIG_HDPARM) += hdparm.o
32MISCUTILS-$(CONFIG_LAST) += last.o
33MISCUTILS-$(CONFIG_MAKEDEVS) += makedevs.o 33MISCUTILS-$(CONFIG_MAKEDEVS) += makedevs.o
34MISCUTILS-$(CONFIG_MT) += mt.o 34MISCUTILS-$(CONFIG_MT) += mt.o
35MISCUTILS-$(CONFIG_STRINGS) += strings.o 35MISCUTILS-$(CONFIG_STRINGS) += strings.o
diff --git a/miscutils/dutmp.c b/miscutils/dutmp.c
deleted file mode 100644
index 86d7ce4b3..000000000
--- a/miscutils/dutmp.c
+++ /dev/null
@@ -1,66 +0,0 @@
1/* vi: set sw=4 ts=4: */
2/*
3 * public domain -- Dave 'Kill a Cop' Cinege <dcinege@psychosis.com>
4 *
5 * dutmp
6 * Takes utmp formated file on stdin and dumps it's contents
7 * out in colon delimited fields. Easy to 'cut' for shell based
8 * versions of 'who', 'last', etc. IP Addr is output in hex,
9 * little endian on x86.
10 *
11 */
12
13/* Mar 13, 2003 Manuel Novoa III
14 *
15 * 1) Added proper error checking.
16 * 2) Allow '-' arg for stdin.
17 * 3) For modern libcs, take into account that utmp char[] members
18 * need not be nul-terminated.
19 */
20
21#include <stdlib.h>
22#include <unistd.h>
23#include <fcntl.h>
24#include <utmp.h>
25#include "busybox.h"
26
27/* Grr... utmp char[] members do not have to be nul-terminated.
28 * Do what we can while still keeping this reasonably small.
29 * Note: We are assuming the ut_id[] size is fixed at 4. */
30
31#if (UT_LINESIZE != 32) || (UT_NAMESIZE != 32) || (UT_HOSTSIZE != 256)
32#error struct utmp member char[] size(s) have changed!
33#endif
34
35extern int dutmp_main(int argc, char **argv)
36{
37 int file = STDIN_FILENO;
38 ssize_t n;
39 struct utmp ut;
40
41 if (argc > 2) {
42 bb_show_usage();
43 }
44 ++argv;
45 if ((argc == 2) && ((argv[0][0] != '-') || argv[0][1])) {
46 file = bb_xopen(*argv, O_RDONLY);
47 }
48
49
50 while ((n = safe_read(file, (void*)&ut, sizeof(struct utmp))) != 0) {
51
52 if (n != sizeof(struct utmp)) {
53 bb_perror_msg_and_die("short read");
54 }
55
56 bb_printf("%d|%d|%.32s|%.4s|%.32s|%.256s|%d|%d|%ld|%ld|%ld|%x\n",
57 ut.ut_type, ut.ut_pid, ut.ut_line,
58 ut.ut_id, ut.ut_user, ut.ut_host,
59 ut.ut_exit.e_termination, ut.ut_exit.e_exit,
60 ut.ut_session,
61 ut.ut_tv.tv_sec, ut.ut_tv.tv_usec,
62 ut.ut_addr);
63 }
64
65 bb_fflush_stdout_and_exit(EXIT_SUCCESS);
66}
diff --git a/miscutils/last.c b/miscutils/last.c
new file mode 100644
index 000000000..e7f9eb57a
--- /dev/null
+++ b/miscutils/last.c
@@ -0,0 +1,107 @@
1/* vi: set sw=4 ts=4: */
2/*
3 * last implementation for busybox
4 *
5 * Copyright (C) 2003 Erik Andersen <andersen@codepoet.org>
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2 of the License, or
10 * (at your option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, write to the Free Software
19 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20 *
21 */
22
23#include <sys/types.h>
24#include <fcntl.h>
25#include <unistd.h>
26#include <stdlib.h>
27#include <utmp.h>
28#include <sys/stat.h>
29#include <errno.h>
30#include <string.h>
31#include <time.h>
32#include "busybox.h"
33
34#ifndef SHUTDOWN_TIME
35# define SHUTDOWN_TIME 254
36#endif
37
38/* Grr... utmp char[] members do not have to be nul-terminated.
39 * Do what we can while still keeping this reasonably small.
40 * Note: We are assuming the ut_id[] size is fixed at 4. */
41
42#if (UT_LINESIZE != 32) || (UT_NAMESIZE != 32) || (UT_HOSTSIZE != 256)
43#error struct utmp member char[] size(s) have changed!
44#endif
45
46extern int last_main(int argc, char **argv)
47{
48 struct utmp ut;
49 int n, file = STDIN_FILENO;
50
51 if (argc > 1) {
52 bb_show_usage();
53 }
54 file = bb_xopen(_PATH_WTMP, O_RDONLY);
55
56 printf("%-10s %-14s %-18s %-12.12s %s\n", "USER", "TTY", "HOST", "LOGIN", "TIME");
57 while ((n = safe_read(file, (void*)&ut, sizeof(struct utmp))) != 0) {
58
59 if (n != sizeof(struct utmp)) {
60 bb_perror_msg_and_die("short read");
61 }
62
63 if (strncmp(ut.ut_line, "~", 1) == 0) {
64 if (strncmp(ut.ut_user, "shutdown", 8) == 0)
65 ut.ut_type = SHUTDOWN_TIME;
66 else if (strncmp(ut.ut_user, "reboot", 6) == 0)
67 ut.ut_type = BOOT_TIME;
68 else if (strncmp(ut.ut_user, "runlevel", 7) == 0)
69 ut.ut_type = RUN_LVL;
70 } else {
71 if (!ut.ut_name[0] || strcmp(ut.ut_name, "LOGIN") == 0 ||
72 ut.ut_name[0] == 0)
73 {
74 /* Don't bother. This means we can't find how long
75 * someone was logged in for. Oh well. */
76 continue;
77 }
78 if (ut.ut_type != DEAD_PROCESS &&
79 ut.ut_name[0] && ut.ut_line[0])
80 {
81 ut.ut_type = USER_PROCESS;
82 }
83 if (strcmp(ut.ut_name, "date") == 0) {
84 if (ut.ut_line[0] == '|') ut.ut_type = OLD_TIME;
85 if (ut.ut_line[0] == '{') ut.ut_type = NEW_TIME;
86 }
87 }
88
89 if (ut.ut_type!=USER_PROCESS) {
90 switch (ut.ut_type) {
91 case OLD_TIME:
92 case NEW_TIME:
93 case RUN_LVL:
94 case SHUTDOWN_TIME:
95 continue;
96 case BOOT_TIME:
97 strcpy(ut.ut_line, "system boot");
98 break;
99 }
100 }
101
102 printf("%-10s %-14s %-18s %-12.12s\n", ut.ut_user, ut.ut_line, ut.ut_host,
103 ctime(&(ut.ut_tv.tv_sec)) + 4);
104 }
105
106 bb_fflush_stdout_and_exit(EXIT_SUCCESS);
107}