home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 January / usenetsourcesnewsgroupsinfomagicjanuary1994.iso / sources / misc / volume3 / send / huh.c next >
Encoding:
C/C++ Source or Header  |  1989-02-03  |  3.7 KB  |  222 lines

  1. /*
  2. **  huh.c --
  3. **        What was that last send?
  4. **
  5. **    Written by: Keith Gabryelski (ag@elgar.UUCP)
  6. **
  7. **        Released into public domain June 14, 1988.
  8. **            Please keep this header.
  9. */
  10.  
  11. #include <stdio.h>
  12. #include <sys/types.h>
  13. #include <sys/stat.h>
  14. #include <pwd.h>
  15. #include <errno.h>
  16.  
  17. extern errno;
  18.  
  19. extern FILE *fopen();
  20. extern struct passwd *getpwuid(), *getpwnam();
  21. extern char *sys_errlist[], *malloc(), *realloc();
  22. extern int sys_nerr;
  23.  
  24. #undef TRUE
  25. #undef FALSE
  26. #define TRUE            1
  27. #define FALSE            0
  28.  
  29. #define    SENDS_FILENAME        "/.sends"    /* must have the '/' */
  30. #define MESSAGE_SEPARATOR    0x1F
  31.  
  32. char *puterr(), *mymalloc(), *myrealloc();
  33. char *progname;
  34.  
  35. int sflag = FALSE;
  36.  
  37. char *
  38. mymalloc(size)
  39. unsigned size;
  40. {
  41.     char *p;
  42.  
  43.     if ((p = malloc(size)) == NULL)
  44.     {
  45.     (void) fprintf(stderr, "%s: Out of memory.\n", progname);
  46.     exit(-1);
  47.     }
  48.  
  49.     return p;
  50. }
  51.  
  52. char *
  53. myrealloc(p, size)
  54. char *p;
  55. unsigned size;
  56. {
  57.     if (p == NULL)
  58.     {
  59.     if ((p = malloc(size)) == NULL)
  60.     {
  61.         (void) fprintf(stderr, "%s: Out of memory.\n", progname);
  62.         exit(-1);
  63.     }
  64.     }
  65.     else if ((p = realloc(p, size)) == NULL)
  66.     {
  67.     (void) fprintf(stderr, "%s: Out of memory.\n", progname);
  68.     exit(-1);
  69.     }
  70.  
  71.     return p;
  72. }
  73.  
  74. main(argc, argv)
  75. int argc;
  76. char **argv;
  77. {
  78.     char *ptr, *sends_filename = mymalloc(0);
  79.     int amount = 1, n, c;
  80.     long *seek_list = (long *)mymalloc(0);
  81.     struct passwd *pt;
  82.     FILE *fp;
  83.  
  84.     progname = *argv++;  --argc;
  85.  
  86.     if (**argv == '-')
  87.     if (!strcmp(*argv, "-s"))
  88.     {
  89.         sflag = TRUE;
  90.         *++argv; --argc;
  91.     }
  92.     else
  93.     {
  94.         fprintf(stderr, "%s: invalid switch given.\n", progname);
  95.         usage();
  96.     }
  97.  
  98.     if (argc > 2)
  99.     usage();
  100.  
  101.     if (argc)
  102.     {
  103.     amount = atoi(*argv++);
  104.     --argc;
  105.     }
  106.  
  107.     if (amount < 1)
  108.     {
  109.     fprintf(stderr, "%s: invalid amount.\n", progname);
  110.     usage();
  111.     }
  112.  
  113.     if (argc)
  114.     {
  115.     if ((pt = getpwnam(*argv)) == (struct passwd *)NULL)
  116.     {
  117.         fprintf(stderr, "%s: invalid user name '%s'.\n", progname, *argv);
  118.         exit(-1);
  119.     }
  120.     }
  121.     else
  122.     pt = getpwuid(getuid());
  123.  
  124.     if ((ptr = pt->pw_dir) == NULL)
  125.     {
  126.     fprintf(stderr, "%s: couldn't find a home directory.\n", progname);
  127.     exit(-1);
  128.     }
  129.  
  130.     sends_filename = myrealloc(sends_filename, strlen(ptr) +
  131.                    sizeof(SENDS_FILENAME) + 1);
  132.  
  133.     strcpy(sends_filename, ptr);
  134.     strcat(sends_filename, SENDS_FILENAME);
  135.  
  136.     if ((fp = fopen(sends_filename, "r")) == (FILE *)NULL)
  137.     {
  138.     if (errno == ENOENT)
  139.     {
  140.         fprintf(stderr, "No sends.\n");
  141.         exit(0);
  142.     }
  143.     else
  144.     {
  145.         fprintf(stderr, "%s: couldn't open sends file %s (%s).\n",
  146.             progname, sends_filename, puterr(errno));
  147.         exit(-1);
  148.     }
  149.     }
  150.  
  151.     /* setup null sent_to_list */
  152.  
  153.     seek_list = (long *)myrealloc(seek_list, sizeof(long));
  154.     seek_list[0] = -1;
  155.  
  156.     do
  157.     {
  158.     n = add_to_list(&seek_list, ftell(fp));
  159.  
  160.     while((c = getc(fp)) != MESSAGE_SEPARATOR && c != EOF)
  161.         ;
  162.     } while (c != EOF);
  163.  
  164.     if (n == 1)
  165.     fprintf(stderr, "No sends.\n");
  166.     else
  167.     {
  168.     if (n-1 < amount)
  169.         amount = 0;
  170.     else
  171.         amount = n - amount - 1;
  172.  
  173.     fseek(fp, seek_list[amount], 0);
  174.  
  175.     do
  176.     {
  177.         while ((c = getc(fp)) != MESSAGE_SEPARATOR && c != EOF)
  178.         putchar(c);
  179.  
  180.         if (sflag && c == MESSAGE_SEPARATOR)
  181.         putchar(MESSAGE_SEPARATOR);
  182.     } while (c != EOF);
  183.     }
  184.     
  185.     fclose(fp);
  186.  
  187.     exit(0);
  188. }
  189.  
  190. usage()
  191. {
  192.     fprintf(stderr, "%s: usage %s [-s] [amount] [username]\n", progname,
  193.         progname);
  194.     exit(-1);
  195. }
  196.  
  197. add_to_list(list, element)
  198. long **list, element;
  199. {
  200.     register int i;
  201.  
  202.     for (i = 0; (*list)[i] != -1; ++i)
  203.     ;
  204.  
  205.     *list = (long *)myrealloc(*list, sizeof(long) * (i + 2));
  206.     (*list)[i] = element;
  207.     (*list)[i+1] = -1;
  208.  
  209.     return i+1;
  210. }
  211.  
  212. char *
  213. puterr(error)
  214. int error;
  215. {
  216.     static char qwerty[42];
  217.  
  218.     (void) sprintf(qwerty, "Unknown error %d", error);
  219.  
  220.     return ((unsigned)error >= sys_nerr) ? qwerty : sys_errlist[error];
  221. }
  222.