X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ian/git?a=blobdiff_plain;f=cprogs%2Facctdump.c;h=77e1896f253ad8bbd78032e161eba20e029c4bb3;hb=2189c49e5f192af1255b790fed00adaba6e0970b;hp=ed6066179363954433e6578a5f36e81a8658c436;hpb=7cb8758351b7b8765f06867811e10213036a3c41;p=chiark-utils.git diff --git a/cprogs/acctdump.c b/cprogs/acctdump.c index ed60661..77e1896 100644 --- a/cprogs/acctdump.c +++ b/cprogs/acctdump.c @@ -32,9 +32,35 @@ #include typedef unsigned long long u64; -#include "acct.h" -/*#include */ + + +/* Sadly this thing is not very portable */ + +#if defined(__linux__) + +#include +#include + typedef struct acct_v3 struct_acct; +#define HAVE_AC_EXITCODE +#define HAVE_AC_FLT +#define FIELD_AC_FLAG(as) ((as)->ac_flag) + +#elif defined(__FreeBSD__) || defined(__FreeBSD_kernel__) + +#include +#include +#include + +typedef struct acctv2 struct_acct; +#define FIELD_AC_FLAG(as) ((as)->ac_flagx & ~ANVER) + +#else + +#error Do not know what struct_acct to use on this platform + +#endif + #include "myopt.h" @@ -55,30 +81,20 @@ static const struct cmdinfo cmdinfos[]= { { 0 } }; +#ifdef HAVE_AC_EXITCODE static const char *sigabbrev[]= { "HUP", "INT", "QUIT", "ILL", "TRAP", "ABRT", "BUS", "FPE", "KILL", "USR1", "SEGV", "USR2", "PIPE", "ALRM", "TERM", "STKFLT", "CHLD", "CONT", "STOP", "TSTP", "TTIN", "TTOU", "URG", "XCPU", "XFSZ", "VTALRM", "PROF", "WINCH", "IO" }; +#endif -static void usage(FILE *file) { +void usagemessage(void) { fputs("usage: acctdump [] [ ...]\n" "options: -f|--forwards -q|--no-banner -p|--stdin -r|--raw -u|--resource\n", - file); - if (ferror(file)) { perror("print usage"); exit(8); } -} - -void badusage(const char *fmt, ...) { - va_list al; - - fputs("usage error: ",stderr); - va_start(al,fmt); - vfprintf(stderr,fmt,al); - va_end(al); - fputs("\n",stderr); - usage(stderr); - exit(12); + stderr); + if (ferror(stderr)) { perror("print usage"); exit(8); } } static void checkstdout(void) { @@ -150,16 +166,25 @@ static int walkdev_cptr(const void *av, const void *bv) { static void printbanner(void) { if (raw) { fputs("begin date command " - "uid gid tty dev FSDX exit", - stdout); + "uid gid tty dev FSDX " +#ifdef HAVE_AC_EXITCODE + "exit" +#endif + , stdout); } else { fputs("begin date and time command " - "user group tty dev FSDX sigexit", - stdout); + "user group tty dev FSDX " +#ifdef HAVE_AC_EXITCODE + "sigexit" +#endif + , stdout); } if (usages) { - fputs(" user time sys time elap time minflt maxflt", - stdout); + fputs(" user time sys time elap time " +#ifdef HAVE_AC_FLT + " minflt maxflt" +#endif + , stdout); } putchar('\n'); checkstdout(); @@ -168,7 +193,7 @@ static void printbanner(void) { static void printrecord(const struct_acct *as, const char *filename) { static int walkeddev; - int i, dc, r; + int i, r; const char *fp; char buf[100]; struct tm *tm; @@ -222,7 +247,7 @@ static void printrecord(const struct_acct *as, const char *filename) { } } - r= as->ac_flag; + r= FIELD_AC_FLAG(as); for (i=1, fp= "FS4DX"; *fp; fp++, i<<=1) { if (r&i) { putchar(*fp); @@ -235,7 +260,9 @@ static void printrecord(const struct_acct *as, const char *filename) { printf("#%x",r); } putchar(' '); - + +#ifdef HAVE_AC_EXITCODE + int dc; dc= WCOREDUMP(as->ac_exitcode) ? 'd' : 'k'; if (raw) { if (WIFEXITED(as->ac_exitcode)) { @@ -265,14 +292,18 @@ static void printrecord(const struct_acct *as, const char *filename) { printf("#%04lx",(unsigned long)as->ac_exitcode); } } +#endif /*HAVE_AC_EXITCODE*/ if (usages) { - printf(" %10lu %10lu %10lu %8ld %8ld", + printf(" %10lu %10lu %10lu", (unsigned long)as->ac_utime, (unsigned long)as->ac_stime, - (unsigned long)as->ac_etime, + (unsigned long)as->ac_etime); +#ifdef HAVE_AC_FLT + printf(" %8lu %8lu", (unsigned long)as->ac_minflt, (unsigned long)as->ac_majflt); +#endif } putchar('\n'); @@ -315,15 +346,12 @@ static void processnamedfile(const char *filename) { } int main(int argc, const char *const *argv) { -union { struct_acct ac; char c[1]; } xu; myopt(&argv,cmdinfos); if (!nobanner) printbanner(); -fprintf(stdout,"s=%d %d\n",(int)sizeof(struct_acct), - (int)((char*)&xu.ac.ac_comm - xu.c)); if (usestdin) { processfile(stdin,""); } else if (!*argv) { - processnamedfile("/var/account/pacct"); + processnamedfile("/var/log/account/pacct"); } else { while (*argv) { processnamedfile(*argv);