diff options
Diffstat (limited to 'usr.bin/lastcomm')
| -rw-r--r-- | usr.bin/lastcomm/Makefile | 7 | ||||
| -rw-r--r-- | usr.bin/lastcomm/lastcomm.1 | 124 | ||||
| -rw-r--r-- | usr.bin/lastcomm/lastcomm.c | 272 | ||||
| -rw-r--r-- | usr.bin/lastcomm/pathnames.h | 38 |
4 files changed, 441 insertions, 0 deletions
diff --git a/usr.bin/lastcomm/Makefile b/usr.bin/lastcomm/Makefile new file mode 100644 index 000000000000..385a0ee57be2 --- /dev/null +++ b/usr.bin/lastcomm/Makefile @@ -0,0 +1,7 @@ +# @(#)Makefile 5.4 (Berkeley) 5/11/90 + +PROG= lastcomm +DPADD= ${LIBUTIL} +LDADD= -lutil + +.include <bsd.prog.mk> diff --git a/usr.bin/lastcomm/lastcomm.1 b/usr.bin/lastcomm/lastcomm.1 new file mode 100644 index 000000000000..eb835d0ef56e --- /dev/null +++ b/usr.bin/lastcomm/lastcomm.1 @@ -0,0 +1,124 @@ +.\" Copyright (c) 1980, 1990 The Regents of the University of California. +.\" All rights reserved. +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in the +.\" documentation and/or other materials provided with the distribution. +.\" 3. All advertising materials mentioning features or use of this software +.\" must display the following acknowledgement: +.\" This product includes software developed by the University of +.\" California, Berkeley and its contributors. +.\" 4. Neither the name of the University nor the names of its contributors +.\" may be used to endorse or promote products derived from this software +.\" without specific prior written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND +.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE +.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +.\" SUCH DAMAGE. +.\" +.\" @(#)lastcomm.1 6.8 (Berkeley) 7/27/91 +.\" +.Dd July 27, 1991 +.Dt LASTCOMM 1 +.Os BSD 3 +.Sh NAME +.Nm lastcomm +.Nd show last commands executed in reverse order +.Sh SYNOPSIS +.Nm lastcomm +.Op Fl f Ar file +.Op Ar command ... +.Op Ar user ... +.Op Ar terminal ... +.Sh DESCRIPTION +.Nm Lastcomm +gives information on previously executed commands. +With no arguments, +.Nm lastcomm +prints information about all the commands recorded +during the current accounting file's lifetime. +.Pp +Option: +.Pp +.Bl -tag -width Fl +.It Fl f Ar file +Read from +.Ar file +rather than the default +accounting file. +.El +.Pp +If called with arguments, only accounting entries with a +matching +.Ar command +name, +.Ar user +name, +or +.Ar terminal +name +are printed. +So, for example: +.Pp +.Dl lastcomm a.out root ttyd0 +.Pp +would produce a listing of all the +executions of commands named +.Pa a.out +by user +.Ar root +on the terminal +.Ar ttyd0 . +.Pp +For each process entry, the following are printed. +.Pp +.Bl -bullet -offset indent -compact +.It +The name of the user who ran the process. +.It +Flags, as accumulated by the accounting facilities in the system. +.It +The command name under which the process was called. +.It +The amount of cpu time used by the process (in seconds). +.It +The time the process exited. +.El +.Pp +The flags are encoded as follows: ``S'' indicates the command was +executed by the super-user, ``F'' indicates the command ran after +a fork, but without a following +.Xr exec , +``C'' indicates the command was run in PDP-11 compatibility mode +(VAX only), +``D'' indicates the command terminated with the generation of a +.Pa core +file, and ``X'' indicates the command was terminated with a signal. +.Sh FILES +.Bl -tag -width /var/account/acct -compact +.It Pa /var/account/acct +Default accounting file. +.El +.Sh SEE ALSO +.Xr last 1 , +.Xr sigvec 2 , +.Xr acct 5 , +.Xr core 5 +.Sh HISTORY +The +.Nm lastcomm +command appeared in +.Bx 3.0 . diff --git a/usr.bin/lastcomm/lastcomm.c b/usr.bin/lastcomm/lastcomm.c new file mode 100644 index 000000000000..298b9082c4a6 --- /dev/null +++ b/usr.bin/lastcomm/lastcomm.c @@ -0,0 +1,272 @@ +/* + * Copyright (c) 1980 Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#ifndef lint +char copyright[] = +"@(#) Copyright (c) 1980 Regents of the University of California.\n\ + All rights reserved.\n"; +#endif /* not lint */ + +#ifndef lint +static char sccsid[] = "@(#)lastcomm.c 5.11 (Berkeley) 6/1/90"; +#endif /* not lint */ + +/* + * last command + */ +#include <sys/param.h> +#include <sys/acct.h> +#include <sys/file.h> +#include <sys/stat.h> +#include <utmp.h> +#include <struct.h> +#include <ctype.h> +#include <stdio.h> +#include "pathnames.h" + +struct acct buf[DEV_BSIZE / sizeof (struct acct)]; + +time_t expand(); +char *flagbits(); +char *getdev(); + +main(argc, argv) + int argc; + char *argv[]; +{ + extern int optind; + extern char *optarg; + register struct acct *acp; + register int bn, cc; + struct stat sb; + int ch, fd; + char *acctfile, *ctime(), *strcpy(), *user_from_uid(); + long lseek(); + + acctfile = _PATH_ACCT; + while ((ch = getopt(argc, argv, "f:")) != EOF) + switch((char)ch) { + case 'f': + acctfile = optarg; + break; + case '?': + default: + fputs("lastcomm [ -f file ]\n", stderr); + exit(1); + } + argv += optind; + + fd = open(acctfile, O_RDONLY); + if (fd < 0) { + perror(acctfile); + exit(1); + } + (void)fstat(fd, &sb); + setpassent(1); + for (bn = btodb(sb.st_size); bn >= 0; bn--) { + (void)lseek(fd, (off_t)dbtob(bn), L_SET); + cc = read(fd, buf, DEV_BSIZE); + if (cc < 0) { + perror("read"); + break; + } + acp = buf + (cc / sizeof (buf[0])) - 1; + for (; acp >= buf; acp--) { + register char *cp; + time_t x; + + if (acp->ac_comm[0] == '\0') + (void)strcpy(acp->ac_comm, "?"); + for (cp = &acp->ac_comm[0]; + cp < &acp->ac_comm[fldsiz(acct, ac_comm)] && *cp; + cp++) + if (!isascii(*cp) || iscntrl(*cp)) + *cp = '?'; + if (*argv && !ok(argv, acp)) + continue; + x = expand(acp->ac_utime) + expand(acp->ac_stime); + printf("%-*.*s %s %-*s %-*s %6.2f secs %.16s\n", + fldsiz(acct, ac_comm), fldsiz(acct, ac_comm), + acp->ac_comm, flagbits(acp->ac_flag), + UT_NAMESIZE, user_from_uid(acp->ac_uid, 0), + UT_LINESIZE, getdev(acp->ac_tty), + x / (double)AHZ, ctime(&acp->ac_btime)); + } + } +} + +time_t +expand (t) + unsigned t; +{ + register time_t nt; + + nt = t & 017777; + t >>= 13; + while (t) { + t--; + nt <<= 3; + } + return (nt); +} + +char * +flagbits(f) + register int f; +{ + static char flags[20]; + char *p, *strcpy(); + +#define BIT(flag, ch) if (f & flag) *p++ = ch; + p = strcpy(flags, "- "); + BIT(ASU, 'S'); + BIT(AFORK, 'F'); + BIT(ACOMPAT, 'C'); + BIT(ACORE, 'D'); + BIT(AXSIG, 'X'); + return (flags); +} + +ok(argv, acp) + register char *argv[]; + register struct acct *acp; +{ + register char *cp; + char *user_from_uid(); + + do { + cp = user_from_uid(acp->ac_uid, 0); + if (!strcmp(cp, *argv)) + return(1); + if ((cp = getdev(acp->ac_tty)) && !strcmp(cp, *argv)) + return(1); + if (!strncmp(acp->ac_comm, *argv, fldsiz(acct, ac_comm))) + return(1); + } while (*++argv); + return(0); +} + +#include <sys/dir.h> + +#define N_DEVS 43 /* hash value for device names */ +#define NDEVS 500 /* max number of file names in /dev */ + +struct devhash { + dev_t dev_dev; + char dev_name [UT_LINESIZE + 1]; + struct devhash * dev_nxt; +}; +struct devhash *dev_hash[N_DEVS]; +struct devhash *dev_chain; +#define HASH(d) (((int) d) % N_DEVS) + +setupdevs() +{ + register DIR * fd; + register struct devhash * hashtab; + register ndevs = NDEVS; + struct direct * dp; + char *malloc(); + + /*NOSTRICT*/ + hashtab = (struct devhash *)malloc(NDEVS * sizeof(struct devhash)); + if (hashtab == (struct devhash *)0) { + fputs("No mem for dev table\n", stderr); + return; + } + if ((fd = opendir(_PATH_DEV)) == NULL) { + perror(_PATH_DEV); + return; + } + while (dp = readdir(fd)) { + if (dp->d_ino == 0) + continue; + if (dp->d_name[0] != 't' && strcmp(dp->d_name, "console") + && strcmp(dp->d_name, "vga")) + continue; + (void)strncpy(hashtab->dev_name, dp->d_name, UT_LINESIZE); + hashtab->dev_name[UT_LINESIZE] = 0; + hashtab->dev_nxt = dev_chain; + dev_chain = hashtab; + hashtab++; + if (--ndevs <= 0) + break; + } + closedir(fd); +} + +char * +getdev(dev) + dev_t dev; +{ + register struct devhash *hp, *nhp; + struct stat statb; + char name[fldsiz(devhash, dev_name) + 6]; + static dev_t lastdev = (dev_t) -1; + static char *lastname; + static int init = 0; + char *strcpy(), *strcat(); + + if (dev == NODEV) + return ("__"); + if (dev == lastdev) + return (lastname); + if (!init) { + setupdevs(); + init++; + } + for (hp = dev_hash[HASH(dev)]; hp; hp = hp->dev_nxt) + if (hp->dev_dev == dev) { + lastdev = dev; + return (lastname = hp->dev_name); + } + for (hp = dev_chain; hp; hp = nhp) { + nhp = hp->dev_nxt; + (void)strcpy(name, _PATH_DEV); + strcat(name, hp->dev_name); + if (stat(name, &statb) < 0) /* name truncated usually */ + continue; + if ((statb.st_mode & S_IFMT) != S_IFCHR) + continue; + hp->dev_dev = statb.st_rdev; + hp->dev_nxt = dev_hash[HASH(hp->dev_dev)]; + dev_hash[HASH(hp->dev_dev)] = hp; + if (hp->dev_dev == dev) { + dev_chain = nhp; + lastdev = dev; + return (lastname = hp->dev_name); + } + } + dev_chain = (struct devhash *) 0; + return ("??"); +} diff --git a/usr.bin/lastcomm/pathnames.h b/usr.bin/lastcomm/pathnames.h new file mode 100644 index 000000000000..fc7f53d8bc11 --- /dev/null +++ b/usr.bin/lastcomm/pathnames.h @@ -0,0 +1,38 @@ +/* + * Copyright (c) 1989 The Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)pathnames.h 5.3 (Berkeley) 6/1/90 + */ + +#include <paths.h> + +#define _PATH_ACCT "/var/account/acct" |
