diff options
author | ed <ed@FreeBSD.org> | 2010-01-13 18:53:06 +0000 |
---|---|---|
committer | ed <ed@FreeBSD.org> | 2010-01-13 18:53:06 +0000 |
commit | fee8e21b50dac7cfc13624b364dc2947480b06fd (patch) | |
tree | d4c5b51c2df66017f358d1de47d262911d580341 /lib/libulog | |
parent | 55b15dac03499c76fbd5fe0a6b03c5c19cb02165 (diff) | |
download | FreeBSD-src-fee8e21b50dac7cfc13624b364dc2947480b06fd.zip FreeBSD-src-fee8e21b50dac7cfc13624b364dc2947480b06fd.tar.gz |
Remove utmpx stub from libulog.
I'm not increasing the shlib major version for this, because not a
single application outside the base system should have used these
functions in such a short timespan.
Rewrite ulog_login(3) and ulog_logout(3) to build on top of the utmpx
implementation in libc.
Diffstat (limited to 'lib/libulog')
-rw-r--r-- | lib/libulog/Makefile | 18 | ||||
-rw-r--r-- | lib/libulog/Symbol.map | 7 | ||||
-rw-r--r-- | lib/libulog/ulog.h | 67 | ||||
-rw-r--r-- | lib/libulog/ulog_getutxent.3 | 183 | ||||
-rw-r--r-- | lib/libulog/ulog_getutxent.c | 317 | ||||
-rw-r--r-- | lib/libulog/ulog_internal.h | 60 | ||||
-rw-r--r-- | lib/libulog/ulog_login.3 | 7 | ||||
-rw-r--r-- | lib/libulog/ulog_login.c | 55 | ||||
-rw-r--r-- | lib/libulog/ulog_login_pseudo.c | 3 | ||||
-rw-r--r-- | lib/libulog/ulog_pututxline.c | 208 | ||||
-rw-r--r-- | lib/libulog/ulog_setutxfile.3 | 94 | ||||
-rw-r--r-- | lib/libulog/ulog_util.c | 49 | ||||
-rw-r--r-- | lib/libulog/utempter.c | 2 | ||||
-rw-r--r-- | lib/libulog/utempter_add_record.3 | 5 |
14 files changed, 45 insertions, 1030 deletions
diff --git a/lib/libulog/Makefile b/lib/libulog/Makefile index 466fc1d..074d9db 100644 --- a/lib/libulog/Makefile +++ b/lib/libulog/Makefile @@ -7,25 +7,21 @@ SHLIBDIR?=/lib LIB= ulog SHLIB_MAJOR= 0 INCS= ulog.h utempter.h -SRCS= ulog.h ulog_getutxent.c ulog_internal.h ulog_login.c \ - ulog_login_pseudo.c ulog_pututxline.c ulog_util.c utempter.c - -MAN= ulog_getutxent.3 ulog_login.3 ulog_setutxfile.3 \ - utempter_add_record.3 -MLINKS+=ulog_getutxent.3 ulog_endutxent.3 \ - ulog_getutxent.3 ulog_getutxline.3 \ - ulog_getutxent.3 ulog_pututxline.3 \ - ulog_getutxent.3 ulog_setutxent.3 \ - ulog_login.3 ulog_login_pseudo.3 \ +SRCS= ulog.h ulog_login.c ulog_login_pseudo.c utempter.c + +MAN= ulog_login.3 utempter_add_record.3 +MLINKS+=ulog_login.3 ulog_login_pseudo.3 \ ulog_login.3 ulog_logout.3 \ ulog_login.3 ulog_logout_pseudo.3 \ - ulog_setutxfile.3 ulog_getutxuser.3 \ utempter_add_record.3 utempter_remove_added_record.3 \ utempter_add_record.3 utempter_remove_record.3 \ utempter_add_record.3 addToUtmp.3 \ utempter_remove_added_record.3 removeFromUtmp.3 \ utempter_remove_record.3 removeLineFromUtmp.3 +DPADD= ${LIBMD} +LDADD= -lmd + VERSION_DEF= ${.CURDIR}/../libc/Versions.def SYMBOL_MAPS= ${.CURDIR}/Symbol.map diff --git a/lib/libulog/Symbol.map b/lib/libulog/Symbol.map index 38f2df8..e0375ae 100644 --- a/lib/libulog/Symbol.map +++ b/lib/libulog/Symbol.map @@ -3,17 +3,10 @@ */ FBSD_1.2 { - ulog_endutxent; - ulog_getutxent; - ulog_getutxline; - ulog_getutxuser; ulog_login; ulog_login_pseudo; ulog_logout; ulog_logout_pseudo; - ulog_pututxline; - ulog_setutxent; - ulog_setutxfile; addToUtmp; removeFromUtmp; diff --git a/lib/libulog/ulog.h b/lib/libulog/ulog.h index b57c0e0..c5f6fa0 100644 --- a/lib/libulog/ulog.h +++ b/lib/libulog/ulog.h @@ -30,79 +30,12 @@ #define _ULOG_H_ #include <sys/cdefs.h> -#include <sys/_timeval.h> -#include <sys/_types.h> - -#ifndef _PID_T_DECLARED -typedef __pid_t pid_t; -#define _PID_T_DECLARED -#endif - -/* - * libulog. - * - * This library is provided as a migratory tool towards <utmpx.h>. We - * cannot yet implement <utmpx.h>, because our on-disk file format lacks - * various fields. <utmpx.h> also has some shortcomings. Ideally we - * want to allow logging of user login records generated by unprivileged - * processes as well, provided that they hold a file descriptor to a - * pseudo-terminal master device. - * - * This library (or at least parts of it) will hopefully deprecate over - * time, when we provide the <utmpx.h> API. - */ - -struct ulog_utmpx { - char ut_user[32]; - char ut_id[8]; /* XXX: unsupported. */ - char ut_line[32]; - char ut_host[256]; - pid_t ut_pid; /* XXX: unsupported. */ - short ut_type; -#define EMPTY 0 -#define BOOT_TIME 1 -#define OLD_TIME 2 -#define NEW_TIME 3 -#define USER_PROCESS 4 -#define INIT_PROCESS 5 /* XXX: unsupported. */ -#define LOGIN_PROCESS 6 /* XXX: unsupported. */ -#define DEAD_PROCESS 7 -#define SHUTDOWN_TIME 8 - struct timeval ut_tv; -}; __BEGIN_DECLS -/* POSIX routines. */ -void ulog_endutxent(void); -struct ulog_utmpx *ulog_getutxent(void); -#if 0 -struct ulog_utmpx *ulog_getutxid(const struct ulog_utmpx *); -#endif -struct ulog_utmpx *ulog_getutxline(const struct ulog_utmpx *); -struct ulog_utmpx *ulog_pututxline(const struct ulog_utmpx *); -void ulog_setutxent(void); - -/* Extensions. */ -struct ulog_utmpx *ulog_getutxuser(const char *); -int ulog_setutxfile(int, const char *); -#define UTXI_TTY 0 -#define UTXI_TIME 1 -#define UTXI_USER 2 - -/* Login/logout utility functions. */ void ulog_login(const char *, const char *, const char *); void ulog_login_pseudo(int, const char *); void ulog_logout(const char *); void ulog_logout_pseudo(int); __END_DECLS -#ifdef _ULOG_POSIX_NAMES -#define utmpx ulog_utmpx -#define endutxent ulog_endutxent -#define getutxent ulog_getutxent -#define getutxline ulog_getutxline -#define pututxline ulog_pututxline -#define setutxent ulog_setutxent -#endif /* _ULOG_POSIX_NAMES */ - #endif /* !_ULOG_H_ */ diff --git a/lib/libulog/ulog_getutxent.3 b/lib/libulog/ulog_getutxent.3 deleted file mode 100644 index 99c1ea1..0000000 --- a/lib/libulog/ulog_getutxent.3 +++ /dev/null @@ -1,183 +0,0 @@ -.\" Copyright (c) 2009 Ed Schouten <ed@FreeBSD.org> -.\" All rights reserved. -.\" -.\" Redistribution and use in source and binary forms, with or without -.\" modification, are permitted provided that the following conditions -.\" are met: -.\" 1. Redistributions of source code must retain the above copyright -.\" notice, this list of conditions and the following disclaimer. -.\" 2. Redistributions in binary form must reproduce the above copyright -.\" notice, this list of conditions and the following disclaimer in the -.\" documentation and/or other materials provided with the distribution. -.\" -.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND -.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE -.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -.\" SUCH DAMAGE. -.\" -.\" $FreeBSD$ -.\" -.Dd December 5, 2009 -.Os -.Dt ULOG_GETUTXENT 3 -.Sh NAME -.Nm ulog_getutxent , -.Nm ulog_getutxline , -.Nm ulog_pututxline , -.Nm ulog_setutxent , -.Nm ulog_endutxent -.Nd read user login records -.Sh LIBRARY -.Lb libulog -.Sh SYNOPSIS -.In ulog.h -.Ft struct ulog_utmpx * -.Fn ulog_getutxent "void" -.Ft struct ulog_utmpx * -.Fn ulog_getutxline "const struct ulog_utmpx *line" -.Ft struct ulog_utmpx * -.Fn ulog_pututxline "const struct ulog_utmpx *utmpx" -.Ft void -.Fn ulog_setutxent "void" -.Ft void -.Fn ulog_endutxent "void" -.Sh DESCRIPTION -The -.Fn ulog_getutxent -function returns a pointer to an object, with the following structure, -containing stored information of an active user login session. -.Bd -literal -struct ulog_utmpx { - char ut_user[]; /* Username. */ - char ut_id[]; /* Private data. */ - char ut_line[]; /* TTY device. */ - char ut_host[]; /* Remote hostname. */ - pid_t ut_pid; /* Process identifier. */ - short ut_type; /* Type of entry. */ - struct timeval ut_tv; /* Timestamp. */ -}; -.Ed -.Pp -The fields are as follows: -.Bl -tag -width ut_user -.It Fa ut_user -The username of the logged in user. -.It Fa ut_id -Private data that can be used to later identify the record. -This implementation is not capable of storing this value on disk. -.It Fa ut_line -The pathname of the TTY device, without the leading -.Pa /dev/ -directory. -.It Fa ut_host -An optional hostname of a remote system, if the login session is -provided through a networked login service. -.It Fa ut_pid -Process identifier of the session leader of the login session. -This implementation is not capable of storing this value on disk. -.It Fa ut_type -The -.Fa ut_type -field contains the type of the message, which may have one of the -following values: -.Bl -tag -width SHUTDOWN_TIME -.It Dv EMPTY -No valid user accounting information. -.It Dv BOOT_TIME -Identifies time of system boot. -.It Dv OLD_TIME -Identifies time when system clock changed. -.It Dv NEW_TIME -Identifies time after system clock changed. -.It Dv USER_PROCESS -Identifies a process. -.It Dv INIT_PROCESS -Identifies a process spawned by the init process. -.It Dv LOGIN_PROCESS -Identifies the session leader of a logged-in user. -.It Dv DEAD_PROCESS -Identifies a session leader who has exited. -.It Dv SHUTDOWN_TIME -Identifies time when system was shut down. -.El -.It Fa ut_tv -Timestamp indicating when the entry was last modified. -.El -.Pp -This implementation guarantees all strings returned in the structure to -be null terminated. -.Pp -The -.Fn ulog_getutxent -function reads the next entry from the utmp file, opening the file if -necessary. -The -.Fn ulog_getutxline -function reads entries from the utmp file, until finding an entry which -shares the same -.Fa ut_line -as the structure -.Fa line . -The -.Fn ulog_setutxent -opens the file, closing it first if already opened. -The -.Fn ulog_endutxent -function closes any open files. -.Pp -The -.Fn ulog_getutxent -and -.Fn ulog_getutxline -functions read from the beginning of the file until and EOF is -encountered. -.Pp -The -.Fn ulog_pututxline -function writes a new entry to the file. -.Sh RETURN VALUES -The -.Fn ulog_getutxent -and -.Fn ulog_getutxline -functions return a null pointer on EOF or error. -.Sh SEE ALSO -.Xr ulog_login 3 , -.Xr ulog_setutxfile 3 , -.Xr utmp 5 -.Sh STANDARDS -This interface is similar to -.In utmpx.h -described in -.St -p1003.1-2008 , -but incompatible. -The underlying file format does not allow a correctly behaving -implementation of the standardized interface. -.Pp -This programming interface has been designed to ease the migration -towards -.In utmpx.h . -If -.Dv _ULOG_POSIX_NAMES -is set before inclusion of -.In ulog.h , -it is also possible to use the -.Vt utmpx -structure and the -.Fn getutxent , -.Fn getutxline , -.Fn pututxline , -.Fn setutxent -and -.Fn endutxent -functions. -.Sh HISTORY -These functions appeared in -.Fx 9.0 . diff --git a/lib/libulog/ulog_getutxent.c b/lib/libulog/ulog_getutxent.c deleted file mode 100644 index c606ac9..0000000 --- a/lib/libulog/ulog_getutxent.c +++ /dev/null @@ -1,317 +0,0 @@ -/*- - * Copyright (c) 2009 Ed Schouten <ed@FreeBSD.org> - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#include <sys/cdefs.h> -__FBSDID("$FreeBSD$"); - -#include <sys/param.h> - -#include <pwd.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <timeconv.h> - -#include "ulog_internal.h" - -static FILE *ufile; -static int ufileindex = -1; - -void -ulog_endutxent(void) -{ - if (ufile != NULL) - fclose(ufile); - ufile = NULL; -} - -/* - * Conversion from on-disk formats to generic ulog_utmpx structure. - */ - -static void -ulog_futmp_to_utmpx(const struct futmp *ut, struct ulog_utmpx *utx) -{ - - memset(utx, 0, sizeof *utx); -#define COPY_STRING(field) do { \ - strncpy(utx->ut_ ## field, ut->ut_ ## field, \ - MIN(sizeof utx->ut_ ## field - 1, sizeof ut->ut_ ## field));\ -} while (0) -#define MATCH(field, value) (strncmp(ut->ut_ ## field, (value), \ - sizeof(ut->ut_ ## field)) == 0) - if (MATCH(user, "reboot") && MATCH(line, "~")) - utx->ut_type = BOOT_TIME; - else if (MATCH(user, "date") && MATCH(line, "|")) - utx->ut_type = OLD_TIME; - else if (MATCH(user, "date") && MATCH(line, "{")) - utx->ut_type = NEW_TIME; - else if (MATCH(user, "shutdown") && MATCH(line, "~")) - utx->ut_type = SHUTDOWN_TIME; - else if (MATCH(user, "") && MATCH(host, "") && !MATCH(line, "")) { - utx->ut_type = DEAD_PROCESS; - /* XXX: ut_id and ut_pid missing. ut_line not needed. */ - COPY_STRING(line); - } else if (!MATCH(user, "") && !MATCH(line, "") && ut->ut_time != 0) { - utx->ut_type = USER_PROCESS; - /* XXX: ut_id and ut_pid missing. */ - COPY_STRING(user); - COPY_STRING(line); - COPY_STRING(host); - } else { - /* Only set ut_type for EMPTY. */ - utx->ut_type = EMPTY; - return; - } -#undef COPY_STRING -#undef MATCH - utx->ut_tv.tv_sec = _time32_to_time(ut->ut_time); - utx->ut_tv.tv_usec = 0; -} - -static void -ulog_flastlog_to_utmpx(const struct flastlog *ll, struct ulog_utmpx *utx) -{ - - memset(utx, 0, sizeof *utx); -#define COPY_STRING(field) do { \ - strncpy(utx->ut_ ## field, ll->ll_ ## field, \ - MIN(sizeof utx->ut_ ## field - 1, sizeof ll->ll_ ## field));\ -} while (0) -#define MATCH(field, value) (strncmp(ll->ll_ ## field, (value), \ - sizeof(ll->ll_ ## field)) == 0) - if (!MATCH(line, "") && ll->ll_time != 0) { - utx->ut_type = USER_PROCESS; - /* XXX: ut_id and ut_pid missing. */ - COPY_STRING(line); - COPY_STRING(host); - } else { - /* Only set ut_type for EMPTY. */ - utx->ut_type = EMPTY; - return; - } -#undef COPY_STRING -#undef MATCH - utx->ut_tv.tv_sec = _time32_to_time(ll->ll_time); - utx->ut_tv.tv_usec = 0; -} - -/* - * File I/O. - */ - -static inline off_t -ulog_tell(void) -{ - - if (ufileindex == UTXI_USER) - return (ftello(ufile) / sizeof(struct flastlog)); - else - return (ftello(ufile) / sizeof(struct futmp)); -} - -static struct ulog_utmpx * -ulog_read(off_t off, int whence, int resolve_user) -{ - static struct ulog_utmpx utx; - - if (ufile == NULL) - ulog_setutxent(); - if (ufile == NULL) - return (NULL); - - /* Only allow seeking to move forward. */ - if (whence == SEEK_SET && ulog_tell() > off) - return (NULL); - - if (ufileindex == UTXI_USER) { - struct flastlog ll; - struct passwd *pw = NULL; - uid_t uid; - - if (fseeko(ufile, off * sizeof ll, whence) != 0) - return (NULL); - uid = ulog_tell(); - if (fread(&ll, sizeof ll, 1, ufile) != 1) - return (NULL); - ulog_flastlog_to_utmpx(&ll, &utx); - if (utx.ut_type == USER_PROCESS && resolve_user) - pw = getpwuid(uid); - if (pw != NULL) - strlcpy(utx.ut_user, pw->pw_name, sizeof utx.ut_user); - else - sprintf(utx.ut_user, "%u", (unsigned int)uid); - } else { - struct futmp ut; - - if (fseeko(ufile, off * sizeof(struct futmp), whence) != 0) - return (NULL); - if (fread(&ut, sizeof ut, 1, ufile) != 1) - return (NULL); - ulog_futmp_to_utmpx(&ut, &utx); - } - return (&utx); -} - -/* - * getutxent(). - * - * Read the next entry from the file. - */ - -struct ulog_utmpx * -ulog_getutxent(void) -{ - - return ulog_read(0, SEEK_CUR, 1); -} - -/* - * ulog_getutxline(). - * - * Read entries from the file, until reaching an entry which matches the - * provided TTY device name. We can optimize the case for utmp files, - * because they are indexed by TTY device name. - */ - -struct ulog_utmpx * -ulog_getutxline(const struct ulog_utmpx *line) -{ - struct ulog_utmpx *utx; - - if (ufile == NULL) - ulog_setutxent(); - if (ufile == NULL) - return (NULL); - - if (ufileindex == UTXI_TTY) { - unsigned int slot; - - slot = ulog_ttyslot(line->ut_line); - if (slot == 0) - return (NULL); - utx = ulog_read(slot, SEEK_SET, 1); - if (utx->ut_type == USER_PROCESS && - strcmp(utx->ut_line, line->ut_line) == 0) - return (utx); - return (NULL); - } else { - for (;;) { - utx = ulog_read(0, SEEK_CUR, 1); - if (utx == NULL) - return (NULL); - if (utx->ut_type == USER_PROCESS && - strcmp(utx->ut_line, line->ut_line) == 0) - return (utx); - } - } -} - -/* - * ulog_getutxuser(). - * - * Read entries from the file, until reaching an entry which matches the - * provided username. We can optimize the case for lastlog files, - * because they are indexed by user ID. - */ - -struct ulog_utmpx * -ulog_getutxuser(const char *user) -{ - struct ulog_utmpx *utx; - - if (ufileindex == UTXI_USER) { - struct passwd *pw; - - pw = getpwnam(user); - if (pw == NULL) - return (NULL); - utx = ulog_read(pw->pw_uid, SEEK_SET, 0); - if (utx != NULL) - strlcpy(utx->ut_user, user, sizeof utx->ut_user); - return (utx); - } else { - for (;;) { - utx = ulog_read(0, SEEK_CUR, 1); - if (utx == NULL) - return (NULL); - if (utx->ut_type == USER_PROCESS && - strcmp(utx->ut_user, user) == 0) - return (utx); - } - } -} - -/* - * ulog_setutxfile(). - * - * Switch to a different record file. When no filename is provided, the - * system default is opened. - */ - -int -ulog_setutxfile(int uidx, const char *file) -{ - - /* Supply default files. */ - switch (uidx) { - case UTXI_TTY: - if (file == NULL) - file = _PATH_UTMP; - break; - case UTXI_TIME: - if (file == NULL) - file = _PATH_WTMP; - break; - case UTXI_USER: - if (file == NULL) - file = _PATH_LASTLOG; - break; - default: - return (-1); - } - - if (ufile != NULL) - fclose(ufile); - ufile = fopen(file, "r"); - ufileindex = uidx; - if (ufile == NULL) - return (-1); - return (0); -} - -/* - * ulog_endutxfile(). - * - * Close any opened files. - */ - -void -ulog_setutxent(void) -{ - - ulog_setutxfile(UTXI_TTY, NULL); -} diff --git a/lib/libulog/ulog_internal.h b/lib/libulog/ulog_internal.h deleted file mode 100644 index 4969ea3..0000000 --- a/lib/libulog/ulog_internal.h +++ /dev/null @@ -1,60 +0,0 @@ -/*- - * Copyright (c) 2009 Ed Schouten <ed@FreeBSD.org> - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * $FreeBSD$ - */ - -#ifndef _ULOG_INTERNAL_H_ -#define _ULOG_INTERNAL_H_ - -#include <stdint.h> - -#include "ulog.h" - -unsigned int ulog_ttyslot(const char *); - -/* - * On-disk format. - */ - -#define _PATH_UTMP "/var/run/utmp" -#define _PATH_WTMP "/var/log/wtmp" - -struct futmp { - char ut_line[8]; - char ut_user[16]; - char ut_host[16]; - int32_t ut_time; -}; - -#define _PATH_LASTLOG "/var/log/lastlog" - -struct flastlog { - int32_t ll_time; - char ll_line[8]; - char ll_host[16]; -}; - -#endif /* !_ULOG_INTERNAL_H_ */ diff --git a/lib/libulog/ulog_login.3 b/lib/libulog/ulog_login.3 index 45dba93..ec397c8 100644 --- a/lib/libulog/ulog_login.3 +++ b/lib/libulog/ulog_login.3 @@ -90,13 +90,10 @@ and .Fn ulog_logout_pseudo functions spawn a privileged process to perform the actual logging. .Sh SEE ALSO -.Xr getuid 3 , -.Xr login 3 , -.Xr logout 3 , .Xr posix_openpt 2 , +.Xr getuid 3 , .Xr ptsname 3 , -.Xr ulog_getutxent 3 , -.Xr utmp 5 +.Xr pututxline 3 .Sh HISTORY These functions appeared in .Fx 9.0 . diff --git a/lib/libulog/ulog_login.c b/lib/libulog/ulog_login.c index 15d607e..3058b9f 100644 --- a/lib/libulog/ulog_login.c +++ b/lib/libulog/ulog_login.c @@ -27,49 +27,58 @@ #include <sys/cdefs.h> __FBSDID("$FreeBSD$"); +#include <sys/param.h> #include <sys/time.h> #include <paths.h> +#include <sha.h> #include <string.h> +#include <unistd.h> +#include <utmpx.h> +#include "ulog.h" -#include "ulog_internal.h" - -void -ulog_login(const char *line, const char *user, const char *host) +static void +ulog_fill(struct utmpx *utx, const char *line) { - struct ulog_utmpx utx; + SHA_CTX c; + char id[SHA_DIGEST_LENGTH]; /* Remove /dev/ component. */ if (strncmp(line, _PATH_DEV, sizeof _PATH_DEV - 1) == 0) line += sizeof _PATH_DEV - 1; - memset(&utx, 0, sizeof utx); + memset(utx, 0, sizeof *utx); + + utx->ut_pid = getpid(); + gettimeofday(&utx->ut_tv, NULL); + strncpy(utx->ut_line, line, sizeof utx->ut_line); + + SHA1_Init(&c); + SHA1_Update(&c, "libulog", 7); + SHA1_Update(&c, utx->ut_line, sizeof utx->ut_line); + SHA_Final(id, &c); + + memcpy(utx->ut_id, id, MIN(sizeof utx->ut_id, sizeof id)); +} + +void +ulog_login(const char *line, const char *user, const char *host) +{ + struct utmpx utx; - /* XXX: ut_id, ut_pid missing. */ + ulog_fill(&utx, line); utx.ut_type = USER_PROCESS; - strncpy(utx.ut_line, line, sizeof utx.ut_line); strncpy(utx.ut_user, user, sizeof utx.ut_user); if (host != NULL) strncpy(utx.ut_host, host, sizeof utx.ut_host); - gettimeofday(&utx.ut_tv, NULL); - - ulog_pututxline(&utx); + pututxline(&utx); } void ulog_logout(const char *line) { - struct ulog_utmpx utx; + struct utmpx utx; - /* Remove /dev/ component. */ - if (strncmp(line, _PATH_DEV, sizeof _PATH_DEV - 1) == 0) - line += sizeof _PATH_DEV - 1; - - memset(&utx, 0, sizeof utx); - - /* XXX: ut_id, ut_pid missing. ut_line not needed */ + ulog_fill(&utx, line); utx.ut_type = DEAD_PROCESS; - strncpy(utx.ut_line, line, sizeof utx.ut_line); - gettimeofday(&utx.ut_tv, NULL); - - ulog_pututxline(&utx); + pututxline(&utx); } diff --git a/lib/libulog/ulog_login_pseudo.c b/lib/libulog/ulog_login_pseudo.c index 841a2db..c7f3066 100644 --- a/lib/libulog/ulog_login_pseudo.c +++ b/lib/libulog/ulog_login_pseudo.c @@ -34,8 +34,7 @@ __FBSDID("$FreeBSD$"); #include <stdlib.h> #include <sysexits.h> #include <unistd.h> - -#include "ulog_internal.h" +#include "ulog.h" #define _PATH_ULOG_HELPER "/usr/libexec/ulog-helper" diff --git a/lib/libulog/ulog_pututxline.c b/lib/libulog/ulog_pututxline.c deleted file mode 100644 index d0e7951..0000000 --- a/lib/libulog/ulog_pututxline.c +++ /dev/null @@ -1,208 +0,0 @@ -/*- - * Copyright (c) 2009 Ed Schouten <ed@FreeBSD.org> - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#include <sys/cdefs.h> -__FBSDID("$FreeBSD$"); - -#include <sys/param.h> -#include <fcntl.h> -#include <pwd.h> -#include <string.h> -#include <timeconv.h> -#include <unistd.h> - -#include "ulog_internal.h" - -static void -ulog_utmpx_to_futmp(const struct ulog_utmpx *utx, struct futmp *ut) -{ - - memset(ut, 0, sizeof *ut); -#define COPY_STRING(field) do { \ - strncpy(ut->ut_ ## field, utx->ut_ ## field, \ - MIN(sizeof ut->ut_ ## field, sizeof utx->ut_ ## field)); \ -} while (0) - switch (utx->ut_type) { - case BOOT_TIME: - strcpy(ut->ut_user, "reboot"); - ut->ut_line[0] = '~'; - break; - case OLD_TIME: - strcpy(ut->ut_user, "date"); - ut->ut_line[0] = '|'; - break; - case NEW_TIME: - strcpy(ut->ut_user, "date"); - ut->ut_line[0] = '{'; - break; - case USER_PROCESS: - COPY_STRING(user); - COPY_STRING(line); - COPY_STRING(host); - break; - case DEAD_PROCESS: - COPY_STRING(line); - break; - case SHUTDOWN_TIME: - strcpy(ut->ut_user, "shutdown"); - ut->ut_line[0] = '~'; - break; - } -#undef COPY_STRING - ut->ut_time = _time_to_time32(utx->ut_tv.tv_sec); -} - -static void -ulog_utmpx_to_flastlog(const struct ulog_utmpx *utx, struct flastlog *ll) -{ - - memset(ll, 0, sizeof *ll); -#define COPY_STRING(field) do { \ - strncpy(ll->ll_ ## field, utx->ut_ ## field, \ - MIN(sizeof ll->ll_ ## field, sizeof utx->ut_ ## field)); \ -} while (0) - switch (utx->ut_type) { - case USER_PROCESS: - COPY_STRING(line); - COPY_STRING(host); - break; - } -#undef COPY_STRING - ll->ll_time = _time_to_time32(utx->ut_tv.tv_sec); -} - -static void -ulog_write_utmp_fast(const struct futmp *ut) -{ - unsigned int idx; - char line[sizeof ut->ut_line + 1]; - int fd; - - if ((fd = open(_PATH_UTMP, O_WRONLY|O_CREAT, 0644)) < 0) - return; - strlcpy(line, ut->ut_line, sizeof line); - idx = ulog_ttyslot(line); - if (idx > 0) { - lseek(fd, (off_t)(idx * sizeof *ut), SEEK_SET); - write(fd, ut, sizeof *ut); - } - close(fd); -} - -static int -ulog_write_utmp_slow(const struct futmp *ut) -{ - struct futmp utf; - int fd, found; - - if ((fd = open(_PATH_UTMP, O_RDWR, 0)) < 0) - return (0); - found = 0; - while (read(fd, &utf, sizeof utf) == sizeof utf) { - if (utf.ut_user[0] == '\0' || - strncmp(utf.ut_line, ut->ut_line, sizeof utf.ut_line) != 0) - continue; - lseek(fd, -(off_t)sizeof utf, SEEK_CUR); - write(fd, ut, sizeof *ut); - found = 1; - } - close(fd); - return (found); -} - -static void -ulog_write_wtmp(const struct futmp *ut) -{ - int fd; - - if ((fd = open(_PATH_WTMP, O_WRONLY|O_APPEND, 0)) < 0) - return; - write(fd, ut, sizeof *ut); - close(fd); -} - -static void -ulog_write_lastlog(const struct flastlog *ll, const char *user) -{ - struct passwd *pw; - int fd; - - if ((fd = open(_PATH_LASTLOG, O_WRONLY, 0)) < 0) - return; - pw = getpwnam(user); - if (pw != NULL) { - lseek(fd, (off_t)(pw->pw_uid * sizeof *ll), SEEK_SET); - write(fd, ll, sizeof *ll); - } - close(fd); -} - -struct ulog_utmpx * -ulog_pututxline(const struct ulog_utmpx *utmpx) -{ - static struct ulog_utmpx utx; - struct futmp ut; - struct flastlog ll; - char user[sizeof utmpx->ut_user + 1]; - - switch (utmpx->ut_type) { - case BOOT_TIME: - case OLD_TIME: - case NEW_TIME: - case SHUTDOWN_TIME: - ulog_utmpx_to_futmp(utmpx, &ut); - - /* Only log to wtmp. */ - ulog_write_wtmp(&ut); - break; - case USER_PROCESS: - ulog_utmpx_to_futmp(utmpx, &ut); - ulog_utmpx_to_flastlog(utmpx, &ll); - - /* Log to utmp, wtmp and lastlog. */ - ulog_write_utmp_fast(&ut); - ulog_write_wtmp(&ut); - strlcpy(user, utmpx->ut_user, sizeof user); - ulog_write_lastlog(&ll, user); - break; - case DEAD_PROCESS: - ulog_utmpx_to_futmp(utmpx, &ut); - - /* Only log to wtmp if logged in utmp. */ - if (ulog_write_utmp_slow(&ut)) - ulog_write_wtmp(&ut); - break; - default: - return (NULL); - } - - /* XXX: Can't we just return utmpx itself? */ - memcpy(&utx, utmpx, sizeof utx); - utx.ut_user[sizeof utx.ut_user - 1] = '\0'; - utx.ut_line[sizeof utx.ut_line - 1] = '\0'; - utx.ut_host[sizeof utx.ut_host - 1] = '\0'; - return (&utx); -} diff --git a/lib/libulog/ulog_setutxfile.3 b/lib/libulog/ulog_setutxfile.3 deleted file mode 100644 index e26380ca..0000000 --- a/lib/libulog/ulog_setutxfile.3 +++ /dev/null @@ -1,94 +0,0 @@ -.\" Copyright (c) 2009 Ed Schouten <ed@FreeBSD.org> -.\" All rights reserved. -.\" -.\" Redistribution and use in source and binary forms, with or without -.\" modification, are permitted provided that the following conditions -.\" are met: -.\" 1. Redistributions of source code must retain the above copyright -.\" notice, this list of conditions and the following disclaimer. -.\" 2. Redistributions in binary form must reproduce the above copyright -.\" notice, this list of conditions and the following disclaimer in the -.\" documentation and/or other materials provided with the distribution. -.\" -.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND -.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE -.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -.\" SUCH DAMAGE. -.\" -.\" $FreeBSD$ -.\" -.Dd December 5, 2009 -.Os -.Dt ULOG_SETUTXFILE 3 -.Sh NAME -.Nm ulog_setutxfile , -.Nm ulog_getutxuser -.Nd additional user login records management -.Sh LIBRARY -.Lb libulog -.Sh SYNOPSIS -.In ulog.h -.Ft int -.Fn ulog_setutxfile "int index" "const char *file" -.Ft struct ulog_utmpx * -.Fn ulog_getutxuser "const char *user" -.Sh DESCRIPTION -The -.Fn ulog_setutxfile -and -.Fn ulog_getutxuser -functions are extensions to the standard -.In ulog.h -interface. -.Pp -The -.Fn ulog_setutxfile -function is similar to -.Fn ulog_setutxent , -but is capable of returning an error code and also gives access to other -login record files by using one of the following values for -.Fa index : -.Bl -tag -width UTXI_TIME -.It Dv UTXI_TTY -Open the default -.Nm utmp -file, which is indexed by TTY device. -.It Dv UTXI_TIME -Open the -.Nm wtmp -file, which is indexed by time. -.It Dv UTXI_USER -Open the -.Nm lastlog -file, which is indexed by user ID. -.El -.Pp -The -.Fa file -argument determines the file to be opened. -If left null, an implementation-defined default file is opened. -.Pp -The -.Fn ulog_getutxuser -searches the currently opened file until an entry is found whose -.Fa ut_user -is equal to the -.Fa user -argument. -.Sh RETURN VALUES -If succesful, -.Fn ulog_setutxfile -returns 0. -It returns -1 on failure. -.Sh SEE ALSO -.Xr ulog_getutxent 3 -.Sh HISTORY -These functions appeared in -.Fx 9.0 . diff --git a/lib/libulog/ulog_util.c b/lib/libulog/ulog_util.c deleted file mode 100644 index b14920c..0000000 --- a/lib/libulog/ulog_util.c +++ /dev/null @@ -1,49 +0,0 @@ -/*- - * Copyright (c) 2009 Ed Schouten <ed@FreeBSD.org> - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#include <sys/cdefs.h> -__FBSDID("$FreeBSD$"); - -#include <string.h> -#include <ttyent.h> - -#include "ulog_internal.h" - -unsigned int -ulog_ttyslot(const char *name) -{ - struct ttyent *ty; - unsigned int slot; - - setttyent(); - for (slot = 1; (ty = getttyent()) != NULL; ++slot) - if (strcmp(ty->ty_name, name) == 0) { - endttyent(); - return (slot); - } - endttyent(); - return (0); -} diff --git a/lib/libulog/utempter.c b/lib/libulog/utempter.c index bb0eb2b..94495b0 100644 --- a/lib/libulog/utempter.c +++ b/lib/libulog/utempter.c @@ -27,7 +27,7 @@ #include <sys/cdefs.h> __FBSDID("$FreeBSD$"); -#include "ulog_internal.h" +#include "ulog.h" #include "utempter.h" static int last_fd = -1; diff --git a/lib/libulog/utempter_add_record.3 b/lib/libulog/utempter_add_record.3 index fdaa00e..1553d68 100644 --- a/lib/libulog/utempter_add_record.3 +++ b/lib/libulog/utempter_add_record.3 @@ -98,9 +98,8 @@ and .Fn utempter_remove_record always return a value of 0. .Sh SEE ALSO -.Xr ulog_login_pseudo 3 , -.Xr ulog_setutxfile 3 , -.Xr utmp 5 +.Xr pututxline 3 , +.Xr ulog_login_pseudo 3 .Sh HISTORY These functions appeared in .Fx 9.0 . |