Annotation of 42BSD/ucb/talk/process.c, revision 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.