* Copyright (c) 1983 Regents of the University of California.
* All rights reserved. The Berkeley software License Agreement
* specifies the terms and conditions for redistribution.
static char sccsid
[] = "@(#)table.c 5.1 (Berkeley) 6/6/85";
* Routines to handle insertion, deletion, etc on the table
* of requests kept by the daemon. Nothing fancy here, linear
* search on a double-linked list. A time is kept with each
* entry so that overly old invitations can be eliminated.
* Consider this a mis-guided attempt at modularity
#define MAX_ID 16000 /* << 2^15 so I don't have sign troubles */
#define NIL ((TABLE_ENTRY *)0)
typedef struct table_entry TABLE_ENTRY
;
TABLE_ENTRY
*table
= NIL
;
* Look in the table for an invitation that matches the current
* request looking for an invitation
current_time
= tp
.tv_sec
;
fprintf(debugout
, "Entering Look-Up with : \n");
for (ptr
= table
; ptr
!= NIL
; ptr
= ptr
->next
) {
if ((ptr
->time
- current_time
) > MAX_LIFE
) {
/* the entry is too old */
,"Deleting expired entry : \n");
print_request(&ptr
->request
);
print_request(&ptr
->request
);
if (strcmp(request
->l_name
, ptr
->request
.r_name
) == 0 &&
strcmp(request
->r_name
, ptr
->request
.l_name
) == 0 &&
ptr
->request
.type
== LEAVE_INVITE
)
* Look for an identical request, as opposed to a complimentary
current_time
= tp
.tv_sec
;
* See if this is a repeated message, and check for
* out of date entries in the table while we are it.
fprintf(debugout
, "Entering find_request with : \n");
for (ptr
= table
; ptr
!= NIL
; ptr
= ptr
->next
) {
if ((ptr
->time
- current_time
) > MAX_LIFE
) {
/* the entry is too old */
, "Deleting expired entry : \n");
print_request(&ptr
->request
);
print_request(&ptr
->request
);
if (strcmp(request
->r_name
, ptr
->request
.r_name
) == 0 &&
strcmp(request
->l_name
, ptr
->request
.l_name
) == 0 &&
request
->type
== ptr
->request
.type
&&
request
->pid
== ptr
->request
.pid
) {
/* update the time if we 'touch' it */
ptr
->time
= current_time
;
insert_table(request
, response
)
current_time
= tp
.tv_sec
;
response
->id_num
= request
->id_num
= new_id();
/* insert a new entry into the top of the list */
ptr
= (TABLE_ENTRY
*)malloc(sizeof(TABLE_ENTRY
));
fprintf(stderr
, "malloc in insert_table");
ptr
->time
= current_time
;
* Generate a unique non-zero sequence number
static int current_id
= 0;
current_id
= (current_id
+ 1) % MAX_ID
;
/* 0 is reserved, helps to pick up bugs */
* Delete the invitation with id 'id_num'
fprintf(debugout
,"Entering delete_invite with %d\n", id_num
);
for (ptr
= table
; ptr
!= NIL
; ptr
= ptr
->next
) {
if (ptr
->request
.id_num
== id_num
)
print_request(&ptr
->request
);
* Classic delete from a double-linked list
fprintf(debugout
, "Deleting : ");
print_request(&ptr
->request
);
else if (ptr
->last
!= NIL
)
ptr
->last
->next
= ptr
->next
;
ptr
->next
->last
= ptr
->last
;