home *** CD-ROM | disk | FTP | other *** search
- /*
- ** huh.c --
- ** What was that last send?
- **
- ** Written by: Keith Gabryelski (ag@elgar.UUCP)
- **
- ** Released into public domain June 14, 1988.
- ** Please keep this header.
- */
-
- #include <stdio.h>
- #include <sys/types.h>
- #include <sys/stat.h>
- #include <pwd.h>
- #include <errno.h>
-
- extern errno;
-
- extern FILE *fopen();
- extern struct passwd *getpwuid(), *getpwnam();
- extern char *sys_errlist[], *malloc(), *realloc();
- extern int sys_nerr;
-
- #undef TRUE
- #undef FALSE
- #define TRUE 1
- #define FALSE 0
-
- #define SENDS_FILENAME "/.sends" /* must have the '/' */
- #define MESSAGE_SEPARATOR 0x1F
-
- char *puterr(), *mymalloc(), *myrealloc();
- char *progname;
-
- int sflag = FALSE;
-
- char *
- mymalloc(size)
- unsigned size;
- {
- char *p;
-
- if ((p = malloc(size)) == NULL)
- {
- (void) fprintf(stderr, "%s: Out of memory.\n", progname);
- exit(-1);
- }
-
- return p;
- }
-
- char *
- myrealloc(p, size)
- char *p;
- unsigned size;
- {
- if (p == NULL)
- {
- if ((p = malloc(size)) == NULL)
- {
- (void) fprintf(stderr, "%s: Out of memory.\n", progname);
- exit(-1);
- }
- }
- else if ((p = realloc(p, size)) == NULL)
- {
- (void) fprintf(stderr, "%s: Out of memory.\n", progname);
- exit(-1);
- }
-
- return p;
- }
-
- main(argc, argv)
- int argc;
- char **argv;
- {
- char *ptr, *sends_filename = mymalloc(0);
- int amount = 1, n, c;
- long *seek_list = (long *)mymalloc(0);
- struct passwd *pt;
- FILE *fp;
-
- progname = *argv++; --argc;
-
- if (**argv == '-')
- if (!strcmp(*argv, "-s"))
- {
- sflag = TRUE;
- *++argv; --argc;
- }
- else
- {
- fprintf(stderr, "%s: invalid switch given.\n", progname);
- usage();
- }
-
- if (argc > 2)
- usage();
-
- if (argc)
- {
- amount = atoi(*argv++);
- --argc;
- }
-
- if (amount < 1)
- {
- fprintf(stderr, "%s: invalid amount.\n", progname);
- usage();
- }
-
- if (argc)
- {
- if ((pt = getpwnam(*argv)) == (struct passwd *)NULL)
- {
- fprintf(stderr, "%s: invalid user name '%s'.\n", progname, *argv);
- exit(-1);
- }
- }
- else
- pt = getpwuid(getuid());
-
- if ((ptr = pt->pw_dir) == NULL)
- {
- fprintf(stderr, "%s: couldn't find a home directory.\n", progname);
- exit(-1);
- }
-
- sends_filename = myrealloc(sends_filename, strlen(ptr) +
- sizeof(SENDS_FILENAME) + 1);
-
- strcpy(sends_filename, ptr);
- strcat(sends_filename, SENDS_FILENAME);
-
- if ((fp = fopen(sends_filename, "r")) == (FILE *)NULL)
- {
- if (errno == ENOENT)
- {
- fprintf(stderr, "No sends.\n");
- exit(0);
- }
- else
- {
- fprintf(stderr, "%s: couldn't open sends file %s (%s).\n",
- progname, sends_filename, puterr(errno));
- exit(-1);
- }
- }
-
- /* setup null sent_to_list */
-
- seek_list = (long *)myrealloc(seek_list, sizeof(long));
- seek_list[0] = -1;
-
- do
- {
- n = add_to_list(&seek_list, ftell(fp));
-
- while((c = getc(fp)) != MESSAGE_SEPARATOR && c != EOF)
- ;
- } while (c != EOF);
-
- if (n == 1)
- fprintf(stderr, "No sends.\n");
- else
- {
- if (n-1 < amount)
- amount = 0;
- else
- amount = n - amount - 1;
-
- fseek(fp, seek_list[amount], 0);
-
- do
- {
- while ((c = getc(fp)) != MESSAGE_SEPARATOR && c != EOF)
- putchar(c);
-
- if (sflag && c == MESSAGE_SEPARATOR)
- putchar(MESSAGE_SEPARATOR);
- } while (c != EOF);
- }
-
- fclose(fp);
-
- exit(0);
- }
-
- usage()
- {
- fprintf(stderr, "%s: usage %s [-s] [amount] [username]\n", progname,
- progname);
- exit(-1);
- }
-
- add_to_list(list, element)
- long **list, element;
- {
- register int i;
-
- for (i = 0; (*list)[i] != -1; ++i)
- ;
-
- *list = (long *)myrealloc(*list, sizeof(long) * (i + 2));
- (*list)[i] = element;
- (*list)[i+1] = -1;
-
- return i+1;
- }
-
- char *
- puterr(error)
- int error;
- {
- static char qwerty[42];
-
- (void) sprintf(qwerty, "Unknown error %d", error);
-
- return ((unsigned)error >= sys_nerr) ? qwerty : sys_errlist[error];
- }
-