* 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
[] = "@(#)process.c 5.2 (Berkeley) %G%";
* process.c handles the requests, which can be of three types:
* ANNOUNCE - announce to a user that a talk is wanted
* LEAVE_INVITE - insert the request into the table
* LOOK_UP - look up to see if a request is waiting in
* in the table for the local user
* DELETE - delete invitation
process_request(request
, response
)
response
->type
= request
->type
;
do_announce(request
, response
);
ptr
= find_request(request
);
if (ptr
!= (CTL_MSG
*) 0) {
response
->id_num
= ptr
->id_num
;
response
->answer
= SUCCESS
;
insert_table(request
, response
);
ptr
= find_match(request
);
if (ptr
!= (CTL_MSG
*) 0) {
response
->id_num
= ptr
->id_num
;
response
->addr
= ptr
->addr
;
response
->answer
= SUCCESS
;
response
->answer
= NOT_HERE
;
response
->answer
= delete_invite(request
->id_num
);
response
->answer
= UNKNOWN_REQUEST
;
struct hostent
*gethostbyaddr();
do_announce(request
, response
)
/* see if the user is logged */
result
= find_user(request
->r_name
, request
->r_tty
);
response
->answer
= result
;
hp
= gethostbyaddr(&request
->ctl_addr
.sin_addr
,
sizeof(struct in_addr
), AF_INET
);
if (hp
== (struct hostent
*)0) {
response
->answer
= MACHINE_UNKNOWN
;
ptr
= find_request(request
);
if (ptr
== (CTL_MSG
*) 0) {
insert_table(request
,response
);
response
->answer
= announce(request
, hp
->h_name
);
if (request
->id_num
> ptr
->id_num
) {
* this is an explicit re-announce, so update the id_num
* field to avoid duplicates and re-announce the talk
ptr
->id_num
= response
->id_num
= new_id();
response
->answer
= announce(request
, hp
->h_name
);
/* a duplicated request, so ignore it */
response
->id_num
= ptr
->id_num
;
response
->answer
= SUCCESS
;
* Search utmp for the local user
if ((fd
= fopen("/etc/utmp", "r")) == NULL
) {
perror("Can't open /etc/utmp");
#define SCMPN(a, b) strncmp(a, b, sizeof (a))
(void) strcpy(ftty
, "/dev/");
while (fread((char *) &ubuf
, sizeof ubuf
, 1, fd
) == 1)
if (SCMPN(ubuf
.ut_name
, name
) == 0) {
status
= PERMISSION_DENIED
;
/* no particular tty was requested */
(void) strcpy(ftty
+5, ubuf
.ut_line
);
if (stat(ftty
,&statb
) == 0) {
if (!(statb
.st_mode
& 02))
(void) strcpy(tty
, ubuf
.ut_line
);
if (strcmp(ubuf
.ut_line
, tty
) == 0) {