summaryrefslogtreecommitdiffstats
path: root/libmisc/setupenv.c
diff options
context:
space:
mode:
Diffstat (limited to 'libmisc/setupenv.c')
-rw-r--r--libmisc/setupenv.c290
1 files changed, 0 insertions, 290 deletions
diff --git a/libmisc/setupenv.c b/libmisc/setupenv.c
deleted file mode 100644
index 5d7aefa..0000000
--- a/libmisc/setupenv.c
+++ /dev/null
@@ -1,290 +0,0 @@
-/*
- * SPDX-FileCopyrightText: 1989 - 1994, Julianne Frances Haugh
- * SPDX-FileCopyrightText: 1996 - 2000, Marek Michałkiewicz
- * SPDX-FileCopyrightText: 2001 - 2006, Tomasz Kłoczko
- * SPDX-FileCopyrightText: 2007 - 2010, Nicolas François
- *
- * SPDX-License-Identifier: BSD-3-Clause
- */
-
-/*
- * Separated from setup.c. --marekm
- */
-
-#include <config.h>
-
-#ident "$Id$"
-
-#include <assert.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <stdio.h>
-#include <ctype.h>
-#include "prototypes.h"
-#include "defines.h"
-#include <pwd.h>
-#include "getdef.h"
-#include "shadowlog.h"
-
-#ifndef USE_PAM
-static void
-addenv_path (const char *varname, const char *dirname, const char *filename)
-{
- char *buf;
- size_t len = strlen (dirname) + strlen (filename) + 2;
- int wlen;
-
- buf = xmalloc (len);
- wlen = snprintf (buf, len, "%s/%s", dirname, filename);
- assert (wlen == (int) len - 1);
-
- addenv (varname, buf);
- free (buf);
-}
-
-static void read_env_file (const char *filename)
-{
- FILE *fp;
- char buf[1024];
- char *cp, *name, *val;
-
- fp = fopen (filename, "r");
- if (NULL == fp) {
- return;
- }
- while (fgets (buf, (int)(sizeof buf), fp) == buf) {
- cp = strrchr (buf, '\n');
- if (NULL == cp) {
- break;
- }
- *cp = '\0';
-
- cp = buf;
- /* ignore whitespace and comments */
- while (('\0' != *cp) && isspace (*cp)) {
- cp++;
- }
- if (('\0' == *cp) || ('#' == *cp)) {
- continue;
- }
- /*
- * ignore lines which don't follow the name=value format
- * (for example, the "export NAME" shell commands)
- */
- name = cp;
- while (('\0' != *cp) && !isspace (*cp) && ('=' != *cp)) {
- cp++;
- }
- if ('=' != *cp) {
- continue;
- }
- /* NUL-terminate the name */
- *cp = '\0';
- cp++;
- val = cp;
-#if 0 /* XXX untested, and needs rewrite with fewer goto's :-) */
-/*
- (state, char_type) -> (state, action)
-
- state: unquoted, single_quoted, double_quoted, escaped, double_quoted_escaped
- char_type: normal, white, backslash, single, double
- action: remove_curr, remove_curr_skip_next, remove_prev, finish XXX
-*/
- no_quote:
- if (*cp == '\\') {
- /* remove the backslash */
- remove_char (cp);
- /* skip over the next character */
- if (*cp)
- cp++;
- goto no_quote;
- } else if (*cp == '\'') {
- /* remove the quote */
- remove_char (cp);
- /* now within single quotes */
- goto s_quote;
- } else if (*cp == '"') {
- /* remove the quote */
- remove_char (cp);
- /* now within double quotes */
- goto d_quote;
- } else if (*cp == '\0') {
- /* end of string */
- goto finished;
- } else if (isspace (*cp)) {
- /* unescaped whitespace - end of string */
- *cp = '\0';
- goto finished;
- } else {
- cp++;
- goto no_quote;
- }
- s_quote:
- if (*cp == '\'') {
- /* remove the quote */
- remove_char (cp);
- /* unquoted again */
- goto no_quote;
- } else if (*cp == '\0') {
- /* end of string */
- goto finished;
- } else {
- /* preserve everything within single quotes */
- cp++;
- goto s_quote;
- }
- d_quote:
- if (*cp == '\"') {
- /* remove the quote */
- remove_char (cp);
- /* unquoted again */
- goto no_quote;
- } else if (*cp == '\\') {
- cp++;
- /* if backslash followed by double quote, remove backslash
- else skip over the backslash and following char */
- if (*cp == '"')
- remove_char (cp - 1);
- else if (*cp)
- cp++;
- goto d_quote;
- }
- else if (*cp == '\0') {
- /* end of string */
- goto finished;
- } else {
- /* preserve everything within double quotes */
- goto d_quote;
- }
- finished:
-#endif /* 0 */
- /*
- * XXX - should handle quotes, backslash escapes, etc.
- * like the shell does.
- */
- addenv (name, val);
- }
- (void) fclose (fp);
-}
-#endif /* USE_PAM */
-
-
-/*
- * change to the user's home directory
- * set the HOME, SHELL, MAIL, PATH, and LOGNAME or USER environmental
- * variables.
- */
-
-void setup_env (struct passwd *info)
-{
-#ifndef USE_PAM
- const char *envf;
-#endif
- const char *cp;
-
- /*
- * Change the current working directory to be the home directory
- * of the user. It is a fatal error for this process to be unable
- * to change to that directory. There is no "default" home
- * directory.
- *
- * We no longer do it as root - should work better on NFS-mounted
- * home directories. Some systems default to HOME=/, so we make
- * this a configurable option. --marekm
- */
-
- if (chdir (info->pw_dir) == -1) {
- static char temp_pw_dir[] = "/";
-
- if (!getdef_bool ("DEFAULT_HOME") || chdir ("/") == -1) {
- fprintf (log_get_logfd(), _("Unable to cd to '%s'\n"),
- info->pw_dir);
- SYSLOG ((LOG_WARN,
- "unable to cd to `%s' for user `%s'\n",
- info->pw_dir, info->pw_name));
- closelog ();
- exit (EXIT_FAILURE);
- }
- (void) puts (_("No directory, logging in with HOME=/"));
- free (info->pw_dir);
- info->pw_dir = xstrdup (temp_pw_dir);
- }
-
- /*
- * Create the HOME environmental variable and export it.
- */
-
- addenv ("HOME", info->pw_dir);
-
- /*
- * Create the SHELL environmental variable and export it.
- */
-
- if ((NULL == info->pw_shell) || ('\0' == *info->pw_shell)) {
- static char temp_pw_shell[] = SHELL;
-
- free (info->pw_shell);
- info->pw_shell = xstrdup (temp_pw_shell);
- }
-
- addenv ("SHELL", info->pw_shell);
-
- /*
- * Export the user name. For BSD derived systems, it's "USER", for
- * all others it's "LOGNAME". We set both of them.
- */
-
- addenv ("USER", info->pw_name);
- addenv ("LOGNAME", info->pw_name);
-
- /*
- * Create the PATH environmental variable and export it.
- */
-
- cp = getdef_str ((info->pw_uid == 0) ? "ENV_SUPATH" : "ENV_PATH");
-
- if (NULL == cp) {
- /* not specified, use a minimal default */
- addenv ((info->pw_uid == 0) ? "PATH=/sbin:/bin:/usr/sbin:/usr/bin" : "PATH=/bin:/usr/bin", NULL);
- } else if (strchr (cp, '=')) {
- /* specified as name=value (PATH=...) */
- addenv (cp, NULL);
- } else {
- /* only value specified without "PATH=" */
- addenv ("PATH", cp);
- }
-
-#ifndef USE_PAM
- /*
- * Create the MAIL environmental variable and export it. login.defs
- * knows the prefix.
- */
-
- if (getdef_bool ("MAIL_CHECK_ENAB")) {
- cp = getdef_str ("MAIL_DIR");
- if (NULL != cp) {
- addenv_path ("MAIL", cp, info->pw_name);
- } else {
- cp = getdef_str ("MAIL_FILE");
- if (NULL != cp) {
- addenv_path ("MAIL", info->pw_dir, cp);
- } else {
-#if defined(MAIL_SPOOL_FILE)
- addenv_path ("MAIL", info->pw_dir, MAIL_SPOOL_FILE);
-#elif defined(MAIL_SPOOL_DIR)
- addenv_path ("MAIL", MAIL_SPOOL_DIR, info->pw_name);
-#endif
- }
- }
- }
-
- /*
- * Read environment from optional config file. --marekm
- */
- envf = getdef_str ("ENVIRON_FILE");
- if (NULL != envf) {
- read_env_file (envf);
- }
-#endif /* !USE_PAM */
-}
-