# 2.11BSD#431 - /usr/src/libexec/talkd/process.c

##### Functions

    do_announce       X
    find_user         X
    process_request   X

##### Macros

    SCMPN             X
    satosin           X

       1: /*
       2:  * Copyright (c) 1983 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: static char sccsid[] = "@(#)process.c	5.4.2 (2.11BSD GTE) 1996/11/16";
       9: #endif
      10:
      11: /*
      12:  * process.c handles the requests, which can be of three types:
      13:  *	ANNOUNCE - announce to a user that a talk is wanted
      14:  *	LEAVE_INVITE - insert the request into the table
      15:  *	LOOK_UP - look up to see if a request is waiting in
      16:  *		  in the table for the local user
      17:  *	DELETE - delete invitation
      18:  */
      19: #include <sys/types.h>
      20: #include <sys/stat.h>
      21: #include <stdio.h>
      22: #include <syslog.h>
      23: #include <netdb.h>
      24: #include <netinet/in.h>
      25:
      26: #include <protocols/talkd.h>
      27:
      28: char    *strcpy();
      29: CTL_MSG *find_request();
      30: CTL_MSG *find_match();
      31:
      32: process_request(mp, rp)
      33:     register CTL_MSG *mp;
      34:     register CTL_RESPONSE *rp;
      35: {
      36:     register CTL_MSG *ptr;
      37:     extern int debug;
      38:
      39:     rp->vers = TALK_VERSION;
      40:     rp->type = mp->type;
      41:     rp->id_num = htonl(0L);
      42:     if (mp->vers != TALK_VERSION) {
      43:         syslog(LOG_WARNING, "Bad protocol version %d", mp->vers);
      44:         rp->answer = BADVERSION;
      45:         return;
      46:     }
      47:     mp->id_num = ntohl(mp->id_num);
      48:     mp->addr.sa_family = ntohs(mp->addr.sa_family);
      49:     if (mp->addr.sa_family != AF_INET) {
      50:         syslog(LOG_WARNING, "Bad address, family %d",
      51:             mp->addr.sa_family);
      52:         rp->answer = BADADDR;
      53:         return;
      54:     }
      55:     mp->ctl_addr.sa_family = ntohs(mp->ctl_addr.sa_family);
      56:     if (mp->ctl_addr.sa_family != AF_INET) {
      57:         syslog(LOG_WARNING, "Bad control address, family %d",
      58:             mp->ctl_addr.sa_family);
      59:         rp->answer = BADCTLADDR;
      60:         return;
      61:     }
      62:     mp->pid = ntohl(mp->pid);
      63:     if (debug)
      64:         print_request("process_request", mp);
      65:     switch (mp->type) {
      66:
      67:     case ANNOUNCE:
      68:         do_announce(mp, rp);
      69:         break;
      70:
      71:     case LEAVE_INVITE:
      72:         ptr = find_request(mp);
      73:         if (ptr != (CTL_MSG *)0) {
      74:             rp->id_num = htonl(ptr->id_num);
      75:             rp->answer = SUCCESS;
      76:         } else
      77:             insert_table(mp, rp);
      78:         break;
      79:
      80:     case LOOK_UP:
      81:         ptr = find_match(mp);
      82:         if (ptr != (CTL_MSG *)0) {
      83:             rp->id_num = htonl(ptr->id_num);
      84:             rp->addr = ptr->addr;
      85:             rp->addr.sa_family = htons(ptr->addr.sa_family);
      86:             rp->answer = SUCCESS;
      87:         } else
      88:             rp->answer = NOT_HERE;
      89:         break;
      90:
      91:     case DELETE:
      92:         rp->answer = delete_invite(mp->id_num);
      93:         break;
      94:
      95:     default:
      96:         rp->answer = UNKNOWN_REQUEST;
      97:         break;
      98:     }
      99:     if (debug)
     100:         print_response("process_request", rp);
     101: }
     102:
     103: do_announce(mp, rp)
     104:     register CTL_MSG *mp;
     105:     CTL_RESPONSE *rp;
     106: {
     107:     struct hostent *hp;
     108:     CTL_MSG *ptr;
     109:     int result;
     110:
     111:     /* see if the user is logged */
     112:     result = find_user(mp->r_name, mp->r_tty);
     113:     if (result != SUCCESS) {
     114:         rp->answer = result;
     115:         return;
     116:     }
     117: #define satosin(sa) ((struct sockaddr_in *)(sa))
     118:     hp = gethostbyaddr(&satosin(&mp->ctl_addr)->sin_addr,
     119:         sizeof (struct in_addr), AF_INET);
     120:     if (hp == (struct hostent *)0) {
     121:         rp->answer = MACHINE_UNKNOWN;
     122:         return;
     123:     }
     124:     ptr = find_request(mp);
     125:     if (ptr == (CTL_MSG *) 0) {
     126:         insert_table(mp, rp);
     127:         rp->answer = announce(mp, hp->h_name);
     128:         return;
     129:     }
     130:     if (mp->id_num > ptr->id_num) {
     131:         /*
     132: 		 * This is an explicit re-announce, so update the id_num
     133: 		 * field to avoid duplicates and re-announce the talk.
     134: 		 */
     135:         ptr->id_num = new_id();
     136:         rp->id_num = htonl(ptr->id_num);
     137:         rp->answer = announce(mp, hp->h_name);
     138:     } else {
     139:         /* a duplicated request, so ignore it */
     140:         rp->id_num = htonl(ptr->id_num);
     141:         rp->answer = SUCCESS;
     142:     }
     143: }
     144:
     145: #include <utmp.h>
     146:
     147: /*
     148:  * Search utmp for the local user
     149:  */
     150: find_user(name, tty)
     151:     char *name, *tty;
     152: {
     153:     struct utmp ubuf;
     154:     int status;
     155:     FILE *fd;
     156:     struct stat statb;
     157:     char ftty[20];
     158:
     159:     if ((fd = fopen(_PATH_UTMP, "r")) == NULL) {
     160:         warn("Can't open %s", _PATH_UTMP);
     161:         return (FAILED);
     162:     }
     163: #define SCMPN(a, b) strncmp(a, b, sizeof (a))
     164:     status = NOT_HERE;
     165:     (void) strcpy(ftty, "/dev/");
     166:     while (fread((char *) &ubuf, sizeof ubuf, 1, fd) == 1)
     167:         if (SCMPN(ubuf.ut_name, name) == 0) {
     168:             if (*tty == '\0') {
     169:                 status = PERMISSION_DENIED;
     170:                 /* no particular tty was requested */
     171:                 (void) strcpy(ftty+5, ubuf.ut_line);
     172:                 if (stat(ftty,&statb) == 0) {
     173:                     if (!(statb.st_mode & 020))
     174:                         continue;
     175:                     (void) strcpy(tty, ubuf.ut_line);
     176:                     status = SUCCESS;
     177:                     break;
     178:                 }
     179:             }
     180:             if (strcmp(ubuf.ut_line, tty) == 0) {
     181:                 status = SUCCESS;
     182:                 break;
     183:             }
     184:         }
     185:     fclose(fd);
     186:     return (status);
     187: }

#### Defined functions

do_announce defined in line 103; used 1 times

- in line 68

find_user defined in line 150; used 1 times

- in line 112

process_request defined in line 32; used 1 times

- in /usr/src/libexec/talkd/talkd.c line 76

#### Defined variables

sccsid defined in line 8; never used

#### Defined macros

SCMPN defined in line 163; used 1 times

- in line 167

satosin defined in line 117; used 1 times

- in line 118

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