chiark
/
gitweb
/
~ian
/
chiark-utils.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Merge branch 'master' into merge-141006
[chiark-utils.git]
/
cprogs
/
acctdump.c
diff --git
a/cprogs/acctdump.c
b/cprogs/acctdump.c
index 2bc85f350269806a3359131da082551a21e717fa..98fab9c55d4f96d0d782500894c99a5c1f62b4d1 100644
(file)
--- a/
cprogs/acctdump.c
+++ b/
cprogs/acctdump.c
@@
-28,8
+28,13
@@
#include <grp.h>
#include <dirent.h>
#include <ctype.h>
#include <grp.h>
#include <dirent.h>
#include <ctype.h>
+#include <errno.h>
#include <sys/stat.h>
#include <sys/stat.h>
-#include <sys/acct.h>
+
+typedef unsigned long long u64;
+#include "acct.h"
+/*#include <sys/acct.h>*/
+typedef struct acct_v3 struct_acct;
#include "myopt.h"
#include "myopt.h"
@@
-91,12
+96,16
@@
static void scandev(const char *basename, int levelsleft) {
if (levelsleft==0) return;
if (levelsleft==0) return;
- dir= opendir(basename); if (!dir) return;
+ dir= opendir(basename);
+ if (!dir) {
+ fprintf(stderr, "%s: opendir: %s\n", basename, strerror(errno));
+ return;
+ }
fnbufalloc= 0;
fnbuf= 0;
basel= strlen(basename);
fnbufalloc= 0;
fnbuf= 0;
basel= strlen(basename);
- while ((de= readdir(dir))) {
+ while ((
errno=0,
de= readdir(dir))) {
fnbufreq= basel+1+strlen(de->d_name)+1;
if (fnbufalloc<fnbufreq) {
fnbufalloc= fnbufreq+10;
fnbufreq= basel+1+strlen(de->d_name)+1;
if (fnbufalloc<fnbufreq) {
fnbufalloc= fnbufreq+10;
@@
-106,6
+115,10
@@
static void scandev(const char *basename, int levelsleft) {
}
sprintf(fnbuf,"%s/%s",basename,de->d_name);
r= lstat(fnbuf,&stab);
}
sprintf(fnbuf,"%s/%s",basename,de->d_name);
r= lstat(fnbuf,&stab);
+ if (r) {
+ fprintf(stderr, "%s: %s\n", fnbuf, strerror(errno));
+ continue;
+ }
if (S_ISCHR(stab.st_mode)) {
if (de_used >= de_allocd) {
nallocd= (de_allocd+10)<<1;
if (S_ISCHR(stab.st_mode)) {
if (de_used >= de_allocd) {
nallocd= (de_allocd+10)<<1;
@@
-122,6
+135,8
@@
static void scandev(const char *basename, int levelsleft) {
scandev(fnbuf,levelsleft-1);
}
}
scandev(fnbuf,levelsleft-1);
}
}
+ if (errno)
+ fprintf(stderr, "%s: readdir: %s\n", basename, strerror(errno));
closedir(dir);
free(fnbuf);
}
closedir(dir);
free(fnbuf);
}
@@
-150,7
+165,7
@@
static void printbanner(void) {
checkstdout();
}
checkstdout();
}
-static void printrecord(const struct
acct *as, const char *filename) {
+static void printrecord(const struct
_
acct *as, const char *filename) {
static int walkeddev;
int i, dc, r;
static int walkeddev;
int i, dc, r;
@@
-160,11
+175,13
@@
static void printrecord(const struct acct *as, const char *filename) {
struct deventry *deve, devlookfor;
struct passwd *pw;
struct group *gr;
struct deventry *deve, devlookfor;
struct passwd *pw;
struct group *gr;
+ time_t btime;
if (raw) {
printf("%10lu ",(unsigned long)as->ac_btime);
} else {
if (raw) {
printf("%10lu ",(unsigned long)as->ac_btime);
} else {
- tm= localtime(&as->ac_btime);
+ btime= as->ac_btime;
+ tm= localtime(&btime);
strftime(buf,sizeof(buf),"%Y-%m-%d %H:%M:%S",tm); buf[sizeof(buf)-1]= 0;
printf("%19s ",buf);
}
strftime(buf,sizeof(buf),"%Y-%m-%d %H:%M:%S",tm); buf[sizeof(buf)-1]= 0;
printf("%19s ",buf);
}
@@
-180,13
+197,13
@@
static void printrecord(const struct acct *as, const char *filename) {
else printf("%-8ld ",(long)as->ac_gid);
if (raw) {
else printf("%-8ld ",(long)as->ac_gid);
if (raw) {
- if (
as->ac_tty == (dev_t)-1
) {
+ if (
!(as->ac_tty + 1) /* check for -1 without knowing type */
) {
printf("- ");
} else {
printf("%08lx ",(unsigned long)as->ac_tty);
}
} else {
printf("- ");
} else {
printf("%08lx ",(unsigned long)as->ac_tty);
}
} else {
- if (
as->ac_tty == (dev_t)-1
) {
+ if (
!(as->ac_tty + 1)
) {
printf("- ");
} else {
if (!walkeddev) {
printf("- ");
} else {
if (!walkeddev) {
@@
-206,11
+223,11
@@
static void printrecord(const struct acct *as, const char *filename) {
}
r= as->ac_flag;
}
r= as->ac_flag;
- for (i=1, fp= "FSDX"; *fp; fp++, i<<=1) {
+ for (i=1, fp= "FS
4
DX"; *fp; fp++, i<<=1) {
if (r&i) {
putchar(*fp);
r &= ~i;
if (r&i) {
putchar(*fp);
r &= ~i;
- } else {
+ } else
if (!isdigit(*fp))
{
putchar(' ');
}
}
putchar(' ');
}
}
@@
-263,8
+280,8
@@
static void printrecord(const struct acct *as, const char *filename) {
}
static void processfile(FILE *file, const char *filename) {
}
static void processfile(FILE *file, const char *filename) {
-
fpos_t po
s;
-
struct acct a
s;
+
struct_acct a
s;
+
long po
s;
int r;
if (forwards) {
int r;
if (forwards) {
@@
-272,14
+289,21
@@
static void processfile(FILE *file, const char *filename) {
printrecord(&as,filename);
}
} else {
printrecord(&as,filename);
}
} else {
+ long seekdist= -(long)sizeof(as);
r= fseek(file,0,SEEK_END); if (r) { perror(filename); exit(8); }
r= fseek(file,0,SEEK_END); if (r) { perror(filename); exit(8); }
- r= fgetpos(file,&pos); if (r) { perror(filename); exit(8); }
+ pos= ftell(file); if (pos==-1) { perror(filename); exit(8); }
+ if (pos % sizeof(as)) {
+ fprintf(stderr, "%s: File size is not an integral number "
+ "of accounting records", filename);
+ exit(8);
+ }
for (;;) {
if (pos<sizeof(as)) break;
pos -= sizeof(as);
for (;;) {
if (pos<sizeof(as)) break;
pos -= sizeof(as);
- r= fse
tpos(file,&pos); if (r
) { perror(filename); exit(8); }
+ r= fse
ek(file,pos,SEEK_SET); if (r==-1
) { perror(filename); exit(8); }
r= fread(&as,1,sizeof(as),file); if (r!=sizeof(as)) { perror(filename); exit(8); }
printrecord(&as,filename);
r= fread(&as,1,sizeof(as),file); if (r!=sizeof(as)) { perror(filename); exit(8); }
printrecord(&as,filename);
+ seekdist= -2*(long)sizeof(as);
}
}
if (ferror(file) || fclose(file)) { perror(filename); exit(8); }
}
}
if (ferror(file) || fclose(file)) { perror(filename); exit(8); }
@@
-293,8
+317,11
@@
static void processnamedfile(const char *filename) {
}
int main(int argc, const char *const *argv) {
}
int main(int argc, const char *const *argv) {
+union { struct_acct ac; char c[1]; } xu;
myopt(&argv,cmdinfos);
if (!nobanner) printbanner();
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,"<standard input>");
} else if (!*argv) {
if (usestdin) {
processfile(stdin,"<standard input>");
} else if (!*argv) {