From 5fd83771641d15c418f747bd343ba6738d3875f7 Mon Sep 17 00:00:00 2001 From: Cameron Katri Date: Sun, 9 May 2021 14:20:58 -0400 Subject: Import macOS userland adv_cmds-176 basic_cmds-55 bootstrap_cmds-116.100.1 developer_cmds-66 diskdev_cmds-667.40.1 doc_cmds-53.60.1 file_cmds-321.40.3 mail_cmds-35 misc_cmds-34 network_cmds-606.40.1 patch_cmds-17 remote_cmds-63 shell_cmds-216.60.1 system_cmds-880.60.2 text_cmds-106 --- shell_cmds/lastcomm/lastcomm.1 | 132 ++++++++++++++++++++++ shell_cmds/lastcomm/lastcomm.c | 235 ++++++++++++++++++++++++++++++++++++++++ shell_cmds/lastcomm/pathnames.h | 36 ++++++ 3 files changed, 403 insertions(+) create mode 100644 shell_cmds/lastcomm/lastcomm.1 create mode 100644 shell_cmds/lastcomm/lastcomm.c create mode 100644 shell_cmds/lastcomm/pathnames.h (limited to 'shell_cmds/lastcomm') diff --git a/shell_cmds/lastcomm/lastcomm.1 b/shell_cmds/lastcomm/lastcomm.1 new file mode 100644 index 0000000..96f7638 --- /dev/null +++ b/shell_cmds/lastcomm/lastcomm.1 @@ -0,0 +1,132 @@ +.\" $NetBSD: lastcomm.1,v 1.11 2006/12/22 08:00:20 ad Exp $ +.\" +.\" Copyright (c) 1980, 1990, 1993 +.\" 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. 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 8.1 (Berkeley) 6/6/93 +.\" +.Dd December 22, 2006 +.Dt LASTCOMM 1 +.Os +.Sh NAME +.Nm lastcomm +.Nd show last commands executed in reverse order +.Sh SYNOPSIS +.Nm +.Op Fl f Ar file +.Op Ar command ... +.Op Ar user ... +.Op Ar terminal ... +.Sh DESCRIPTION +.Nm +gives information on previously executed commands. +With no arguments, +.Nm +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 started. +.It +The elapsed time of the process. +.El +.Pp +The flags are encoded as follows: +.Dq S +indicates the command was +executed by the super-user, +.Dq F +indicates the command ran after +a fork, but without a following +.Xr exec 3 , +.Dq C +indicates the command was run in PDP-11 compatibility mode +(VAX only), +.Dq D +indicates the command terminated with the generation of a +.Pa core +file, and +.Dq 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 sigaction 2 , +.Xr acct 5 , +.Xr core 5 +.Sh HISTORY +The +.Nm +command appeared in +.Bx 3.0 . diff --git a/shell_cmds/lastcomm/lastcomm.c b/shell_cmds/lastcomm/lastcomm.c new file mode 100644 index 0000000..e1d9b66 --- /dev/null +++ b/shell_cmds/lastcomm/lastcomm.c @@ -0,0 +1,235 @@ +/* $NetBSD: lastcomm.c,v 1.21 2009/04/12 13:08:31 lukem Exp $ */ + +/* + * Copyright (c) 1980, 1993 + * 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. 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. + */ + +#include +#ifndef lint +__COPYRIGHT("@(#) Copyright (c) 1980, 1993\ + The Regents of the University of California. All rights reserved."); +#endif /* not lint */ + +#ifndef lint +#if 0 +static char sccsid[] = "@(#)lastcomm.c 8.2 (Berkeley) 4/29/95"; +#endif +__RCSID("$NetBSD: lastcomm.c,v 1.21 2009/04/12 13:08:31 lukem Exp $"); +#endif /* not lint */ + +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +/* definitions from utmp.h */ +#define UT_NAMESIZE 8 +#define UT_LINESIZE 8 +#include "pathnames.h" + +static time_t expand(u_int); +static char *flagbits(int); +static const char *getdev(dev_t); +static int requested(char *[], struct acct *); +static void usage(void) __dead; + +int main(int, char **); + +int +main(int argc, char *argv[]) +{ + char *p; + struct acct ab; + struct stat sb; + FILE *fp; + off_t size; + time_t t; + double delta; + int ch; + const char *acctfile = _PATH_ACCT; + + setprogname(argv[0]); + + while ((ch = getopt(argc, argv, "f:")) != -1) + switch((char)ch) { + case 'f': + acctfile = optarg; + break; + case '?': + default: + usage(); + } + argc -= optind; + argv += optind; + + /* Open the file. */ + if ((fp = fopen(acctfile, "r")) == NULL || fstat(fileno(fp), &sb)) + err(1, "%s", acctfile); + + /* + * Round off to integral number of accounting records, probably + * not necessary, but it doesn't hurt. + */ + size = sb.st_size - sb.st_size % sizeof(struct acct); + + /* Check if any records to display. */ + if (size < (off_t)sizeof(struct acct)) + exit(0); + + /* + * Seek to before the last entry in the file; use lseek(2) in case + * the file is bigger than a "long". + */ + size -= sizeof(struct acct); + if (lseek(fileno(fp), size, SEEK_SET) == -1) + err(1, "%s", acctfile); + + for (;;) { + if (fread(&ab, sizeof(struct acct), 1, fp) != 1) + err(1, "%s", acctfile); + + if (ab.ac_comm[0] == '\0') { + ab.ac_comm[0] = '?'; + ab.ac_comm[1] = '\0'; + } else + for (p = &ab.ac_comm[0]; + p < &ab.ac_comm[fldsiz(acct, ac_comm)] && *p; ++p) + if (!isprint((unsigned char)*p)) + *p = '?'; + if (!*argv || requested(argv, &ab)) { + + time_t timelong = ab.ac_btime; + t = expand(ab.ac_utime) + expand(ab.ac_stime); + (void)printf( + "%-*.*s %-7s %-*.*s %-*.*s %6.2f secs %.16s", + (int)fldsiz(acct, ac_comm), + (int)fldsiz(acct, ac_comm), + ab.ac_comm, flagbits(ab.ac_flag), + UT_NAMESIZE, UT_NAMESIZE, + user_from_uid(ab.ac_uid, 0), UT_LINESIZE, + UT_LINESIZE, getdev(ab.ac_tty), + t / (double)AHZ, ctime(&timelong)); + delta = expand(ab.ac_etime) / (double)AHZ; + printf(" (%1.0f:%02.0f:%05.2f)\n", + floor(delta / SECSPERHOUR), + floor(fmod(delta, SECSPERHOUR) / SECSPERMIN), + fmod(delta, SECSPERMIN)); + } + /* are we at the beginning of the file yet? */ + if (size == 0) + break; + /* seek backward over the one we read and the next to read */ + if (fseek(fp, 2 * -(long)sizeof(struct acct), SEEK_CUR) == -1) + err(1, "%s", acctfile); + /* and account for its size */ + size -= sizeof(struct acct); + } + exit(0); +} + +static time_t +expand(u_int t) +{ + time_t nt; + + nt = t & 017777; + t >>= 13; + while (t) { + t--; + nt <<= 3; + } + return (nt); +} + +static char * +flagbits(int f) +{ + static char flags[20] = "-"; + char *p; + +#define BIT(flag, ch) if (f & flag) *p++ = ch + + p = flags + 1; + BIT(ASU, 'S'); + BIT(AFORK, 'F'); + BIT(ACOMPAT, 'C'); + BIT(ACORE, 'D'); + BIT(AXSIG, 'X'); + *p = '\0'; + return (flags); +} + +static int +requested(char *argv[], struct acct *acp) +{ + do { + if (!strcmp(user_from_uid(acp->ac_uid, 0), *argv)) + return (1); + if (!strcmp(getdev(acp->ac_tty), *argv)) + return (1); + if (!strncmp(acp->ac_comm, *argv, fldsiz(acct, ac_comm))) + return (1); + } while (*++argv); + return (0); +} + +static const char * +getdev(dev_t dev) +{ + static dev_t lastdev = (dev_t)-1; + static const char *lastname; + + if (dev == NODEV) /* Special case. */ + return ("__"); + if (dev == lastdev) /* One-element cache. */ + return (lastname); + lastdev = dev; + if ((lastname = devname(dev, S_IFCHR)) == NULL) + lastname = "??"; + return (lastname); +} + +static void +usage(void) +{ + (void)fprintf(stderr, + "Usage: %s [ -f file ] [command ...] [user ...] [tty ...]\n", + getprogname()); + exit(1); +} diff --git a/shell_cmds/lastcomm/pathnames.h b/shell_cmds/lastcomm/pathnames.h new file mode 100644 index 0000000..6ca75d8 --- /dev/null +++ b/shell_cmds/lastcomm/pathnames.h @@ -0,0 +1,36 @@ +/* $NetBSD: pathnames.h,v 1.4 2003/08/07 11:14:18 agc Exp $ */ + +/* + * Copyright (c) 1989, 1993 + * 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. 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 8.1 (Berkeley) 6/6/93 + */ + +#include + +#define _PATH_ACCT "/var/account/acct" -- cgit v1.2.3-56-ge451