Submit #3261 ยป 0001-talkd-Find-users-in-more-than-one-talk-request.patch
libexec/talkd/Makefile | ||
---|---|---|
# @(#)Makefile 8.1 (Berkeley) 6/4/93
|
||
# $FreeBSD: src/libexec/talkd/Makefile,v 1.6.2.2 2001/10/18 12:30:42 des Exp $
|
||
.PATH: ${.CURDIR}/../../usr.bin/wall ${.CURDIR}/../../usr.bin/who
|
||
.PATH: ${.CURDIR}/../../usr.bin/wall
|
||
PROG= ntalkd
|
||
SRCS= talkd.c announce.c process.c table.c print.c ttymsg.c utmpentry.c
|
||
SRCS= talkd.c announce.c process.c table.c print.c ttymsg.c
|
||
MAN= talkd.8
|
||
DPADD= ${LIBUTIL}
|
||
LDADD= -lutil
|
||
CFLAGS+=-I${.CURDIR}/../../usr.bin/wall
|
||
CFLAGS+=-I${.CURDIR}/../../usr.bin/who
|
||
.include <bsd.prog.mk>
|
libexec/talkd/extern.h | ||
---|---|---|
void do_announce(CTL_MSG *, CTL_RESPONSE *);
|
||
CTL_MSG *find_match(CTL_MSG *request);
|
||
CTL_MSG *find_request(CTL_MSG *request);
|
||
int find_user(const char *name, char *tty);
|
||
int find_user(const char *name, char *tty, size_t ttylen);
|
||
void insert_table(CTL_MSG *, CTL_RESPONSE *);
|
||
int new_id(void);
|
||
int print_mesg(const char *, CTL_MSG *, const char *);
|
libexec/talkd/process.c | ||
---|---|---|
#include <stdio.h>
|
||
#include <string.h>
|
||
#include <syslog.h>
|
||
#include "utmpentry.h"
|
||
#include <utmpx.h>
|
||
#include "extern.h"
|
||
... | ... | |
int result;
|
||
/* see if the user is logged */
|
||
result = find_user(mp->r_name, mp->r_tty);
|
||
result = find_user(mp->r_name, mp->r_tty, sizeof(mp->r_tty));
|
||
if (result != SUCCESS) {
|
||
rp->answer = result;
|
||
return;
|
||
... | ... | |
* Search utmpx for the local user
|
||
*/
|
||
int
|
||
find_user(const char *name, char *tty)
|
||
find_user(const char *name, char *tty, size_t ttylen)
|
||
{
|
||
struct utmpentry *ep = NULL; /* avoid gcc warnings */
|
||
struct utmpx *ut; /* avoid gcc warnings */
|
||
int status;
|
||
struct stat statb;
|
||
time_t best = 0;
|
||
char ftty[sizeof(_PATH_DEV) + sizeof(ep->line)];
|
||
time_t best;
|
||
char ftty[sizeof(_PATH_DEV) + _UTX_LINESIZE];
|
||
getutentries(NULL, &ep);
|
||
if (ttylen > sizeof(ftty))
|
||
ttylen = sizeof(ftty);
|
||
#define SCMPN(a, b) strncmp(a, b, sizeof (a))
|
||
best = 0;
|
||
status = NOT_HERE;
|
||
(void) strcpy(ftty, _PATH_DEV);
|
||
for (; ep; ep = ep->next)
|
||
if (SCMPN(ep->name, name) == 0) {
|
||
if (*tty == '\0' || best != 0) {
|
||
if (best == 0)
|
||
status = PERMISSION_DENIED;
|
||
/* no particular tty was requested */
|
||
(void) strcpy(ftty + sizeof(_PATH_DEV) - 1,
|
||
ep->line);
|
||
if (stat(ftty, &statb) == 0) {
|
||
if (!(statb.st_mode & 020))
|
||
continue;
|
||
if (statb.st_atime > best) {
|
||
best = statb.st_atime;
|
||
(void) strcpy(tty, ep->line);
|
||
status = SUCCESS;
|
||
continue;
|
||
}
|
||
strlcpy(ftty, _PATH_DEV, sizeof(ftty));
|
||
setutxent();
|
||
while ((ut = getutxent()) != NULL) {
|
||
if (ut->ut_type != USER_PROCESS)
|
||
continue;
|
||
if (strncmp(ut->ut_name, name, sizeof(ut->ut_name)) != 0)
|
||
continue;
|
||
if (*tty == '\0' || best != 0) {
|
||
if (best == 0)
|
||
status = PERMISSION_DENIED;
|
||
/* no particular tty was requested */
|
||
strlcat(ftty, ut->ut_line, sizeof(ftty));
|
||
if (stat(ftty, &statb) == 0) {
|
||
if (!(statb.st_mode & 020))
|
||
continue;
|
||
if (statb.st_atime > best) {
|
||
best = statb.st_atime;
|
||
strlcpy(tty, ut->ut_line, ttylen);
|
||
status = SUCCESS;
|
||
continue;
|
||
}
|
||
}
|
||
if (strcmp(ep->line, tty) == 0) {
|
||
status = SUCCESS;
|
||
break;
|
||
}
|
||
}
|
||
if (strcmp(ut->ut_line, tty) == 0) {
|
||
status = SUCCESS;
|
||
break;
|
||
}
|
||
}
|
||
endutxent();
|
||
return (status);
|
||
}
|