|
|
1.1 ! root 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: #ifndef lint ! 8: static char sccsid[] = "@(#)process.c 5.2 (Berkeley) 6/8/85"; ! 9: #endif not lint ! 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 "ctl.h" ! 20: #include <sys/stat.h> ! 21: #include <stdio.h> ! 22: ! 23: char *strcpy(); ! 24: CTL_MSG *find_request(); ! 25: CTL_MSG *find_match(); ! 26: ! 27: process_request(request, response) ! 28: CTL_MSG *request; ! 29: CTL_RESPONSE *response; ! 30: { ! 31: CTL_MSG *ptr; ! 32: ! 33: response->type = request->type; ! 34: response->id_num = 0; ! 35: ! 36: switch (request->type) { ! 37: ! 38: case ANNOUNCE : ! 39: do_announce(request, response); ! 40: break; ! 41: ! 42: case LEAVE_INVITE : ! 43: ptr = find_request(request); ! 44: if (ptr != (CTL_MSG *) 0) { ! 45: response->id_num = ptr->id_num; ! 46: response->answer = SUCCESS; ! 47: } else ! 48: insert_table(request, response); ! 49: break; ! 50: ! 51: case LOOK_UP : ! 52: ptr = find_match(request); ! 53: if (ptr != (CTL_MSG *) 0) { ! 54: response->id_num = ptr->id_num; ! 55: response->addr = ptr->addr; ! 56: response->answer = SUCCESS; ! 57: } else ! 58: response->answer = NOT_HERE; ! 59: break; ! 60: ! 61: case DELETE : ! 62: response->answer = delete_invite(request->id_num); ! 63: break; ! 64: ! 65: default : ! 66: response->answer = UNKNOWN_REQUEST; ! 67: break; ! 68: } ! 69: } ! 70: ! 71: struct hostent *gethostbyaddr(); ! 72: ! 73: do_announce(request, response) ! 74: CTL_MSG *request; ! 75: CTL_RESPONSE *response; ! 76: { ! 77: struct hostent *hp; ! 78: CTL_MSG *ptr; ! 79: int result; ! 80: ! 81: /* see if the user is logged */ ! 82: result = find_user(request->r_name, request->r_tty); ! 83: if (result != SUCCESS) { ! 84: response->answer = result; ! 85: return; ! 86: } ! 87: hp = gethostbyaddr(&request->ctl_addr.sin_addr, ! 88: sizeof(struct in_addr), AF_INET); ! 89: if (hp == (struct hostent *)0) { ! 90: response->answer = MACHINE_UNKNOWN; ! 91: return; ! 92: } ! 93: ptr = find_request(request); ! 94: if (ptr == (CTL_MSG *) 0) { ! 95: insert_table(request,response); ! 96: response->answer = announce(request, hp->h_name); ! 97: return; ! 98: } ! 99: if (request->id_num > ptr->id_num) { ! 100: /* ! 101: * this is an explicit re-announce, so update the id_num ! 102: * field to avoid duplicates and re-announce the talk ! 103: */ ! 104: ptr->id_num = response->id_num = new_id(); ! 105: response->answer = announce(request, hp->h_name); ! 106: return; ! 107: } ! 108: /* a duplicated request, so ignore it */ ! 109: response->id_num = ptr->id_num; ! 110: response->answer = SUCCESS; ! 111: } ! 112: ! 113: #include <utmp.h> ! 114: ! 115: /* ! 116: * Search utmp for the local user ! 117: */ ! 118: find_user(name, tty) ! 119: char *name; ! 120: char *tty; ! 121: { ! 122: struct utmp ubuf; ! 123: int status; ! 124: FILE *fd; ! 125: struct stat statb; ! 126: char ftty[20]; ! 127: ! 128: if ((fd = fopen("/etc/utmp", "r")) == NULL) { ! 129: perror("Can't open /etc/utmp"); ! 130: return (FAILED); ! 131: } ! 132: #define SCMPN(a, b) strncmp(a, b, sizeof (a)) ! 133: status = NOT_HERE; ! 134: (void) strcpy(ftty, "/dev/"); ! 135: while (fread((char *) &ubuf, sizeof ubuf, 1, fd) == 1) ! 136: if (SCMPN(ubuf.ut_name, name) == 0) { ! 137: if (*tty == '\0') { ! 138: status = PERMISSION_DENIED; ! 139: /* no particular tty was requested */ ! 140: (void) strcpy(ftty+5, ubuf.ut_line); ! 141: if (stat(ftty,&statb) == 0) { ! 142: if (!(statb.st_mode & 020)) ! 143: continue; ! 144: (void) strcpy(tty, ubuf.ut_line); ! 145: status = SUCCESS; ! 146: break; ! 147: } ! 148: } ! 149: if (strcmp(ubuf.ut_line, tty) == 0) { ! 150: status = SUCCESS; ! 151: break; ! 152: } ! 153: } ! 154: fclose(fd); ! 155: return (status); ! 156: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.