From fe4ccbda8b057c24d8654b34b1818ac2e9914daa Mon Sep 17 00:00:00 2001 From: Alejandro Colomar Date: Sat, 3 Jan 2026 01:01:04 +0100 Subject: [PATCH 1/3] lib/, src/, lib/string/strspn/: Compact files Put together str*() and corresponding stp*() APIs in the same file. Signed-off-by: Alejandro Colomar --- lib/Makefile.am | 8 ++----- lib/basename.c | 2 +- lib/fields.c | 4 ++-- lib/getdef.c | 4 ++-- lib/limits.c | 2 +- lib/loginprompt.c | 2 +- lib/nss.c | 2 +- lib/setupenv.c | 2 +- lib/string/ctype/isascii.h | 2 +- lib/string/strspn/stprcspn.c | 7 ------ lib/string/strspn/stprcspn.h | 26 ----------------------- lib/string/strspn/stprspn.c | 7 ------ lib/string/strspn/stprspn.h | 26 ----------------------- lib/string/strspn/stpspn.h | 27 ------------------------ lib/string/strspn/strrcspn.h | 9 ++++++++ lib/string/strspn/strrspn.h | 11 ++++++++++ lib/string/strspn/{stpspn.c => strspn.c} | 2 +- lib/string/strspn/strspn.h | 25 ++++++++++++++++++++++ src/login_nopam.c | 1 - src/suauth.c | 4 ++-- src/usermod.c | 2 +- 21 files changed, 61 insertions(+), 114 deletions(-) delete mode 100644 lib/string/strspn/stprcspn.c delete mode 100644 lib/string/strspn/stprcspn.h delete mode 100644 lib/string/strspn/stprspn.c delete mode 100644 lib/string/strspn/stprspn.h delete mode 100644 lib/string/strspn/stpspn.h rename lib/string/strspn/{stpspn.c => strspn.c} (79%) create mode 100644 lib/string/strspn/strspn.h diff --git a/lib/Makefile.am b/lib/Makefile.am index 599cb0bbdd..6577dfe12c 100644 --- a/lib/Makefile.am +++ b/lib/Makefile.am @@ -239,16 +239,12 @@ libshadow_la_SOURCES = \ string/strerrno.h \ string/strftime.c \ string/strftime.h \ - string/strspn/stpspn.c \ - string/strspn/stpspn.h \ - string/strspn/stprcspn.c \ - string/strspn/stprcspn.h \ - string/strspn/stprspn.c \ - string/strspn/stprspn.h \ string/strspn/strrcspn.c \ string/strspn/strrcspn.h \ string/strspn/strrspn.c \ string/strspn/strrspn.h \ + string/strspn/strspn.c \ + string/strspn/strspn.h \ string/strtok/stpsep.c \ string/strtok/stpsep.h \ string/strtok/astrsep2ls.c \ diff --git a/lib/basename.c b/lib/basename.c index d38e1dbb7f..3943f9081a 100644 --- a/lib/basename.c +++ b/lib/basename.c @@ -17,7 +17,7 @@ #include #include "prototypes.h" -#include "string/strspn/stprcspn.h" +#include "string/strspn/strrcspn.h" /*@observer@*/const char * diff --git a/lib/fields.c b/lib/fields.c index 568746fc8f..aa792d98af 100644 --- a/lib/fields.c +++ b/lib/fields.c @@ -21,8 +21,8 @@ #include "prototypes.h" #include "string/ctype/isascii.h" #include "string/strcmp/streq.h" -#include "string/strspn/stpspn.h" -#include "string/strspn/stprspn.h" +#include "string/strspn/strrspn.h" +#include "string/strspn/strspn.h" #include "string/strtok/stpsep.h" diff --git a/lib/getdef.c b/lib/getdef.c index e85e0a4460..1fca59a2f9 100644 --- a/lib/getdef.c +++ b/lib/getdef.c @@ -33,8 +33,8 @@ #include "string/strcmp/strcaseeq.h" #include "string/strcmp/streq.h" #include "string/strcmp/strprefix.h" -#include "string/strspn/stpspn.h" -#include "string/strspn/stprspn.h" +#include "string/strspn/strrspn.h" +#include "string/strspn/strspn.h" #include "string/strtok/stpsep.h" diff --git a/lib/limits.c b/lib/limits.c index 129a99fd75..32f73f1784 100644 --- a/lib/limits.c +++ b/lib/limits.c @@ -35,7 +35,7 @@ #include "string/memset/memzero.h" #include "string/strcmp/streq.h" #include "string/strcmp/strprefix.h" -#include "string/strspn/stpspn.h" +#include "string/strspn/strspn.h" #include "typetraits.h" diff --git a/lib/loginprompt.c b/lib/loginprompt.c index 9eeae3ddb0..7bac9cb5c7 100644 --- a/lib/loginprompt.c +++ b/lib/loginprompt.c @@ -20,7 +20,7 @@ #include "prototypes.h" #include "string/memset/memzero.h" #include "string/strcpy/strtcpy.h" -#include "string/strspn/stpspn.h" +#include "string/strspn/strspn.h" #include "string/strtok/stpsep.h" diff --git a/lib/nss.c b/lib/nss.c index 528eee87ca..3138cc83fd 100644 --- a/lib/nss.c +++ b/lib/nss.c @@ -17,7 +17,7 @@ #include "string/strcmp/strcaseprefix.h" #include "string/strcmp/streq.h" #include "string/strcmp/strprefix.h" -#include "string/strspn/stpspn.h" +#include "string/strspn/strspn.h" #include "string/strtok/stpsep.h" diff --git a/lib/setupenv.c b/lib/setupenv.c index efa0f2d820..ce66cc8012 100644 --- a/lib/setupenv.c +++ b/lib/setupenv.c @@ -29,7 +29,7 @@ #include "string/strcmp/streq.h" #include "string/strcmp/strprefix.h" #include "string/strdup/strdup.h" -#include "string/strspn/stpspn.h" +#include "string/strspn/strspn.h" #include "string/strtok/stpsep.h" diff --git a/lib/string/ctype/isascii.h b/lib/string/ctype/isascii.h index 6500717c6a..b0476de934 100644 --- a/lib/string/ctype/isascii.h +++ b/lib/string/ctype/isascii.h @@ -11,7 +11,7 @@ #include #include "string/strcmp/streq.h" -#include "string/strspn/stpspn.h" +#include "string/strspn/strspn.h" #define CTYPE_CNTRL_C \ diff --git a/lib/string/strspn/stprcspn.c b/lib/string/strspn/stprcspn.c deleted file mode 100644 index 012d5e39bf..0000000000 --- a/lib/string/strspn/stprcspn.c +++ /dev/null @@ -1,7 +0,0 @@ -// SPDX-FileCopyrightText: 2024, Alejandro Colomar -// SPDX-License-Identifier: BSD-3-Clause - - -#include "config.h" - -#include "string/strspn/stprcspn.h" diff --git a/lib/string/strspn/stprcspn.h b/lib/string/strspn/stprcspn.h deleted file mode 100644 index 6101074572..0000000000 --- a/lib/string/strspn/stprcspn.h +++ /dev/null @@ -1,26 +0,0 @@ -// SPDX-FileCopyrightText: 2024-2026, Alejandro Colomar -// SPDX-License-Identifier: BSD-3-Clause - - -#ifndef SHADOW_INCLUDE_LIB_STRING_STRSPN_STPRCSPN_H_ -#define SHADOW_INCLUDE_LIB_STRING_STRSPN_STPRCSPN_H_ - - -#include "config.h" - -#include - -#include "string/strchr/strnul.h" -#include "string/strspn/strrcspn.h" - - -// stprcspn - string returns-pointer rear complement span -#define stprcspn(s, reject) \ -({ \ - __auto_type s_ = (s); \ - \ - strnul(s_) - strrcspn(s_, reject); \ -}) - - -#endif // include guard diff --git a/lib/string/strspn/stprspn.c b/lib/string/strspn/stprspn.c deleted file mode 100644 index 8b5ab59e37..0000000000 --- a/lib/string/strspn/stprspn.c +++ /dev/null @@ -1,7 +0,0 @@ -// SPDX-FileCopyrightText: 2024, Alejandro Colomar -// SPDX-License-Identifier: BSD-3-Clause - - -#include "config.h" - -#include "string/strspn/stprspn.h" diff --git a/lib/string/strspn/stprspn.h b/lib/string/strspn/stprspn.h deleted file mode 100644 index f6a0ff05fe..0000000000 --- a/lib/string/strspn/stprspn.h +++ /dev/null @@ -1,26 +0,0 @@ -// SPDX-FileCopyrightText: 2024-2026, Alejandro Colomar -// SPDX-License-Identifier: BSD-3-Clause - - -#ifndef SHADOW_INCLUDE_LIB_STRING_STRSPN_STPRSPN_H_ -#define SHADOW_INCLUDE_LIB_STRING_STRSPN_STPRSPN_H_ - - -#include "config.h" - -#include - -#include "string/strchr/strnul.h" -#include "string/strspn/strrspn.h" - - -// stprspn - string returns-pointer rear span -#define stprspn(s, accept) \ -({ \ - __auto_type s_ = (s); \ - \ - strnul(s_) - strrspn_(s_, accept); \ -}) - - -#endif // include guard diff --git a/lib/string/strspn/stpspn.h b/lib/string/strspn/stpspn.h deleted file mode 100644 index 1834f5fcda..0000000000 --- a/lib/string/strspn/stpspn.h +++ /dev/null @@ -1,27 +0,0 @@ -// SPDX-FileCopyrightText: 2024, Alejandro Colomar -// SPDX-License-Identifier: BSD-3-Clause - - -#ifndef SHADOW_INCLUDE_LIB_STRING_STRSPN_STPSPN_H_ -#define SHADOW_INCLUDE_LIB_STRING_STRSPN_STPSPN_H_ - - -#include "config.h" - -#include - -#include "attr.h" - - -// string returns-pointer substring prefix length -// Similar to strspn(3), but return a pointer instead of an offset. -// Similar to strchrnul(3), but search for any bytes not in 'accept'. -#define stpspn(s, accept) \ -({ \ - __auto_type s_ = s; \ - \ - s_ + strspn(s_, accept); \ -}) - - -#endif // include guard diff --git a/lib/string/strspn/strrcspn.h b/lib/string/strspn/strrcspn.h index e7d8c16297..b5c1db0074 100644 --- a/lib/string/strspn/strrcspn.h +++ b/lib/string/strspn/strrcspn.h @@ -15,6 +15,15 @@ #include "string/strchr/strnul.h" +// stprcspn - string returns-pointer rear complement span +#define stprcspn(s, reject) \ +({ \ + __auto_type s_ = (s); \ + \ + strnul(s_) - strrcspn(s_, reject); \ +}) + + ATTR_STRING(1) ATTR_STRING(2) inline size_t strrcspn(const char *s, const char *reject); diff --git a/lib/string/strspn/strrspn.h b/lib/string/strspn/strrspn.h index bf3650ba9d..4381970af8 100644 --- a/lib/string/strspn/strrspn.h +++ b/lib/string/strspn/strrspn.h @@ -15,6 +15,17 @@ #include "string/strchr/strnul.h" +// stprspn - string returns-pointer rear span +// Available in Oracle Solaris as strrspn(3GEN). +// +#define stprspn(s, accept) \ +({ \ + __auto_type s_ = (s); \ + \ + strnul(s_) - strrspn_(s_, accept); \ +}) + + ATTR_STRING(1) ATTR_STRING(2) inline size_t strrspn_(const char *s, const char *accept); diff --git a/lib/string/strspn/stpspn.c b/lib/string/strspn/strspn.c similarity index 79% rename from lib/string/strspn/stpspn.c rename to lib/string/strspn/strspn.c index 9d99c0c52b..00c86e35d7 100644 --- a/lib/string/strspn/stpspn.c +++ b/lib/string/strspn/strspn.c @@ -4,4 +4,4 @@ #include "config.h" -#include "string/strspn/stpspn.h" +#include "string/strspn/strspn.h" diff --git a/lib/string/strspn/strspn.h b/lib/string/strspn/strspn.h new file mode 100644 index 0000000000..066abdda9d --- /dev/null +++ b/lib/string/strspn/strspn.h @@ -0,0 +1,25 @@ +// SPDX-FileCopyrightText: 2024, Alejandro Colomar +// SPDX-License-Identifier: BSD-3-Clause + + +#ifndef SHADOW_INCLUDE_LIB_STRING_STRSPN_STRSPN_H_ +#define SHADOW_INCLUDE_LIB_STRING_STRSPN_STRSPN_H_ + + +#include "config.h" + +#include + +#include "attr.h" + + +// stpspn - string offset-pointer span +#define stpspn(s, accept) \ +({ \ + __auto_type s_ = s; \ + \ + s_ + strspn(s_, accept); \ +}) + + +#endif // include guard diff --git a/src/login_nopam.c b/src/login_nopam.c index 7b5356ee27..916a865b03 100644 --- a/src/login_nopam.c +++ b/src/login_nopam.c @@ -65,7 +65,6 @@ #include "string/strcmp/streq.h" #include "string/strcmp/strprefix.h" #include "string/strspn/strrspn.h" -#include "string/strspn/stprspn.h" #include "string/strtok/stpsep.h" diff --git a/src/suauth.c b/src/suauth.c index 5d55484ce9..7326e123ce 100644 --- a/src/suauth.c +++ b/src/suauth.c @@ -22,8 +22,8 @@ #include "prototypes.h" #include "string/strcmp/streq.h" #include "string/strcmp/strprefix.h" -#include "string/strspn/stpspn.h" -#include "string/strspn/stprspn.h" +#include "string/strspn/strrspn.h" +#include "string/strspn/strspn.h" #include "string/strtok/stpsep.h" diff --git a/src/usermod.c b/src/usermod.c index 3afe19ea4c..557a181b9f 100644 --- a/src/usermod.c +++ b/src/usermod.c @@ -65,7 +65,7 @@ #include "string/strcmp/strprefix.h" #include "string/strdup/strdup.h" #include "string/strerrno.h" -#include "string/strspn/stprspn.h" +#include "string/strspn/strrspn.h" #include "sysconf.h" #include "time/day_to_str.h" #include "typetraits.h" From 6bac1f4b89511d10a26c5b8fbe91852b1013eaf2 Mon Sep 17 00:00:00 2001 From: Alejandro Colomar Date: Wed, 10 Jun 2026 20:02:53 +0200 Subject: [PATCH 2/3] lib/limits.c: Use stpspn() to simplify This loop accepts and skips contiguous commas. Let's acknowledge that by using code that explicitly does this (and which is also simpler, avoiding a conditional operator). Signed-off-by: Alejandro Colomar --- lib/limits.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/limits.c b/lib/limits.c index 32f73f1784..1d756bf86d 100644 --- a/lib/limits.c +++ b/lib/limits.c @@ -468,7 +468,7 @@ void setup_limits (const struct passwd *info) for (cp = info->pw_gecos; cp != NULL; cp = strchr (cp, ',')) { char *val; - cp = strprefix(cp, ",") ?: cp; + cp = stpspn(cp, ","); val = strprefix(cp, "pri="); if (val != NULL) { From c4a36d59e349aafe0b940e00a6d7861f74b18e4f Mon Sep 17 00:00:00 2001 From: Alejandro Colomar Date: Sun, 21 Jun 2026 01:02:38 +0200 Subject: [PATCH 3/3] lib/, src/, lib/string/strcmp/: Compact files Signed-off-by: Alejandro Colomar --- lib/Makefile.am | 2 -- lib/chkname.c | 1 - lib/getdef.c | 1 - lib/string/strcmp/strcaseeq.c | 7 ------- lib/string/strcmp/strcaseeq.h | 18 ------------------ lib/string/strcmp/streq.h | 6 +++++- src/login_nopam.c | 1 - src/useradd.c | 1 - 8 files changed, 5 insertions(+), 32 deletions(-) delete mode 100644 lib/string/strcmp/strcaseeq.c delete mode 100644 lib/string/strcmp/strcaseeq.h diff --git a/lib/Makefile.am b/lib/Makefile.am index 6577dfe12c..612b378566 100644 --- a/lib/Makefile.am +++ b/lib/Makefile.am @@ -209,8 +209,6 @@ libshadow_la_SOURCES = \ string/strchr/strchrscnt.h \ string/strchr/strnul.c \ string/strchr/strnul.h \ - string/strcmp/strcaseeq.c \ - string/strcmp/strcaseeq.h \ string/strcmp/strcaseprefix.c \ string/strcmp/strcaseprefix.h \ string/strcmp/streq.c \ diff --git a/lib/chkname.c b/lib/chkname.c index ee8ff9d108..f1c622b2bc 100644 --- a/lib/chkname.c +++ b/lib/chkname.c @@ -35,7 +35,6 @@ #include "sizeof.h" #include "string/ctype/isascii.h" #include "string/strcmp/streq.h" -#include "string/strcmp/strcaseeq.h" #include "string/strspn/strrcspn.h" #include "string/strtok/stpsep.h" #include "sysconf.h" diff --git a/lib/getdef.c b/lib/getdef.c index 1fca59a2f9..4a0036dcd5 100644 --- a/lib/getdef.c +++ b/lib/getdef.c @@ -30,7 +30,6 @@ #include "shadowlog.h" #include "sizeof.h" #include "string/sprintf/aprintf.h" -#include "string/strcmp/strcaseeq.h" #include "string/strcmp/streq.h" #include "string/strcmp/strprefix.h" #include "string/strspn/strrspn.h" diff --git a/lib/string/strcmp/strcaseeq.c b/lib/string/strcmp/strcaseeq.c deleted file mode 100644 index 045d2d452f..0000000000 --- a/lib/string/strcmp/strcaseeq.c +++ /dev/null @@ -1,7 +0,0 @@ -// SPDX-FileCopyrightText: 2024-2026, Alejandro Colomar -// SPDX-License-Identifier: BSD-3-Clause - - -#include "config.h" - -#include "string/strcmp/strcaseeq.h" diff --git a/lib/string/strcmp/strcaseeq.h b/lib/string/strcmp/strcaseeq.h deleted file mode 100644 index ec0e3d0ada..0000000000 --- a/lib/string/strcmp/strcaseeq.h +++ /dev/null @@ -1,18 +0,0 @@ -// SPDX-FileCopyrightText: 2024-2026, Alejandro Colomar -// SPDX-License-Identifier: BSD-3-Clause - - -#ifndef SHADOW_INCLUDE_LIB_STRING_STRCMP_STRCASEEQ_H_ -#define SHADOW_INCLUDE_LIB_STRING_STRCMP_STRCASEEQ_H_ - - -#include "config.h" - -#include - - -// strcaseeq - strings case-insensitive equal -#define strcaseeq(s1, s2) (!strcasecmp(s1, s2)) - - -#endif // include guard diff --git a/lib/string/strcmp/streq.h b/lib/string/strcmp/streq.h index e56ef1cf69..375c051634 100644 --- a/lib/string/strcmp/streq.h +++ b/lib/string/strcmp/streq.h @@ -9,10 +9,14 @@ #include "config.h" #include +#include // streq - strings equal -#define streq(s1, s2) (!strcmp(s1, s2)) +#define streq(s1, s2) (!strcmp(s1, s2)) + +// strcaseeq - strings case-insensitive equal +#define strcaseeq(s1, s2) (!strcasecmp(s1, s2)) #endif // include guard diff --git a/src/login_nopam.c b/src/login_nopam.c index 916a865b03..b7fcb2de25 100644 --- a/src/login_nopam.c +++ b/src/login_nopam.c @@ -61,7 +61,6 @@ #include "io/fgets/fgets.h" #include "prototypes.h" #include "sizeof.h" -#include "string/strcmp/strcaseeq.h" #include "string/strcmp/streq.h" #include "string/strcmp/strprefix.h" #include "string/strspn/strrspn.h" diff --git a/src/useradd.c b/src/useradd.c index e6c80bd6f1..6507c5b0f3 100644 --- a/src/useradd.c +++ b/src/useradd.c @@ -66,7 +66,6 @@ #include "string/memset/memzero.h" #include "string/sprintf/aprintf.h" #include "string/sprintf/stprintf.h" -#include "string/strcmp/strcaseeq.h" #include "string/strcmp/streq.h" #include "string/strcmp/strprefix.h" #include "string/strdup/strdup.h"