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