]> granicus.if.org Git - linux-pam/commitdiff
CVS: Indicate any relevant BUGIDs here
authorThorsten Kukuk <kukuk@thkukuk.de>
Tue, 24 Jan 2006 16:02:11 +0000 (16:02 +0000)
committerThorsten Kukuk <kukuk@thkukuk.de>
Tue, 24 Jan 2006 16:02:11 +0000 (16:02 +0000)
Relevant BUGIDs:

Purpose of commit: new feature

Commit summary:
---------------

2006-01-24  Thorsten Kukuk  <kukuk@thkukuk.de>

        * configure.in: Add modules/pam_exec.
        * modules/Makefile.am: Add pam_exec subdirectory.
        * modules/pam_exec/README: New.
        * modules/pam_exec/Makefile.am: New.
        * modules/pam_exec/pam_exec.8: New.
        * modules/pam_exec/pam_exec.c: New.
        * modules/pam_exec/pam_exec.8.xml: New.
        * po/POTFILES.in: Add modules/pam_exec/pam_exec.c.
        * po/*.po: Merge new pam_exec strings.

27 files changed:
ChangeLog
NEWS
configure.in
modules/Makefile.am
modules/pam_exec/.cvsignore [new file with mode: 0644]
modules/pam_exec/Makefile.am [new file with mode: 0644]
modules/pam_exec/README [new file with mode: 0644]
modules/pam_exec/pam_exec.8 [new file with mode: 0644]
modules/pam_exec/pam_exec.8.xml [new file with mode: 0644]
modules/pam_exec/pam_exec.c [new file with mode: 0644]
po/Linux-PAM.pot
po/POTFILES.in
po/cs.po
po/de.po
po/es.po
po/fi.po
po/fr.po
po/hu.po
po/it.po
po/ja.po
po/nb.po
po/pa.po
po/pl.po
po/pt.po
po/pt_BR.po
po/zh_CN.po
po/zh_TW.po

index 290ff0f1174ed32108d59eadcd6aaaf3e5a497b1..1a8c8d9e08013d588297a6a6e62762bf86a72bc2 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -4,6 +4,16 @@
 
        * po/de.po: Fix one translation.
 
+       * configure.in: Add modules/pam_exec.
+       * modules/Makefile.am: Add pam_exec subdirectory.
+       * modules/pam_exec/README: New.
+       * modules/pam_exec/Makefile.am: New.
+       * modules/pam_exec/pam_exec.8: New.
+       * modules/pam_exec/pam_exec.c: New.
+       * modules/pam_exec/pam_exec.8.xml: New.
+       * po/POTFILES.in: Add modules/pam_exec/pam_exec.c.
+       * po/*.po: Merge new pam_exec strings.
+
 2006-01-22  Thorsten Kukuk  <kukuk@thkukuk.de>
 
        * modules/pam_succeed_if/pam_succeed_if.c: Add support for
diff --git a/NEWS b/NEWS
index 2a00c4ae8bed4b268d92b84076e6d40bf1217618..943bdda4237f38cafd72436732b43d1f5b100a27 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -2,6 +2,7 @@ Linux-PAM NEWS -- history of user-visible changes.
 
 * Fix building of static variants of libpam, libpamc and libpam_misc
 * pam_listfile: Add support for password and session management
+* pam_exec: New PAM module to execute arbitary commands
 
 Release 0.99.3.0
 
index 5bba95237f84d7852f2d53a9d18545440fbbf928..a262026128e043d16cd7019b823878093e8f2a61 100644 (file)
@@ -90,7 +90,7 @@ AC_C___ATTRIBUTE__
 
 dnl
 dnl Check if --version-script is supported by ld
-dnl 
+dnl
 AC_CACHE_CHECK(for .symver assembler directive, libc_cv_asm_symver_directive,
 [cat > conftest.s <<EOF
 ${libc_cv_dot_text}
@@ -119,7 +119,7 @@ VERS_2 {
         global: sym;
 } VERS_1;
 EOF
-  if ${CC-cc} -c $ASFLAGS conftest.s 1>&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD; 
+  if ${CC-cc} -c $ASFLAGS conftest.s 1>&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD;
 then
     if AC_TRY_COMMAND([${CC-cc} $CFLAGS $LDFLAGS -shared
                                 -o conftest.so conftest.o
@@ -318,7 +318,7 @@ AC_SUBST(LIBCRYPT)
 
 dnl check for libndbm or libdb as fallback
 BACKUP_LIBS=$LIBS
-AC_CHECK_LIB([ndbm],[dbm_store], LIBDB="-lndbm", LIBDB="") 
+AC_CHECK_LIB([ndbm],[dbm_store], LIBDB="-lndbm", LIBDB="")
 LIBS=$BACKUP_LIBS
 if test -z "$LIBDB" ; then
     BACKUP_LIBS=$LIBS
@@ -447,7 +447,7 @@ AC_OUTPUT(Makefile libpam/Makefile libpamc/Makefile libpamc/test/Makefile \
        modules/pam_mkhomedir/Makefile modules/pam_motd/Makefile \
        modules/pam_nologin/Makefile modules/pam_permit/Makefile \
        modules/pam_pwdb/Makefile modules/pam_rhosts/Makefile \
-       modules/pam_rootok/Makefile \
+       modules/pam_rootok/Makefile modules/pam_exec/Makefile \
        modules/pam_securetty/Makefile modules/pam_selinux/Makefile \
        modules/pam_shells/Makefile modules/pam_stress/Makefile \
        modules/pam_succeed_if/Makefile modules/pam_tally/Makefile \
index a120a97e62e617c0cb849d70c1224753d413fb7b..a259d738e6d4092ed94295923c37078caa838d36 100644 (file)
@@ -8,7 +8,7 @@ SUBDIRS = pam_access pam_cracklib pam_debug pam_deny pam_echo \
        pam_motd pam_nologin pam_permit pam_pwdb pam_rhosts pam_rootok \
        pam_securetty pam_selinux pam_shells pam_stress pam_succeed_if \
        pam_tally pam_time pam_umask pam_unix pam_userdb pam_warn \
-       pam_wheel pam_xauth
+       pam_wheel pam_xauth pam_exec
 
 
 CLEANFILES = *~
diff --git a/modules/pam_exec/.cvsignore b/modules/pam_exec/.cvsignore
new file mode 100644 (file)
index 0000000..9fb9857
--- /dev/null
@@ -0,0 +1,6 @@
+*.la
+*.lo
+.deps
+.libs
+Makefile
+Makefile.in
diff --git a/modules/pam_exec/Makefile.am b/modules/pam_exec/Makefile.am
new file mode 100644 (file)
index 0000000..8310f3b
--- /dev/null
@@ -0,0 +1,21 @@
+#
+# Copyright (c) 2006 Thorsten Kukuk <kukuk@suse.de>
+#
+
+CLEANFILES = *~
+
+EXTRA_DIST = README $(MANS)
+
+man_MANS = pam_exec.8
+
+securelibdir = $(SECUREDIR)
+secureconfdir = $(SCONFIGDIR)
+
+AM_CFLAGS = -I$(top_srcdir)/libpam/include -I$(top_srcdir)/libpamc/include
+AM_LDFLAGS = -no-undefined -avoid-version -module \
+       -L$(top_builddir)/libpam -lpam
+if HAVE_VERSIONING
+  AM_LDFLAGS += -Wl,--version-script=$(srcdir)/../modules.map
+endif
+
+securelib_LTLIBRARIES = pam_exec.la
diff --git a/modules/pam_exec/README b/modules/pam_exec/README
new file mode 100644 (file)
index 0000000..8451ef0
--- /dev/null
@@ -0,0 +1,29 @@
+
+pam_exec module:
+       Call <prog> <arguments>
+
+
+USAGE:
+        For the services you wish to run a program put the following
+       line in the config as the last line for that service:
+
+        <type>    required     pam_exec.so [options] /path/prog ...
+
+       and pam_exec.so will run "/path/prog ...".
+
+
+OPTIONS:
+
+       debug           print debug informations
+
+       seteuid         pam_exec.so will call setuid(seteuid()), so that
+                       the program will run with the same rights as the 
+                       calling applications (effective user ID). The
+                       default is that the program will be run with the
+                       permissions of the calling user (real user ID).
+
+       log=<file>      the output is appended to this file.
+
+
+AUTHOR:
+       Thorsten Kukuk <kukuk@thkukuk.de>
diff --git a/modules/pam_exec/pam_exec.8 b/modules/pam_exec/pam_exec.8
new file mode 100644 (file)
index 0000000..6ecd2dc
--- /dev/null
@@ -0,0 +1,79 @@
+.\" ** You probably do not want to edit this file directly **
+.\" It was generated using the DocBook XSL Stylesheets (version 1.69.1).
+.\" Instead of manually editing it, you probably should edit the DocBook XML
+.\" source for it and then use the DocBook XSL Stylesheets to regenerate it.
+.TH "PAM_EXEC" "8" "01/24/2006" "Linux\-PAM Manual" "Linux\-PAM Manual"
+.\" disable hyphenation
+.nh
+.\" disable justification (adjust text to left margin only)
+.ad l
+.SH "NAME"
+pam_exec \- PAM module which calls an external command
+.SH "SYNOPSIS"
+.HP 12
+\fBpam_exec.so\fR [debug] [seteuid] [log=\fIfile\fR] \fIcommand\fR [\fI...\fR]
+.SH "DESCRIPTION"
+.PP
+pam_exec is a PAM module that can be used to run an external command.
+.SH "OPTIONS"
+.PP
+.TP
+\fBdebug\fR
+Print debug information.
+.TP
+\fBlog=\fR\fB\fIfile\fR\fR
+The output of the command is appended to
+\fIfile\fR
+.TP
+\fBseteuid\fR
+Per default pam_exec.so will execute the external command with the real user ID of the calling process. Specifying this option means the command is run with the effective user ID.
+.SH "MODULE SERVICES PROVIDED"
+.PP
+The services
+\fBauth\fR,
+\fBaccount\fR,
+\fBpassword\fR
+and
+\fBsession\fR
+are supported.
+.SH "RETURN VALUES"
+.PP
+.TP
+\fBPAM_SUCCESS\fR
+The external command runs successfull.
+.TP
+\fBPAM_SERVICE_ERR\fR
+No argument or a wrong number of arguments were given.
+.TP
+\fBPAM_SYSTEM_ERR\fR
+A system error occured or the command to execute failed.
+.TP
+\fBPAM_IGNORE\fR
+\fBpam_setcred\fR
+was called, which does not execute the command.
+.SH "EXAMPLES"
+.PP
+Add the following line to
+\fI/etc/pam.d/passwd\fR
+to rebuild the NIS database after each local password change:
+.sp
+.nf
+        passwd optional pam_exec.so seteuid make \-C /var/yp
+      
+.fi
+.sp
+This will execute the command
+.sp
+.nf
+make \-C /var/yp
+.fi
+.sp
+with effective user ID.
+.SH "SEE ALSO"
+.PP
+\fBpam.conf\fR(5),
+\fBpam.d\fR(8),
+\fBpam\fR(8)
+.SH "AUTHOR"
+.PP
+pam_exec was written by Thorsten Kukuk <kukuk@thkukuk.de>.
diff --git a/modules/pam_exec/pam_exec.8.xml b/modules/pam_exec/pam_exec.8.xml
new file mode 100644 (file)
index 0000000..112f76c
--- /dev/null
@@ -0,0 +1,202 @@
+<?xml version="1.0" encoding='UTF-8'?>
+<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.3//EN"
+       "http://www.oasis-open.org/docbook/xml/4.3/docbookx.dtd">
+
+<refentry id="pam_exec">
+
+  <refmeta>
+    <refentrytitle>pam_exec</refentrytitle>
+    <manvolnum>8</manvolnum>
+    <refmiscinfo class="sectdesc">Linux-PAM Manual</refmiscinfo>
+  </refmeta>
+
+  <refnamediv>
+    <refname>pam_exec</refname>
+    <refpurpose>PAM module which calls an external command</refpurpose>
+  </refnamediv>
+
+  <refsynopsisdiv>
+    <cmdsynopsis id="pam_exec-cmdsynopsis">
+      <command>pam_exec.so</command>
+      <arg choice="opt">
+       debug
+      </arg>
+      <arg choice="opt">
+        seteuid
+      </arg>
+      <arg choice="opt">
+        log=<replaceable>file</replaceable>
+      </arg>
+      <arg choice="plain">
+       <replaceable>command</replaceable>
+      </arg>
+      <arg choice="opt">
+        <replaceable>...</replaceable>
+      </arg>
+    </cmdsynopsis>
+  </refsynopsisdiv>
+
+  <refsect1 id="pam_exec-description">
+
+    <title>Description</title>
+
+    <para>
+      pam_exec is a PAM module that can be used to run
+      an external command.
+    </para>
+
+  </refsect1>
+
+  <refsect1 id="pam_exec-options">
+
+    <title>Options</title>
+    <para>
+      <variablelist>
+
+        <varlistentry>
+          <term>
+            <option>debug</option>
+          </term>
+          <listitem>
+            <para>
+             Print debug information.
+            </para>
+          </listitem>
+        </varlistentry>
+
+        <varlistentry>
+          <term>
+            <option>log=<replaceable>file</replaceable></option>
+          </term>
+          <listitem>
+            <para>
+             The output of the command is appended to
+              <filename>file</filename>
+            </para>
+          </listitem>
+       </varlistentry>
+
+        <varlistentry>
+          <term>
+            <option>seteuid</option>
+          </term>
+          <listitem>
+            <para>
+             Per default pam_exec.so will execute the external command
+             with the real user ID of the calling process.
+              Specifying this option means the command is run
+              with the effective user ID.
+            </para>
+          </listitem>
+        </varlistentry>
+
+      </variablelist>
+
+    </para>
+  </refsect1>
+
+  <refsect1 id="pam_exec-services">
+    <title>Module Services Provided</title>
+    <para>
+      The services <option>auth</option>, <option>account</option>,
+      <option>password</option> and <option>session</option> are supported.
+    </para>
+  </refsect1>
+
+  <refsect1 id='pam_exec-return_values'>
+    <title>Return Values</title>
+    <para>
+      <variablelist>
+
+        <varlistentry>
+          <term>
+            <option>PAM_SUCCESS</option>
+          </term>
+          <listitem>
+            <para>
+              The external command runs successfull.
+            </para>
+          </listitem>
+        </varlistentry>
+
+        <varlistentry>
+          <term>
+            <option>PAM_SERVICE_ERR</option>
+          </term>
+          <listitem>
+            <para>
+             No argument or a wrong number of arguments were given.
+            </para>
+          </listitem>
+        </varlistentry>
+
+        <varlistentry>
+          <term>
+            <option>PAM_SYSTEM_ERR</option>
+          </term>
+          <listitem>
+            <para>
+             A system error occured or the command to execute failed.
+            </para>
+          </listitem>
+        </varlistentry>
+
+        <varlistentry>
+          <term>
+            <option>PAM_IGNORE</option>
+          </term>
+          <listitem>
+            <para>
+             <function>pam_setcred</function> was called, which
+             does not execute the command.
+            </para>
+          </listitem>
+        </varlistentry>
+
+      </variablelist>
+    </para>
+  </refsect1>
+
+  <refsect1 id='pam_exec-examples'>
+    <title>Examples</title>
+    <para>
+      Add the following line to <filename>/etc/pam.d/passwd</filename> to
+      rebuild the NIS database after each local password change:
+      <programlisting>
+        passwd optional pam_exec.so seteuid make -C /var/yp
+      </programlisting>
+
+      This will execute the command
+      <programlisting>make -C /var/yp</programlisting>
+       with effective user ID.
+    </para>
+  </refsect1>
+
+  <refsect1 id='pam_exec-see_also'>
+    <title>See Also</title>
+    <para>
+      <citerefentry>
+       <refentrytitle>pam.conf</refentrytitle>
+       <manvolnum>5</manvolnum>
+      </citerefentry>,
+      <citerefentry>
+       <refentrytitle>pam.d</refentrytitle>
+       <manvolnum>8</manvolnum>
+      </citerefentry>,
+      <citerefentry>
+       <refentrytitle>pam</refentrytitle>
+       <manvolnum>8</manvolnum>
+      </citerefentry>
+    </para>
+  </refsect1>
+
+  <refsect1 id='pam_exec-author'>
+    <title>Author</title>
+      <para>
+        pam_exec was written by Thorsten Kukuk &lt;kukuk@thkukuk.de&gt;.
+      </para>
+  </refsect1>
+
+</refentry>
+<!-- vim: sw=2
+-->
diff --git a/modules/pam_exec/pam_exec.c b/modules/pam_exec/pam_exec.c
new file mode 100644 (file)
index 0000000..7bbaed2
--- /dev/null
@@ -0,0 +1,284 @@
+/*
+ * Copyright (c) 2006 Thorsten Kukuk <kukuk@thkukuk.de>
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, and the entire permission notice in its entirety,
+ *    including the disclaimer of warranties.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote
+ *    products derived from this software without specific prior
+ *    written permission.
+ *
+ * ALTERNATIVELY, this product may be distributed under the terms of
+ * the GNU Public License, in which case the provisions of the GPL are
+ * required INSTEAD OF the above restrictions.  (This clause is
+ * necessary due to a potential bad interaction between the GPL and
+ * the restrictions contained in a BSD-style copyright.)
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
+ * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+ * OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#if defined(HAVE_CONFIG_H)
+#include "config.h"
+#endif
+
+#include <time.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <stdio.h>
+#include <string.h>
+#include <syslog.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <sys/wait.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+
+
+#define PAM_SM_AUTH
+#define PAM_SM_ACCOUNT
+#define PAM_SM_SESSION
+#define PAM_SM_PASSWORD
+
+#include <security/pam_modules.h>
+#include <security/pam_modutil.h>
+#include <security/pam_ext.h>
+
+static int
+call_exec (pam_handle_t *pamh, int argc, const char **argv)
+{
+  int debug = 0;
+  int call_setuid = 0;
+  int optargc;
+  const char *logfile = NULL;
+  pid_t pid;
+
+  if (argc < 1) {
+    pam_syslog (pamh, LOG_ERR,
+               "This module needs at least one argument");
+    return PAM_SERVICE_ERR;
+  }
+
+  for (optargc = 0; optargc < argc; optargc++)
+    {
+      if (argv[optargc][0] == '/') /* paths starts with / */
+       break;
+
+      if (strcasecmp (argv[optargc], "debug") == 0)
+       debug = 1;
+      else if (strncasecmp (argv[optargc], "log=", 4) == 0)
+       logfile = &argv[optargc][4];
+      else if (strcasecmp (argv[optargc], "seteuid") == 0)
+       call_setuid = 1;
+      else
+       break; /* Unknown option, assume program to execute. */
+    }
+
+
+  if (optargc >= argc) {
+    pam_syslog (pamh, LOG_ERR, "No path given as argument");
+    return PAM_SERVICE_ERR;
+  }
+
+  pid = fork();
+  if (pid == -1)
+    return PAM_SYSTEM_ERR;
+  if (pid > 0) /* parent */
+    {
+      int status = 0;
+      pid_t retval;
+      while ((retval = waitpid (pid, &status, 0)) == -1 &&
+            errno == EINTR);
+      if (retval == (pid_t)-1)
+       {
+         pam_syslog (pamh, LOG_ERR, "waitpid returns with -1: %m");
+         return PAM_SYSTEM_ERR;
+       }
+      else if (status != 0)
+       {
+         if (WIFEXITED(status))
+           {
+             pam_syslog (pamh, LOG_ERR, "%s failed: exit code %d",
+                         argv[optargc], WEXITSTATUS(status));
+             pam_error (pamh, _("%s failed: exit code %d"),
+                        argv[optargc], WEXITSTATUS(status));
+           }
+         else if (WIFSIGNALED(status))
+           {
+             pam_syslog (pamh, LOG_ERR, "%s failed: caught signal %d%s",
+                         argv[optargc], WTERMSIG(status),
+                         WCOREDUMP(status) ? " (core dumped)" : "");
+             pam_error (pamh, _("%s failed: caught signal %d%s"),
+                        argv[optargc], WTERMSIG(status),
+                        WCOREDUMP(status) ? " (core dumped)" : "");
+           }
+         else
+           {
+             pam_syslog (pamh, LOG_ERR, "%s failed: unknown status 0x%x",
+                         argv[optargc], status);
+             pam_error (pamh, _("%s failed: unknown status 0x%x"),
+                        argv[optargc], status);
+           }
+         return PAM_SYSTEM_ERR;
+       }
+      return PAM_SUCCESS;
+    }
+  else /* child */
+    {
+      char **arggv;
+      int i;
+
+      for (i = 0; i < sysconf (_SC_OPEN_MAX); i++)
+       close (i);
+
+      /* New stdin.  */
+      if ((i = open ("/dev/null", O_RDWR)) < 0)
+       {
+         int err = errno;
+         pam_syslog (pamh, LOG_ERR, "open of /dev/null failed: %m");
+         exit (err);
+       }
+      /* New stdout and stderr.  */
+      if (logfile)
+       {
+         time_t tm = time (NULL);
+         char *buffer = NULL;
+
+         if ((i = open (logfile, O_CREAT|O_APPEND|O_WRONLY))  == -1)
+           {
+             int err = errno;
+             pam_syslog (pamh, LOG_ERR, "open of %s failed: %m",
+                         logfile);
+             exit (err);
+           }
+         if (asprintf (&buffer, "*** %s", ctime (&tm)) > 0)
+           {
+             pam_modutil_write (i, buffer, strlen (buffer));
+             free (buffer);
+           }
+       }
+      else
+       if (dup (i) == -1)
+         {
+           int err = errno;
+           pam_syslog (pamh, LOG_ERR, "dup failed: %m");
+           exit (err);
+         }
+      if (dup (i) == -1)
+        {
+         int err = errno;
+         pam_syslog (pamh, LOG_ERR, "dup failed: %m");
+          exit (err);
+        }
+
+      if (call_setuid)
+       if (setuid (geteuid ()) == -1)
+         {
+           int err = errno;
+           pam_syslog (pamh, LOG_ERR, "setuid(%d) failed: %m",
+                       geteuid ());
+           exit (err);
+         }
+
+      if (setsid () == -1)
+       {
+         int err = errno;
+         pam_syslog (pamh, LOG_ERR, "setsid failed: %m");
+         exit (err);
+       }
+
+      arggv = calloc (argc + 4, sizeof (char *));
+      if (arggv == NULL)
+       exit (ENOMEM);
+
+      for (i = 0; i < (argc - optargc); i++)
+       arggv[i] = argv[i+optargc];
+      arggv[i] = NULL;
+
+      if (debug)
+       pam_syslog (pamh, LOG_DEBUG, "Calling %s ...", arggv[0]);
+
+      if (execv (arggv[0], arggv) == -1)
+       {
+         int err = errno;
+         pam_syslog (pamh, LOG_ERR, "execv(%s,...) failed: %m",
+                     arggv[0]);
+         exit (err);
+       }
+      exit (1); /* should never be reached. */
+    }
+  return PAM_SYSTEM_ERR;
+}
+
+PAM_EXTERN int
+pam_sm_authenticate (pam_handle_t *pamh, int flags UNUSED,
+                    int argc, const char **argv)
+{
+  return call_exec (pamh, argc, argv);
+}
+
+PAM_EXTERN int
+pam_sm_setcred (pam_handle_t *pamh UNUSED, int flags UNUSED,
+               int argc UNUSED, const char **argv UNUSED)
+{
+  return PAM_IGNORE;
+}
+
+/* password updating functions */
+
+PAM_EXTERN int
+pam_sm_chauthtok(pam_handle_t *pamh, int flags,
+                int argc, const char **argv)
+{
+  if (flags & PAM_PRELIM_CHECK)
+    return PAM_SUCCESS;
+  return call_exec (pamh, argc, argv);
+}
+
+PAM_EXTERN int
+pam_sm_acct_mgmt(pam_handle_t *pamh, int flags UNUSED,
+                int argc, const char **argv)
+{
+  return call_exec (pamh, argc, argv);
+}
+
+PAM_EXTERN int
+pam_sm_open_session(pam_handle_t *pamh, int flags UNUSED,
+                   int argc, const char **argv)
+{
+  return call_exec (pamh, argc, argv);
+}
+
+PAM_EXTERN int
+pam_sm_close_session(pam_handle_t *pamh, int flags UNUSED,
+                    int argc, const char **argv)
+{
+  return call_exec (pamh, argc, argv);
+}
+
+#ifdef PAM_STATIC
+struct pam_module _pam_exec_modstruct = {
+  "pam_exec",
+  pam_sm_authenticate,
+  pam_sm_setcred,
+  pam_sm_acct_mgmt,
+  pam_sm_open_session,
+  pam_sm_close_session,
+  pam_sm_chauthtok,
+};
+#endif
index 9c7eb2a1ee83613d7aaa8c742cdc471daff63d12..0db761dc7b1e3e212a0a10784d06215cdec2a107 100644 (file)
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: http://sourceforge.net/projects/pam\n"
-"POT-Creation-Date: 2006-01-13 22:04+0100\n"
+"POT-Creation-Date: 2006-01-24 16:51+0100\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -16,6 +16,21 @@ msgstr ""
 "Content-Type: text/plain; charset=CHARSET\n"
 "Content-Transfer-Encoding: 8bit\n"
 
+#: modules/pam_exec/pam_exec.c:118
+#, c-format
+msgid "%s failed: exit code %d"
+msgstr ""
+
+#: modules/pam_exec/pam_exec.c:126
+#, c-format
+msgid "%s failed: caught signal %d%s"
+msgstr ""
+
+#: modules/pam_exec/pam_exec.c:134
+#, c-format
+msgid "%s failed: unknown status 0x%x"
+msgstr ""
+
 #: modules/pam_tally/pam_tally.c:738
 msgid "Authentication error"
 msgstr ""
index 5231eb08d99aae5168d71f947a7ff889c4bf24d5..335cab9234a87c421a5d811a224a91c9ad85786b 100644 (file)
@@ -5,6 +5,7 @@
 ./modules/pam_access/pam_access.c
 ./modules/pam_localuser/pam_localuser.c
 ./modules/pam_debug/pam_debug.c
+./modules/pam_exec/pam_exec.c
 ./modules/pam_echo/pam_echo.c
 ./modules/pam_group/pam_group.c
 ./modules/pam_issue/pam_issue.c
index 5cf51fa7e4f653713902d9bce38e12bed655a482..37fa3bad7d58215e220e9706ee846a974e300378 100644 (file)
--- a/po/cs.po
+++ b/po/cs.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: Linux-PAM\n"
 "Report-Msgid-Bugs-To: http://sourceforge.net/projects/pam\n"
-"POT-Creation-Date: 2006-01-13 22:04+0100\n"
+"POT-Creation-Date: 2006-01-24 16:51+0100\n"
 "PO-Revision-Date: 2005-12-12 13:14+0100\n"
 "Last-Translator: Tomas Mraz <t8m@centrum.cz>\n"
 "Language-Team: cs_CZ <cs@li.org>\n"
@@ -17,6 +17,21 @@ msgstr ""
 "Plural-Forms:  nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%"
 "10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
 
+#: modules/pam_exec/pam_exec.c:118
+#, c-format
+msgid "%s failed: exit code %d"
+msgstr ""
+
+#: modules/pam_exec/pam_exec.c:126
+#, c-format
+msgid "%s failed: caught signal %d%s"
+msgstr ""
+
+#: modules/pam_exec/pam_exec.c:134
+#, c-format
+msgid "%s failed: unknown status 0x%x"
+msgstr ""
+
 #: modules/pam_tally/pam_tally.c:738
 msgid "Authentication error"
 msgstr "Chyba autentizace"
index c0138c082ebe9be86361542cf0c385b25c08d282..c2def450dd5dbd6df8634d4c1c62717dec15f6d3 100644 (file)
--- a/po/de.po
+++ b/po/de.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: Linux-PAM\n"
 "Report-Msgid-Bugs-To: http://sourceforge.net/projects/pam\n"
-"POT-Creation-Date: 2006-01-13 22:04+0100\n"
+"POT-Creation-Date: 2006-01-24 16:51+0100\n"
 "PO-Revision-Date: 2005-12-12 17:55+01:00\n"
 "Last-Translator: Novell Language <language@novell.com>\n"
 "Language-Team: Novell Language <language@novell.com>\n"
@@ -15,6 +15,21 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 
+#: modules/pam_exec/pam_exec.c:118
+#, c-format
+msgid "%s failed: exit code %d"
+msgstr ""
+
+#: modules/pam_exec/pam_exec.c:126
+#, c-format
+msgid "%s failed: caught signal %d%s"
+msgstr ""
+
+#: modules/pam_exec/pam_exec.c:134
+#, c-format
+msgid "%s failed: unknown status 0x%x"
+msgstr ""
+
 #: modules/pam_tally/pam_tally.c:738
 msgid "Authentication error"
 msgstr "Authentifizierungsfehler"
index abc01353cc378b600ca8edeaec3c4bf9fec04ec7..995511b8a2d671903466eec7397b6e4b0d84510f 100644 (file)
--- a/po/es.po
+++ b/po/es.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: Linux-PAM\n"
 "Report-Msgid-Bugs-To: http://sourceforge.net/projects/pam\n"
-"POT-Creation-Date: 2006-01-13 22:04+0100\n"
+"POT-Creation-Date: 2006-01-24 16:51+0100\n"
 "PO-Revision-Date: 2005-08-18 HO:MI+ZONE\n"
 "Last-Translator: Novell Language <language@novell.com>\n"
 "Language-Team: Novell Language <language@novell.com>\n"
@@ -15,6 +15,21 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 
+#: modules/pam_exec/pam_exec.c:118
+#, c-format
+msgid "%s failed: exit code %d"
+msgstr ""
+
+#: modules/pam_exec/pam_exec.c:126
+#, c-format
+msgid "%s failed: caught signal %d%s"
+msgstr ""
+
+#: modules/pam_exec/pam_exec.c:134
+#, c-format
+msgid "%s failed: unknown status 0x%x"
+msgstr ""
+
 #: modules/pam_tally/pam_tally.c:738
 msgid "Authentication error"
 msgstr "Error de autenticación"
index f262af0c8bec66f8678950b11e3fc6e6fbec9f52..466add538dbcfe466d5687c30ecdeb98b3da9c8f 100644 (file)
--- a/po/fi.po
+++ b/po/fi.po
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: Linux-PAM\n"
 "Report-Msgid-Bugs-To: http://sourceforge.net/projects/pam\n"
-"POT-Creation-Date: 2006-01-13 22:04+0100\n"
+"POT-Creation-Date: 2006-01-24 16:51+0100\n"
 "PO-Revision-Date: 2006-01-12 18:58+0200\n"
 "Last-Translator: Jyri Palokangas <jmp@netti.fi>\n"
 "Language-Team:  <fi@li.org>\n"
@@ -17,6 +17,21 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "X-Generator: KBabel 1.11.1\n"
 
+#: modules/pam_exec/pam_exec.c:118
+#, c-format
+msgid "%s failed: exit code %d"
+msgstr ""
+
+#: modules/pam_exec/pam_exec.c:126
+#, c-format
+msgid "%s failed: caught signal %d%s"
+msgstr ""
+
+#: modules/pam_exec/pam_exec.c:134
+#, c-format
+msgid "%s failed: unknown status 0x%x"
+msgstr ""
+
 #: modules/pam_tally/pam_tally.c:738
 msgid "Authentication error"
 msgstr "Tunnistautumisvirhe"
index 71be82adee2eca0d578d7f27ca542dc87cfcce2c..4a40590f4aceea49b20a137ae7c53c8b961f3e3b 100644 (file)
--- a/po/fr.po
+++ b/po/fr.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: Linux-PAM\n"
 "Report-Msgid-Bugs-To: http://sourceforge.net/projects/pam\n"
-"POT-Creation-Date: 2006-01-13 22:04+0100\n"
+"POT-Creation-Date: 2006-01-24 16:51+0100\n"
 "PO-Revision-Date: 2005-08-18 12:12+0000\n"
 "Last-Translator: Novell Language <language@novell.com>\n"
 "Language-Team: Novell Language <language@novell.com>\n"
@@ -15,6 +15,21 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 
+#: modules/pam_exec/pam_exec.c:118
+#, c-format
+msgid "%s failed: exit code %d"
+msgstr ""
+
+#: modules/pam_exec/pam_exec.c:126
+#, c-format
+msgid "%s failed: caught signal %d%s"
+msgstr ""
+
+#: modules/pam_exec/pam_exec.c:134
+#, c-format
+msgid "%s failed: unknown status 0x%x"
+msgstr ""
+
 #: modules/pam_tally/pam_tally.c:738
 msgid "Authentication error"
 msgstr "Erreur d'authentification"
index 01ee67a44df3d58174d873a2ee5102cd5825af08..ce4cb92016d993ba1071802eee06e9947c201e5b 100644 (file)
--- a/po/hu.po
+++ b/po/hu.po
@@ -9,7 +9,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: Linux-PAM.hu\n"
 "Report-Msgid-Bugs-To: http://sourceforge.net/projects/pam\n"
-"POT-Creation-Date: 2006-01-13 22:04+0100\n"
+"POT-Creation-Date: 2006-01-24 16:51+0100\n"
 "PO-Revision-Date: 2006-01-10 12:08+0100\n"
 "Last-Translator: Kalman Kemenczy <kkemenczy@novell.com>\n"
 "Language-Team: Hungarian <en@li.org>\n"
@@ -19,6 +19,21 @@ msgstr ""
 "X-Generator: KBabel 1.10.2\n"
 "Plural-Forms:  nplurals=1; plural=0;\n"
 
+#: modules/pam_exec/pam_exec.c:118
+#, c-format
+msgid "%s failed: exit code %d"
+msgstr ""
+
+#: modules/pam_exec/pam_exec.c:126
+#, c-format
+msgid "%s failed: caught signal %d%s"
+msgstr ""
+
+#: modules/pam_exec/pam_exec.c:134
+#, c-format
+msgid "%s failed: unknown status 0x%x"
+msgstr ""
+
 #: modules/pam_tally/pam_tally.c:738
 msgid "Authentication error"
 msgstr "Hitelesítési hiba"
index 1398583b2db91186795ff634c230b13fb825074f..41a51fe8892be4bec2427c344e96ad4410bc4f43 100644 (file)
--- a/po/it.po
+++ b/po/it.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: Linux-PAM\n"
 "Report-Msgid-Bugs-To: http://sourceforge.net/projects/pam\n"
-"POT-Creation-Date: 2006-01-13 22:04+0100\n"
+"POT-Creation-Date: 2006-01-24 16:51+0100\n"
 "PO-Revision-Date: 2005-08-18 13:43-0000\n"
 "Last-Translator: Novell Language <language@novell.com>\n"
 "Language-Team: Novell Language <language@novell.com>\n"
@@ -15,6 +15,21 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 
+#: modules/pam_exec/pam_exec.c:118
+#, c-format
+msgid "%s failed: exit code %d"
+msgstr ""
+
+#: modules/pam_exec/pam_exec.c:126
+#, c-format
+msgid "%s failed: caught signal %d%s"
+msgstr ""
+
+#: modules/pam_exec/pam_exec.c:134
+#, c-format
+msgid "%s failed: unknown status 0x%x"
+msgstr ""
+
 #: modules/pam_tally/pam_tally.c:738
 msgid "Authentication error"
 msgstr "Errore di autenticazione"
index 59462c611073b9ced4ebbceef0edc49b9c3e384d..dcf120b8a1729cdceb2b43e1ad2f218de7d7020b 100644 (file)
--- a/po/ja.po
+++ b/po/ja.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: Linux-PAM\n"
 "Report-Msgid-Bugs-To: http://sourceforge.net/projects/pam\n"
-"POT-Creation-Date: 2006-01-13 22:04+0100\n"
+"POT-Creation-Date: 2006-01-24 16:51+0100\n"
 "PO-Revision-Date: 2005-08-18 11:52-0000\n"
 "Last-Translator: Novell Language <language@novell.com>\n"
 "Language-Team: Novell Language <language@novell.com>\n"
@@ -15,6 +15,21 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 
+#: modules/pam_exec/pam_exec.c:118
+#, c-format
+msgid "%s failed: exit code %d"
+msgstr ""
+
+#: modules/pam_exec/pam_exec.c:126
+#, c-format
+msgid "%s failed: caught signal %d%s"
+msgstr ""
+
+#: modules/pam_exec/pam_exec.c:134
+#, c-format
+msgid "%s failed: unknown status 0x%x"
+msgstr ""
+
 #: modules/pam_tally/pam_tally.c:738
 msgid "Authentication error"
 msgstr "認証エラー"
index 5df17477cf1e099eba97363276fa246ae0d3b9d6..66546a09f003cdca93079670f81ef591070c331d 100644 (file)
--- a/po/nb.po
+++ b/po/nb.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: Linux-PAM\n"
 "Report-Msgid-Bugs-To: http://sourceforge.net/projects/pam\n"
-"POT-Creation-Date: 2006-01-13 22:04+0100\n"
+"POT-Creation-Date: 2006-01-24 16:51+0100\n"
 "PO-Revision-Date: 2006-01-06 11:56+0100\n"
 "Last-Translator: Olav Pettershagen <olav.pet@online.no>\n"
 "Language-Team:  <nb@li.org>\n"
@@ -16,6 +16,21 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "X-Generator: KBabel 1.11\n"
 
+#: modules/pam_exec/pam_exec.c:118
+#, c-format
+msgid "%s failed: exit code %d"
+msgstr ""
+
+#: modules/pam_exec/pam_exec.c:126
+#, c-format
+msgid "%s failed: caught signal %d%s"
+msgstr ""
+
+#: modules/pam_exec/pam_exec.c:134
+#, c-format
+msgid "%s failed: unknown status 0x%x"
+msgstr ""
+
 #: modules/pam_tally/pam_tally.c:738
 msgid "Authentication error"
 msgstr "Autentiseringsfeil"
index 2d8a7a15cae526d4b6c5c7498eb9daa5f80e94ab..f2cf43fd32fb7100a070c06041775045e17b6b0a 100644 (file)
--- a/po/pa.po
+++ b/po/pa.po
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: Linux-PAM.pa\n"
 "Report-Msgid-Bugs-To: http://sourceforge.net/projects/pam\n"
-"POT-Creation-Date: 2006-01-13 22:04+0100\n"
+"POT-Creation-Date: 2006-01-24 16:51+0100\n"
 "PO-Revision-Date: 2005-08-06 08:34+0530\n"
 "Last-Translator: Amanpreet Singh Alam[ਆਲਮ] <amanpreetalam@yahoo.com>\n"
 "Language-Team: Panjabi <pa@li.org>\n"
@@ -18,6 +18,21 @@ msgstr ""
 "X-Generator: KBabel 1.9.1\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
+#: modules/pam_exec/pam_exec.c:118
+#, c-format
+msgid "%s failed: exit code %d"
+msgstr ""
+
+#: modules/pam_exec/pam_exec.c:126
+#, c-format
+msgid "%s failed: caught signal %d%s"
+msgstr ""
+
+#: modules/pam_exec/pam_exec.c:134
+#, c-format
+msgid "%s failed: unknown status 0x%x"
+msgstr ""
+
 #: modules/pam_tally/pam_tally.c:738
 msgid "Authentication error"
 msgstr "ਪਰਮਾਣਕਿਤਾ ਗਲਤੀ"
index 953fb1497fc9d5cec8d3e65da3b1587eb74d2b7c..2166103f8e55a3526b96394d79401bfb8c671a56 100644 (file)
--- a/po/pl.po
+++ b/po/pl.po
@@ -5,7 +5,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: Linux-PAM TBD\n"
 "Report-Msgid-Bugs-To: http://sourceforge.net/projects/pam\n"
-"POT-Creation-Date: 2006-01-13 22:04+0100\n"
+"POT-Creation-Date: 2006-01-24 16:51+0100\n"
 "PO-Revision-Date: 2005-08-23 15:22+0200\n"
 "Last-Translator: Piotr Bolek <pb@7bulls.com>\n"
 "Language-Team: Polish <i18n@suse.de>\n"
@@ -15,6 +15,21 @@ msgstr ""
 "Plural-Forms: nplurals=3; plural=n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 "
 "|| n%100>=20) ? 1 : 2;\n"
 
+#: modules/pam_exec/pam_exec.c:118
+#, c-format
+msgid "%s failed: exit code %d"
+msgstr ""
+
+#: modules/pam_exec/pam_exec.c:126
+#, c-format
+msgid "%s failed: caught signal %d%s"
+msgstr ""
+
+#: modules/pam_exec/pam_exec.c:134
+#, c-format
+msgid "%s failed: unknown status 0x%x"
+msgstr ""
+
 #: modules/pam_tally/pam_tally.c:738
 msgid "Authentication error"
 msgstr "Błąd autoryzacji"
index 80a3398d62c58543a8187522f0cd8d07a7dcb68d..c2e911618c9310a376728dd89823804157bdcbac 100644 (file)
--- a/po/pt.po
+++ b/po/pt.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: Linux-PAM-pt\n"
 "Report-Msgid-Bugs-To: http://sourceforge.net/projects/pam\n"
-"POT-Creation-Date: 2006-01-13 22:04+0100\n"
+"POT-Creation-Date: 2006-01-24 16:51+0100\n"
 "PO-Revision-Date: 2005-08-07 00:41+0100\n"
 "Last-Translator: Antonio Cardoso Martins <digiplan@netvisao.pt>\n"
 "Language-Team: portuguese\n"
@@ -16,6 +16,21 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "X-Generator: KBabel 1.10\n"
 
+#: modules/pam_exec/pam_exec.c:118
+#, c-format
+msgid "%s failed: exit code %d"
+msgstr ""
+
+#: modules/pam_exec/pam_exec.c:126
+#, c-format
+msgid "%s failed: caught signal %d%s"
+msgstr ""
+
+#: modules/pam_exec/pam_exec.c:134
+#, c-format
+msgid "%s failed: unknown status 0x%x"
+msgstr ""
+
 #: modules/pam_tally/pam_tally.c:738
 msgid "Authentication error"
 msgstr "Erro de autenticação"
index 72d76662ea29fe9b443b6636f69be1356f9a644c..ca3a4c5be79c9a41e4b5c5f49c2159f8d6ed955b 100644 (file)
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: Linux-PAM\n"
 "Report-Msgid-Bugs-To: http://sourceforge.net/projects/pam\n"
-"POT-Creation-Date: 2006-01-13 22:04+0100\n"
+"POT-Creation-Date: 2006-01-24 16:51+0100\n"
 "PO-Revision-Date: 2005-08-18 15:02+0000\n"
 "Last-Translator: Novell Language <language@novell.com>\n"
 "Language-Team: Novell Language <language@novell.com>\n"
@@ -15,6 +15,21 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 
+#: modules/pam_exec/pam_exec.c:118
+#, c-format
+msgid "%s failed: exit code %d"
+msgstr ""
+
+#: modules/pam_exec/pam_exec.c:126
+#, c-format
+msgid "%s failed: caught signal %d%s"
+msgstr ""
+
+#: modules/pam_exec/pam_exec.c:134
+#, c-format
+msgid "%s failed: unknown status 0x%x"
+msgstr ""
+
 #: modules/pam_tally/pam_tally.c:738
 msgid "Authentication error"
 msgstr "Erro de autenticação"
index efb3ddf10d70d8b5ec27707a1c2336e70236e424..fe4b4a85053972c1a8263253b4cfeb9e1143b279 100644 (file)
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: Linux_PAM\n"
 "Report-Msgid-Bugs-To: http://sourceforge.net/projects/pam\n"
-"POT-Creation-Date: 2006-01-13 22:04+0100\n"
+"POT-Creation-Date: 2006-01-24 16:51+0100\n"
 "PO-Revision-Date: 2005-08-18 HO:MI+ZONE\n"
 "Last-Translator: Novell Language <language@novell.com>\n"
 "Language-Team: Novell Language <language@novell.com>\n"
@@ -15,6 +15,21 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 
+#: modules/pam_exec/pam_exec.c:118
+#, c-format
+msgid "%s failed: exit code %d"
+msgstr ""
+
+#: modules/pam_exec/pam_exec.c:126
+#, c-format
+msgid "%s failed: caught signal %d%s"
+msgstr ""
+
+#: modules/pam_exec/pam_exec.c:134
+#, c-format
+msgid "%s failed: unknown status 0x%x"
+msgstr ""
+
 #: modules/pam_tally/pam_tally.c:738
 msgid "Authentication error"
 msgstr "鉴定错误"
index 14a21481d91a49e19f11dea8ffbf0c3df8950c58..80bbb95b187b3366da49da1bc6674411ba122a10 100644 (file)
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: Linux_PAM\n"
 "Report-Msgid-Bugs-To: http://sourceforge.net/projects/pam\n"
-"POT-Creation-Date: 2006-01-13 22:04+0100\n"
+"POT-Creation-Date: 2006-01-24 16:51+0100\n"
 "PO-Revision-Date: 2005-08-18 12:12+0200\n"
 "Last-Translator: Novell Language <language@novell.com>\n"
 "Language-Team: Novell Language <language@novell.com>\n"
@@ -15,6 +15,21 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 
+#: modules/pam_exec/pam_exec.c:118
+#, c-format
+msgid "%s failed: exit code %d"
+msgstr ""
+
+#: modules/pam_exec/pam_exec.c:126
+#, c-format
+msgid "%s failed: caught signal %d%s"
+msgstr ""
+
+#: modules/pam_exec/pam_exec.c:134
+#, c-format
+msgid "%s failed: unknown status 0x%x"
+msgstr ""
+
 #: modules/pam_tally/pam_tally.c:738
 msgid "Authentication error"
 msgstr "驗證錯誤"