Date: Fri, 19 Feb 2021 00:40:15 +0000 (UTC) From: Mikhail Teterin <mi@FreeBSD.org> To: ports-committers@freebsd.org, svn-ports-all@freebsd.org, svn-ports-head@freebsd.org Subject: svn commit: r566018 - in head/lang/siod: . files Message-ID: <202102190040.11J0eG8q044709@repo.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: mi Date: Fri Feb 19 00:40:15 2021 New Revision: 566018 URL: https://svnweb.freebsd.org/changeset/ports/566018 Log: Enable the acct-module -- by porting it from the old utmp.h functions (not present since FreeBSD-9) to utmpx.h. Change the recently-enabled statfs-module to only report fsid, if provided (which it is not for non-root users) -- and in the format reported by mount(8). Sponsored by: United Marsupials Added: head/lang/siod/files/patch-acct (contents, props changed) Modified: head/lang/siod/Makefile head/lang/siod/files/patch-statfs head/lang/siod/pkg-plist Modified: head/lang/siod/Makefile ============================================================================== --- head/lang/siod/Makefile Fri Feb 19 00:34:28 2021 (r566017) +++ head/lang/siod/Makefile Fri Feb 19 00:40:15 2021 (r566018) @@ -34,7 +34,7 @@ MAKE_ENV+= MAN1PREFIX=${MAN1PREFIX} PREFIX=${PREFIX:Q} MAKE_ENV+= INSTALL_MAN=${INSTALL_MAN:Q} INSTALL_SCRIPT=${INSTALL_SCRIPT:Q} MAKE_ENV+= INSTALL_DATA=${INSTALL_DATA:Q} -MODULES= statfs tar parser_pratt +MODULES= acct statfs tar parser_pratt SQL_SYBASE_LIB_DEPENDS= libct.so:databases/freetds # Or freetds-devel GD_LIB_DEPENDS= libgd.so:graphics/gd # Or ukrainian/gd Added: head/lang/siod/files/patch-acct ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ head/lang/siod/files/patch-acct Fri Feb 19 00:40:15 2021 (r566018) @@ -0,0 +1,259 @@ +--- acct.c 2014-03-25 06:16:47.000000000 -0400 ++++ acct.c 2021-02-18 19:25:12.351120000 -0500 +@@ -1,6 +1,8 @@ + #include <stdio.h> + #include <stdlib.h> ++#include <stdint.h> + #include <string.h> +-#include <utmp.h> ++#include <time.h> ++#include <utmpx.h> + #if defined(__osf__) + #include <sys/acct.h> +@@ -10,9 +12,10 @@ + static void init_acct_version(void) + {setvar(cintern("*acct-version*"), +- cintern("$Id: acct.c,v 1.1 1996/10/17 18:40:18 gjc Exp $"), ++ cintern("$FreeBSD$"), + NIL);} + + /* decode various accounting structures */ + ++#if defined(__osf__) + /* I could not find any include file for this structure, only documentation + for it in the "man acct" */ +@@ -32,26 +35,77 @@ + unsigned short ta_sc; + unsigned short ta_dc;}; ++#endif + ++static struct utmpx_types { ++ const char *name; ++ short type; ++} utmpx_types[] = { ++ /* Keep sorted by name */ ++#define T(name) { #name, name } ++#ifdef ACCOUNTING ++ T(ACCOUNTING), ++#endif ++ T(BOOT_TIME), ++ T(DEAD_PROCESS), ++#ifdef EMPTY ++ T(EMPTY), ++#endif ++ T(INIT_PROCESS), ++ T(LOGIN_PROCESS), ++ T(NEW_TIME), ++ T(OLD_TIME), ++#ifdef RUN_LVL ++ T(RUN_LVL), ++#endif ++ T(USER_PROCESS) ++}; ++#undef T ++ ++static LISP utmpx_type_name(short type) ++{ ++ unsigned u; ++ ++ for (u = 0; u < sizeof(utmpx_types)/sizeof(utmpx_types[0]); u++) ++ if (utmpx_types[u].type == type) ++ return cintern(utmpx_types[u].name); ++ return flocons(type); ++} ++ ++static short utmpx_type_num(LISP type) ++{ ++ int64_t _type; ++ short result; ++ const char *name; ++ unsigned u; ++ ++ switch (TYPE(type)) { ++ case tc_flonum: ++ result = _type = FLONM(type); ++ if (result < 0) ++ err("UTMPX cannot be negative", type); ++ if (result != _type) ++ err("Number too large to be a UTMPX type", type); ++ return result; ++ /* Any special cases for other types? */ ++ default: ++ name = get_c_string(type); ++ } ++ for (u = 0; u < sizeof(utmpx_types)/sizeof(utmpx_types[0]); u++) { ++ int cmp = strcmp(utmpx_types[u].name, name); ++ ++ if (cmp == 0) ++ return utmpx_types[u].type; ++ if (cmp > 0) ++ break; ++ } ++ err("No such UTMPX type", type); ++ return -1; ++} + +-LISP decode_utmp(struct utmp *p) ++static LISP decode_utmpx(struct utmpx *p) + {return(symalist("user",strcons(SAFE_STRLEN(p->ut_user),p->ut_user), + "id",strcons(SAFE_STRLEN(p->ut_id),p->ut_id), + "line",strcons(SAFE_STRLEN(p->ut_line),p->ut_line), +- "type", +-#ifdef EMPTY +- (p->ut_type == EMPTY) ? cintern("EMPTY") : +-#endif +- (p->ut_type == RUN_LVL) ? cintern("RUN_LVL") : +- (p->ut_type == BOOT_TIME) ? cintern("BOOT_TIME") : +- (p->ut_type == OLD_TIME) ? cintern("OLD_TIME") : +- (p->ut_type == NEW_TIME) ? cintern("NEW_TIME") : +- (p->ut_type == INIT_PROCESS) ? cintern("INIT_PROCESS") : +- (p->ut_type == LOGIN_PROCESS) ? cintern("LOGIN_PROCESS") : +- (p->ut_type == USER_PROCESS) ? cintern("USER_PROCESS") : +- (p->ut_type == DEAD_PROCESS) ? cintern("DEAD_PROCESS") : +-#ifdef ACCOUNTING +- (p->ut_type == ACCOUNTING) ? cintern("ACCOUNTING") : +-#endif +- flocons(p->ut_type), ++ "type", utmpx_type_name(p->ut_type), + "pid",flocons(p->ut_pid), + #if defined(__osf__) +@@ -59,34 +113,69 @@ + "exit",flocons(p->ut_exit.e_exit), + #endif +- "ut_time",flocons(p->ut_time), ++ "ut_time", flocons(time(&p->ut_tv.tv_sec)), + "host",strcons(SAFE_STRLEN(p->ut_host),p->ut_host), + NULL));} + +-LISP lgetutent(void) +-{struct utmp *p; ++static LISP lgetutent(void) ++{struct utmpx *p; + long iflag; + iflag = no_interrupt(1); +- p = getutent(); ++ p = getutxent(); + no_interrupt(iflag); +- return((p) ? decode_utmp(p) : NIL);} ++ return((p) ? decode_utmpx(p) : NIL);} + +-LISP lsetutent(void) +-{long iflag; +- iflag = no_interrupt(1); +- setutent(); +- no_interrupt(iflag); +- return(NIL);} ++static LISP lgetutxid(LISP ltype, LISP lid) ++{ ++ const char *id; ++ long idlen; ++ ++ struct utmpx *p, utmpx = { ++ .ut_type = utmpx_type_num(ltype) ++ }; ++ if (lid != NULL) { ++ id = get_c_string_dim(lid, &idlen); ++ if ((size_t)idlen > sizeof(utmpx.ut_id)) ++ err("String too long to be a UTMPX ID", lid); ++ memcpy(&utmpx.ut_id, id, idlen); ++ } ++ p = getutxid(&utmpx); ++ return p == NULL ? NULL : decode_utmpx(p); ++} ++ ++static LISP lgetutxline(LISP lline) ++{ ++ long linelen; ++ const char *line = get_c_string_dim(lline, &linelen); ++ struct utmpx *p, utmpx = { .ut_type = 0 }; ++ ++ if (line == NULL || linelen == 0 || ++ (size_t)linelen > sizeof utmpx.ut_line) { ++ err("Not a valid UTMPX line", lline); ++ } ++ memcpy(&utmpx.ut_line, line, linelen); ++ p = getutxline(&utmpx); ++ return p == NULL ? NULL : decode_utmpx(p); ++} ++ ++static LISP lgetutxuser(LISP luser) ++{ ++ const char *user = get_c_string(luser); ++ struct utmpx *p; ++ ++ p = getutxuser(user); ++ return p == NULL ? NULL : decode_utmpx(p); ++} + +-LISP lendutent(void) ++static LISP lsetutent(void) + {long iflag; + iflag = no_interrupt(1); +- endutent(); ++ setutxent(); + no_interrupt(iflag); + return(NIL);} + +-LISP lutmpname(LISP name) ++static LISP lendutent(void) + {long iflag; + iflag = no_interrupt(1); +- utmpname(get_c_string(name)); ++ endutxent(); + no_interrupt(iflag); + return(NIL);} +@@ -94,5 +183,5 @@ + #if defined(__osf__) + +-LISP decode_acct(struct acct *p) ++static LISP decode_acct(struct acct *p) + {LISP flags = NIL; + if (p->ac_flag & AFORK) flags = cons(cintern("FORK"),flags); +@@ -121,5 +210,5 @@ + NULL));} + +-LISP ldecode_acct(LISP l) ++static LISP ldecode_acct(LISP l) + {char *buffer; + long n; +@@ -129,5 +218,5 @@ + return(decode_acct((struct acct *) buffer));} + +-LISP decode_tacct(struct tacct *p) ++static LISP decode_tacct(struct tacct *p) + {return(symalist("uid",flocons(p->ta_uid), + "name",strcons(SAFE_STRLEN(p->ta_name),p->ta_name), +@@ -155,5 +244,5 @@ + NULL));} + +-LISP ldecode_tacct(LISP l) ++static LISP ldecode_tacct(LISP l) + {char *buffer; + long n; +@@ -165,11 +254,17 @@ + #endif + ++void init_acct(void); /* The function invoked by siod upon loading module */ ++ + void init_acct(void) +-{setvar(cintern("UTMP_FILE"),strcons(strlen(UTMP_FILE),UTMP_FILE),NIL); +- setvar(cintern("WTMP_FILE"),strcons(strlen(WTMP_FILE),WTMP_FILE),NIL); ++{ + init_subr_0("getutent",lgetutent); ++ init_subr_0("getutxent", lgetutent); + init_subr_0("setutent",lsetutent); ++ init_subr_0("setutxent", lsetutent); + init_subr_0("endutent",lendutent); +- init_subr_1("utmpname",lutmpname); ++ init_subr_0("endutxent", lendutent); ++ init_subr_2("getutxid", lgetutxid); ++ init_subr_1("getutxline", lgetutxline); ++ init_subr_1("getutxuser", lgetutxuser); + #if defined(__osf__) + setvar(cintern("SIZEOF_ACCT"),flocons(sizeof(struct acct)),NIL); +@@ -179,5 +274,2 @@ + #endif + init_acct_version();} +- +- +- Modified: head/lang/siod/files/patch-statfs ============================================================================== --- head/lang/siod/files/patch-statfs Fri Feb 19 00:34:28 2021 (r566017) +++ head/lang/siod/files/patch-statfs Fri Feb 19 00:40:15 2021 (r566018) @@ -1,5 +1,5 @@ --- statfs.c 2014-03-25 04:10:42.000000000 -0400 -+++ statfs.c 2021-02-17 22:30:00.996673000 -0500 ++++ statfs.c 2021-02-18 18:56:33.147163000 -0500 @@ -4,9 +4,15 @@ #include <stdio.h> @@ -16,7 +16,7 @@ +#ifndef BSD #define MNT_NUMTYPES 128 /* -@@ -14,16 +20,87 @@ +@@ -14,16 +20,98 @@ */ extern char *mnt_names[]; +#endif @@ -80,6 +80,9 @@ +static LISP lstatfs(LISP path) {long iflag; struct statfs s; ++#ifdef BSD ++ LISP lfsid; ++#endif iflag = no_interrupt(1); - if (statfs(get_c_string(path),&s,sizeof(s))) + if (TYPE(path) == tc_c_file) { @@ -95,6 +98,14 @@ + no_interrupt(iflag); - return(symalist("type",(((s.f_type >= 0) && (s.f_type < MNT_NUMTYPES) && ++ if (s.f_fsid.val[0] != 0 || s.f_fsid.val[1] != 0) { ++ lfsid = strcons(sizeof(s.f_fsid) * 2, NULL); ++ unsigned u; ++ char *p = get_string_data(lfsid); ++ for (u = 0; u < sizeof(s.f_fsid); u++, p += 2) ++ sprintf(p, "%02x", ((u_char *)&s.f_fsid)[u]); ++ } else ++ lfsid = NULL; + return(symalist("type", +#ifdef BSD + s.f_fstypename[0] != '\0' @@ -108,7 +119,7 @@ + : flocons(s.f_type), "bsize",flocons(s.f_bsize), "blocks",flocons(s.f_blocks), -@@ -34,8 +111,18 @@ +@@ -34,8 +122,17 @@ "mntonname",strcons(-1,s.f_mntonname), "mntfromname",strcons(-1,s.f_mntfromname), +#ifdef BSD @@ -117,9 +128,8 @@ + "syncreads", flocons(s.f_syncreads), + "asyncreads", flocons(s.f_asyncreads), + "namemax", flocons(s.f_namemax), -+ "fsid", flocons(((uint64_t)s.f_fsid.val[0] << 32) + -+ s.f_fsid.val[1]), + "flags", decode_fstat_flags(s.f_flags), ++ lfsid == NULL ? NULL : "fsid", lfsid, +#endif NULL));} @@ -128,28 +138,28 @@ +static LISP decode_fstab(const struct fstab *p) {if (p) return(symalist("spec",strcons(-1,p->fs_spec), -@@ -50,5 +137,5 @@ +@@ -50,5 +147,5 @@ return(NIL);} -LISP lgetfsent(void) +static LISP lgetfsent(void) {long iflag; LISP result; -@@ -58,5 +145,5 @@ +@@ -58,5 +155,5 @@ return(result);} -LISP lsetfsent(void) +static LISP lsetfsent(void) {long iflag; LISP result; -@@ -66,5 +153,5 @@ +@@ -66,5 +163,5 @@ return(result);} -LISP lendfsent(void) +static LISP lendfsent(void) {long iflag; iflag = no_interrupt(1); -@@ -73,4 +160,6 @@ +@@ -73,4 +170,6 @@ return(NIL);} +void init_statfs(void); /* The sole symbol exported from a SIOD-module */ Modified: head/lang/siod/pkg-plist ============================================================================== --- head/lang/siod/pkg-plist Fri Feb 19 00:34:28 2021 (r566017) +++ head/lang/siod/pkg-plist Fri Feb 19 00:40:15 2021 (r566018) @@ -33,6 +33,7 @@ lib/siod/piechart.scm lib/siod/cgi.scm lib/siod/ftp.scm lib/siod/sql_msql.scm +lib/siod/acct.so %%GD%%lib/siod/gd.so %%NDBM%%lib/siod/ndbm.so %%SS%%lib/siod/ss.so
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?202102190040.11J0eG8q044709>