/* * Utility program for AberMUD [Dirt 3.0] * (Modified for iDIRT by Illusion) * * 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 * Illusion, January 1995 */ #include <stdlib.h> #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); int main (int argc, char *argv[]) { PERSONA p; FILE *fl; int option; char *filename; time_t earliest = 0; 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 Str PFlags\n"); printf ("-----------------------------------------------------------------------\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 %7d %8d %8d 0x%08lx%08lx%08lx\n", p.p_name, xtstbit (p.p_sflags.l, SFL_FEMALE) ? 'F' : 'M', p.p_level, p.p_score, p.p_strength, p.p_pflags.u, 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 <lvl> Only players > level. Default = 1.\n"); fprintf (stderr, " -h Include Header explaning output\n"); }