Skip to content

Commit

Permalink
lib/: Call strchrnul(3) instead of open-coding it
Browse files Browse the repository at this point in the history
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
45c6603 (nekral-guest      2007-10-07 11:44:02 +0000  30)  *	WARNING: I profiled this once with and without strchr() calls
6f88bcf (nekral-guest      2008-05-26 08:31:14 +0000  97) 		cp = strchr (cp, ':');

Signed-off-by: Alejandro Colomar <[email protected]>
  • Loading branch information
alejandro-colomar authored and hallyn committed Mar 14, 2024
1 parent bed1850 commit 5f8f19f
Show file tree
Hide file tree
Showing 4 changed files with 24 additions and 22 deletions.
12 changes: 4 additions & 8 deletions lib/sgetgrent.c
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
#include <stdio.h>
#include <sys/types.h>
#include <grp.h>
#include <string.h>

#include "alloc.h"
#include "defines.h"
Expand All @@ -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 */
Expand All @@ -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';
}
Expand Down
11 changes: 6 additions & 5 deletions lib/sgetpwent.c
Original file line number Diff line number Diff line change
Expand Up @@ -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"

Expand All @@ -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];
Expand Down Expand Up @@ -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';
Expand Down
15 changes: 10 additions & 5 deletions lib/sgetspent.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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';
Expand Down
8 changes: 4 additions & 4 deletions lib/subordinateio.c
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
#include <pwd.h>
#include <ctype.h>
#include <fcntl.h>
#include <string.h>

#include "alloc.h"
#include "string/sprintf.h"
Expand Down Expand Up @@ -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];
Expand All @@ -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';
Expand Down

0 comments on commit 5f8f19f

Please sign in to comment.