summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authored <ed@FreeBSD.org>2009-12-25 11:12:05 +0000
committered <ed@FreeBSD.org>2009-12-25 11:12:05 +0000
commit95bce7e0551a08e9e52f650a4274f6bd2049bce8 (patch)
tree162183a0f789ba7c1b857799b24d8cafb7b1cd02
parentd6471fa124631390f775bd45acea4914faf44544 (diff)
downloadFreeBSD-src-95bce7e0551a08e9e52f650a4274f6bd2049bce8.zip
FreeBSD-src-95bce7e0551a08e9e52f650a4274f6bd2049bce8.tar.gz
Let talkd use utmpx instead of utmp.
Because strings are null terminated now, there is no need to copy ut_line into a separate buffer first. Also enable WARNS.
-rw-r--r--libexec/talkd/Makefile6
-rw-r--r--libexec/talkd/process.c31
2 files changed, 17 insertions, 20 deletions
diff --git a/libexec/talkd/Makefile b/libexec/talkd/Makefile
index aa6df1b..4900857 100644
--- a/libexec/talkd/Makefile
+++ b/libexec/talkd/Makefile
@@ -6,6 +6,10 @@ SRCS= talkd.c announce.c process.c table.c print.c ttymsg.c
.PATH: ${.CURDIR}/../../usr.bin/wall
MAN= talkd.8
CFLAGS+=-I${.CURDIR}/../../usr.bin/wall
-WFORMAT=0
+
+WARNS?= 6
+
+DPADD= ${LIBULOG}
+LDADD= -lulog
.include <bsd.prog.mk>
diff --git a/libexec/talkd/process.c b/libexec/talkd/process.c
index d77f8a1..c6ec34d 100644
--- a/libexec/talkd/process.c
+++ b/libexec/talkd/process.c
@@ -59,6 +59,8 @@ static const char rcsid[] =
#include <stdio.h>
#include <string.h>
#include <syslog.h>
+#define _ULOG_POSIX_NAMES
+#include <ulog.h>
#include "extern.h"
@@ -181,55 +183,46 @@ do_announce(CTL_MSG *mp, CTL_RESPONSE *rp)
}
}
-#include <utmp.h>
-
/*
* Search utmp for the local user
*/
int
find_user(const char *name, char *tty)
{
- struct utmp ubuf;
+ struct utmpx *ut;
int status;
- FILE *fd;
struct stat statb;
time_t best = 0;
- char line[sizeof(ubuf.ut_line) + 1];
- char ftty[sizeof(_PATH_DEV) - 1 + sizeof(line)];
+ char ftty[sizeof(_PATH_DEV) - 1 + sizeof(ut->ut_line)];
- if ((fd = fopen(_PATH_UTMP, "r")) == NULL) {
- warnx("can't read %s", _PATH_UTMP);
- return (FAILED);
- }
-#define SCMPN(a, b) strncmp(a, b, sizeof (a))
+ setutxent();
status = NOT_HERE;
(void) strcpy(ftty, _PATH_DEV);
- while (fread((char *) &ubuf, sizeof ubuf, 1, fd) == 1)
- if (SCMPN(ubuf.ut_name, name) == 0) {
- strncpy(line, ubuf.ut_line, sizeof(ubuf.ut_line));
- line[sizeof(ubuf.ut_line)] = '\0';
+ while ((ut = getutxent()) != NULL)
+ if (ut->ut_type == USER_PROCESS &&
+ strcmp(ut->ut_user, 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,
- line);
+ ut->ut_line);
if (stat(ftty, &statb) == 0) {
if (!(statb.st_mode & 020))
continue;
if (statb.st_atime > best) {
best = statb.st_atime;
- (void) strcpy(tty, line);
+ (void) strcpy(tty, ut->ut_line);
status = SUCCESS;
continue;
}
}
}
- if (strcmp(line, tty) == 0) {
+ if (strcmp(ut->ut_line, tty) == 0) {
status = SUCCESS;
break;
}
}
- fclose(fd);
+ endutxent();
return (status);
}
OpenPOWER on IntegriCloud