svn commit: r566018 - in head/lang/siod: . files
Mikhail Teterin
mi at FreeBSD.org
Fri Feb 19 00:40:17 UTC 2021
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
More information about the svn-ports-all
mailing list