diff options
author | Ludwig Nussel | 2012-05-25 10:54:23 +0200 |
---|---|---|
committer | Ludwig Nussel | 2012-05-25 10:55:40 +0200 |
commit | 9c44ac503f0d18348518f195b36c4ea83ab0ca76 (patch) | |
tree | c3b63cf412fe5abd99f00a58cf524f9325d4c060 | |
parent | syslog always (diff) | |
download | kernel-qcow2-util-linux-9c44ac503f0d18348518f195b36c4ea83ab0ca76.tar.gz kernel-qcow2-util-linux-9c44ac503f0d18348518f195b36c4ea83ab0ca76.tar.xz kernel-qcow2-util-linux-9c44ac503f0d18348518f195b36c4ea83ab0ca76.zip |
use existing logindefs.c and pathnames.h
I'm not sure having /usr/local in _PATH_DEFPATH_ROOT and even putting it
in front is such a good idea though. /usr/local might be on NFS so could
prevent root from logging in if the network is down.
-rw-r--r-- | login-utils/Makefile.am | 4 | ||||
-rw-r--r-- | login-utils/getdef.c | 259 | ||||
-rw-r--r-- | login-utils/getdef.h | 29 | ||||
-rw-r--r-- | login-utils/logindefs.c | 16 | ||||
-rw-r--r-- | login-utils/logindefs.h | 2 | ||||
-rw-r--r-- | login-utils/su.c | 33 |
6 files changed, 35 insertions, 308 deletions
diff --git a/login-utils/Makefile.am b/login-utils/Makefile.am index 60e6f1091..8484066db 100644 --- a/login-utils/Makefile.am +++ b/login-utils/Makefile.am @@ -71,8 +71,8 @@ vipw_SOURCES = \ $(top_srcdir)/lib/fileutils.c su_SOURCES = \ su.c \ - getdef.c \ - getdef.h + logindefs.c \ + logindefs.h chfn_LDADD = $(login_ldadd_common) chsh_LDADD = $(login_ldadd_common) diff --git a/login-utils/getdef.c b/login-utils/getdef.c deleted file mode 100644 index a2b978a9b..000000000 --- a/login-utils/getdef.c +++ /dev/null @@ -1,259 +0,0 @@ -/* Copyright (C) 2003, 2004, 2005 Thorsten Kukuk - Author: Thorsten Kukuk <kukuk@suse.de> - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License version 2 or - later as published by the Free Software Foundation. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software Foundation, - Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#define _GNU_SOURCE - -#include <errno.h> -#include <ctype.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <limits.h> - -#include "getdef.h" - -struct item { - char *name; /* Name of the option. */ - char *value; /* Value of the option. */ - struct item *next; /* Pointer to next option. */ -}; - -static struct item *list = NULL; - -void -free_getdef_data (void) -{ - struct item *ptr; - - ptr = list; - while (ptr != NULL) - { - struct item *tmp; - tmp = ptr->next; - free (ptr->name); - free (ptr->value); - free (ptr); - ptr = tmp; - } - - list = NULL; -} - -/* Add a new entry to the list. */ -static void -store (const char *name, const char *value) -{ - struct item *new = malloc (sizeof (struct item)); - - if (new == NULL) - abort (); - - if (name == NULL) - abort (); - - new->name = strdup (name); - new->value = strdup (value ?: ""); - new->next = list; - list = new; -} - -/* Search a special entry in the list and return the value. */ -static const char * -search (const char *name) -{ - struct item *ptr; - - ptr = list; - while (ptr != NULL) - { - if (strcasecmp (name, ptr->name) == 0) - return ptr->value; - ptr = ptr->next; - } - - return NULL; -} - -/* Load the login.defs file (/etc/login.defs). */ -static void -load_defaults_internal (const char *filename) -{ - FILE *fp; - char *buf = NULL; - size_t buflen = 0; - - fp = fopen (filename, "r"); - if (NULL == fp) - return; - - while (!feof (fp)) - { - char *tmp, *cp; -#if defined(HAVE_GETLINE) - ssize_t n = getline (&buf, &buflen, fp); -#elif defined (HAVE_GETDELIM) - ssize_t n = getdelim (&buf, &buflen, '\n', fp); -#else - ssize_t n; - - if (buf == NULL) - { - buflen = 8096; - buf = malloc (buflen); - } - buf[0] = '\0'; - fgets (buf, buflen - 1, fp); - if (buf != NULL) - n = strlen (buf); - else - n = 0; -#endif /* HAVE_GETLINE / HAVE_GETDELIM */ - cp = buf; - - if (n < 1) - break; - - tmp = strchr (cp, '#'); /* remove comments */ - if (tmp) - *tmp = '\0'; - while (isspace ((unsigned char) *cp)) /* remove spaces and tabs */ - ++cp; - if (*cp == '\0') /* ignore empty lines */ - continue; - - if (cp[strlen (cp) - 1] == '\n') - cp[strlen (cp) - 1] = '\0'; - - tmp = strsep (&cp, " \t="); - if (cp != NULL) - while (isspace ((unsigned char) *cp) || *cp == '=') - ++cp; - - store (tmp, cp); - } - fclose (fp); - - if (buf) - free (buf); -} - -static void -load_defaults (void) -{ - load_defaults_internal ("/etc/default/su"); - load_defaults_internal ("/etc/login.defs"); -} - -int -getdef_bool (const char *name, int dflt) -{ - const char *val; - - if (list == NULL) - load_defaults (); - - val = search (name); - - if (val == NULL) - return dflt; - - return (strcasecmp (val, "yes") == 0); -} - -long -getdef_num (const char *name, long dflt) -{ - const char *val; - char *cp; - long retval; - - if (list == NULL) - load_defaults (); - - val = search (name); - - if (val == NULL) - return dflt; - - errno = 0; - retval = strtol (val, &cp, 0); - if (*cp != '\0' - || ((retval == LONG_MAX || retval == LONG_MIN) && errno == ERANGE)) - { - fprintf (stderr, - "%s contains invalid numerical value: %s!\n", - name, val); - retval = dflt; - } - return retval; -} - -unsigned long -getdef_unum (const char *name, unsigned long dflt) -{ - const char *val; - char *cp; - unsigned long retval; - - if (list == NULL) - load_defaults (); - - val = search (name); - - if (val == NULL) - return dflt; - - errno = 0; - retval = strtoul (val, &cp, 0); - if (*cp != '\0' || (retval == ULONG_MAX && errno == ERANGE)) - { - fprintf (stderr, - "%s contains invalid numerical value: %s!\n", - name, val); - retval = dflt; - } - return retval; -} - -const char * -getdef_str (const char *name, const char *dflt) -{ - const char *retval; - - if (list == NULL) - load_defaults (); - - retval = search (name); - - return retval ?: dflt; -} - -#if defined(TEST) - -int -main () -{ - printf ("CYPT=%s\n", getdef_str ("cRypt", "no")); - printf ("LOG_UNKFAIL_ENAB=%s\n", getdef_str ("log_unkfail_enab","")); - printf ("DOESNOTEXIST=%s\n", getdef_str ("DOESNOTEXIST","yes")); - return 0; -} - -#endif diff --git a/login-utils/getdef.h b/login-utils/getdef.h deleted file mode 100644 index a5ebaf5fb..000000000 --- a/login-utils/getdef.h +++ /dev/null @@ -1,29 +0,0 @@ -/* Copyright (C) 2003, 2005 Thorsten Kukuk - Author: Thorsten Kukuk <kukuk@suse.de> - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License version 2 or - later as published by the Free Software Foundation. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software Foundation, - Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#ifndef _GETDEF_H_ - -#define _GETDEF_H_ 1 - -extern int getdef_bool (const char *name, int dflt); -extern long getdef_num (const char *name, long dflt); -extern unsigned long getdef_unum (const char *name, unsigned long dflt); -extern const char *getdef_str (const char *name, const char *dflt); - -/* Free all data allocated by getdef_* calls before. */ -extern void free_getdef_data (void); - -#endif /* _GETDEF_H_ */ diff --git a/login-utils/logindefs.c b/login-utils/logindefs.c index ff7266ea1..6117936b8 100644 --- a/login-utils/logindefs.c +++ b/login-utils/logindefs.c @@ -45,6 +45,8 @@ struct item { static struct item *list = NULL; +void (*logindefs_load_defaults)(void) = NULL; + void free_getlogindefs_data(void) { struct item *ptr; @@ -77,7 +79,7 @@ static void store(const char *name, const char *value, const char *path) list = new; } -static void load_defaults(const char *filename) +void logindefs_load_file(const char *filename) { FILE *f; char buf[BUFSIZ]; @@ -139,12 +141,20 @@ static void load_defaults(const char *filename) fclose(f); } +static void load_defaults() +{ + if (logindefs_load_defaults) + logindefs_load_defaults(); + else + logindefs_load_file(_PATH_LOGINDEFS); +} + static struct item *search(const char *name) { struct item *ptr; if (!list) - load_defaults(_PATH_LOGINDEFS); + load_defaults(); ptr = list; while (ptr != NULL) { @@ -259,7 +269,7 @@ int main(int argc, char *argv[]) errx(EXIT_FAILURE, "usage: %s <filename> " "[<str|num|bool> <valname>]", argv[0]); - load_defaults(argv[1]); + logindefs_load_file(argv[1]); if (argc != 4) { /* list all */ struct item *ptr; diff --git a/login-utils/logindefs.h b/login-utils/logindefs.h index 163869dfd..24e946ef5 100644 --- a/login-utils/logindefs.h +++ b/login-utils/logindefs.h @@ -1,6 +1,8 @@ #ifndef UTIL_LINUX_LOGINDEFS_H #define UTIL_LINUX_LOGINDEFS_H +extern void logindefs_load_file(const char *filename); +extern void (*logindefs_load_defaults)(void); extern int getlogindefs_bool(const char *name, int dflt); extern long getlogindefs_num(const char *name, long dflt); extern const char *getlogindefs_str(const char *name, const char *dflt); diff --git a/login-utils/su.c b/login-utils/su.c index 6ee331163..81c430981 100644 --- a/login-utils/su.c +++ b/login-utils/su.c @@ -69,6 +69,7 @@ enum #include <stdbool.h> #include "xalloc.h" #include "nls.h" +#include "pathnames.h" /* The official name of this program (e.g., no `g' prefix). */ #define PROGRAM_NAME "su" @@ -77,13 +78,7 @@ enum #define PAM_SERVICE_NAME PROGRAM_NAME #define PAM_SERVICE_NAME_L PROGRAM_NAME "-l" -#include "getdef.h" - -/* The default PATH for simulated logins to non-superuser accounts. */ -#define DEFAULT_LOGIN_PATH "/usr/local/bin:/bin:/usr/bin" - -/* The default PATH for simulated logins to superuser accounts. */ -#define DEFAULT_ROOT_LOGIN_PATH "/usr/sbin:/bin:/usr/bin:/sbin" +#include "logindefs.h" /* The shell to run if none is given in the user's passwd entry. */ #define DEFAULT_SHELL "/bin/sh" @@ -517,8 +512,8 @@ modify_environment (const struct passwd *pw, const char *shell) xsetenv ("USER", pw->pw_name); xsetenv ("LOGNAME", pw->pw_name); xsetenv ("PATH", (pw->pw_uid - ? getdef_str ("PATH", DEFAULT_LOGIN_PATH) - : getdef_str ("SUPATH", DEFAULT_ROOT_LOGIN_PATH))); + ? getlogindefs_str ("PATH", _PATH_DEFPATH) + : getlogindefs_str ("SUPATH", _PATH_DEFPATH_ROOT))); } else { @@ -528,12 +523,12 @@ modify_environment (const struct passwd *pw, const char *shell) { xsetenv ("HOME", pw->pw_dir); xsetenv ("SHELL", shell); - if (getdef_bool ("ALWAYS_SET_PATH", 0)) + if (getlogindefs_bool ("ALWAYS_SET_PATH", 0)) xsetenv ("PATH", (pw->pw_uid - ? getdef_str ("PATH", - DEFAULT_LOGIN_PATH) - : getdef_str ("SUPATH", - DEFAULT_ROOT_LOGIN_PATH))); + ? getlogindefs_str ("PATH", + _PATH_DEFPATH) + : getlogindefs_str ("SUPATH", + _PATH_DEFPATH_ROOT))); else { char const *path = getenv ("PATH"); @@ -687,6 +682,12 @@ A mere - implies -l. If USER not given, assume root.\n\ exit (status); } +void load_config(void) +{ + logindefs_load_file("/etc/default/su"); + logindefs_load_file(_PATH_LOGINDEFS); +} + int main (int argc, char **argv) { @@ -757,6 +758,8 @@ main (int argc, char **argv) if (optind < argc) new_user = argv[optind++]; + logindefs_load_defaults = load_config; + pw = getpwnam (new_user); if (! (pw && pw->pw_name && pw->pw_name[0] && pw->pw_dir && pw->pw_dir[0] && pw->pw_passwd)) @@ -781,7 +784,7 @@ main (int argc, char **argv) if (!correct_password (pw)) { log_su (pw, false); - sleep (getdef_num ("FAIL_DELAY", 1)); + sleep (getlogindefs_num ("FAIL_DELAY", 1)); error (EXIT_FAIL, 0, _("incorrect password")); } else |