diff options
author | Alejandro Colomar <alx@kernel.org> | 2024-01-15 16:20:03 +0100 |
---|---|---|
committer | Serge Hallyn <serge@hallyn.com> | 2024-03-14 17:11:36 -0500 |
commit | 5f8f19f2678d29e3ab78d8506fe71da3e48bf283 (patch) | |
tree | faeb7bfcc3b348b135466aea97b4c19a8abf927f | |
parent | bed18501b1a198a4c5cb177a4cff8685e5a81abf (diff) |
lib/: Call strchrnul(3) instead of open-coding it
Performance tests made in 2007 are obsolete. We should assume libc is
reasonably fast today (otherwise, report a bug to libc).
$ git blame -- lib/sgetgrent.c | grep strchr
45c6603cc (nekral-guest 2007-10-07 11:44:02 +0000 30) * WARNING: I profiled this once with and without strchr() calls
6f88bcf58 (nekral-guest 2008-05-26 08:31:14 +0000 97) cp = strchr (cp, ':');
Signed-off-by: Alejandro Colomar <alx@kernel.org>
-rw-r--r-- | lib/sgetgrent.c | 12 | ||||
-rw-r--r-- | lib/sgetpwent.c | 11 | ||||
-rw-r--r-- | lib/sgetspent.c | 15 | ||||
-rw-r--r-- | lib/subordinateio.c | 8 |
4 files changed, 24 insertions, 22 deletions
diff --git a/lib/sgetgrent.c b/lib/sgetgrent.c index 6894baf9..24764ecd 100644 --- a/lib/sgetgrent.c +++ b/lib/sgetgrent.c @@ -14,6 +14,7 @@ #include <stdio.h> #include <sys/types.h> #include <grp.h> +#include <string.h> #include "alloc.h" #include "defines.h" @@ -27,14 +28,11 @@ * list() converts the comma-separated list of member names into * an array of character pointers. * - * WARNING: I profiled this once with and without strchr() calls - * and found that using a register variable and an explicit loop - * works best. For large /etc/group files, this is a major win. - * * FINALLY added dynamic allocation. Still need to fix sgetsgent(). * --marekm */ -static char **list (char *s) +static char ** +list(char *s) { static char **members = NULL; static size_t size = 0; /* max members + 1 */ @@ -55,9 +53,7 @@ static char **list (char *s) if (!s || s[0] == '\0') break; members[i++] = s; - while (('\0' != *s) && (',' != *s)) { - s++; - } + s = strchrnul(s, ','); if ('\0' != *s) { *s++ = '\0'; } diff --git a/lib/sgetpwent.c b/lib/sgetpwent.c index 8dba02f8..d60a7fe1 100644 --- a/lib/sgetpwent.c +++ b/lib/sgetpwent.c @@ -12,9 +12,11 @@ #ident "$Id$" #include <sys/types.h> -#include "defines.h" #include <stdio.h> #include <pwd.h> +#include <string.h> + +#include "defines.h" #include "prototypes.h" #include "shadowlog_internal.h" @@ -32,7 +34,8 @@ * performance reasons. I am going to come up with some conditional * compilation glarp to improve on this in the future. */ -struct passwd *sgetpwent (const char *buf) +struct passwd * +sgetpwent(const char *buf) { static struct passwd pwent; static char pwdbuf[PASSWD_ENTRY_MAX_LENGTH]; @@ -60,9 +63,7 @@ struct passwd *sgetpwent (const char *buf) for (cp = pwdbuf, i = 0; (i < NFIELDS) && (NULL != cp); i++) { fields[i] = cp; - while (('\0' != *cp) && (':' != *cp)) { - cp++; - } + cp = strchrnul(cp, ':'); if ('\0' != *cp) { *cp = '\0'; diff --git a/lib/sgetspent.c b/lib/sgetspent.c index 184fbc16..07104924 100644 --- a/lib/sgetspent.c +++ b/lib/sgetspent.c @@ -14,17 +14,24 @@ #ident "$Id$" +#include <stdio.h> #include <sys/types.h> +#include <string.h> + #include "prototypes.h" #include "shadowlog_internal.h" #include "defines.h" -#include <stdio.h> + + #define FIELDS 9 #define OFIELDS 5 + + /* * sgetspent - convert string in shadow file format to (struct spwd *) */ -struct spwd *sgetspent (const char *string) +struct spwd * +sgetspent(const char *string) { static char spwbuf[PASSWD_ENTRY_MAX_LENGTH]; static struct spwd spwd; @@ -57,9 +64,7 @@ struct spwd *sgetspent (const char *string) for (cp = spwbuf, i = 0; ('\0' != *cp) && (i < FIELDS); i++) { fields[i] = cp; - while (('\0' != *cp) && (':' != *cp)) { - cp++; - } + cp = strchrnul(cp, ':'); if ('\0' != *cp) { *cp = '\0'; diff --git a/lib/subordinateio.c b/lib/subordinateio.c index 844de5f0..85bc0adc 100644 --- a/lib/subordinateio.c +++ b/lib/subordinateio.c @@ -16,6 +16,7 @@ #include <pwd.h> #include <ctype.h> #include <fcntl.h> +#include <string.h> #include "alloc.h" #include "string/sprintf.h" @@ -74,7 +75,8 @@ subordinate_free(/*@only@*/void *ent) * in @line, or NULL on failure. Note that the returned value should not * be freed by the caller. */ -static void *subordinate_parse (const char *line) +static void * +subordinate_parse(const char *line) { static struct subordinate_range range; static char rangebuf[1024]; @@ -97,9 +99,7 @@ static void *subordinate_parse (const char *line) for (cp = rangebuf, i = 0; (i < SUBID_NFIELDS) && (NULL != cp); i++) { fields[i] = cp; - while (('\0' != *cp) && (':' != *cp)) { - cp++; - } + cp = strchrnul(cp, ':'); if ('\0' != *cp) { *cp = '\0'; |