|
|
1.1 root 1: /* $Header: table.c,v 1.2 85/01/09 13:05:08 rcs Exp $ */
2:
3: /* routines to handle insertion, deletion, etc on the table
4: of requests kept by the daemon. Nothing fancy here, linear
5: search on a double-linked list. A time is kept with each
6: entry so that overly old invitations can be eliminated.
7:
8: Consider this a mis-guided attempt at modularity
9: */
10:
11: #include "ctl.h"
12: #include <sys/time.h>
13:
14: #define MAX_ID 16000 /* << 2^15 so I don't have sign troubles */
15:
16: #define NIL ( (TABLE_ENTRY *) 0)
17:
18: extern int debug;
19: struct timeval tp;
20: struct timezone *txp;
21:
22: typedef struct table_entry TABLE_ENTRY;
23:
24: struct table_entry {
25: CTL_MSG request;
26: long time;
27: TABLE_ENTRY *next;
28: TABLE_ENTRY *last;
29: };
30:
31: TABLE_ENTRY *table = NIL;
32: CTL_MSG *find_request();
33: CTL_MSG *find_match();
34: char *malloc();
35:
36: /*
37: * Look in the table for an invitation that matches the current
38: * request looking for an invitation
39: */
40:
41: CTL_MSG *find_match(request)
42: CTL_MSG *request;
43: {
44: TABLE_ENTRY *ptr;
45: long current_time;
46:
47: gettimeofday(&tp, &txp);
48: current_time = tp.tv_sec;
49:
50: ptr = table;
51:
52: if (debug) {
53: printf("Entering Look-Up with : \n");
54: print_request(request);
55: }
56:
57: while (ptr != NIL) {
58:
59: if ( (ptr->time - current_time) > MAX_LIFE ) {
60: /* the entry is too old */
61: if (debug) printf("Deleting expired entry : \n");
62: if (debug) print_request(&ptr->request);
63: delete(ptr);
64: ptr = ptr->next;
65: continue;
66: }
67:
68: if (debug) {
69: printf("entry: ");
70: print_request(&ptr->request);
71: }
72:
73: if ( strcmp(request->ctlm_l_name, ptr->request.ctlm_r_name) == 0 &&
74: strcmp(request->ctlm_r_name, ptr->request.ctlm_l_name) == 0 &&
75: ptr->request.ctlm_type == LEAVE_INVITE ) {
76: if (debug)
77: printf("found in table\n");
78: return(&ptr->request);
79: }
80:
81: ptr = ptr->next;
82: }
83:
84: if (debug)
85: printf("not found in table\n");
86: return((CTL_MSG *) 0);
87: }
88:
89: /*
90: * look for an identical request, as opposed to a complimentary
91: * one as find_match does
92: */
93:
94: CTL_MSG *find_request(request)
95: CTL_MSG *request;
96: {
97: TABLE_ENTRY *ptr;
98: long current_time;
99:
100: gettimeofday(&tp, &txp);
101: current_time = tp.tv_sec;
102:
103: /* See if this is a repeated message, and check for
104: out of date entries in the table while we are it.
105: */
106:
107: ptr = table;
108:
109: if (debug) {
110: printf("Entering find_request with : \n");
111: print_request(request);
112: }
113:
114: while (ptr != NIL) {
115:
116: if ( (ptr->time - current_time) > MAX_LIFE ) {
117: /* the entry is too old */
118: if (debug) printf("Deleting expired entry : \n");
119: if (debug) print_request(&ptr->request);
120: delete(ptr);
121: ptr = ptr->next;
122: continue;
123: }
124:
125: if (debug) {
126: printf("entry: ");
127: print_request(&ptr->request);
128: }
129:
130: if ( strcmp(request->ctlm_r_name, ptr->request.ctlm_r_name) == 0 &&
131: strcmp(request->ctlm_l_name, ptr->request.ctlm_l_name) == 0 &&
132: request->ctlm_type == ptr->request.ctlm_type &&
133: request->ctlm_pid == ptr->request.ctlm_pid) {
134:
135: /* update the time if we 'touch' it */
136: ptr->time = current_time;
137: if (debug)
138: printf("found in request table\n");
139: return(&ptr->request);
140: }
141:
142: ptr = ptr->next;
143: }
144:
145: if (debug)
146: printf("not found in request table\n");
147: return((CTL_MSG *) 0);
148: }
149:
150: insert_table(request, response)
151: CTL_MSG *request;
152: CTL_RESPONSE *response;
153: {
154: TABLE_ENTRY *ptr;
155: long current_time;
156:
157: gettimeofday(&tp, &txp);
158: current_time = tp.tv_sec;
159:
160: response->ctlr_id_num = request->ctlm_id_num = new_id();
161:
162: /* insert a new entry into the top of the list */
163:
164: ptr = (TABLE_ENTRY *) malloc(sizeof(TABLE_ENTRY));
165:
166: if (ptr == NIL) {
167: print_error("malloc in insert_table");
168: }
169:
170: ptr->time = current_time;
171: ptr->request = *request;
172:
173: ptr->next = table;
174: if (ptr->next != NIL) {
175: ptr->next->last = ptr;
176: }
177: ptr->last = NIL;
178: table = ptr;
179: }
180:
181: /* generate a unique non-zero sequence number */
182:
183: new_id()
184: {
185: static int current_id = 0;
186:
187: current_id = (current_id + 1) % MAX_ID;
188:
189: /* 0 is reserved, helps to pick up bugs */
190:
191: if (current_id == 0) current_id = 1;
192:
193: return(current_id);
194: }
195:
196: /* delete the invitation with id 'id_num' */
197:
198: delete_invite(id_num)
199: int id_num;
200: {
201: TABLE_ENTRY *ptr;
202:
203: ptr = table;
204:
205: if (debug) printf("Entering delete_invite with %d\n", id_num);
206:
207: while (ptr != NIL && ptr->request.ctlm_id_num != id_num) {
208: if (debug) print_request(&ptr->request);
209: ptr = ptr->next;
210: }
211:
212: if (ptr != NIL) {
213: delete(ptr);
214: return(SUCCESS);
215: }
216:
217: return(NOT_HERE);
218: }
219:
220: /* classic delete from a double-linked list */
221:
222: delete(ptr)
223: TABLE_ENTRY *ptr;
224: {
225: if (debug) printf("Deleting : ");
226: if (debug) print_request(&ptr->request);
227:
228: if (table == ptr) {
229: table = ptr->next;
230: } else if (ptr->last != NIL) {
231: ptr->last->next = ptr->next;
232: }
233:
234: if (ptr->next != NIL) {
235: ptr->next->last = ptr->last;
236: }
237:
238: free((char *) ptr);
239: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.