home *** CD-ROM | disk | FTP | other *** search
/ The Atari Compendium / The Atari Compendium (Toad Computers) (1994).iso / files / prgtools / mint / utilit~1 / initsn~1.zoo / init / write / write.c next >
Encoding:
C/C++ Source or Header  |  1993-01-08  |  2.4 KB  |  131 lines

  1. /*
  2.  * write - send a message to another user
  3.  * (C) 1991 D P Gymer
  4.  * This code may be freely redistributed under the terms of the GNU GPL.
  5.  *
  6.  * 05.Jan.1993  T.Scherer (tesche), email: itschere@techfak.uni-bielefeld.de
  7.  *        a small bugfix: signal SIGTSTP was catched, it should have
  8.  *        been SIGTTOU
  9.  *
  10.  * $Log$
  11.  */
  12.  
  13. #include <fcntl.h>
  14. #include <signal.h>
  15. #include <stdio.h>
  16. #include <stdlib.h>
  17. #include <string.h>
  18. #include <termcap.h>
  19. #include <unistd.h>
  20. #include <utmp.h>
  21.  
  22. const char *rcsid = "$Id$";
  23.  
  24. #define UTMP    "/etc/utmp"
  25.  
  26. static void
  27. do_write(line)
  28.     char *line;
  29. {
  30.     int fd,
  31.     c;
  32.     char host[16];
  33.     FILE *fp;
  34.  
  35.     if (gethostname(host, 16))
  36.     strcpy(host, "unknown-host");
  37.     signal(SIGTTOU, SIG_IGN);
  38.     if ((fd = open(line, O_WRONLY, 0)) < 0 || !(fp = fdopen(fd, "w"))) {
  39.     perror(line);
  40.     exit(1);
  41.     }
  42.     fprintf(fp, "Message from %s@%s on %s...\n", getlogin(), host, ttyname(-1));
  43.     while ((c = getchar()) != EOF)
  44.     fputc(c, fp);
  45.     fputs("EOF\n", fp);
  46.     fclose(fp);
  47.     signal(SIGTTOU, SIG_DFL);
  48. }
  49.  
  50. static char *
  51. findline(user, line)
  52.     char *user;
  53.     char *line;
  54. {
  55.     static char buf1[14];    /* Magic number alert! */
  56.     char buf2[9];
  57.     int fd;
  58.     struct utmp utmp;
  59.  
  60.     if (!line) {
  61.     if ((fd = open(UTMP, O_RDONLY, 0)) < 0) {
  62.         perror(UTMP);
  63.         exit(1);
  64.     }
  65.     while (read(fd, &utmp, sizeof(struct utmp)) == sizeof(struct utmp)) {
  66.         if (!strncmp(utmp.ut_name, user, 8)) {    /* Magic #! */
  67.         if (line) {
  68.             printf("User logged in more than once; trying %s...\n",
  69.             line);
  70.         } else {
  71.             line = buf2;
  72.             strncpy(buf2, utmp.ut_line, 8);
  73.             buf2[8] = '\0';
  74.         }
  75.         } else if (!strncmp(utmp.ut_line, line, 8)) {
  76.         fprintf(stderr, "%s is not logged to that terminal!\n", user);
  77.         exit(1);
  78.         }
  79.     }
  80.     close(fd);
  81.     }
  82.     if (line) {
  83.     sprintf(buf1, "/dev/%s", line);
  84.     line = buf1;
  85.     }
  86.     return line;
  87. }
  88.  
  89. static void
  90. usage()
  91. {
  92.     fprintf(stderr, "Usage: write [tty] user\n");
  93.     exit(1);
  94. }
  95.  
  96. int
  97. main(argc, argv)
  98.     int argc;
  99.     char **argv;
  100. {
  101.     int c;
  102.     char *user,
  103.        *line;
  104.     extern int opterr,
  105.         optind;
  106.  
  107.     opterr = 0;
  108.     while ((c = getopt(argc, argv, "")) != EOF)
  109.     switch (c) {
  110.     default:
  111.         usage();
  112.     }
  113.  
  114.     if (optind == argc - 2)
  115.     line = argv[optind++];
  116.     else
  117.     line = 0;
  118.  
  119.     if (optind != argc - 1)
  120.     usage();
  121.  
  122.     if (!(line = findline((user = argv[optind]), line))) {
  123.     fprintf(stderr, "%s is not logged on!\n", user);
  124.     exit(1);
  125.     }
  126.  
  127.     do_write(line);
  128.  
  129.     return 0;
  130. }
  131.