1
0
mirror of https://git.FreeBSD.org/ports.git synced 2024-12-25 04:43:33 +00:00
freebsd-ports/lang/siod/files/patch-acct
Mikhail Teterin bab6b5ce41 Though we were compiling cleanly with clang, using gcc8 picked
up several nits, which might bite this port, when building on
the platforms, where we still use gcc.

Also, when using port-installed gcc8, ${LOCALBASE}/include is
implicitly used to search for headers BEFORE /usr/include. This
may cause gdbm-provided ndbm.h to be picked up instead of the
base version, and we're not ready for that.

The already-built packages should be unaffected, hence, still
no PORTREVISION bump...

Sponsored By: United Marsupials
2021-02-22 17:36:39 +00:00

260 lines
6.4 KiB
Plaintext

--- 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 type 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();}
-
-
-