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