From f7bca531be5d486c1b4f5ec64b3f554fdfc774c6 Mon Sep 17 00:00:00 2001 From: deraadt Date: Tue, 22 Feb 2022 17:22:28 +0000 Subject: [PATCH] Since other exported commandnames were increased to 24 and graduated into proper strings, adapt struct acct's ac_comm similarily. While here increase ac_mem to 32-bits, increase ac_flag from 8 to 32 bits for future extensions, add ac_pid for forensics, and reorder the structure to avoid compiler pads. More work remains in the sa(8) command to use ac_pid better. This is a flag day for the acct file format, new/old files/tools are incompatible. ok bluhm millert --- share/man/man5/acct.5 | 13 +++++++------ sys/kern/kern_acct.c | 5 ++++- sys/sys/acct.h | 41 ++++++++++++++++++++++------------------- usr.sbin/sa/extern.h | 9 +++++---- usr.sbin/sa/main.c | 7 ++++--- 5 files changed, 42 insertions(+), 33 deletions(-) diff --git a/share/man/man5/acct.5 b/share/man/man5/acct.5 index a2d17bec782..378676ed9c7 100644 --- a/share/man/man5/acct.5 +++ b/share/man/man5/acct.5 @@ -1,4 +1,4 @@ -.\" $OpenBSD: acct.5,v 1.25 2021/12/13 16:37:37 deraadt Exp $ +.\" $OpenBSD: acct.5,v 1.26 2022/02/22 17:22:29 deraadt Exp $ .\" $NetBSD: acct.5,v 1.4 1995/10/22 01:40:10 ghudson Exp $ .\" .\" Copyright (c) 1991, 1993 @@ -30,7 +30,7 @@ .\" .\" @(#)acct.5 8.1 (Berkeley) 6/5/93 .\" -.Dd $Mdocdate: December 13 2021 $ +.Dd $Mdocdate: February 22 2022 $ .Dt ACCT 5 .Os .Sh NAME @@ -57,16 +57,17 @@ to the accounting file. typedef u_int16_t comp_t; struct acct { - char ac_comm[10]; /* command name */ + char ac_comm[24]; /* command name, incl NUL */ comp_t ac_utime; /* user time */ comp_t ac_stime; /* system time */ comp_t ac_etime; /* elapsed time */ + comp_t ac_io; /* count of IO blocks */ time_t ac_btime; /* starting time */ uid_t ac_uid; /* user id */ gid_t ac_gid; /* group id */ - u_int16_t ac_mem; /* average memory usage */ - comp_t ac_io; /* count of IO blocks */ + u_int32_t ac_mem; /* average memory usage */ dev_t ac_tty; /* controlling tty, or -1 */ + pid_t ac_pid; /* process id */ #define AFORK 0x01 /* fork'd but not exec'd */ #define AMAP 0x04 /* system call or stack mapping violation */ @@ -75,7 +76,7 @@ struct acct { #define APLEDGE 0x20 /* killed due to pledge violation */ #define ATRAP 0x40 /* memory access violation */ #define AUNVEIL 0x80 /* unveil access violation */ - u_int8_t ac_flag; /* accounting flags */ + u_int32_t ac_flag; /* accounting flags */ }; /* diff --git a/sys/kern/kern_acct.c b/sys/kern/kern_acct.c index e8499529eeb..4ffb88f2e93 100644 --- a/sys/kern/kern_acct.c +++ b/sys/kern/kern_acct.c @@ -1,4 +1,4 @@ -/* $OpenBSD: kern_acct.c,v 1.45 2021/12/13 16:37:37 deraadt Exp $ */ +/* $OpenBSD: kern_acct.c,v 1.46 2022/02/22 17:22:29 deraadt Exp $ */ /* $NetBSD: kern_acct.c,v 1.42 1996/02/04 02:15:12 christos Exp $ */ /*- @@ -235,6 +235,9 @@ acct_process(struct proc *p) /* (8) The boolean flags that tell how process terminated or misbehaved. */ acct.ac_flag = pr->ps_acflag; + /* Extensions */ + acct.ac_pid = pr->ps_pid; + /* * Now, just write the accounting information to the file. */ diff --git a/sys/sys/acct.h b/sys/sys/acct.h index e802b258a84..dce3283b12c 100644 --- a/sys/sys/acct.h +++ b/sys/sys/acct.h @@ -1,4 +1,4 @@ -/* $OpenBSD: acct.h,v 1.11 2021/12/13 16:37:37 deraadt Exp $ */ +/* $OpenBSD: acct.h,v 1.12 2022/02/22 17:22:28 deraadt Exp $ */ /* $NetBSD: acct.h,v 1.16 1995/03/26 20:23:52 jtc Exp $ */ /*- @@ -37,6 +37,8 @@ * @(#)acct.h 8.3 (Berkeley) 7/10/94 */ +#include + /* * Accounting structures; these use a comp_t type which is a 3 bits base 8 * exponent, 13 bit fraction ``floating point'' number. Units are 1/AHZ @@ -45,25 +47,26 @@ typedef u_int16_t comp_t; struct acct { - char ac_comm[10]; /* command name */ - comp_t ac_utime; /* user time */ - comp_t ac_stime; /* system time */ - comp_t ac_etime; /* elapsed time */ - time_t ac_btime; /* starting time */ - uid_t ac_uid; /* user id */ - gid_t ac_gid; /* group id */ - u_int16_t ac_mem; /* average memory usage */ - comp_t ac_io; /* count of IO blocks */ - dev_t ac_tty; /* controlling tty, or -1 */ + char ac_comm[_MAXCOMLEN]; /* command name, incl NUL */ + comp_t ac_utime; /* user time */ + comp_t ac_stime; /* system time */ + comp_t ac_etime; /* elapsed time */ + comp_t ac_io; /* count of IO blocks */ + time_t ac_btime; /* starting time */ + uid_t ac_uid; /* user id */ + gid_t ac_gid; /* group id */ + u_int32_t ac_mem; /* average memory usage */ + dev_t ac_tty; /* controlling tty, or -1 */ + pid_t ac_pid; /* process id */ -#define AFORK 0x01 /* fork'd but not exec'd */ -#define AMAP 0x04 /* system call or stack mapping violation */ -#define ACORE 0x08 /* dumped core */ -#define AXSIG 0x10 /* killed by a signal */ -#define APLEDGE 0x20 /* killed due to pledge violation */ -#define ATRAP 0x40 /* memory access violation */ -#define AUNVEIL 0x80 /* unveil access violation */ - u_int8_t ac_flag; /* accounting flags */ +#define AFORK 0x01 /* fork'd but not exec'd */ +#define AMAP 0x04 /* system call or stack mapping violation */ +#define ACORE 0x08 /* dumped core */ +#define AXSIG 0x10 /* killed by a signal */ +#define APLEDGE 0x20 /* killed due to pledge violation */ +#define ATRAP 0x40 /* memory access violation */ +#define AUNVEIL 0x80 /* unveil access violation */ + u_int32_t ac_flag; /* accounting flags */ }; /* diff --git a/usr.sbin/sa/extern.h b/usr.sbin/sa/extern.h index e7d22341adf..4ab2142daa9 100644 --- a/usr.sbin/sa/extern.h +++ b/usr.sbin/sa/extern.h @@ -1,4 +1,4 @@ -/* $OpenBSD: extern.h,v 1.6 2019/01/17 06:21:46 tedu Exp $ */ +/* $OpenBSD: extern.h,v 1.7 2022/02/22 17:22:29 deraadt Exp $ */ /* * Copyright (c) 1994 Christopher G. Demetriou * All rights reserved. @@ -30,21 +30,22 @@ * */ -#include /* MAXCOMLEN */ +#include #include /* structures */ struct cmdinfo { - char ci_comm[MAXCOMLEN+2]; /* command name (+ '*') */ + char ci_comm[KI_MAXCOMLEN+1]; /* command name (+ '*') */ uid_t ci_uid; /* user id */ + pid_t ci_pid; /* pid */ uint64_t ci_calls; /* number of calls */ uint64_t ci_etime; /* elapsed time */ uint64_t ci_utime; /* user time */ uint64_t ci_stime; /* system time */ uint64_t ci_mem; /* memory use */ uint64_t ci_io; /* number of disk i/o ops */ - u_int ci_flags; /* flags; see below */ + uint32_t ci_flags; /* flags; see below */ }; #define CI_UNPRINTABLE 0x0001 /* unprintable chars in name */ diff --git a/usr.sbin/sa/main.c b/usr.sbin/sa/main.c index ac83714c3d0..fa7cb2fde79 100644 --- a/usr.sbin/sa/main.c +++ b/usr.sbin/sa/main.c @@ -1,4 +1,4 @@ -/* $OpenBSD: main.c,v 1.17 2021/10/24 21:24:19 deraadt Exp $ */ +/* $OpenBSD: main.c,v 1.18 2022/02/22 17:22:29 deraadt Exp $ */ /* * Copyright (c) 1994 Christopher G. Demetriou * All rights reserved. @@ -339,6 +339,7 @@ acct_load(char *pn, int wr) ci.ci_uid = ac.ac_uid; ci.ci_mem = ac.ac_mem; ci.ci_io = decode_comp_t(ac.ac_io) / AHZ; + ci.ci_pid = ac.ac_pid; if (!uflag) { /* and enter it into the usracct and pacct databases */ @@ -347,10 +348,10 @@ acct_load(char *pn, int wr) if (sflag || (mflag && !qflag)) usracct_add(&ci); } else if (!qflag) - printf("%6u %12.2f cpu %12lluk mem %12llu io %s\n", + printf("%6u %12.2f cpu %12lluk mem %12llu io pid %u %s\n", ci.ci_uid, (ci.ci_utime + ci.ci_stime) / (double) AHZ, - ci.ci_mem, ci.ci_io, ci.ci_comm); + ci.ci_mem, ci.ci_io, ci.ci_pid, ci.ci_comm); } /* finally, return the file descriptor for possible truncation */ -- 2.20.1