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