* Copyright (c) 1983 Regents of the University of California.
* Redistribution and use in source and binary forms are permitted
* provided that the above copyright notice and this paragraph are
* duplicated in all such forms and that any documentation,
* advertising materials, and other materials related to such
* distribution and use acknowledge that the software was developed
* by the University of California, Berkeley. The name of the
* University may not be used to endorse or promote products derived
* from this software without specific prior written permission.
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
* WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
static char sccsid
[] = "@(#)process.c 5.6 (Berkeley) 6/18/88";
* 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
#include <protocols/talkd.h>
register CTL_RESPONSE
*rp
;
if (mp
->vers
!= TALK_VERSION
) {
syslog(LOG_WARNING
, "Bad protocol version %d", mp
->vers
);
mp
->id_num
= ntohl(mp
->id_num
);
mp
->addr
.sa_family
= ntohs(mp
->addr
.sa_family
);
if (mp
->addr
.sa_family
!= AF_INET
) {
syslog(LOG_WARNING
, "Bad address, family %d",
mp
->ctl_addr
.sa_family
= ntohs(mp
->ctl_addr
.sa_family
);
if (mp
->ctl_addr
.sa_family
!= AF_INET
) {
syslog(LOG_WARNING
, "Bad control address, family %d",
mp
->pid
= ntohl(mp
->pid
);
print_request("process_request", mp
);
if (ptr
!= (CTL_MSG
*)0) {
rp
->id_num
= htonl(ptr
->id_num
);
if (ptr
!= (CTL_MSG
*)0) {
rp
->id_num
= htonl(ptr
->id_num
);
rp
->addr
.sa_family
= htons(ptr
->addr
.sa_family
);
rp
->answer
= delete_invite(mp
->id_num
);
rp
->answer
= UNKNOWN_REQUEST
;
print_response("process_request", rp
);
/* see if the user is logged */
result
= find_user(mp
->r_name
, mp
->r_tty
);
#define satosin(sa) ((struct sockaddr_in *)(sa))
hp
= gethostbyaddr(&satosin(&mp
->ctl_addr
)->sin_addr
,
sizeof (struct in_addr
), AF_INET
);
if (hp
== (struct hostent
*)0) {
rp
->answer
= MACHINE_UNKNOWN
;
if (ptr
== (CTL_MSG
*) 0) {
rp
->answer
= announce(mp
, hp
->h_name
);
if (mp
->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.
rp
->id_num
= htonl(ptr
->id_num
);
rp
->answer
= announce(mp
, hp
->h_name
);
/* a duplicated request, so ignore it */
rp
->id_num
= htonl(ptr
->id_num
);
* 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
& 020))
(void) strcpy(tty
, ubuf
.ut_line
);
if (strcmp(ubuf
.ut_line
, tty
) == 0) {