Annotation of 42BSD/ucb/talk/process.c, revision 1.1.1.1

1.1       root        1: /* $Header: process.c 1.5 83/03/28 20:16:07 moore Exp $ */
                      2: 
                      3:     /* process.c handles the requests, which can be of three types:
                      4: 
                      5:                ANNOUNCE - announce to a user that a talk is wanted
                      6: 
                      7:                LEAVE_INVITE - insert the request into the table
                      8:                
                      9:                LOOK_UP - look up to see if a request is waiting in
                     10:                          in the table for the local user
                     11: 
                     12:                DELETE - delete invitation
                     13: 
                     14:      */
                     15: 
                     16: #include "ctl.h"
                     17: char *strcpy();
                     18: CTL_MSG *find_request();
                     19: CTL_MSG *find_match();
                     20: 
                     21: process_request(request, response)
                     22: CTL_MSG *request;
                     23: CTL_RESPONSE *response;
                     24: {
                     25:     CTL_MSG *ptr;
                     26: 
                     27:     response->type = request->type;
                     28:     response->id_num = 0;
                     29: 
                     30:     switch (request->type) {
                     31: 
                     32:        case ANNOUNCE :
                     33: 
                     34:            do_announce(request, response);
                     35:            break;
                     36: 
                     37:        case LEAVE_INVITE :
                     38: 
                     39:            ptr = find_request(request);
                     40:            if (ptr != (CTL_MSG *) 0) {
                     41:                response->id_num = ptr->id_num;
                     42:                response->answer = SUCCESS;
                     43:            } else {
                     44:                insert_table(request, response);
                     45:            }
                     46:            break;
                     47: 
                     48:        case LOOK_UP :
                     49: 
                     50:            ptr = find_match(request);
                     51:            if (ptr != (CTL_MSG *) 0) {
                     52:                response->id_num = ptr->id_num;
                     53:                response->addr = ptr->addr;
                     54:                response->answer = SUCCESS;
                     55:            } else {
                     56:                response->answer = NOT_HERE;
                     57:            }
                     58:            break;
                     59: 
                     60:        case DELETE :
                     61: 
                     62:            response->answer = delete_invite(request->id_num);
                     63:            break;
                     64: 
                     65:        default :
                     66: 
                     67:            response->answer = UNKNOWN_REQUEST;
                     68:            break;
                     69: 
                     70:     }
                     71: }
                     72: 
                     73: struct hostent *gethostbyaddr();
                     74: 
                     75: do_announce(request, response)
                     76: CTL_MSG *request;
                     77: CTL_RESPONSE *response;
                     78: {
                     79:     struct hostent *hp;
                     80:     CTL_MSG *ptr;
                     81:     int result;
                     82: 
                     83:        /* see if the user is logged */
                     84: 
                     85:     result = find_user(request->r_name, request->r_tty);
                     86: 
                     87:     if (result != SUCCESS) {
                     88:        response->answer = result;
                     89:        return;
                     90:     }
                     91: 
                     92:     hp = gethostbyaddr(&request->ctl_addr.sin_addr,
                     93:                          sizeof(struct in_addr), AF_INET);
                     94: 
                     95:     if ( hp == (struct hostent *) 0 ) {
                     96:        response->answer = MACHINE_UNKNOWN;
                     97:        return;
                     98:     }
                     99: 
                    100:     ptr = find_request(request);
                    101:     if (ptr == (CTL_MSG *) 0) {
                    102:        insert_table(request,response);
                    103:        response->answer = announce(request, hp->h_name);
                    104:     } else if (request->id_num > ptr->id_num) {
                    105:            /*
                    106:             * this is an explicit re-announce, so update the id_num
                    107:             * field to avoid duplicates and re-announce the talk 
                    108:             */
                    109:        ptr->id_num = response->id_num = new_id();
                    110:        response->answer = announce(request, hp->h_name);
                    111:     } else {
                    112:            /* a duplicated request, so ignore it */
                    113:        response->id_num = ptr->id_num;
                    114:        response->answer = SUCCESS;
                    115:     }
                    116: 
                    117:     return;
                    118: }
                    119: 
                    120: #include <utmp.h>
                    121: 
                    122: /*
                    123:  * Search utmp for the local user
                    124:  */
                    125: 
                    126: find_user(name, tty)
                    127: char *name;
                    128: char *tty;
                    129: {
                    130:     struct utmp ubuf;
                    131: 
                    132:     int fd;
                    133: 
                    134:     if ((fd = open("/etc/utmp", 0)) == -1) {
                    135:        print_error("Can't open /etc/utmp");
                    136:        return(FAILED);
                    137:     }
                    138: 
                    139:     while (read(fd, (char *) &ubuf, sizeof ubuf) == sizeof(ubuf)) {
                    140:        if (strncmp(ubuf.ut_name, name, sizeof ubuf.ut_name) == 0) {
                    141:            if (*tty == '\0') {
                    142:                    /* no particular tty was requested */
                    143:                (void) strcpy(tty, ubuf.ut_line);
                    144:                close(fd);
                    145:                return(SUCCESS);
                    146:            } else if (strcmp(ubuf.ut_line, tty) == 0) {
                    147:                close(fd);
                    148:                return(SUCCESS);
                    149:            }
                    150:        }
                    151:     }
                    152: 
                    153:     close(fd);
                    154:     return(NOT_HERE);
                    155: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.