Date: Thu, 7 Jan 2010 23:28:58 +0000 (UTC) From: Ed Schouten <ed@FreeBSD.org> To: src-committers@freebsd.org, svn-src-user@freebsd.org Subject: svn commit: r201763 - user/ed/utmpx/lib/libc/gen Message-ID: <201001072328.o07NSwnn097152@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: ed Date: Thu Jan 7 23:28:58 2010 New Revision: 201763 URL: http://svn.freebsd.org/changeset/base/201763 Log: Put conversion between futx and utmpx in a separate file. This allows me to get the return value of pututxline() working without excessive code duplication. Added: user/ed/utmpx/lib/libc/gen/utxdb.c (contents, props changed) Modified: user/ed/utmpx/lib/libc/gen/Makefile.inc user/ed/utmpx/lib/libc/gen/getutxent.c user/ed/utmpx/lib/libc/gen/pututxline.c user/ed/utmpx/lib/libc/gen/utxdb.h Modified: user/ed/utmpx/lib/libc/gen/Makefile.inc ============================================================================== --- user/ed/utmpx/lib/libc/gen/Makefile.inc Thu Jan 7 23:17:48 2010 (r201762) +++ user/ed/utmpx/lib/libc/gen/Makefile.inc Thu Jan 7 23:28:58 2010 (r201763) @@ -32,7 +32,7 @@ SRCS+= __getosreldate.c __xuname.c \ sysconf.c sysctl.c sysctlbyname.c sysctlnametomib.c \ syslog.c telldir.c termios.c time.c times.c timezone.c tls.c \ ttyname.c ttyslot.c ualarm.c ulimit.c uname.c unvis.c \ - usleep.c utime.c valloc.c vis.c wait.c wait3.c waitpid.c \ + usleep.c utime.c utxdb.c valloc.c vis.c wait.c wait3.c waitpid.c \ wordexp.c SYM_MAPS+=${.CURDIR}/gen/Symbol.map Modified: user/ed/utmpx/lib/libc/gen/getutxent.c ============================================================================== --- user/ed/utmpx/lib/libc/gen/getutxent.c Thu Jan 7 23:17:48 2010 (r201762) +++ user/ed/utmpx/lib/libc/gen/getutxent.c Thu Jan 7 23:28:58 2010 (r201763) @@ -28,6 +28,9 @@ __FBSDID("$FreeBSD$"); #include "namespace.h" +#include <sys/endian.h> +#include <sys/param.h> +#include <sys/stat.h> #include <errno.h> #include <stdio.h> #include <string.h> @@ -42,6 +45,7 @@ static struct utmpx utx; int setutxdb(int db, const char *file) { + struct stat sb; switch (db) { case UTXDB_ACTIVE: @@ -66,6 +70,16 @@ setutxdb(int db, const char *file) uf = fopen(file, "r"); if (uf == NULL) return (-1); + + /* Safety check: never use broken files. */ + if (db != UTXDB_LOG && _fstat(fileno(uf), &sb) != -1 && + sb.st_size % sizeof(struct futx) != 0) { + fclose(uf); + uf = NULL; + errno = EFTYPE; + return (-1); + } + udb = db; return (0); } @@ -87,49 +101,6 @@ endutxent(void) } } -static void -futx_to_utx(const struct futx *fu, struct utmpx *ut) -{ - - memset(ut, 0, sizeof *ut); - - switch (fu->fu_type) { - case BOOT_TIME: - case OLD_TIME: - case NEW_TIME: - /* Extension: shutdown time. */ - case SHUTDOWN_TIME: - break; - case USER_PROCESS: - FTOU_ID(fu, ut); - FTOU_STRING(fu, ut, user); - FTOU_STRING(fu, ut, line); - /* Extension: host name. */ - FTOU_STRING(fu, ut, host); - FTOU_PID(fu, ut); - break; - case INIT_PROCESS: - FTOU_ID(fu, ut); - FTOU_PID(fu, ut); - break; - case LOGIN_PROCESS: - FTOU_ID(fu, ut); - FTOU_STRING(fu, ut, user); - FTOU_PID(fu, ut); - break; - case DEAD_PROCESS: - FTOU_ID(fu, ut); - FTOU_PID(fu, ut); - break; - default: - ut->ut_type = EMPTY; - return; - } - - FTOU_TYPE(fu, ut); - FTOU_TV(fu, ut); -} - static struct futx * getfutxent(void) { Modified: user/ed/utmpx/lib/libc/gen/pututxline.c ============================================================================== --- user/ed/utmpx/lib/libc/gen/pututxline.c Thu Jan 7 23:17:48 2010 (r201762) +++ user/ed/utmpx/lib/libc/gen/pututxline.c Thu Jan 7 23:28:58 2010 (r201763) @@ -28,6 +28,7 @@ __FBSDID("$FreeBSD$"); #include "namespace.h" +#include <sys/endian.h> #include <sys/stat.h> #include <fcntl.h> #include <string.h> @@ -55,50 +56,6 @@ futx_open(const char *file) return (fd); } -static int -utx_to_futx(const struct utmpx *ut, struct futx *fu) -{ - - memset(fu, 0, sizeof *fu); - - switch (ut->ut_type) { - case BOOT_TIME: - case OLD_TIME: - case NEW_TIME: - /* Extension: shutdown time. */ - case SHUTDOWN_TIME: - break; - case USER_PROCESS: - UTOF_ID(ut, fu); - UTOF_STRING(ut, fu, user); - UTOF_STRING(ut, fu, line); - /* Extension: host name. */ - UTOF_STRING(ut, fu, host); - UTOF_PID(ut, fu); - break; - case INIT_PROCESS: - UTOF_ID(ut, fu); - UTOF_PID(ut, fu); - break; - case LOGIN_PROCESS: - UTOF_ID(ut, fu); - UTOF_STRING(ut, fu, user); - UTOF_PID(ut, fu); - break; - case DEAD_PROCESS: - UTOF_ID(ut, fu); - UTOF_PID(ut, fu); - break; - default: - return (-1); - } - - UTOF_TYPE(ut, fu); - UTOF_TV(ut, fu); - - return (0); -} - static void utx_active_add(const struct futx *fu) { @@ -254,9 +211,9 @@ struct utmpx * pututxline(const struct utmpx *utmpx) { struct futx fu; + static struct utmpx ut; - if (utx_to_futx(utmpx, &fu) != 0) - return (NULL); + utx_to_futx(utmpx, &fu); switch (fu.fu_type) { case BOOT_TIME: @@ -285,6 +242,6 @@ pututxline(const struct utmpx *utmpx) } utx_log_add(&fu); - /* XXX: return an entry on success! */ - return (NULL); + futx_to_utx(&fu, &ut); + return (&ut); } Added: user/ed/utmpx/lib/libc/gen/utxdb.c ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ user/ed/utmpx/lib/libc/gen/utxdb.c Thu Jan 7 23:28:58 2010 (r201763) @@ -0,0 +1,162 @@ +/*- + * Copyright (c) 2010 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 "namespace.h" +#include <sys/endian.h> +#include <sys/param.h> +#include <string.h> +#include <utmpx.h> +#include "utxdb.h" +#include "un-namespace.h" + +#define UTOF_STRING(ut, fu, field) do { \ + strncpy((fu)->fu_ ## field, (ut)->ut_ ## field, \ + MIN(sizeof (fu)->fu_ ## field, sizeof (ut)->ut_ ## field)); \ +} while (0) +#define UTOF_ID(ut, fu) do { \ + memcpy((fu)->fu_id, (ut)->ut_id, \ + MIN(sizeof (fu)->fu_id, sizeof (ut)->ut_id)); \ +} while (0) +#define UTOF_PID(ut, fu) do { \ + (fu)->fu_pid = htobe32((ut)->ut_pid); \ +} while (0) +#define UTOF_TYPE(ut, fu) do { \ + (fu)->fu_type = (ut)->ut_type; \ +} while (0) +#define UTOF_TV(ut, fu) do { \ + (fu)->fu_tv = htobe64((uint64_t)(ut)->ut_tv.tv_sec * 1000000 + \ + (uint64_t)(ut)->ut_tv.tv_usec); \ +} while (0) + +void +utx_to_futx(const struct utmpx *ut, struct futx *fu) +{ + + memset(fu, 0, sizeof *fu); + + switch (ut->ut_type) { + case BOOT_TIME: + case OLD_TIME: + case NEW_TIME: + /* Extension: shutdown time. */ + case SHUTDOWN_TIME: + break; + case USER_PROCESS: + UTOF_ID(ut, fu); + UTOF_STRING(ut, fu, user); + UTOF_STRING(ut, fu, line); + /* Extension: host name. */ + UTOF_STRING(ut, fu, host); + UTOF_PID(ut, fu); + break; + case INIT_PROCESS: + UTOF_ID(ut, fu); + UTOF_PID(ut, fu); + break; + case LOGIN_PROCESS: + UTOF_ID(ut, fu); + UTOF_STRING(ut, fu, user); + UTOF_PID(ut, fu); + break; + case DEAD_PROCESS: + UTOF_ID(ut, fu); + UTOF_PID(ut, fu); + break; + default: + fu->fu_type = EMPTY; + return; + } + + UTOF_TYPE(ut, fu); + UTOF_TV(ut, fu); +} + +#define FTOU_STRING(fu, ut, field) do { \ + strncpy((ut)->ut_ ## field, (fu)->fu_ ## field, \ + MIN(sizeof (ut)->ut_ ## field - 1, sizeof (fu)->fu_ ## field)); \ +} while (0) +#define FTOU_ID(fu, ut) do { \ + memcpy((ut)->ut_id, (fu)->fu_id, \ + MIN(sizeof (ut)->ut_id, sizeof (fu)->fu_id)); \ +} while (0) +#define FTOU_PID(fu, ut) do { \ + (ut)->ut_pid = be32toh((fu)->fu_pid); \ +} while (0) +#define FTOU_TYPE(fu, ut) do { \ + (ut)->ut_type = (fu)->fu_type; \ +} while (0) +#define FTOU_TV(fu, ut) do { \ + uint64_t t; \ + t = be64toh((fu)->fu_tv); \ + (ut)->ut_tv.tv_sec = t / 1000000; \ + (ut)->ut_tv.tv_usec = t % 1000000; \ +} while (0) + +void +futx_to_utx(const struct futx *fu, struct utmpx *ut) +{ + + memset(ut, 0, sizeof *ut); + + switch (fu->fu_type) { + case BOOT_TIME: + case OLD_TIME: + case NEW_TIME: + /* Extension: shutdown time. */ + case SHUTDOWN_TIME: + break; + case USER_PROCESS: + FTOU_ID(fu, ut); + FTOU_STRING(fu, ut, user); + FTOU_STRING(fu, ut, line); + /* Extension: host name. */ + FTOU_STRING(fu, ut, host); + FTOU_PID(fu, ut); + break; + case INIT_PROCESS: + FTOU_ID(fu, ut); + FTOU_PID(fu, ut); + break; + case LOGIN_PROCESS: + FTOU_ID(fu, ut); + FTOU_STRING(fu, ut, user); + FTOU_PID(fu, ut); + break; + case DEAD_PROCESS: + FTOU_ID(fu, ut); + FTOU_PID(fu, ut); + break; + default: + ut->ut_type = EMPTY; + return; + } + + FTOU_TYPE(fu, ut); + FTOU_TV(fu, ut); +} Modified: user/ed/utmpx/lib/libc/gen/utxdb.h ============================================================================== --- user/ed/utmpx/lib/libc/gen/utxdb.h Thu Jan 7 23:17:48 2010 (r201762) +++ user/ed/utmpx/lib/libc/gen/utxdb.h Thu Jan 7 23:28:58 2010 (r201763) @@ -29,9 +29,6 @@ #ifndef _UTXDB_H_ #define _UTXDB_H_ -#include <sys/cdefs.h> -#include <sys/endian.h> -#include <sys/param.h> #include <stdint.h> #define _PATH_UTX_ACTIVE "/var/run/utx.active" @@ -46,6 +43,8 @@ * those at the front. */ +struct utmpx; + struct futx { uint8_t fu_type; uint64_t fu_tv; @@ -56,44 +55,7 @@ struct futx { char fu_host[128]; } __packed; -#define FTOU_STRING(fu, ut, field) do { \ - strncpy((ut)->ut_ ## field, (fu)->fu_ ## field, \ - MIN(sizeof (ut)->ut_ ## field - 1, sizeof (fu)->fu_ ## field)); \ -} while (0) -#define FTOU_ID(fu, ut) do { \ - memcpy((ut)->ut_id, (fu)->fu_id, \ - MIN(sizeof (ut)->ut_id, sizeof (fu)->fu_id)); \ -} while (0) -#define FTOU_PID(fu, ut) do { \ - (ut)->ut_pid = be32toh((fu)->fu_pid); \ -} while (0) -#define FTOU_TYPE(fu, ut) do { \ - (ut)->ut_type = (fu)->fu_type; \ -} while (0) -#define FTOU_TV(fu, ut) do { \ - uint64_t t; \ - t = be64toh((fu)->fu_tv); \ - (ut)->ut_tv.tv_sec = t / 1000000; \ - (ut)->ut_tv.tv_usec = t % 1000000; \ -} while (0) - -#define UTOF_STRING(ut, fu, field) do { \ - strncpy((fu)->fu_ ## field, (ut)->ut_ ## field, \ - MIN(sizeof (fu)->fu_ ## field, sizeof (ut)->ut_ ## field)); \ -} while (0) -#define UTOF_ID(ut, fu) do { \ - memcpy((fu)->fu_id, (ut)->ut_id, \ - MIN(sizeof (fu)->fu_id, sizeof (ut)->ut_id)); \ -} while (0) -#define UTOF_PID(ut, fu) do { \ - (fu)->fu_pid = htobe32((ut)->ut_pid); \ -} while (0) -#define UTOF_TYPE(ut, fu) do { \ - (fu)->fu_type = (ut)->ut_type; \ -} while (0) -#define UTOF_TV(ut, fu) do { \ - (fu)->fu_tv = htobe64((uint64_t)(ut)->ut_tv.tv_sec * 1000000 + \ - (uint64_t)(ut)->ut_tv.tv_usec); \ -} while (0) +void utx_to_futx(const struct utmpx *, struct futx *); +void futx_to_utx(const struct futx *, struct utmpx *); #endif /* !_UTXDB_H_ */
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201001072328.o07NSwnn097152>