/* * write - send a message to another user * (C) 1991 D P Gymer * This code may be freely redistributed under the terms of the GNU GPL. * * $Log$ */ #include #include #include #include #include #include #include #include const char *rcsid = "$Id$"; #define UTMP "/etc/utmp" static void do_write(line) char *line; { int fd, c; char host[16]; FILE *fp; if (gethostname(host, 16)) strcpy(host, "unknown-host"); signal(SIGTSTP, SIG_IGN); if ((fd = open(line, O_WRONLY, 0)) < 0 || !(fp = fdopen(fd, "w"))) { perror(line); exit(1); } fprintf(fp, "Message from %s@%s on %s...\n", getlogin(), host, ttyname(-1)); while ((c = getchar()) != EOF) fputc(c, fp); fputs("EOF\n", fp); fclose(fp); signal(SIGTSTP, SIG_DFL); } static char * findline(user, line) char *user; char *line; { static char buf1[14]; /* Magic number alert! */ char buf2[9]; int fd; struct utmp utmp; if (!line) { if ((fd = open(UTMP, O_RDONLY, 0)) < 0) { perror(UTMP); exit(1); } while (read(fd, &utmp, sizeof(struct utmp)) == sizeof(struct utmp)) { if (!strncmp(utmp.ut_name, user, 8)) { /* Magic #! */ if (line) { printf("User logged in more than once; trying %s...\n", line); } else { line = buf2; strncpy(buf2, utmp.ut_line, 8); buf2[8] = '\0'; } } else if (!strncmp(utmp.ut_line, line, 8)) { fprintf(stderr, "%s is not logged to that terminal!\n", user); exit(1); } } close(fd); } if (line) { sprintf(buf1, "/dev/%s", line); line = buf1; } return line; } static void usage() { fprintf(stderr, "Usage: write [tty] user\n"); exit(1); } int main(argc, argv) int argc; char **argv; { int c; char *user, *line; extern int opterr, optind; opterr = 0; while ((c = getopt(argc, argv, "")) != EOF) switch (c) { default: usage(); } if (optind == argc - 2) line = argv[optind++]; else line = 0; if (optind != argc - 1) usage(); if (!(line = findline((user = argv[optind]), line))) { fprintf(stderr, "%s is not logged on!\n", user); exit(1); } do_write(line); return 0; }