xref: /csrg-svn/libexec/talkd/process.c (revision 16355)
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