home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / misc / volume30 / sendopr / part01 / sendopr.c < prev    next >
C/C++ Source or Header  |  1992-06-20  |  5KB  |  152 lines

  1. /*    $Author: reggers $
  2. *    $Date: 1992/04/21 14:31:46 $
  3. *    $Id: sendopr.c,v 1.5 1992/04/21 14:31:46 reggers Exp $
  4. *    $Source: /usr/src/usr.local/utilities/sendopr/RCS/sendopr.c,v $
  5. *    $State: Exp $
  6. *
  7. *  Original work done by Brian Borowski on April 10 1992
  8. *  done during a placement here at UWO
  9. *  This program sends messages to the operator in one of two modes.
  10. *  These are immediate where the message on the command line is sent via
  11. *  xmessage.  In this mode the program will pause until the operator
  12. *  clicks on the button at the bottom of the message window, at which
  13. *  point the sender will see "okay" and be returned to the prompt.
  14. *  In the second mode queued mode the message is sent via a host
  15. *  socket pair using tcp and the message is queued for future reading
  16. *  by the operator.  Immediate and queued can be controlled from the
  17. *  command line by the -i and -q options.  If the controlling device
  18. *  is not a tty then queued mode is assumed.
  19. */
  20.  
  21. static    char    *rcsid="$Id: sendopr.c,v 1.5 1992/04/21 14:31:46 reggers Exp $";
  22.  
  23. #ifndef SENDOPRHOST
  24. #define SENDOPRHOST "sendoprhost"
  25. #endif
  26.  
  27. #ifndef SENDOPRPORT
  28. #define SENDOPRPORT "sendopr"
  29. #endif
  30.  
  31. #define CFG "/usr/local/share/etc/operator"
  32.  
  33. #include <stdio.h>
  34. #include <sysexits.h>
  35. #include <sys/types.h>
  36. #include <pwd.h>
  37. #include <errno.h>
  38. #include "sendoprd.h"
  39.  
  40. char display_buf[BUFSIZ];
  41. char msg_buf[BUFSIZ];
  42. char *usage="sendopr [-i|-q] [-d display] [-s subject] message";
  43. char *display = DISPLAY;
  44. char *title = TITLE;
  45. char *name = NAME;
  46. char *subject=NAME, *logname, *date;
  47. char myhost[BUFSIZ]; /* name of host */
  48. int from_stdin=0; /* assume input is from args rather than stdin */
  49. int debug=0;
  50.  
  51. /* msg_print: feeds the users message into the file pointer.
  52.     Returns no value.  Called by main. */
  53. void msg_print(argv, argc, start, fp)
  54. char *argv[];
  55. int argc, start;
  56. FILE *fp;
  57. { int i;
  58.  
  59. fprintf(fp, "From: %s@%s\n", logname, myhost);
  60. fprintf(fp, "Subject: %s\n", subject);
  61. fprintf(fp, "Date: %s\n", date);
  62. if (from_stdin) /* get message from stdin and feed it out */
  63.     while (fgets(msg_buf, BUFSIZ, stdin) != NULL)
  64.     fputs(msg_buf, fp);
  65.     else /* else get message from argv */
  66.   { for (i = start; argv[i]; i++) /* feed rest of argv into pipe */
  67.       { fprintf(fp, "%s", argv[i]);
  68.         if (i < argc-1) putc(' ', fp);
  69.         } /* end for args */
  70.     putc('\n', fp);
  71.     } /* end else from args */
  72. fflush(fp);
  73. } /* end msg_print */
  74.  
  75.  
  76. main(argc, argv)
  77. int argc;
  78. char *argv[];
  79. { int unit, i;
  80. time_t secs;
  81. char *getlogin(), *ctime();
  82. extern int optind;
  83. extern char *optarg;
  84. extern int tcpopen();
  85. int immediate, c;
  86. struct passwd *pw_info;
  87. FILE *fp_out, *fp1;
  88.  
  89. if (isatty(fileno(stdin)))
  90.     immediate = 1; /* set immediate to true if tty */
  91.     else immediate = 0;
  92. /* parse command line arguments: */
  93. if (argc == 1) /* assume input from stdin */
  94.     from_stdin=1;
  95.     else /* check the argv */
  96.     while ((c = getopt(argc, argv, "iqd:s:")) != EOF)
  97.     switch(c)
  98.       { case 'i' : if (optind == 2)
  99.             immediate=1;
  100.         break;
  101.         case 'q' : if (optind == 2)
  102.             immediate=0;
  103.         break;
  104.         case 'd' : display=optarg;
  105.         break;
  106.         case 's' : subject = (optarg)? optarg: NAME;
  107.         break;
  108.         default : fprintf(stderr, usage);
  109.         exit(EX_USAGE);
  110.         } /* end case */
  111.  
  112. if (optind == argc) from_stdin=1; /* message from stdin */
  113. if (display == DISPLAY) /* then hasn't been changed by command line */
  114.     if ((fp1=fopen(CFG, "r")) != NULL) /* check for config file */
  115.       { fgets(display_buf,BUFSIZ,fp1);
  116.     display = display_buf;
  117.     fclose(fp1);
  118.     }  /* end get display info */
  119. time(&secs);
  120. date = ctime(&secs);
  121. if ((logname = getlogin()) == NULL)
  122.   { pw_info = getpwuid(getuid()); /* not attached to a tty */
  123.     logname = pw_info->pw_name;
  124.     }
  125. if (gethostname(myhost, BUFSIZ) == -1)
  126.   { fprintf(stderr, "***-cannot get name of host");
  127.     exit(127);
  128.     }
  129. if (debug) fprintf(stderr,"got user, date and host\n");
  130. if (immediate) /* send using xmessage */
  131.   { sprintf(msg_buf, "%s -display %s -title %s -name %s -",
  132.     XMESSAGE,display,title,name);
  133.     if ((fp_out=popen(msg_buf, "w")) == NULL)
  134.       { fprintf(stderr, "cannot pipe to xmessage");
  135.     exit(127);
  136.     }
  137.     msg_print(argv, argc, optind, fp_out);
  138.     pclose(fp_out);
  139.     } /* end if immediate */
  140.     else /* use the sendopr host */
  141.     { if ((unit=tcpopen(SENDOPRHOST, SENDOPRPORT)) < 0)
  142.       { fprintf(stderr, "**cannot create a socket\n");
  143.     exit(127);
  144.     }
  145.     fp_out=fdopen(unit, "w");
  146.     /* feed in the message */
  147.     msg_print(argv, argc, optind, fp_out);
  148.     fclose(fp_out);
  149.     } /* end else use the sendopr host */
  150. exit(0);
  151.     } /* end main */
  152.