first commit

This commit is contained in:
Bradford White
2026-03-26 10:28:14 -04:00
commit 00bc136f92
5 changed files with 102 additions and 0 deletions
+15
View File
@@ -0,0 +1,15 @@
# BusyBox, Orwellian Edition
Given that states and countries are now requiring that operating systems report
the age of users, it is important that BusyBox be able to comply. Why? BusyBox
is used in embedded devices that qualify for regulation under these bills (such
as California's [AB-1043](https://leginfo.legislature.ca.gov/faces/billTextClient.xhtml?bill_id=202520260AB1043)).
For most hardware, this would actually amount to just reporting epoc for root,
as most devices won't directly have users. Applications on those may, but those
usually have their own user management features.
This patch adds the `-b` option to BusyBox's adduser, and will record a birthday
in YYYYMMDD format. This can then be used to determine age, and/or the age
bracket of the user via the standard UNIX shell which serves as the UNIX
API/ABI, and thus makes BusyBox compliant with the law. The two UNIX commands
added here are `howoldami` and `useragerange`.
+67
View File
@@ -0,0 +1,67 @@
--- loginutils/adduser.c.orig
+++ loginutils/adduser.c
@@ -44,6 +44,7 @@
//usage: "\n -H Don't create home directory"
//usage: "\n -u UID User id"
//usage: "\n -k SKEL Skeleton directory (/etc/skel)"
+//usage: "\n -b DOB Date of birth (YYYYMMDD)"
#include "libbb.h"
@@ -61,6 +62,7 @@
#define OPT_DONT_MAKE_HOME (1 << 6)
#define OPT_UID (1 << 7)
#define OPT_SKEL (1 << 8)
+#define OPT_DOB (1 << 9)
/* remix */
/* recoded such that the uid may be passed in *p */
@@ -128,6 +130,7 @@
"no-create-home\0" No_argument "H"
"uid\0" Required_argument "u"
"skel\0" Required_argument "k"
+ "dob\0" Required_argument "b"
;
/*
@@ -141,6 +144,7 @@
unsigned opts;
char *uid;
const char *skel = "/etc/skel";
+ char *dob = NULL;
/* got root? */
if (geteuid()) {
@@ -151,12 +155,12 @@
pw.pw_dir = NULL;
opts = getopt32long(argv, "^"
- "h:g:s:G:DSHu:k:"
+ "h:g:s:G:DSHu:k:b:"
/* at least one and at most two non-option args */
/* disable interactive passwd for system accounts */
"\0" "-1:?2:SD",
adduser_longopts,
- &pw.pw_dir, &pw.pw_gecos, &pw.pw_shell,
- &usegroup, &uid, &skel
+ &pw.pw_dir, &pw.pw_gecos, &pw.pw_shell,
+ &usegroup, &uid, &skel, &dob
);
if (opts & OPT_UID)
@@ -200,6 +204,16 @@
free(p);
#endif
+ /* Record date of birth if specified */
+ if (opts & OPT_DOB) {
+ FILE *f = fopen("/etc/birthdays", "a");
+ if (f) {
+ fprintf(f, "%s:x:%s:\n", pw.pw_name, dob);
+ fclose(f);
+ } else {
+ bb_perror_msg("/etc/birthdays");
+ }
+ }
+
/* add to group */
addgroup_wrapper(&pw, usegroup);
+6
View File
@@ -0,0 +1,6 @@
#!/bin/bash
username=$(whoami)
dob=$(grep $username /etc/birthdays | cut -f 3 -d ':')
today=$(date +%Y%m%d)
age=$(echo "$today - $dob" | bc -l | cut -f 1 -d '.')
printf "%s%b" "$age" "\n"
+12
View File
@@ -0,0 +1,12 @@
#!/bin/bash
age=$(howoldami)
if [ $age -lt 13 ]; then
echo "User is under the age of 13."
elif [ $age -ge 13 ] && [ $age -lt 16 ]; then
echo "User is under the age of 16, but at least 13."
elif [ $age -ge 16 ] && [ $age -lt 18 ]; then
echo "User is at least 16, but younger than 18."
else
echo "User is over 18"
fi
+2
View File
@@ -0,0 +1,2 @@
# username:x:YYYYMMDD:
root:x:19700101: