Supporting vendor given -shells- configuration file
This commit is contained in:
committed by
Serge Hallyn
parent
b2d202cb5d
commit
a27d5c51f1
@@ -11,7 +11,8 @@ AM_CPPFLAGS = \
|
||||
-I${top_srcdir}/lib \
|
||||
-I$(top_srcdir)/libmisc \
|
||||
-I$(top_srcdir) \
|
||||
-DLOCALEDIR=\"$(datadir)/locale\"
|
||||
-DLOCALEDIR=\"$(datadir)/locale\" \
|
||||
$(ECONF_CPPFLAGS)
|
||||
|
||||
AM_CFLAGS = $(LIBBSD_CFLAGS)
|
||||
|
||||
|
||||
63
src/chsh.c
63
src/chsh.c
@@ -33,6 +33,13 @@
|
||||
#ifndef SHELLS_FILE
|
||||
#define SHELLS_FILE "/etc/shells"
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_VENDORDIR
|
||||
#include <libeconf.h>
|
||||
#define SHELLS "shells"
|
||||
#define ETCDIR "/etc"
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Global variables
|
||||
*/
|
||||
@@ -127,17 +134,59 @@ static bool is_restricted_shell (const char *sh)
|
||||
* If getusershell() is available (Linux, *BSD, possibly others), use it
|
||||
* instead of re-implementing it.
|
||||
*/
|
||||
|
||||
#ifdef HAVE_VENDORDIR
|
||||
static bool shell_is_listed (const char *sh)
|
||||
{
|
||||
char *cp;
|
||||
bool found = false;
|
||||
|
||||
#ifndef HAVE_GETUSERSHELL
|
||||
char buf[BUFSIZ];
|
||||
FILE *fp;
|
||||
#endif
|
||||
size_t size = 0;
|
||||
econf_err error;
|
||||
char **keys;
|
||||
econf_file *key_file;
|
||||
|
||||
error = econf_readDirs(&key_file,
|
||||
VENDORDIR,
|
||||
ETCDIR,
|
||||
SHELLS,
|
||||
NULL,
|
||||
"", /* key only */
|
||||
"#" /* comment */);
|
||||
if (error) {
|
||||
fprintf (stderr,
|
||||
_("Cannot parse shell files: %s"),
|
||||
econf_errString(error));
|
||||
fail_exit (1);
|
||||
}
|
||||
|
||||
error = econf_getKeys(key_file, NULL, &size, &keys);
|
||||
if (error) {
|
||||
fprintf (stderr,
|
||||
_("Cannot evaluate entries in shell files: %s"),
|
||||
econf_errString(error));
|
||||
econf_free (key_file);
|
||||
fail_exit (1);
|
||||
}
|
||||
|
||||
for (size_t i = 0; i < size; i++) {
|
||||
if (strcmp (keys[i], sh) == 0) {
|
||||
found = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
econf_free (key_file);
|
||||
|
||||
return found;
|
||||
}
|
||||
|
||||
#else /* without HAVE_VENDORDIR */
|
||||
|
||||
static bool shell_is_listed (const char *sh)
|
||||
{
|
||||
bool found = false;
|
||||
|
||||
#ifdef HAVE_GETUSERSHELL
|
||||
char *cp;
|
||||
setusershell ();
|
||||
while ((cp = getusershell ())) {
|
||||
if (strcmp (cp, sh) == 0) {
|
||||
@@ -147,6 +196,9 @@ static bool shell_is_listed (const char *sh)
|
||||
}
|
||||
endusershell ();
|
||||
#else
|
||||
char buf[BUFSIZ];
|
||||
FILE *fp;
|
||||
|
||||
fp = fopen (SHELLS_FILE, "r");
|
||||
if (NULL == fp) {
|
||||
return false;
|
||||
@@ -171,6 +223,7 @@ static bool shell_is_listed (const char *sh)
|
||||
#endif
|
||||
return found;
|
||||
}
|
||||
#endif /* with HAVE_VENDORDIR */
|
||||
|
||||
/*
|
||||
* process_flags - parse the command line options
|
||||
|
||||
Reference in New Issue
Block a user