1*16365Skarels #ifndef lint 2*16365Skarels static char sccsid[] = "@(#)process.c 1.2 (Berkeley) 04/11/84"; 3*16365Skarels #endif 416355Skarels 5*16365Skarels /* 6*16365Skarels * process.c handles the requests, which can be of three types: 7*16365Skarels * ANNOUNCE - announce to a user that a talk is wanted 8*16365Skarels * LEAVE_INVITE - insert the request into the table 9*16365Skarels * LOOK_UP - look up to see if a request is waiting in 10*16365Skarels * in the table for the local user 11*16365Skarels * DELETE - delete invitation 12*16365Skarels */ 13*16365Skarels #include "ctl.h" 1416355Skarels 1516355Skarels char *strcpy(); 1616355Skarels CTL_MSG *find_request(); 1716355Skarels CTL_MSG *find_match(); 1816355Skarels 1916355Skarels process_request(request, response) 20*16365Skarels CTL_MSG *request; 21*16365Skarels CTL_RESPONSE *response; 2216355Skarels { 23*16365Skarels CTL_MSG *ptr; 2416355Skarels 25*16365Skarels response->type = request->type; 26*16365Skarels response->id_num = 0; 2716355Skarels 28*16365Skarels switch (request->type) { 2916355Skarels 3016355Skarels case ANNOUNCE : 31*16365Skarels do_announce(request, response); 32*16365Skarels break; 3316355Skarels 3416355Skarels case LEAVE_INVITE : 35*16365Skarels ptr = find_request(request); 36*16365Skarels if (ptr != (CTL_MSG *) 0) { 37*16365Skarels response->id_num = ptr->id_num; 38*16365Skarels response->answer = SUCCESS; 39*16365Skarels } else 40*16365Skarels insert_table(request, response); 41*16365Skarels break; 4216355Skarels 4316355Skarels case LOOK_UP : 44*16365Skarels ptr = find_match(request); 45*16365Skarels if (ptr != (CTL_MSG *) 0) { 46*16365Skarels response->id_num = ptr->id_num; 47*16365Skarels response->addr = ptr->addr; 48*16365Skarels response->answer = SUCCESS; 49*16365Skarels } else 50*16365Skarels response->answer = NOT_HERE; 51*16365Skarels break; 5216355Skarels 5316355Skarels case DELETE : 54*16365Skarels response->answer = delete_invite(request->id_num); 55*16365Skarels break; 5616355Skarels 5716355Skarels default : 58*16365Skarels response->answer = UNKNOWN_REQUEST; 59*16365Skarels break; 60*16365Skarels } 6116355Skarels } 6216355Skarels 6316355Skarels struct hostent *gethostbyaddr(); 6416355Skarels 6516355Skarels do_announce(request, response) 66*16365Skarels CTL_MSG *request; 67*16365Skarels CTL_RESPONSE *response; 6816355Skarels { 69*16365Skarels struct hostent *hp; 70*16365Skarels CTL_MSG *ptr; 71*16365Skarels int result; 7216355Skarels 7316355Skarels /* see if the user is logged */ 74*16365Skarels result = find_user(request->r_name, request->r_tty); 75*16365Skarels if (result != SUCCESS) { 76*16365Skarels response->answer = result; 77*16365Skarels return; 78*16365Skarels } 79*16365Skarels hp = gethostbyaddr(&request->ctl_addr.sin_addr, 80*16365Skarels sizeof(struct in_addr), AF_INET); 81*16365Skarels if (hp == (struct hostent *)0) { 82*16365Skarels response->answer = MACHINE_UNKNOWN; 83*16365Skarels return; 84*16365Skarels } 85*16365Skarels ptr = find_request(request); 86*16365Skarels if (ptr == (CTL_MSG *) 0) { 87*16365Skarels insert_table(request,response); 88*16365Skarels response->answer = announce(request, hp->h_name); 89*16365Skarels return; 90*16365Skarels } 91*16365Skarels if (request->id_num > ptr->id_num) { 92*16365Skarels /* 93*16365Skarels * this is an explicit re-announce, so update the id_num 94*16365Skarels * field to avoid duplicates and re-announce the talk 95*16365Skarels */ 96*16365Skarels ptr->id_num = response->id_num = new_id(); 97*16365Skarels response->answer = announce(request, hp->h_name); 98*16365Skarels return; 99*16365Skarels } 100*16365Skarels /* a duplicated request, so ignore it */ 10116355Skarels response->id_num = ptr->id_num; 10216355Skarels response->answer = SUCCESS; 10316355Skarels } 10416355Skarels 10516355Skarels #include <utmp.h> 10616355Skarels 10716355Skarels /* 10816355Skarels * Search utmp for the local user 10916355Skarels */ 11016355Skarels find_user(name, tty) 111*16365Skarels char *name; 112*16365Skarels char *tty; 11316355Skarels { 114*16365Skarels struct utmp ubuf; 115*16365Skarels int fd, status; 11616355Skarels 117*16365Skarels if ((fd = open("/etc/utmp", 0)) == -1) { 118*16365Skarels perror("Can't open /etc/utmp"); 119*16365Skarels return (FAILED); 12016355Skarels } 121*16365Skarels #define SCMPN(a, b) strncmp(a, b, sizeof (a)) 122*16365Skarels status = NOT_HERE; 123*16365Skarels while (read(fd, (char *) &ubuf, sizeof ubuf) == sizeof(ubuf)) 124*16365Skarels if (SCMPN(ubuf.ut_name, name) == 0) { 125*16365Skarels if (*tty == '\0') { 126*16365Skarels /* no particular tty was requested */ 127*16365Skarels (void) strcpy(tty, ubuf.ut_line); 128*16365Skarels status = SUCCESS; 129*16365Skarels break; 130*16365Skarels } 131*16365Skarels if (strcmp(ubuf.ut_line, tty) == 0) { 132*16365Skarels status = SUCCESS; 133*16365Skarels break; 134*16365Skarels } 135*16365Skarels } 136*16365Skarels close(fd); 137*16365Skarels return (status); 13816355Skarels } 139