home *** CD-ROM | disk | FTP | other *** search
/ rtsi.com / 2014.01.www.rtsi.com.tar / www.rtsi.com / OS9 / OSK / APPS / elm.lzh / ELM / UTILS / AUTOREPLY.C < prev    next >
C/C++ Source or Header  |  1990-08-04  |  6KB  |  243 lines

  1.  
  2. static char rcsid[] = "@(#)$Id: autoreply.c,v 4.1 90/04/28 22:44:35 syd Exp $";
  3.  
  4. /*******************************************************************************
  5.  *  The Elm Mail System  -  $Revision: 4.1 $   $State: Exp $
  6.  *
  7.  *             Copyright (c) 1986, 1987 Dave Taylor
  8.  *             Copyright (c) 1988, 1989, 1990 USENET Community Trust
  9.  *******************************************************************************
  10.  * Bug reports, patches, comments, suggestions should be sent to:
  11.  *
  12.  *    Syd Weinstein, Elm Coordinator
  13.  *    elm@DSI.COM            dsinc!elm
  14.  *
  15.  *******************************************************************************
  16.  * $Log:    autoreply.c,v $
  17.  * Revision 4.1  90/04/28  22:44:35  syd
  18.  * checkin of Elm 2.3 as of Release PL0
  19.  * 
  20.  *
  21.  ******************************************************************************/
  22.  
  23. /** This is the front-end for the autoreply system, and performs two 
  24.     functions: it either adds the user to the list of people using the
  25.     autoreply function (starting the daemon if no-one else) or removes
  26.     a user from the list of people.
  27.  
  28.     Usage:  autoreply filename
  29.         autoreply "off"
  30.     or  autoreply        [to find current status]
  31.     
  32. **/
  33.  
  34. #include <stdio.h>
  35. #include <errno.h>
  36. #include <sys/types.h>
  37. #include <sys/stat.h>
  38.  
  39. #ifdef PWDINSYS
  40. #  include <sys/pwd.h>
  41. #else
  42. #  include <pwd.h>
  43. #endif
  44.  
  45. #include "defs.h"
  46.  
  47. static char ident[] = { WHAT_STRING };
  48.  
  49. #define  tempdir    "/tmp/arep"        /* file prefix          */
  50. #define  autoreply_file    "/etc/autoreply.data"   /* autoreply data file  */
  51.  
  52. extern   int errno;                /* system error code    */
  53. char     username[NLEN];            /* login name of user   */
  54.  
  55. main(argc, argv)
  56. int    argc;
  57. char *argv[];
  58. {
  59.     char filename[SLEN];
  60.     int userid;
  61.     struct passwd *pass;
  62. #ifndef    _POSIX_SOURCE
  63.     struct passwd *getpwuid();
  64. #endif
  65.  
  66.     if (argc > 2) {
  67.       printf("Usage: %s <filename>\tto start autoreply,\n", argv[0]);
  68.       printf("       %s off\t\tto turn off autoreply\n", argv[0]);
  69.       printf("   or  %s    \t\tto check current status\n", argv[0]);
  70.       exit(1);
  71.     }
  72.  
  73.     userid  = getuid();
  74.  
  75.     /*
  76.      * Get username (logname) field from the password entry for this user id.
  77.      */
  78.  
  79.     if((pass = getpwuid(userid)) == NULL) {
  80.       printf("You have no password entry!");
  81.       exit(1);
  82.     }
  83.     strcpy(username, pass->pw_name);
  84.  
  85.     if (argc == 1 || strcmp(argv[1], "off") == 0) 
  86.       remove_user((argc == 1));
  87.     else {
  88.       strcpy(filename, argv[1]);
  89.       if (access(filename,READ_ACCESS) != 0) {
  90.         printf("Error: Can't read file '%s'\n", filename);
  91.         exit(1);
  92.       }
  93.       
  94.       if (filename[0] != '/') /* prefix home directory */
  95.         sprintf(filename,"%s/%s", getenv("HOME"), argv[1]);
  96.  
  97.       add_user(filename);
  98.     }
  99.  
  100.     exit(0);
  101. }
  102.  
  103. remove_user(stat_only)
  104. int stat_only;
  105. {
  106.     /** Remove the user from the list of currently active autoreply 
  107.         people.  If 'stat_only' is set, then just list the name of
  108.         the file being used to autoreply with, if any. **/
  109.  
  110.     FILE *temp, *repfile;
  111.     char  tempfile[SLEN], user[SLEN], filename[SLEN];
  112.     int   c, copied = 0, found = 0;
  113.     long  filesize, bytes();
  114.  
  115.     if (! stat_only) {
  116.       sprintf(tempfile, "%s.%06d", tempdir, getpid());
  117.  
  118.       if ((temp = fopen(tempfile, "w")) == NULL) {
  119.         printf("Error: couldn't open tempfile '%s'.  Not removed\n",
  120.             tempfile);
  121.         exit(1);
  122.       }
  123.     }
  124.  
  125.     if ((repfile = fopen(autoreply_file, "r")) == NULL) {
  126.       if (stat_only) {
  127.         printf("You're not currently autoreplying to mail.\n");
  128.         exit(0);
  129.       }
  130.       printf("No-one is autoreplying to their mail!\n");
  131.       exit(0);
  132.     }
  133.  
  134.     /** copy out of real replyfile... **/
  135.  
  136.     while (fscanf(repfile, "%s %s %ld", user, filename, &filesize) != EOF) 
  137.  
  138.       if (strcmp(user, username) != 0) {
  139.         if (! stat_only) {
  140.           copied++;
  141.           fprintf(temp, "%s %s %ld\n", user, filename, filesize);
  142.         }
  143.       }
  144.       else {
  145.         if (stat_only) {
  146.           printf("You're currently autoreplying to mail with the file %s\n",              filename); 
  147.           exit(0);
  148.         }
  149.         found++;
  150.       }
  151.  
  152.     fclose(temp);
  153.     fclose(repfile);
  154.  
  155.     if (! found) {
  156.       printf("You're not currently autoreplying to mail%s\n",
  157.           stat_only? "." : "!");
  158.       if (! stat_only)
  159.         unlink(tempfile);
  160.       exit(! stat_only);
  161.     }
  162.  
  163.     /** now copy tempfile back into replyfile **/
  164.  
  165.     if (copied == 0) {    /* removed the only person! */
  166.       unlink(autoreply_file);
  167.     }
  168.     else {            /* save everyone else   */
  169.       
  170.       if ((temp = fopen(tempfile,"r")) == NULL) {
  171.         printf("Error: couldn't reopen tempfile '%s'.  Not removed.\n",
  172.             tempfile);
  173.         unlink(tempfile);
  174.         exit(1);
  175.       }
  176.  
  177.       if ((repfile = fopen(autoreply_file, "w")) == NULL) {
  178.         printf(
  179.           "Error: couldn't reopen autoreply file for writing!  Not removed.\n");
  180.         unlink(tempfile);
  181.         exit(1);
  182.       }
  183.  
  184.       while ((c = getc(temp)) != EOF)
  185.         putc(c, repfile);
  186.  
  187.       fclose(temp);
  188.       fclose(repfile);
  189.     
  190.     }
  191.     unlink(tempfile);
  192.  
  193.     if (found > 1)
  194.       printf("Warning: your username appeared %d times!!   Removed all\n", 
  195.           found);
  196.     else
  197.       printf("You've been removed from the autoreply table.\n");
  198. }
  199.  
  200. add_user(filename)
  201. char *filename;
  202. {
  203.     /** add the user to the autoreply file... **/
  204.  
  205.     FILE *repfile;
  206.     char  mailfile[SLEN];
  207.     long  bytes();
  208.  
  209.     if ((repfile = fopen(autoreply_file, "a")) == NULL) {
  210.       printf("Error: couldn't open the autoreply file!  Not added\n");
  211.       exit(1);
  212.     }
  213.     
  214.     sprintf(mailfile,"%s/%s", mailhome, username);
  215.  
  216.     fprintf(repfile,"%s %s %ld\n", username, filename, bytes(mailfile));
  217.  
  218.     fclose(repfile);
  219.  
  220.     printf("You've been added to the autoreply system.\n");
  221. }
  222.  
  223.  
  224. long
  225. bytes(name)
  226. char *name;
  227. {
  228.     /** return the number of bytes in the specified file.  This
  229.         is to check to see if new mail has arrived....  **/
  230.  
  231.     int ok = 1;
  232.     extern int errno;    /* system error number! */
  233.     struct stat buffer;
  234.  
  235.     if (stat(name, &buffer) != 0)
  236.       if (errno != 2)
  237.        exit(fprintf(stderr,"Error %d attempting fstat on %s", errno, name));
  238.       else
  239.         ok = 0;
  240.     
  241.     return(ok ? buffer.st_size : 0L);
  242. }
  243.