|
|
1.1 ! root 1: /* $Header: process.c,v 1.2 85/01/09 13:05:04 rcs 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->ctlr_type = request->ctlm_type; ! 28: response->ctlr_id_num = 0; ! 29: ! 30: switch (request->ctlm_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->ctlr_id_num = ptr->ctlm_id_num; ! 42: response->ctlr_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->ctlr_id_num = ptr->ctlm_id_num; ! 53: response->ctlr_addr = ptr->ctlm_addr; ! 54: response->ctlr_answer = SUCCESS; ! 55: } else { ! 56: response->ctlr_answer = NOT_HERE; ! 57: } ! 58: break; ! 59: ! 60: case DELETE : ! 61: ! 62: response->ctlr_answer = delete_invite(request->ctlm_id_num); ! 63: break; ! 64: ! 65: default : ! 66: ! 67: response->ctlr_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->ctlm_r_name, request->ctlm_r_tty); ! 86: ! 87: if (result != SUCCESS) { ! 88: response->ctlr_answer = result; ! 89: return; ! 90: } ! 91: ! 92: hp = gethostbyaddr(&request->ctlm_ctl_addr.sin_addr, ! 93: sizeof(struct in_addr), AF_INET); ! 94: ! 95: if ( hp == (struct hostent *) 0 ) { ! 96: response->ctlr_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->ctlr_answer = announce(request, hp->h_name); ! 104: } else if (request->ctlm_id_num > ptr->ctlm_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->ctlm_id_num = response->ctlr_id_num = new_id(); ! 110: response->ctlr_answer = announce(request, hp->h_name); ! 111: } else { ! 112: /* a duplicated request, so ignore it */ ! 113: response->ctlr_id_num = ptr->ctlm_id_num; ! 114: response->ctlr_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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.