/* * Utility program for AberMUD [Dirt 3.0] * * Dumps the user-activity-file (uaf) given as argument in human-readable * form to the standard output. If no argument is given, the file UAF_RAND * is assumed. * * Options: -l [level] -Level. Only show players >= the specified level. * The default is 1, but ignore level if -a is on. * This option is really unneccesary on UNIX systems, * I'd like to remove it, but it's there... * * -f -Flags. Show full names of flags. Default is hex. * (Not imlemented yet.) * * -h -Header. Include a header that explains the * columns. Useful if the standard output is a tty. * * -d [days] -Show only players who have been on at least once * the last specified number of days. * * -a -All. Do not skip entries with empty names. For * debugging purposes where we want the whole file. * * Gjermund S. (Nicknack), March 1991 */ #include <sys/types.h> #include <time.h> #include <errno.h> #include "kernel.h" #include "macros.h" #include "sflags.h" #include "pflags.h" #include "pflagnames.h" extern int getopt(int argc, char **argv, char *optstr); extern int optind; extern char *optarg; void usage(char *progname); main( int argc, char *argv[] ) { PERSONA p; FILE * fl; int option; char * filename; time_t earliest; const int secs_in_a_day = 86400; int incl = 0, flags = 0, debug = 0, level = 1, days = 0; while ((option = getopt(argc, argv, "ad:l:fh")) != -1) { switch (option) { case 'a': debug++; break; case 'h': incl++; break; case 'f': flags++; break; case 'l': level = atoi(optarg); break; case 'd': days = atoi(optarg); break; case '?': usage(*argv); exit(1); } } filename = optind < argc ? argv[optind] : DATA_DIR UAF_RAND; if ((fl = fopen( filename, "r" )) == NULL) { perror( filename ); exit(1); } if (days > 0) earliest = time((time_t *)NULL) - days * secs_in_a_day; if (incl) { printf("Name Sex Level Score Strength"); printf(" Pflags\n------------------------"); printf("----------------------------------------------------\n\n"); } while (fread( &p, sizeof(p), 1, fl) > 0) { if ( !debug && (p.p_level < level || *p.p_name == '\0' || days > 0 && p.p_last_on < earliest) ) continue; printf( "%-13.12s%c %9d %10d %9d 0x%08x%08x\n", p.p_name, xtstbit(p.p_sflags, SFL_FEMALE) ? 'f' : 'm', p.p_level, p.p_score, p.p_strength, p.p_pflags.h, p.p_pflags.l); } fclose( fl ); return(0); } void usage(char *progname) { fprintf(stderr, "Usage: %s <options> <uaf-file>\n\n", progname); fprintf(stderr, "Options: -a All entries (including empty ones)\n"); fprintf(stderr, " -d <#> Only players on the last # days.\n"); fprintf(stderr, " -l <level>Only players > level. Default = 1.\n"); fprintf(stderr, " -h Include Header explaning output\n"); }