e87740c
--- coreutils-5.2.1/src/Makefile.am.pam	2005-04-15 17:03:44.000000000 +0100
e87740c
+++ coreutils-5.2.1/src/Makefile.am	2005-04-15 17:03:44.000000000 +0100
cvsdist 5adf0da
@@ -66,7 +66,7 @@
cvsdist 5adf0da
 
cvsdist 5adf0da
 uptime_LDADD = $(LDADD) $(GETLOADAVG_LIBS)
cvsdist 5adf0da
 
cvsdist 5adf0da
-su_LDADD = $(LDADD) $(LIB_CRYPT)
cvsdist 5adf0da
+su_LDADD = $(LDADD) $(LIB_CRYPT) @LIB_PAM@
cvsdist 5adf0da
 
cvsdist 5adf0da
 $(PROGRAMS): ../lib/libfetish.a
cvsdist 5adf0da
 
e87740c
--- coreutils-5.2.1/src/su.c.pam	2005-04-15 17:03:44.000000000 +0100
e87740c
+++ coreutils-5.2.1/src/su.c	2005-04-15 17:04:52.000000000 +0100
cvsdist 5adf0da
@@ -38,6 +38,16 @@
cvsdist 5adf0da
    restricts who can su to UID 0 accounts.  RMS considers that to
cvsdist 5adf0da
    be fascist.
cvsdist 5adf0da
 
cvsdist 5adf0da
+#ifdef USE_PAM
cvsdist 5adf0da
+
cvsdist 5adf0da
+   Actually, with PAM, su has nothing to do with whether or not a
cvsdist 5adf0da
+   wheel group is enforced by su.  RMS tries to restrict your access
cvsdist 5adf0da
+   to a su which implements the wheel group, but PAM considers that
cvsdist 5adf0da
+   to be fascist, and gives the user/sysadmin the opportunity to
cvsdist 5adf0da
+   enforce a wheel group by proper editing of /etc/pam.conf
cvsdist 5adf0da
+
cvsdist 5adf0da
+#endif
cvsdist 5adf0da
+
cvsdist 5adf0da
    Options:
cvsdist 5adf0da
    -, -l, --login	Make the subshell a login shell.
cvsdist 5adf0da
 			Unset all environment variables except
e87740c
@@ -81,6 +91,15 @@
cvsdist 5adf0da
    prototype (returning `int') in <unistd.h>.  */
cvsdist 5adf0da
 #define getusershell _getusershell_sys_proto_
cvsdist 5adf0da
 
cvsdist 5adf0da
+#ifdef USE_PAM
cvsdist 5adf0da
+# include <signal.h>
cvsdist 5adf0da
+# include <sys/wait.h>
cvsdist 5adf0da
+# include <sys/fsuid.h>
e87740c
+# include <unistd.h>
3dd4afb
+# include <security/pam_appl.h>
3dd4afb
+# include <security/pam_misc.h>
cvsdist 5adf0da
+#endif /* USE_PAM */
cvsdist 5adf0da
+
cvsdist 5adf0da
 #include "system.h"
cvsdist 5adf0da
 #include "dirname.h"
cvsdist 5adf0da
 
e87740c
@@ -150,7 +169,9 @@
cvsdist 5adf0da
 /* The user to become if none is specified.  */
cvsdist 5adf0da
 #define DEFAULT_USER "root"
cvsdist 5adf0da
 
cvsdist 5adf0da
+#ifndef USE_PAM
cvsdist 5adf0da
 char *crypt ();
cvsdist 5adf0da
+#endif
cvsdist 5adf0da
 char *getpass ();
cvsdist 5adf0da
 char *getusershell ();
cvsdist 5adf0da
 void endusershell ();
e87740c
@@ -158,8 +179,12 @@
cvsdist 5adf0da
 
cvsdist 5adf0da
 extern char **environ;
cvsdist 5adf0da
 
cvsdist 5adf0da
-static void run_shell (const char *, const char *, char **)
cvsdist 5adf0da
+static void run_shell (const char *, const char *, char **, const struct passwd *)
cvsdist 5adf0da
+#ifdef USE_PAM
cvsdist 5adf0da
+     ;
cvsdist 5adf0da
+#else
cvsdist 5adf0da
      ATTRIBUTE_NORETURN;
cvsdist 5adf0da
+#endif
cvsdist 5adf0da
 
cvsdist 5adf0da
 /* The name this program was run with.  */
cvsdist 5adf0da
 char *program_name;
e87740c
@@ -271,7 +296,22 @@
cvsdist 5adf0da
 }
cvsdist 5adf0da
 #endif
cvsdist 5adf0da
 
cvsdist 5adf0da
+#ifdef USE_PAM
cvsdist 5adf0da
+static pam_handle_t *pamh = NULL;
cvsdist 5adf0da
+static int retval;
cvsdist 5adf0da
+static struct pam_conv conv = {
cvsdist 5adf0da
+  misc_conv,
cvsdist 5adf0da
+  NULL
cvsdist 5adf0da
+};
cvsdist 5adf0da
+
cvsdist 5adf0da
+#define PAM_BAIL_P if (retval) { \
cvsdist 5adf0da
+  pam_end(pamh, PAM_SUCCESS); \
cvsdist 5adf0da
+  return 0; \
cvsdist 5adf0da
+}
cvsdist 5adf0da
+#endif
cvsdist 5adf0da
+
cvsdist 5adf0da
 /* Ask the user for a password.
cvsdist 5adf0da
+   If PAM is in use, let PAM ask for the password if necessary.
cvsdist 5adf0da
    Return 1 if the user gives the correct password for entry PW,
cvsdist 5adf0da
    0 if not.  Return 1 without asking for a password if run by UID 0
cvsdist 5adf0da
    or if PW has an empty password.  */
f1ce78f
@@ -279,6 +319,44 @@
cvsdist 5adf0da
 static int
cvsdist 5adf0da
 correct_password (const struct passwd *pw)
cvsdist 5adf0da
 {
cvsdist 5adf0da
+#ifdef USE_PAM
cvsdist 5adf0da
+  struct passwd *caller;
e87740c
+  char *tty_name, *ttyn;
cvsdist 5adf0da
+  retval = pam_start(PROGRAM_NAME, pw->pw_name, &conv, &pamh);
cvsdist 5adf0da
+  PAM_BAIL_P;
cvsdist 5adf0da
+
cvsdist 5adf0da
+  if (getuid() != 0 && !isatty(0)) {
cvsdist 5adf0da
+	fprintf(stderr, "standard in must be a tty\n");
cvsdist 5adf0da
+	exit(1);
cvsdist 5adf0da
+  }
cvsdist 5adf0da
+
cvsdist 5adf0da
+  caller = getpwuid(getuid());
cvsdist 5adf0da
+  if(caller != NULL && caller->pw_name != NULL) {
cvsdist 5adf0da
+	  retval = pam_set_item(pamh, PAM_RUSER, caller->pw_name);
cvsdist 5adf0da
+	  PAM_BAIL_P;
cvsdist 5adf0da
+  }
cvsdist 5adf0da
+
e87740c
+  ttyn = ttyname(0);
f1ce78f
+  if (ttyn) {
f1ce78f
+    if (strncmp(ttyn, "/dev/", 5) == 0)
e87740c
+       tty_name = ttyn+5;
f1ce78f
+    else
e87740c
+       tty_name = ttyn;
f1ce78f
+    retval = pam_set_item(pamh, PAM_TTY, tty_name);
f1ce78f
+    PAM_BAIL_P;
f1ce78f
+  }
cvsdist 5adf0da
+  retval = pam_authenticate(pamh, 0);
cvsdist 5adf0da
+  PAM_BAIL_P;
cvsdist 5adf0da
+  retval = pam_acct_mgmt(pamh, 0);
cvsdist 5adf0da
+  if (retval == PAM_NEW_AUTHTOK_REQD) {
cvsdist 5adf0da
+    /* password has expired.  Offer option to change it. */
cvsdist 5adf0da
+    retval = pam_chauthtok(pamh, PAM_CHANGE_EXPIRED_AUTHTOK);
cvsdist 5adf0da
+    PAM_BAIL_P;
cvsdist 5adf0da
+  }
cvsdist 5adf0da
+  PAM_BAIL_P;
cvsdist 5adf0da
+  /* must be authenticated if this point was reached */
cvsdist 5adf0da
+  return 1;
cvsdist 5adf0da
+#else /* !USE_PAM */
cvsdist 5adf0da
   char *unencrypted, *encrypted, *correct;
cvsdist 5adf0da
 #if HAVE_GETSPNAM && HAVE_STRUCT_SPWD_SP_PWDP
cvsdist 5adf0da
   /* Shadow passwd stuff for SVR3 and maybe other systems.  */
f1ce78f
@@ -303,6 +381,7 @@
cvsdist 5adf0da
   encrypted = crypt (unencrypted, correct);
cvsdist 5adf0da
   memset (unencrypted, 0, strlen (unencrypted));
cvsdist 5adf0da
   return strcmp (encrypted, correct) == 0;
cvsdist 5adf0da
+#endif /* !USE_PAM */
cvsdist 5adf0da
 }
cvsdist 5adf0da
 
cvsdist 5adf0da
 /* Update `environ' for the new shell based on PW, with SHELL being
f1ce78f
@@ -312,16 +391,24 @@
cvsdist 5adf0da
 modify_environment (const struct passwd *pw, const char *shell)
cvsdist 5adf0da
 {
cvsdist 5adf0da
   char *term;
cvsdist 5adf0da
+  char *display;
cvsdist 5adf0da
+  char *xauthority;
cvsdist 5adf0da
 
cvsdist 5adf0da
   if (simulate_login)
cvsdist 5adf0da
     {
cvsdist 5adf0da
-      /* Leave TERM unchanged.  Set HOME, SHELL, USER, LOGNAME, PATH.
cvsdist 5adf0da
+      /* Leave TERM, DISPLAY, XAUTHORITY unchanged.  Set HOME, SHELL, USER, LOGNAME, PATH.
cvsdist 5adf0da
          Unset all other environment variables.  */
cvsdist 5adf0da
       term = getenv ("TERM");
cvsdist 5adf0da
+      display = getenv ("DISPLAY");
cvsdist 5adf0da
+      xauthority = getenv ("XAUTHORITY");
cvsdist 5adf0da
       environ = xmalloc (2 * sizeof (char *));
cvsdist 5adf0da
       environ[0] = 0;
cvsdist 5adf0da
       if (term)
cvsdist 5adf0da
 	xputenv (concat ("TERM", "=", term));
cvsdist 5adf0da
+      if (display)
cvsdist 5adf0da
+	xputenv (concat ("DISPLAY", "=", display));
cvsdist 5adf0da
+      if (xauthority)
cvsdist 5adf0da
+	xputenv (concat ("XAUTHORITY", "=", xauthority));
cvsdist 5adf0da
       xputenv (concat ("HOME", "=", pw->pw_dir));
cvsdist 5adf0da
       xputenv (concat ("SHELL", "=", shell));
cvsdist 5adf0da
       xputenv (concat ("USER", "=", pw->pw_name));
f1ce78f
@@ -354,8 +441,13 @@
e87740c
 {
e87740c
 #ifdef HAVE_INITGROUPS
e87740c
   errno = 0;
e87740c
-  if (initgroups (pw->pw_name, pw->pw_gid) == -1)
e87740c
+  if (initgroups (pw->pw_name, pw->pw_gid) == -1) {
e87740c
+#ifdef USE_PAM
e87740c
+    pam_close_session(pamh, 0);
e87740c
+    pam_end(pamh, PAM_ABORT);
e87740c
+#endif
cvsdist 5adf0da
     error (EXIT_FAIL, errno, _("cannot set groups"));
e87740c
+  }
cvsdist 5adf0da
   endgrent ();
cvsdist 5adf0da
 #endif
cvsdist 5adf0da
   if (setgid (pw->pw_gid))
f1ce78f
@@ -364,16 +456,69 @@
cvsdist 5adf0da
     error (EXIT_FAIL, errno, _("cannot set user id"));
cvsdist 5adf0da
 }
cvsdist 5adf0da
 
cvsdist 5adf0da
+#ifdef USE_PAM
cvsdist 5adf0da
+static int caught=0;
cvsdist 5adf0da
+/* Signal handler for parent process later */
cvsdist 5adf0da
+static void su_catch_sig(int sig)
cvsdist 5adf0da
+{
cvsdist 5adf0da
+  ++caught;
cvsdist 5adf0da
+}
cvsdist 5adf0da
+
cvsdist 5adf0da
+int
cvsdist 5adf0da
+pam_copyenv (pam_handle_t *pamh)
cvsdist 5adf0da
+{
cvsdist 5adf0da
+  char **env;
cvsdist 5adf0da
+
cvsdist 5adf0da
+  env = pam_getenvlist(pamh);
cvsdist 5adf0da
+  if(env) {
cvsdist 5adf0da
+    while(*env) {
cvsdist 5adf0da
+	xputenv(*env);
cvsdist 5adf0da
+	env++;
cvsdist 5adf0da
+    }
cvsdist 5adf0da
+  }
cvsdist 5adf0da
+  return(0);
cvsdist 5adf0da
+}
cvsdist 5adf0da
+#endif
cvsdist 5adf0da
+
cvsdist 5adf0da
 /* Run SHELL, or DEFAULT_SHELL if SHELL is empty.
cvsdist 5adf0da
    If COMMAND is nonzero, pass it to the shell with the -c option.
cvsdist 5adf0da
    If ADDITIONAL_ARGS is nonzero, pass it to the shell as more
cvsdist 5adf0da
    arguments.  */
cvsdist 5adf0da
 
cvsdist 5adf0da
 static void
cvsdist 5adf0da
-run_shell (const char *shell, const char *command, char **additional_args)
cvsdist 5adf0da
+run_shell (const char *shell, const char *command, char **additional_args, const struct passwd *pw)
cvsdist 5adf0da
 {
cvsdist 5adf0da
   const char **args;
cvsdist 5adf0da
   int argno = 1;
cvsdist 5adf0da
+#ifdef USE_PAM
cvsdist 5adf0da
+  int child;
cvsdist 5adf0da
+  sigset_t ourset;
cvsdist 5adf0da
+  int status;
cvsdist 5adf0da
+
cvsdist 5adf0da
+  retval = pam_open_session(pamh,0);
cvsdist 5adf0da
+  if (retval != PAM_SUCCESS) {
cvsdist 5adf0da
+    fprintf (stderr, "could not open session\n");
cvsdist 5adf0da
+    exit (1);
cvsdist 5adf0da
+  }
cvsdist 5adf0da
+
cvsdist 5adf0da
+/* do this at the last possible moment, because environment variables may
cvsdist 5adf0da
+   be passed even in the session phase
cvsdist 5adf0da
+*/
cvsdist 5adf0da
+  if(pam_copyenv(pamh) != PAM_SUCCESS)
cvsdist 5adf0da
+     fprintf (stderr, "error copying PAM environment\n");
cvsdist 5adf0da
+  
e87740c
+  /* Credentials should be set in the parent */ 
e87740c
+  if (pam_setcred(pamh, PAM_ESTABLISH_CRED) != PAM_SUCCESS) {
e87740c
+    pam_close_session(pamh, 0);
e87740c
+    fprintf(stderr, "could not set PAM credentials\n");
e87740c
+    exit(1);
e87740c
+  }
e87740c
+
cvsdist 5adf0da
+  child = fork();
cvsdist 5adf0da
+  if (child == 0) {  /* child shell */
cvsdist 5adf0da
+  change_identity (pw);
cvsdist 5adf0da
+  pam_end(pamh, 0);
cvsdist 5adf0da
+#endif
cvsdist 5adf0da
 
cvsdist 5adf0da
   if (additional_args)
cvsdist 5adf0da
     args = xmalloc (sizeof (char *)
f1ce78f
@@ -385,6 +530,9 @@
cvsdist 5adf0da
       char *arg0;
cvsdist 5adf0da
       char *shell_basename;
cvsdist 5adf0da
 
cvsdist 5adf0da
+      if(chdir(pw->pw_dir))
cvsdist 5adf0da
+	      error(0, errno, _("warning: cannot change directory to %s"), pw->pw_dir);
cvsdist 5adf0da
+
cvsdist 5adf0da
       shell_basename = base_name (shell);
cvsdist 5adf0da
       arg0 = xmalloc (strlen (shell_basename) + 2);
cvsdist 5adf0da
       arg0[0] = '-';
f1ce78f
@@ -411,6 +559,66 @@
cvsdist 5adf0da
     error (0, errno, "%s", shell);
cvsdist 5adf0da
     exit (exit_status);
cvsdist 5adf0da
   }
cvsdist 5adf0da
+#ifdef USE_PAM
cvsdist 5adf0da
+  } else if (child == -1) {
cvsdist 5adf0da
+      fprintf(stderr, "can not fork user shell: %s", strerror(errno));
e87740c
+      pam_setcred(pamh, PAM_DELETE_CRED | PAM_SILENT);
e87740c
+      pam_close_session(pamh, 0);
e87740c
+      pam_end(pamh, PAM_ABORT);
cvsdist 5adf0da
+      exit(1);
cvsdist 5adf0da
+  }
cvsdist 5adf0da
+  /* parent only */
cvsdist 5adf0da
+  sigfillset(&ourset);
cvsdist 5adf0da
+  if (sigprocmask(SIG_BLOCK, &ourset, NULL)) {
cvsdist 5adf0da
+    fprintf(stderr, "%s: signal malfunction\n", PROGRAM_NAME);
cvsdist 5adf0da
+    caught = 1;
cvsdist 5adf0da
+  }
cvsdist 5adf0da
+  if (!caught) {
cvsdist 5adf0da
+    struct sigaction action;
cvsdist 5adf0da
+    action.sa_handler = su_catch_sig;
cvsdist 5adf0da
+    sigemptyset(&action.sa_mask);
cvsdist 5adf0da
+    action.sa_flags = 0;
cvsdist 5adf0da
+    sigemptyset(&ourset);
cvsdist 5adf0da
+    if (sigaddset(&ourset, SIGTERM)
cvsdist 5adf0da
+        || sigaddset(&ourset, SIGALRM)
cvsdist 5adf0da
+        || sigaction(SIGTERM, &action, NULL)
cvsdist 5adf0da
+        || sigprocmask(SIG_UNBLOCK, &ourset, NULL)) {
cvsdist 5adf0da
+      fprintf(stderr, "%s: signal masking malfunction\n", PROGRAM_NAME);
cvsdist 5adf0da
+      caught = 1;
cvsdist 5adf0da
+    }
cvsdist 5adf0da
+  }
cvsdist 5adf0da
+  if (!caught) {
cvsdist 5adf0da
+    do {
cvsdist 5adf0da
+      int pid;
cvsdist 5adf0da
+
cvsdist 5adf0da
+      pid = waitpid(-1, &status, WUNTRACED);
cvsdist 5adf0da
+
cvsdist 5adf0da
+      if (WIFSTOPPED(status)) {
cvsdist 5adf0da
+          kill(getpid(), SIGSTOP);
cvsdist 5adf0da
+          /* once we get here, we must have resumed */
cvsdist 5adf0da
+          kill(pid, SIGCONT);
cvsdist 5adf0da
+      }
cvsdist 5adf0da
+    } while (WIFSTOPPED(status));
cvsdist 5adf0da
+  }
cvsdist 5adf0da
+
cvsdist 5adf0da
+  if (caught) {
cvsdist 5adf0da
+    fprintf(stderr, "\nSession terminated, killing shell...");
cvsdist 5adf0da
+    kill (child, SIGTERM);
cvsdist 5adf0da
+  }
e87740c
+  /* Not checking retval on this because we need to call close session */
e87740c
+  pam_setcred(pamh, PAM_DELETE_CRED | PAM_SILENT);
cvsdist 5adf0da
+  retval = pam_close_session(pamh, 0);
cvsdist 5adf0da
+  PAM_BAIL_P;
cvsdist 5adf0da
+  retval = pam_end(pamh, PAM_SUCCESS);
cvsdist 5adf0da
+  PAM_BAIL_P;
cvsdist 5adf0da
+  if (caught) {
cvsdist 5adf0da
+    sleep(2);
cvsdist 5adf0da
+    kill(child, SIGKILL);
cvsdist 5adf0da
+    fprintf(stderr, " ...killed.\n");
cvsdist 5adf0da
+    exit(-1);
cvsdist 5adf0da
+  }
cvsdist 5adf0da
+  exit (WEXITSTATUS(status));
cvsdist 5adf0da
+#endif /* USE_PAM */
cvsdist 5adf0da
 }
cvsdist 5adf0da
 
cvsdist 5adf0da
 /* Return 1 if SHELL is a restricted shell (one not returned by
f1ce78f
@@ -586,9 +794,10 @@
e87740c
     }
e87740c
   modify_environment (pw, shell);
cvsdist 5adf0da
 
cvsdist 5adf0da
+
a2135bf
+#ifndef USE_PAM
cvsdist 5adf0da
   change_identity (pw);
cvsdist 5adf0da
-  if (simulate_login && chdir (pw->pw_dir))
cvsdist 5adf0da
-    error (0, errno, _("warning: cannot change directory to %s"), pw->pw_dir);
cvsdist 5adf0da
+#endif
cvsdist 5adf0da
 
cvsdist 5adf0da
-  run_shell (shell, command, additional_args);
cvsdist 5adf0da
+  run_shell (shell, command, additional_args, pw);
cvsdist 5adf0da
 }
e87740c
--- coreutils-5.2.1/doc/coreutils.texi.pam	2005-04-15 17:03:44.000000000 +0100
e87740c
+++ coreutils-5.2.1/doc/coreutils.texi	2005-04-15 17:03:44.000000000 +0100
e87740c
@@ -11850,8 +11850,11 @@
cvsdist 460c938
 @findex syslog
cvsdist 460c938
 @command{su} can optionally be compiled to use @code{syslog} to report
cvsdist 460c938
 failed, and optionally successful, @command{su} attempts.  (If the system
cvsdist 460c938
-supports @code{syslog}.)  However, GNU @command{su} does not check if the
cvsdist 460c938
-user is a member of the @code{wheel} group; see below.
cvsdist 460c938
+supports @code{syslog}.)
cvsdist 460c938
+
cvsdist 460c938
+This version of @command{su} has support for using PAM for
cvsdist 460c938
+authentication.  You can edit @file{/etc/pam.d/su} to customize its
cvsdist 460c938
+behaviour.
cvsdist 460c938
 
cvsdist 460c938
 The program accepts the following options.  Also see @ref{Common options}.
cvsdist 460c938
 
e87740c
@@ -11932,33 +11935,6 @@
cvsdist 460c938
 the exit status of the subshell otherwise
cvsdist 460c938
 @end display
cvsdist 460c938
 
cvsdist 460c938
-@cindex wheel group, not supported
cvsdist 460c938
-@cindex group wheel, not supported
cvsdist 460c938
-@cindex fascism
cvsdist 460c938
-@subsection Why GNU @command{su} does not support the @samp{wheel} group
cvsdist 460c938
-
cvsdist 460c938
-(This section is by Richard Stallman.)
cvsdist 460c938
-
cvsdist 460c938
-@cindex Twenex
cvsdist 460c938
-@cindex MIT AI lab
cvsdist 460c938
-Sometimes a few of the users try to hold total power over all the
cvsdist 460c938
-rest.  For example, in 1984, a few users at the MIT AI lab decided to
cvsdist 460c938
-seize power by changing the operator password on the Twenex system and
cvsdist 460c938
-keeping it secret from everyone else.  (I was able to thwart this coup
cvsdist 460c938
-and give power back to the users by patching the kernel, but I
cvsdist 460c938
-wouldn't know how to do that in Unix.)
cvsdist 460c938
-
cvsdist 460c938
-However, occasionally the rulers do tell someone.  Under the usual
cvsdist 460c938
-@command{su} mechanism, once someone learns the root password who
cvsdist 460c938
-sympathizes with the ordinary users, he or she can tell the rest.  The
cvsdist 460c938
-``wheel group'' feature would make this impossible, and thus cement the
cvsdist 460c938
-power of the rulers.
cvsdist 460c938
-
cvsdist 460c938
-I'm on the side of the masses, not that of the rulers.  If you are
cvsdist 460c938
-used to supporting the bosses and sysadmins in whatever they do, you
cvsdist 460c938
-might find this idea strange at first.
cvsdist 460c938
-
cvsdist 460c938
-
cvsdist 460c938
 @node Process control
cvsdist 460c938
 @chapter Process control
cvsdist 460c938
 
e87740c
--- coreutils-5.2.1/configure.ac.pam	2005-04-15 17:03:44.000000000 +0100
e87740c
+++ coreutils-5.2.1/configure.ac	2005-04-15 17:03:44.000000000 +0100
e87740c
@@ -7,6 +7,13 @@
e87740c
 
e87740c
 AM_INIT_AUTOMAKE([1.8 gnits dist-bzip2])
e87740c
 
e87740c
+dnl Give the chance to enable PAM
e87740c
+AC_ARG_ENABLE(pam, dnl
e87740c
+[  --enable-pam              Enable use of the PAM libraries],
e87740c
+[AC_DEFINE(USE_PAM, 1, [Define if you want to use PAM])
e87740c
+LIB_PAM="-ldl -lpam -lpam_misc"
e87740c
+AC_SUBST(LIB_PAM)])
e87740c
+
e87740c
 gl_DEFAULT_POSIX2_VERSION
e87740c
 gl_USE_SYSTEM_EXTENSIONS
e87740c
 jm_PERL
e87740c
--- coreutils-5.2.1/config.hin.pam	2005-04-15 17:03:44.000000000 +0100
e87740c
+++ coreutils-5.2.1/config.hin	2005-04-15 17:03:44.000000000 +0100
e87740c
@@ -1365,6 +1365,9 @@
e87740c
 /* Define if you want access control list support. */
e87740c
 #undef USE_ACL
e87740c
 
e87740c
+/* Define if you want to use PAM */
e87740c
+#undef USE_PAM
e87740c
+
e87740c
 /* Version number of package */
e87740c
 #undef VERSION
e87740c