# 2.11BSD#431 - /usr/src/bin/wall.c

##### Functions

    main              X
    sendmes           X

##### Variables

    clock             X
    copyright         X
    hostname          X
    localclock        X
    mesg              X
    msize             X
    sline             X
    utmp              X
    who               X

##### Macros

    IGNOREUSER        X

       1: /*
       2:  * Copyright (c) 1980 Regents of the University of California.
       3:  * All rights reserved.  The Berkeley software License Agreement
       4:  * specifies the terms and conditions for redistribution.
       5:  */
       6:
       7: #if defined(DOSCCS) && !defined(lint)
       8: char copyright[] =
       9: "@(#) Copyright (c) 1980 Regents of the University of California.\n\
      10:  All rights reserved.\n";
      11:
      12: static char sccsid[] = "@(#)wall.c	5.3.2 (2.11BSD GTE) 1996/11/16";
      13: #endif
      14:
      15: /*
      16:  * wall.c - Broadcast a message to all users.
      17:  *
      18:  * This program is not related to David Wall, whose Stanford Ph.D. thesis
      19:  * is entitled "Mechanisms for Broadcast and Selective Broadcast".
      20:  */
      21:
      22: #include <stdio.h>
      23: #include <utmp.h>
      24: #include <errno.h>
      25: #include <signal.h>
      26: #include <sys/time.h>
      27: #include <fcntl.h>
      28: #include <sys/types.h>
      29: #include <sys/stat.h>
      30:
      31: #define IGNOREUSER  "sleeper"
      32:
      33: char    hostname[32];
      34: char    mesg[3000];
      35: int msize,sline;
      36: struct  utmp *utmp;
      37: char    *strcpy();
      38: char    *strcat();
      39: char    *malloc();
      40: char    who[UT_NAMESIZE + 1] = "???";
      41: long    clock, time();
      42: struct tm *localtime();
      43: struct tm *localclock;
      44:
      45: extern  errno;
      46:
      47: main(argc, argv)
      48: char *argv[];
      49: {
      50:     register int i, c;
      51:     register struct utmp *p;
      52:     int f;
      53:     struct stat statb;
      54:
      55:     (void) gethostname(hostname, sizeof (hostname));
      56:     if ((f = open(_PATH_UTMP, O_RDONLY, 0)) < 0) {
      57:         fprintf(stderr, "Cannot open %s\n", _PATH_UTMP);
      58:         exit(1);
      59:     }
      60:     clock = time( 0 );
      61:     localclock = localtime( &clock );
      62:     sline = ttyslot();  /* 'utmp' slot no. of sender */
      63:     (void) fstat(f, &statb);
      64:     utmp = (struct utmp *)malloc((unsigned)statb.st_size);
      65:     c = read(f, (char *)utmp, (int)statb.st_size);
      66:     (void) close(f);
      67:     c /= sizeof(struct utmp);
      68:     if (sline)
      69:         strncpy(who, utmp[sline].ut_name, sizeof(utmp[sline].ut_name));
      70:     sprintf(mesg,
      71:         "\n\007\007Broadcast Message from %s@%s (%.*s) at %d:%02d ...\r\n\n"
      72:         , who
      73:         , hostname
      74:         , sizeof(utmp[sline].ut_line)
      75:         , utmp[sline].ut_line
      76:         , localclock -> tm_hour
      77:         , localclock -> tm_min
      78:     );
      79:     msize = strlen(mesg);
      80:     if (argc >= 2) {
      81:         /* take message from unix file instead of standard input */
      82:         if (freopen(argv[1], "r", stdin) == NULL) {
      83:             perror(argv[1]);
      84:             exit(1);
      85:         }
      86:     }
      87:     while ((i = getchar()) != EOF) {
      88:         if (i == '\n')
      89:             mesg[msize++] = '\r';
      90:         if (msize >= sizeof mesg) {
      91:             fprintf(stderr, "Message too long\n");
      92:             exit(1);
      93:         }
      94:         mesg[msize++] = i;
      95:     }
      96:     fclose(stdin);
      97:     for (i=0; i<c; i++) {
      98:         p = &utmp[i];
      99:         if (p->ut_name[0] == 0 ||
     100:             strncmp(p->ut_name, IGNOREUSER, sizeof(p->ut_name)) == 0)
     101:             continue;
     102:         sendmes(p->ut_line);
     103:     }
     104:     exit(0);
     105: }
     106:
     107: sendmes(tty)
     108: char *tty;
     109: {
     110:     register f, flags;
     111:     static char t[50] = "/dev/";
     112:     int e, i;
     113:
     114:     strcpy(t + 5, tty);
     115:
     116:     if ((f = open(t, O_WRONLY|O_NDELAY)) < 0) {
     117:         if (errno != EWOULDBLOCK)
     118:             perror(t);
     119:         return;
     120:     }
     121:     if ((flags = fcntl(f, F_GETFL, 0)) == -1) {
     122:         perror(t);
     123:         return;
     124:     }
     125:     if (fcntl(f, F_SETFL, flags | FNDELAY) == -1)
     126:         goto oldway;
     127:     i = write(f, mesg, msize);
     128:     e = errno;
     129:     (void) fcntl(f, F_SETFL, flags);
     130:     if (i == msize) {
     131:         (void) close(f);
     132:         return;
     133:     }
     134:     if (e != EWOULDBLOCK) {
     135:         errno = e;
     136:         perror(t);
     137:         (void) close(f);
     138:         return;
     139:     }
     140: oldway:
     141:     while ((i = fork()) == -1)
     142:         if (wait((int *)0) == -1) {
     143:             fprintf(stderr, "Try again\n");
     144:             return;
     145:         }
     146:     if (i) {
     147:         (void) close(f);
     148:         return;
     149:     }
     150:
     151:     (void) write(f, mesg, msize);
     152:     exit(0);
     153: }

#### Defined functions

main defined in line 47; never used
sendmes defined in line 107; used 1 times

- in line 102

#### Defined variables

clock defined in line 41; used 2 times

- in line 60-61(2)

copyright defined in line 8; never used
hostname defined in line 33; used 3 times

- in line 55(2), 73

localclock defined in line 43; used 3 times

- in line 61, 76-77(2)

mesg defined in line 34; used 7 times

- in line 70, 79, 89-94(3), 127, 151

msize defined in line 35; used 7 times

- in line 79, 89-94(3), 127-130(2), 151

sccsid defined in line 12; never used
sline defined in line 35; used 6 times

- in line 62, 68-75(5)

utmp defined in line 36; used 7 times

- in line 64-75(6), 98

who defined in line 40; used 2 times

- in line 69-72(2)

#### Defined macros

IGNOREUSER defined in line 31; used 1 times

- in line 100

Last modified: 1996-11-17 Generated: 2016-12-26 | Generated by src2html V0.67 page hit count: 1474 |