From 5242eef8fc54636a41701fd9d7083ba6e4a4e0b3 Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Wed, 26 Jun 2024 18:18:39 +0200 Subject: Merging upstream version 1:4.15.2. Signed-off-by: Daniel Baumann --- lib/shadow.c | 305 ++++++----------------------------------------------------- 1 file changed, 28 insertions(+), 277 deletions(-) (limited to 'lib/shadow.c') diff --git a/lib/shadow.c b/lib/shadow.c index b628b65..f17d09e 100644 --- a/lib/shadow.c +++ b/lib/shadow.c @@ -18,54 +18,15 @@ #include "prototypes.h" #include "defines.h" #include -#ifdef USE_NIS -static bool nis_used; -static bool nis_ignore; -static enum { native, start, middle, native2 } nis_state; -static bool nis_bound; -static char *nis_domain; -static char *nis_key; -static int nis_keylen; -static char *nis_val; -static int nis_vallen; - -#define IS_NISCHAR(c) ((c)=='+') -#endif + +#include "atoi/str2i.h" + static FILE *shadow; #define FIELDS 9 #define OFIELDS 5 -#ifdef USE_NIS - -/* - * __setspNIS - turn on or off NIS searches - */ - -void __setspNIS (bool flag) -{ - nis_ignore = !flag; - - if (nis_ignore) { - nis_used = false; - } -} - -/* - * bind_nis - bind to NIS server - */ - -static int bind_nis (void) -{ - if (yp_get_default_domain (&nis_domain)) { - return -1; - } - - nis_bound = true; - return 0; -} -#endif /* * setspent - initialize access to shadow text and DBM files @@ -78,10 +39,6 @@ void setspent (void) }else { shadow = fopen (SHADOW_FILE, "r"); } - -#ifdef USE_NIS - nis_state = native; -#endif } /* @@ -94,7 +51,7 @@ void endspent (void) (void) fclose (shadow); } - shadow = (FILE *) 0; + shadow = NULL; } /* @@ -150,11 +107,6 @@ static struct spwd *my_sgetspent (const char *string) */ spwd.sp_namp = fields[0]; -#ifdef USE_NIS - if (IS_NISCHAR (fields[0][0])) { - nis_used = true; - } -#endif spwd.sp_pwdp = fields[1]; /* @@ -166,16 +118,10 @@ static struct spwd *my_sgetspent (const char *string) if (fields[2][0] == '\0') { spwd.sp_lstchg = -1; } else { - if (getlong (fields[2], &spwd.sp_lstchg) == 0) { -#ifdef USE_NIS - if (nis_used) { - spwd.sp_lstchg = -1; - } else -#endif - return 0; - } else if (spwd.sp_lstchg < 0) { + if (str2sl(&spwd.sp_lstchg, fields[2]) == -1) + return 0; + if (spwd.sp_lstchg < 0) return 0; - } } /* @@ -185,18 +131,10 @@ static struct spwd *my_sgetspent (const char *string) if (fields[3][0] == '\0') { spwd.sp_min = -1; } else { - if (getlong (fields[3], &spwd.sp_min) == 0) { -#ifdef USE_NIS - if (nis_used) { - spwd.sp_min = -1; - } else -#endif - { - return 0; - } - } else if (spwd.sp_min < 0) { + if (str2sl(&spwd.sp_min, fields[3]) == -1) + return 0; + if (spwd.sp_min < 0) return 0; - } } /* @@ -206,16 +144,10 @@ static struct spwd *my_sgetspent (const char *string) if (fields[4][0] == '\0') { spwd.sp_max = -1; } else { - if (getlong (fields[4], &spwd.sp_max) == 0) { -#ifdef USE_NIS - if (nis_used) { - spwd.sp_max = -1; - } else -#endif - return 0; - } else if (spwd.sp_max < 0) { + if (str2sl(&spwd.sp_max, fields[4]) == -1) + return 0; + if (spwd.sp_max < 0) return 0; - } } /* @@ -239,18 +171,10 @@ static struct spwd *my_sgetspent (const char *string) if (fields[5][0] == '\0') { spwd.sp_warn = -1; } else { - if (getlong (fields[5], &spwd.sp_warn) == 0) { -#ifdef USE_NIS - if (nis_used) { - spwd.sp_warn = -1; - } else -#endif - { - return 0; - } - } else if (spwd.sp_warn < 0) { + if (str2sl(&spwd.sp_warn, fields[5]) == -1) + return 0; + if (spwd.sp_warn < 0) return 0; - } } /* @@ -261,18 +185,10 @@ static struct spwd *my_sgetspent (const char *string) if (fields[6][0] == '\0') { spwd.sp_inact = -1; } else { - if (getlong (fields[6], &spwd.sp_inact) == 0) { -#ifdef USE_NIS - if (nis_used) { - spwd.sp_inact = -1; - } else -#endif - { - return 0; - } - } else if (spwd.sp_inact < 0) { + if (str2sl(&spwd.sp_inact, fields[6]) == -1) + return 0; + if (spwd.sp_inact < 0) return 0; - } } /* @@ -283,18 +199,10 @@ static struct spwd *my_sgetspent (const char *string) if (fields[7][0] == '\0') { spwd.sp_expire = -1; } else { - if (getlong (fields[7], &spwd.sp_expire) == 0) { -#ifdef USE_NIS - if (nis_used) { - spwd.sp_expire = -1; - } else -#endif - { - return 0; - } - } else if (spwd.sp_expire < 0) { + if (str2sl(&spwd.sp_expire, fields[7]) == -1) + return 0; + if (spwd.sp_expire < 0) return 0; - } } /* @@ -305,18 +213,10 @@ static struct spwd *my_sgetspent (const char *string) if (fields[8][0] == '\0') { spwd.sp_flag = SHADOW_SP_FLAG_UNSET; } else { - if (getulong (fields[8], &spwd.sp_flag) == 0) { -#ifdef USE_NIS - if (nis_used) { - spwd.sp_flag = SHADOW_SP_FLAG_UNSET; - } else -#endif - { - return 0; - } - } else if (spwd.sp_flag < 0) { + if (str2ul(&spwd.sp_flag, fields[8]) == -1) + return 0; + if (spwd.sp_flag < 0) return 0; - } } return (&spwd); @@ -335,21 +235,12 @@ struct spwd *fgetspent (FILE * fp) return (0); } -#ifdef USE_NIS - while (fgets (buf, (int) sizeof buf, fp) != (char *) 0) -#else - if (fgets (buf, (int) sizeof buf, fp) != (char *) 0) -#endif + if (fgets (buf, sizeof buf, fp) != NULL) { cp = strchr (buf, '\n'); if (NULL != cp) { *cp = '\0'; } -#ifdef USE_NIS - if (nis_ignore && IS_NISCHAR (buf[0])) { - continue; - } -#endif return my_sgetspent (buf); } return 0; @@ -361,92 +252,10 @@ struct spwd *fgetspent (FILE * fp) struct spwd *getspent (void) { -#ifdef USE_NIS - int nis_1_user = 0; - struct spwd *val; -#endif if (NULL == shadow) { setspent (); } - -#ifdef USE_NIS - again: - /* - * See if we are reading from the local file. - */ - - if (nis_state == native || nis_state == native2) { - - /* - * Get the next entry from the shadow file. Return NULL - * right away if there is none. - */ - - val = fgetspent (shadow); - if (NULL == val) - return 0; - - /* - * If this entry began with a NIS escape character, we have - * to see if this is just a single user, or if the entire - * map is being asked for. - */ - - if (IS_NISCHAR (val->sp_namp[0])) { - if (val->sp_namp[1]) - nis_1_user = 1; - else - nis_state = start; - } - - /* - * If this isn't a NIS user and this isn't an escape to go - * use a NIS map, it must be a regular local user. - */ - - if (nis_1_user == 0 && nis_state != start) - return val; - - /* - * If this is an escape to use an NIS map, switch over to - * that bunch of code. - */ - - if (nis_state == start) - goto again; - - /* - * NEEDSWORK. Here we substitute pieces-parts of this entry. - */ - - return 0; - } else { - if (!nis_bound) { - if (bind_nis ()) { - nis_state = native2; - goto again; - } - } - if (nis_state == start) { - if (yp_first (nis_domain, "shadow.bynam", &nis_key, - &nis_keylen, &nis_val, &nis_vallen)) { - nis_state = native2; - goto again; - } - nis_state = middle; - } else if (nis_state == middle) { - if (yp_next (nis_domain, "shadow.bynam", nis_key, - nis_keylen, &nis_key, &nis_keylen, - &nis_val, &nis_vallen)) { - nis_state = native2; - goto again; - } - } - return my_sgetspent (nis_val); - } -#else return (fgetspent (shadow)); -#endif } /* @@ -457,74 +266,16 @@ struct spwd *getspnam (const char *name) { struct spwd *sp; -#ifdef USE_NIS - static char save_name[16]; - bool nis_disabled = false; -#endif - setspent (); -#ifdef USE_NIS - /* - * Search the shadow.byname map for this user. - */ - - if (!nis_ignore && !nis_bound) { - bind_nis (); - } - - if (!nis_ignore && nis_bound) { - char *cp; - - if (yp_match (nis_domain, "shadow.byname", name, - strlen (name), &nis_val, &nis_vallen) == 0) { - - cp = strchr (nis_val, '\n'); - if (NULL != cp) { - *cp = '\0'; - } - - nis_state = middle; - sp = my_sgetspent (nis_val); - if (NULL != sp) { - strcpy (save_name, sp->sp_namp); - nis_key = save_name; - nis_keylen = strlen (save_name); - } - endspent (); - return sp; - } else { - nis_state = native2; - } - } -#endif -#ifdef USE_NIS - /* - * NEEDSWORK -- this is a mess, and it is the same mess in the - * other three files. I can't just blindly turn off NIS because - * this might be the first pass through the local files. In - * that case, I never discover that NIS is present. - */ - - if (nis_used) { - nis_ignore = true; - nis_disabled = true; - } -#endif - while ((sp = getspent ()) != (struct spwd *) 0) { + while ((sp = getspent ()) != NULL) { if (strcmp (name, sp->sp_namp) == 0) { break; } } -#ifdef USE_NIS - if (nis_disabled) { - nis_ignore = false; - } -#endif endspent (); return (sp); } #else -extern int errno; /* warning: ANSI C forbids an empty source file */ +extern int ISO_C_forbids_an_empty_translation_unit; #endif - -- cgit v1.2.3