summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTomas Mraz <tm@t8m.info>2005-09-21 10:54:50 +0000
committerTomas Mraz <tm@t8m.info>2005-09-21 10:54:50 +0000
commitefe5feecf980b2a1352d438bfd444eec2024d7ce (patch)
tree970388f0f1bfe428bdb9e0ab0d3a748f96c9dbd7
parentbe09d6354efcb2571731bdffc47da86f22621ac8 (diff)
Relevant BUGIDs:
Purpose of commit: bugfix, new feature Commit summary: --------------- pam_lastlog: Cleanup, fix broken logic in pam_parse, modify wtmp by default, nowtmp option switches that off (patch by ldv)
-rw-r--r--CHANGELOG2
-rw-r--r--modules/pam_lastlog/Makefile.am2
-rw-r--r--modules/pam_lastlog/pam_lastlog.c389
-rw-r--r--po/Linux-PAM.pot24
-rw-r--r--po/cs.po24
-rw-r--r--po/de.po24
-rw-r--r--po/es.po24
-rw-r--r--po/fi.po24
-rw-r--r--po/fr.po24
-rw-r--r--po/hu.po24
-rw-r--r--po/it.po24
-rw-r--r--po/ja.po24
-rw-r--r--po/nb.po24
-rw-r--r--po/pa.po24
-rw-r--r--po/pl.po24
-rw-r--r--po/pt.po24
-rw-r--r--po/pt_BR.po24
-rw-r--r--po/zh_CN.po24
-rw-r--r--po/zh_TW.po24
19 files changed, 585 insertions, 192 deletions
diff --git a/CHANGELOG b/CHANGELOG
index 04380973..51fe16c3 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -65,6 +65,8 @@ bug report - outstanding bugs are listed here:
values for other limits are applied) patch by Anton Guda
* pam_unix: Always honor nis flag on password change (by Aaron Hope)
* libpam: Moved functions from pammodutil to libpam (t8m)
+* pam_lastlog: Cleanup, fix broken logic in pam_parse,
+ modify wtmp by default, nowtmp option switches that off (ldv)
0.80: Wed Jul 13 13:23:20 CEST 2005
* pam_tally: test for NULL data before dereferencing them (t8m)
diff --git a/modules/pam_lastlog/Makefile.am b/modules/pam_lastlog/Makefile.am
index 30b7bf1b..dc2fc631 100644
--- a/modules/pam_lastlog/Makefile.am
+++ b/modules/pam_lastlog/Makefile.am
@@ -9,7 +9,7 @@ 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
+ -L$(top_builddir)/libpam -lpam -lutil
if HAVE_VERSIONING
AM_LDFLAGS += -Wl,--version-script=../modules.map
endif
diff --git a/modules/pam_lastlog/pam_lastlog.c b/modules/pam_lastlog/pam_lastlog.c
index d0ad8216..129b994d 100644
--- a/modules/pam_lastlog/pam_lastlog.c
+++ b/modules/pam_lastlog/pam_lastlog.c
@@ -28,10 +28,6 @@
#include <syslog.h>
#include <unistd.h>
-#ifdef WANT_PWDB
-#include <pwdb/pwdb_public.h> /* use POSIX front end */
-#endif
-
#if defined(hpux) || defined(sunos) || defined(solaris)
# ifndef _PATH_LASTLOG
# define _PATH_LASTLOG "/usr/adm/lastlog"
@@ -56,17 +52,6 @@ struct lastlog {
#define DEFAULT_HOST "" /* "[no.where]" */
#define DEFAULT_TERM "" /* "tt???" */
-#define LASTLOG_NEVER_WELCOME "Welcome to your new account!"
-#define LASTLOG_INTRO "Last login:"
-#define LASTLOG_TIME " %s"
-#define _LASTLOG_HOST_FORMAT " from %%.%ds"
-#define _LASTLOG_LINE_FORMAT " on %%.%ds"
-#define LASTLOG_TAIL ""
-#define LASTLOG_MAXSIZE (sizeof(LASTLOG_INTRO)+0 \
- +sizeof(LASTLOG_TIME)+strlen(the_time) \
- +sizeof(_LASTLOG_HOST_FORMAT)+UT_HOSTSIZE \
- +sizeof(_LASTLOG_LINE_FORMAT)+UT_LINESIZE \
- +sizeof(LASTLOG_TAIL))
/*
* here, we make a definition for the externally accessible function
@@ -90,11 +75,12 @@ struct lastlog {
#define LASTLOG_NEVER 010 /* display a welcome message for first login */
#define LASTLOG_DEBUG 020 /* send info to syslog(3) */
#define LASTLOG_QUIET 040 /* keep quiet about things */
+#define LASTLOG_WTMP 0100 /* log to wtmp as well as lastlog */
static int
_pam_parse(pam_handle_t *pamh, int flags, int argc, const char **argv)
{
- int ctrl=(LASTLOG_DATE|LASTLOG_HOST|LASTLOG_LINE);
+ int ctrl=(LASTLOG_DATE|LASTLOG_HOST|LASTLOG_LINE|LASTLOG_WTMP);
/* does the appliction require quiet? */
if (flags & PAM_SILENT) {
@@ -109,15 +95,17 @@ _pam_parse(pam_handle_t *pamh, int flags, int argc, const char **argv)
if (!strcmp(*argv,"debug")) {
ctrl |= LASTLOG_DEBUG;
} else if (!strcmp(*argv,"nodate")) {
- ctrl |= ~LASTLOG_DATE;
+ ctrl &= ~LASTLOG_DATE;
} else if (!strcmp(*argv,"noterm")) {
- ctrl |= ~LASTLOG_LINE;
+ ctrl &= ~LASTLOG_LINE;
} else if (!strcmp(*argv,"nohost")) {
- ctrl |= ~LASTLOG_HOST;
+ ctrl &= ~LASTLOG_HOST;
} else if (!strcmp(*argv,"silent")) {
ctrl |= LASTLOG_QUIET;
} else if (!strcmp(*argv,"never")) {
ctrl |= LASTLOG_NEVER;
+ } else if (!strcmp(*argv,"nowtmp")) {
+ ctrl &= ~LASTLOG_WTMP;
} else {
pam_syslog(pamh, LOG_ERR, "unknown option: %s", *argv);
}
@@ -127,209 +115,250 @@ _pam_parse(pam_handle_t *pamh, int flags, int argc, const char **argv)
return ctrl;
}
-/*
- * Values for the announce flags..
- */
-
-static int last_login_date(pam_handle_t *pamh, int announce, uid_t uid)
+static const char *
+get_tty(pam_handle_t *pamh)
{
- struct flock last_lock;
- struct lastlog last_login;
- int retval = PAM_SESSION_ERR;
- int last_fd;
+ const void *void_terminal_line = NULL;
+ const char *terminal_line;
- /* obtain the last login date and all the relevant info */
- last_fd = open(_PATH_LASTLOG, O_RDWR);
- if (last_fd < 0) {
- pam_syslog(pamh, LOG_ERR, "unable to open %s: %m", _PATH_LASTLOG);
- D(("unable to open the %s file", _PATH_LASTLOG));
- retval = PAM_PERM_DENIED;
+ if (pam_get_item(pamh, PAM_TTY, &void_terminal_line) != PAM_SUCCESS
+ || void_terminal_line == NULL) {
+ terminal_line = DEFAULT_TERM;
} else {
- int win;
+ terminal_line = void_terminal_line;
+ }
+ if (!strncmp("/dev/", terminal_line, 5)) {
+ /* strip leading "/dev/" from tty. */
+ terminal_line += 5;
+ }
+ D(("terminal = %s", terminal_line));
+ return terminal_line;
+}
- /* read the lastlogin file - for this uid */
- (void) lseek(last_fd, sizeof(last_login) * (off_t) uid, SEEK_SET);
+static int
+last_login_read(pam_handle_t *pamh, int announce, int last_fd, uid_t uid)
+{
+ struct flock last_lock;
+ struct lastlog last_login;
+ int retval = PAM_SERVICE_ERR;
+ char *date = NULL;
+ char *host = NULL;
+ char *line = NULL;
+ do {
memset(&last_lock, 0, sizeof(last_lock));
last_lock.l_type = F_RDLCK;
last_lock.l_whence = SEEK_SET;
last_lock.l_start = sizeof(last_login) * (off_t) uid;
last_lock.l_len = sizeof(last_login);
- if ( fcntl(last_fd, F_SETLK, &last_lock) < 0 ) {
+ if (fcntl(last_fd, F_SETLK, &last_lock) < 0) {
D(("locking %s failed..(waiting a little)", _PATH_LASTLOG));
pam_syslog(pamh, LOG_WARNING,
- "%s file is locked/read", _PATH_LASTLOG);
+ "file %s is locked/read", _PATH_LASTLOG);
sleep(LASTLOG_IGNORE_LOCK_TIME);
}
- win = (pam_modutil_read (last_fd, (char *) &last_login,
- sizeof(last_login)) == sizeof(last_login));
+ if (pam_modutil_read(last_fd, (char *) &last_login,
+ sizeof(last_login)) != sizeof(last_login)) {
+ memset(&last_login, 0, sizeof(last_login));
+ }
last_lock.l_type = F_UNLCK;
(void) fcntl(last_fd, F_SETLK, &last_lock); /* unlock */
- if (!win) {
- D(("First login for user uid=%d", _PATH_LASTLOG, uid));
+ if (!last_login.ll_time) {
+ D(("First login for user uid=%d", uid));
if (announce & LASTLOG_DEBUG) {
pam_syslog(pamh, LOG_DEBUG, "creating lastlog for uid %d", uid);
}
- memset(&last_login, 0, sizeof(last_login));
}
- /* rewind */
- (void) lseek(last_fd, sizeof(last_login) * (off_t) uid, SEEK_SET);
+ if ((announce & LASTLOG_QUIET)) {
+ retval = PAM_SUCCESS;
+ break;
+ }
- if (!(announce & LASTLOG_QUIET)) {
- if (last_login.ll_time) {
+ if (last_login.ll_time) {
+ retval = PAM_BUF_ERR;
+
+ /* we want the date? */
+ if (announce & LASTLOG_DATE) {
time_t ll_time;
char *the_time;
- char *remark;
ll_time = last_login.ll_time;
the_time = ctime(&ll_time);
- the_time[-1+strlen(the_time)] = '\0'; /* delete '\n' */
-
- remark = malloc(LASTLOG_MAXSIZE);
- if (remark == NULL) {
- D(("no memory for last login remark"));
- retval = PAM_BUF_ERR;
- } else {
- int at;
-
- /* printing prefix */
- at = sprintf(remark, "%s", LASTLOG_INTRO);
-
- /* we want the date? */
- if (announce & LASTLOG_DATE) {
- at += sprintf(remark+at, LASTLOG_TIME, the_time);
- }
-
- /* we want & have the host? */
- if ((announce & LASTLOG_HOST)
- && (last_login.ll_host[0] != '\0')) {
- char format[2*sizeof(_LASTLOG_HOST_FORMAT)];
-
- (void) sprintf(format, _LASTLOG_HOST_FORMAT
- , UT_HOSTSIZE);
- D(("format: %s", format));
- at += sprintf(remark+at, format, last_login.ll_host);
- _pam_overwrite(format);
- }
-
- /* we want and have the terminal? */
- if ((announce & LASTLOG_LINE)
- && (last_login.ll_line[0] != '\0')) {
- char format[2*sizeof(_LASTLOG_LINE_FORMAT)];
-
- (void) sprintf(format, _LASTLOG_LINE_FORMAT
- , UT_LINESIZE);
- D(("format: %s", format));
- at += sprintf(remark+at, format, last_login.ll_line);
- _pam_overwrite(format);
- }
-
- /* display requested combo */
- sprintf(remark+at, "%s", LASTLOG_TAIL);
-
- retval = pam_info(pamh, "%s", remark);
-
- /* free all the stuff malloced */
- _pam_overwrite(remark);
- _pam_drop(remark);
+ the_time[strlen(the_time)-1] = '\0'; /* strip trailing '\n' */
+
+ if (asprintf(&date, " %s", the_time) < 0) {
+ pam_syslog(pamh, LOG_ERR, "out of memory");
+ break;
}
- } else if ((!last_login.ll_time) && (announce & LASTLOG_NEVER)) {
- D(("this is the first time this user has logged in"));
- retval = pam_info(pamh, "%s", LASTLOG_NEVER_WELCOME);
}
- } else {
- D(("no text was requested"));
- retval = PAM_SUCCESS;
+
+ /* we want & have the host? */
+ if ((announce & LASTLOG_HOST)
+ && (last_login.ll_host[0] != '\0')) {
+ /* TRANSLATORS: " from <host>" */
+ if (asprintf(&host, _(" from %.*s"), UT_HOSTSIZE,
+ last_login.ll_host) < 0) {
+ pam_syslog(pamh, LOG_ERR, "out of memory");
+ break;
+ }
+ }
+
+ /* we want and have the terminal? */
+ if ((announce & LASTLOG_LINE)
+ && (last_login.ll_line[0] != '\0')) {
+ /* TRANSLATORS: " on <terminal>" */
+ if (asprintf(&line, _(" on %.*s"), UT_LINESIZE,
+ last_login.ll_line) < 0) {
+ pam_syslog(pamh, LOG_ERR, "out of memory");
+ break;
+ }
+ }
+
+ /* TRANSLATORS: "Last login: <date> from <host> on <terminal>" */
+ retval = pam_info(pamh, _("Last login:%s%s%s"),
+ date ? date : "",
+ host ? host : "",
+ line ? line : "");
+ } else if (announce & LASTLOG_NEVER) {
+ D(("this is the first time this user has logged in"));
+ retval = pam_info(pamh, "%s", _("Welcome to your new account!"));
}
+ } while (0);
- /* write latest value */
- {
- time_t ll_time;
- const void *remote_host=NULL
- , *void_terminal_line=DEFAULT_TERM;
- const char *terminal_line;
+ /* cleanup */
+ memset(&last_login, 0, sizeof(last_login));
+ _pam_overwrite(date);
+ _pam_drop(date);
+ _pam_overwrite(host);
+ _pam_drop(host);
+ _pam_overwrite(line);
+ _pam_drop(line);
- /* set this login date */
- D(("set the most recent login time"));
+ return retval;
+}
- (void) time(&ll_time); /* set the time */
- last_login.ll_time = ll_time;
+static int
+last_login_write(pam_handle_t *pamh, int announce, int last_fd,
+ uid_t uid, const char *user)
+{
+ struct flock last_lock;
+ struct lastlog last_login;
+ time_t ll_time;
+ const void *void_remote_host = NULL;
+ const char *remote_host;
+ const char *terminal_line;
+ int retval = PAM_SUCCESS;
+
+ /* rewind */
+ if (lseek(last_fd, sizeof(last_login) * (off_t) uid, SEEK_SET) < 0) {
+ pam_syslog(pamh, LOG_ERR, "failed to lseek %s: %m", _PATH_LASTLOG);
+ return PAM_SERVICE_ERR;
+ }
- /* set the remote host */
- (void) pam_get_item(pamh, PAM_RHOST, &remote_host);
- if (remote_host == NULL) {
- remote_host = DEFAULT_HOST;
- }
+ /* set this login date */
+ D(("set the most recent login time"));
+ (void) time(&ll_time); /* set the time */
+ last_login.ll_time = ll_time;
- /* copy to last_login */
- strncpy(last_login.ll_host, remote_host,
- sizeof(last_login.ll_host));
- last_login.ll_host[sizeof(last_login.ll_host) - 1] = '\0';
- remote_host = NULL;
-
- /* set the terminal line */
- (void) pam_get_item(pamh, PAM_TTY, &void_terminal_line);
- terminal_line = void_terminal_line;
- D(("terminal = %s", terminal_line));
- if (terminal_line == NULL) {
- terminal_line = DEFAULT_TERM;
- } else if ( !strncmp("/dev/", terminal_line, 5) ) {
- /* strip leading "/dev/" from tty.. */
- terminal_line += 5;
- }
- D(("terminal = %s", terminal_line));
-
- /* copy to last_login */
- strncpy(last_login.ll_line, terminal_line,
- sizeof(last_login.ll_line));
- last_login.ll_host[sizeof(last_login.ll_host) - 1] = '\0';
- terminal_line = NULL;
-
- D(("locking last_log file"));
-
- /* now we try to lock this file-record exclusively; non-blocking */
- memset(&last_lock, 0, sizeof(last_lock));
- last_lock.l_type = F_WRLCK;
- last_lock.l_whence = SEEK_SET;
- last_lock.l_start = sizeof(last_login) * (off_t) uid;
- last_lock.l_len = sizeof(last_login);
-
- if ( fcntl(last_fd, F_SETLK, &last_lock) < 0 ) {
- D(("locking %s failed..(waiting a little)", _PATH_LASTLOG));
- pam_syslog(pamh, LOG_WARNING,
- "%s file is locked/write", _PATH_LASTLOG);
- sleep(LASTLOG_IGNORE_LOCK_TIME);
- }
+ /* set the remote host */
+ if (pam_get_item(pamh, PAM_RHOST, &void_remote_host) != PAM_SUCCESS
+ || void_remote_host == NULL) {
+ remote_host = DEFAULT_HOST;
+ } else {
+ remote_host = void_remote_host;
+ }
- D(("writing to the last_log file"));
- pam_modutil_write (last_fd, (char *) &last_login,
- sizeof (last_login));
+ /* copy to last_login */
+ last_login.ll_host[0] = '\0';
+ strncat(last_login.ll_host, remote_host, sizeof(last_login.ll_host)-1);
- last_lock.l_type = F_UNLCK;
- (void) fcntl(last_fd, F_SETLK, &last_lock); /* unlock */
- D(("unlocked"));
+ /* set the terminal line */
+ terminal_line = get_tty(pamh);
- close(last_fd); /* all done */
- }
- D(("all done with last login"));
+ /* copy to last_login */
+ last_login.ll_host[0] = '\0';
+ strncat(last_login.ll_line, terminal_line, sizeof(last_login.ll_line)-1);
+ terminal_line = NULL;
+
+ D(("locking lastlog file"));
+
+ /* now we try to lock this file-record exclusively; non-blocking */
+ memset(&last_lock, 0, sizeof(last_lock));
+ last_lock.l_type = F_WRLCK;
+ last_lock.l_whence = SEEK_SET;
+ last_lock.l_start = sizeof(last_login) * (off_t) uid;
+ last_lock.l_len = sizeof(last_login);
+
+ if (fcntl(last_fd, F_SETLK, &last_lock) < 0) {
+ D(("locking %s failed..(waiting a little)", _PATH_LASTLOG));
+ pam_syslog(pamh, LOG_WARNING, "file %s is locked/write", _PATH_LASTLOG);
+ sleep(LASTLOG_IGNORE_LOCK_TIME);
+ }
+
+ D(("writing to the lastlog file"));
+ if (pam_modutil_write (last_fd, (char *) &last_login,
+ sizeof (last_login)) != sizeof(last_login)) {
+ pam_syslog(pamh, LOG_ERR, "failed to write %s: %m", _PATH_LASTLOG);
+ retval = PAM_SERVICE_ERR;
}
- /* reset the last login structure */
+ last_lock.l_type = F_UNLCK;
+ (void) fcntl(last_fd, F_SETLK, &last_lock); /* unlock */
+ D(("unlocked"));
+
+ if (announce & LASTLOG_WTMP) {
+ /* write wtmp entry for user */
+ logwtmp(last_login.ll_line, user, remote_host);
+ }
+
+ /* cleanup */
memset(&last_login, 0, sizeof(last_login));
return retval;
}
+static int
+last_login_date(pam_handle_t *pamh, int announce, uid_t uid, const char *user)
+{
+ int rc_read, rc_write;
+ int last_fd;
+
+ /* obtain the last login date and all the relevant info */
+ last_fd = open(_PATH_LASTLOG, O_RDWR);
+ if (last_fd < 0) {
+ pam_syslog(pamh, LOG_ERR, "unable to open %s: %m", _PATH_LASTLOG);
+ D(("unable to open %s file", _PATH_LASTLOG));
+ return PAM_SERVICE_ERR;
+ }
+
+ if (lseek(last_fd, sizeof(struct lastlog) * (off_t) uid, SEEK_SET) < 0) {
+ pam_syslog(pamh, LOG_ERR, "failed to lseek %s: %m", _PATH_LASTLOG);
+ D(("unable to lseek %s file", _PATH_LASTLOG));
+ return PAM_SERVICE_ERR;
+ }
+
+ rc_read = last_login_read(pamh, announce, last_fd, uid);
+ rc_write = last_login_write(pamh, announce, last_fd, uid, user);
+
+ close(last_fd);
+ D(("all done with last login"));
+
+ if (rc_write != PAM_SUCCESS)
+ return rc_write;
+ else
+ return rc_read;
+}
+
/* --- authentication management functions (only) --- */
-PAM_EXTERN
-int pam_sm_open_session(pam_handle_t *pamh, int flags, int argc
- , const char **argv)
+PAM_EXTERN int
+pam_sm_open_session(pam_handle_t *pamh, int flags,
+ int argc, const char **argv)
{
int retval, ctrl;
const void *user;
@@ -356,14 +385,14 @@ int pam_sm_open_session(pam_handle_t *pamh, int flags, int argc
pwd = pam_modutil_getpwnam (pamh, user);
if (pwd == NULL) {
D(("couldn't identify user %s", user));
- return PAM_CRED_INSUFFICIENT;
+ return PAM_USER_UNKNOWN;
}
uid = pwd->pw_uid;
pwd = NULL; /* tidy up */
/* process the current login attempt (indicate last) */
- retval = last_login_date(pamh, ctrl, uid);
+ retval = last_login_date(pamh, ctrl, uid, user);
/* indicate success or failure */
@@ -373,9 +402,19 @@ int pam_sm_open_session(pam_handle_t *pamh, int flags, int argc
}
PAM_EXTERN int
-pam_sm_close_session (pam_handle_t *pamh UNUSED, int flags UNUSED,
- int argc UNUSED, const char **argv UNUSED)
+pam_sm_close_session (pam_handle_t *pamh, int flags,
+ int argc, const char **argv)
{
+ const char *terminal_line;
+
+ if (!(_pam_parse(pamh, flags, argc, argv) & LASTLOG_WTMP))
+ return PAM_SUCCESS;
+
+ terminal_line = get_tty(pamh);
+
+ /* Wipe out utmp logout entry */
+ logwtmp(terminal_line, "", "");
+
return PAM_SUCCESS;
}
diff --git a/po/Linux-PAM.pot b/po/Linux-PAM.pot
index 5ff58f16..e6f80f36 100644
--- a/po/Linux-PAM.pot
+++ b/po/Linux-PAM.pot
@@ -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: 2005-09-20 18:30+0200\n"
+"POT-Creation-Date: 2005-09-21 12:48+0200\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"
@@ -53,6 +53,28 @@ msgstr ""
msgid "%s: Can't reset all users to non-zero\n"
msgstr ""
+#. TRANSLATORS: " from <host>"
+#: modules/pam_lastlog/pam_lastlog.c:204
+#, c-format
+msgid " from %.*s"
+msgstr ""
+
+#. TRANSLATORS: " on <terminal>"
+#: modules/pam_lastlog/pam_lastlog.c:215
+#, c-format
+msgid " on %.*s"
+msgstr ""
+
+#. TRANSLATORS: "Last login: <date> from <host> on <terminal>"
+#: modules/pam_lastlog/pam_lastlog.c:223
+#, c-format
+msgid "Last login:%s%s%s"
+msgstr ""
+
+#: modules/pam_lastlog/pam_lastlog.c:229
+msgid "Welcome to your new account!"
+msgstr ""
+
#: modules/pam_limits/pam_limits.c:658
#, c-format
msgid "Too many logins for '%s'."
diff --git a/po/cs.po b/po/cs.po
index 26c18d5c..5e4a3756 100644
--- 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: 2005-09-20 18:30+0200\n"
+"POT-Creation-Date: 2005-09-21 12:48+0200\n"
"PO-Revision-Date: 2005-08-24 13:58+0200\n"
"Last-Translator: Tomas Mraz <t8m@centrum.cz>\n"
"Language-Team: cs_CZ <cs@li.org>\n"
@@ -56,6 +56,28 @@ msgstr ""
msgid "%s: Can't reset all users to non-zero\n"
msgstr "%s: Nelze resetovat všechny uživatele nenulově\n"
+#. TRANSLATORS: " from <host>"
+#: modules/pam_lastlog/pam_lastlog.c:204
+#, c-format
+msgid " from %.*s"
+msgstr ""
+
+#. TRANSLATORS: " on <terminal>"
+#: modules/pam_lastlog/pam_lastlog.c:215
+#, c-format
+msgid " on %.*s"
+msgstr ""
+
+#. TRANSLATORS: "Last login: <date> from <host> on <terminal>"
+#: modules/pam_lastlog/pam_lastlog.c:223
+#, c-format
+msgid "Last login:%s%s%s"
+msgstr ""
+
+#: modules/pam_lastlog/pam_lastlog.c:229
+msgid "Welcome to your new account!"
+msgstr ""
+
#: modules/pam_limits/pam_limits.c:658
#, c-format
msgid "Too many logins for '%s'."
diff --git a/po/de.po b/po/de.po
index 3cfe48e4..95591f80 100644
--- 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: 2005-09-20 18:30+0200\n"
+"POT-Creation-Date: 2005-09-21 12:48+0200\n"
"PO-Revision-Date: 2005-09-14 19:44+02:00\n"
"Last-Translator: Novell Language <language@novell.com>\n"
"Language-Team: Novell Language <language@novell.com>\n"
@@ -54,6 +54,28 @@ msgid "%s: Can't reset all users to non-zero\n"
msgstr ""
"%s: Es können nicht alle Benutzer auf Nicht-null zurückgesetzt werden\n"
+#. TRANSLATORS: " from <host>"
+#: modules/pam_lastlog/pam_lastlog.c:204
+#, c-format
+msgid " from %.*s"
+msgstr ""
+
+#. TRANSLATORS: " on <terminal>"
+#: modules/pam_lastlog/pam_lastlog.c:215
+#, c-format
+msgid " on %.*s"
+msgstr ""
+
+#. TRANSLATORS: "Last login: <date> from <host> on <terminal>"
+#: modules/pam_lastlog/pam_lastlog.c:223
+#, c-format
+msgid "Last login:%s%s%s"
+msgstr ""
+
+#: modules/pam_lastlog/pam_lastlog.c:229
+msgid "Welcome to your new account!"
+msgstr ""
+
#: modules/pam_limits/pam_limits.c:658
#, c-format
msgid "Too many logins for '%s'."
diff --git a/po/es.po b/po/es.po
index 1857b3be..cd297195 100644
--- 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: 2005-09-20 18:30+0200\n"
+"POT-Creation-Date: 2005-09-21 12:48+0200\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"
@@ -56,6 +56,28 @@ msgstr ""
"%s: No es posible restaurar a todos los usuarios a un número distinto de "
"cero\n"
+#. TRANSLATORS: " from <host>"
+#: modules/pam_lastlog/pam_lastlog.c:204
+#, c-format
+msgid " from %.*s"
+msgstr ""
+
+#. TRANSLATORS: " on <terminal>"
+#: modules/pam_lastlog/pam_lastlog.c:215
+#, c-format
+msgid " on %.*s"
+msgstr ""
+
+#. TRANSLATORS: "Last login: <date> from <host> on <terminal>"
+#: modules/pam_lastlog/pam_lastlog.c:223
+#, c-format
+msgid "Last login:%s%s%s"
+msgstr ""
+
+#: modules/pam_lastlog/pam_lastlog.c:229
+msgid "Welcome to your new account!"
+msgstr ""
+
#: modules/pam_limits/pam_limits.c:658
#, c-format
msgid "Too many logins for '%s'."
diff --git a/po/fi.po b/po/fi.po
index 8057a2e9..fc07cb50 100644
--- a/po/fi.po
+++ b/po/fi.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: 2005-09-20 18:30+0200\n"
+"POT-Creation-Date: 2005-09-21 12:48+0200\n"
"PO-Revision-Date: 2005-09-17 12:27+0300\n"
"Last-Translator: Ilkka Pirskanen <ilkka.pirskanen@kolumbus.fi>\n"
"Language-Team: Finnish <fi@li.org>\n"
@@ -55,6 +55,28 @@ msgstr ""
msgid "%s: Can't reset all users to non-zero\n"
msgstr "%s: Ei voida palauttaa kaikkia käyttäjiä ei-nolliksi\n"
+#. TRANSLATORS: " from <host>"
+#: modules/pam_lastlog/pam_lastlog.c:204
+#, c-format
+msgid " from %.*s"
+msgstr ""
+
+#. TRANSLATORS: " on <terminal>"
+#: modules/pam_lastlog/pam_lastlog.c:215
+#, c-format
+msgid " on %.*s"
+msgstr ""
+
+#. TRANSLATORS: "Last login: <date> from <host> on <terminal>"
+#: modules/pam_lastlog/pam_lastlog.c:223
+#, c-format
+msgid "Last login:%s%s%s"
+msgstr ""
+
+#: modules/pam_lastlog/pam_lastlog.c:229
+msgid "Welcome to your new account!"
+msgstr ""
+
#: modules/pam_limits/pam_limits.c:658
#, c-format
msgid "Too many logins for '%s'."
diff --git a/po/fr.po b/po/fr.po
index 7deb756b..fb1e4dc5 100644
--- 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: 2005-09-20 18:30+0200\n"
+"POT-Creation-Date: 2005-09-21 12:48+0200\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"
@@ -53,6 +53,28 @@ msgstr ""
msgid "%s: Can't reset all users to non-zero\n"
msgstr "%s: Impossible de réinitialiser tous les utilisateurs à non-zéro\n"
+#. TRANSLATORS: " from <host>"
+#: modules/pam_lastlog/pam_lastlog.c:204
+#, c-format
+msgid " from %.*s"
+msgstr ""
+
+#. TRANSLATORS: " on <terminal>"
+#: modules/pam_lastlog/pam_lastlog.c:215
+#, c-format
+msgid " on %.*s"
+msgstr ""
+
+#. TRANSLATORS: "Last login: <date> from <host> on <terminal>"
+#: modules/pam_lastlog/pam_lastlog.c:223
+#, c-format
+msgid "Last login:%s%s%s"
+msgstr ""
+
+#: modules/pam_lastlog/pam_lastlog.c:229
+msgid "Welcome to your new account!"
+msgstr ""
+
#: modules/pam_limits/pam_limits.c:658
#, c-format
msgid "Too many logins for '%s'."
diff --git a/po/hu.po b/po/hu.po
index 63e70524..205b2ce4 100644
--- a/po/hu.po
+++ b/po/hu.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Linux-PAM 0.80\n"
"Report-Msgid-Bugs-To: http://sourceforge.net/projects/pam\n"
-"POT-Creation-Date: 2005-09-20 18:30+0200\n"
+"POT-Creation-Date: 2005-09-21 12:48+0200\n"
"PO-Revision-Date: 2005-08-07 02:59+0100\n"
"Last-Translator: Szabolcs Varga <shirokuma@shirokuma.hu>\n"
"Language-Team: hu\n"
@@ -53,6 +53,28 @@ msgstr ""
msgid "%s: Can't reset all users to non-zero\n"
msgstr "%s: Nem állítható vissza minden felhasználó nem nullára\n"
+#. TRANSLATORS: " from <host>"
+#: modules/pam_lastlog/pam_lastlog.c:204
+#, c-format
+msgid " from %.*s"
+msgstr ""
+
+#. TRANSLATORS: " on <terminal>"
+#: modules/pam_lastlog/pam_lastlog.c:215
+#, c-format
+msgid " on %.*s"
+msgstr ""
+
+#. TRANSLATORS: "Last login: <date> from <host> on <terminal>"
+#: modules/pam_lastlog/pam_lastlog.c:223
+#, c-format
+msgid "Last login:%s%s%s"
+msgstr ""
+
+#: modules/pam_lastlog/pam_lastlog.c:229
+msgid "Welcome to your new account!"
+msgstr ""
+
#: modules/pam_limits/pam_limits.c:658
#, c-format
msgid "Too many logins for '%s'."
diff --git a/po/it.po b/po/it.po
index d7afab42..8b94b63d 100644
--- 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: 2005-09-20 18:30+0200\n"
+"POT-Creation-Date: 2005-09-21 12:48+0200\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"
@@ -54,6 +54,28 @@ msgid "%s: Can't reset all users to non-zero\n"
msgstr ""
"%s: Impossibile ripristinare tutti gli utenti a valori diversi da zero\n"
+#. TRANSLATORS: " from <host>"
+#: modules/pam_lastlog/pam_lastlog.c:204
+#, c-format
+msgid " from %.*s"
+msgstr ""
+
+#. TRANSLATORS: " on <terminal>"
+#: modules/pam_lastlog/pam_lastlog.c:215
+#, c-format
+msgid " on %.*s"
+msgstr ""
+
+#. TRANSLATORS: "Last login: <date> from <host> on <terminal>"
+#: modules/pam_lastlog/pam_lastlog.c:223
+#, c-format
+msgid "Last login:%s%s%s"
+msgstr ""
+
+#: modules/pam_lastlog/pam_lastlog.c:229
+msgid "Welcome to your new account!"
+msgstr ""
+
#: modules/pam_limits/pam_limits.c:658
#, c-format
msgid "Too many logins for '%s'."
diff --git a/po/ja.po b/po/ja.po
index 83b0ec42..44d71db2 100644
--- 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: 2005-09-20 18:30+0200\n"
+"POT-Creation-Date: 2005-09-21 12:48+0200\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"
@@ -53,6 +53,28 @@ msgstr ""
msgid "%s: Can't reset all users to non-zero\n"
msgstr "%s: すべてのユーザを非ゼロにリセットできません\n"
+#. TRANSLATORS: " from <host>"
+#: modules/pam_lastlog/pam_lastlog.c:204
+#, c-format
+msgid " from %.*s"
+msgstr ""
+
+#. TRANSLATORS: " on <terminal>"
+#: modules/pam_lastlog/pam_lastlog.c:215
+#, c-format
+msgid " on %.*s"
+msgstr ""
+
+#. TRANSLATORS: "Last login: <date> from <host> on <terminal>"
+#: modules/pam_lastlog/pam_lastlog.c:223
+#, c-format
+msgid "Last login:%s%s%s"
+msgstr ""
+
+#: modules/pam_lastlog/pam_lastlog.c:229
+msgid "Welcome to your new account!"
+msgstr ""
+
#: modules/pam_limits/pam_limits.c:658
#, c-format
msgid "Too many logins for '%s'."
diff --git a/po/nb.po b/po/nb.po
index 5e4a2792..2f280a7b 100644
--- 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: 2005-09-20 18:30+0200\n"
+"POT-Creation-Date: 2005-09-21 12:48+0200\n"
"PO-Revision-Date: 2005-08-13 22:44+0200\n"
"Last-Translator: Olav Pettershagen <olav.pet@online.no>\n"
"Language-Team: <nb@li.org>\n"
@@ -54,6 +54,28 @@ msgstr ""
msgid "%s: Can't reset all users to non-zero\n"
msgstr "%s: Kan ikke tilbakestille alle brukere til non-zero\n"
+#. TRANSLATORS: " from <host>"
+#: modules/pam_lastlog/pam_lastlog.c:204
+#, c-format
+msgid " from %.*s"
+msgstr ""
+
+#. TRANSLATORS: " on <terminal>"
+#: modules/pam_lastlog/pam_lastlog.c:215
+#, c-format
+msgid " on %.*s"
+msgstr ""
+
+#. TRANSLATORS: "Last login: <date> from <host> on <terminal>"
+#: modules/pam_lastlog/pam_lastlog.c:223
+#, c-format
+msgid "Last login:%s%s%s"
+msgstr ""
+
+#: modules/pam_lastlog/pam_lastlog.c:229
+msgid "Welcome to your new account!"
+msgstr ""
+
#: modules/pam_limits/pam_limits.c:658
#, c-format
msgid "Too many logins for '%s'."
diff --git a/po/pa.po b/po/pa.po
index 6450cec4..81e54344 100644
--- 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: 2005-09-20 18:30+0200\n"
+"POT-Creation-Date: 2005-09-21 12:48+0200\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"
@@ -56,6 +56,28 @@ msgstr ""
msgid "%s: Can't reset all users to non-zero\n"
msgstr ""
+#. TRANSLATORS: " from <host>"
+#: modules/pam_lastlog/pam_lastlog.c:204
+#, c-format
+msgid " from %.*s"
+msgstr ""
+
+#. TRANSLATORS: " on <terminal>"
+#: modules/pam_lastlog/pam_lastlog.c:215
+#, c-format
+msgid " on %.*s"
+msgstr ""
+
+#. TRANSLATORS: "Last login: <date> from <host> on <terminal>"
+#: modules/pam_lastlog/pam_lastlog.c:223
+#, c-format
+msgid "Last login:%s%s%s"
+msgstr ""
+
+#: modules/pam_lastlog/pam_lastlog.c:229
+msgid "Welcome to your new account!"
+msgstr ""
+
#: modules/pam_limits/pam_limits.c:658
#, c-format
msgid "Too many logins for '%s'."
diff --git a/po/pl.po b/po/pl.po
index e5320a31..076a8413 100644
--- 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: 2005-09-20 18:30+0200\n"
+"POT-Creation-Date: 2005-09-21 12:48+0200\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"
@@ -53,6 +53,28 @@ msgstr ""
msgid "%s: Can't reset all users to non-zero\n"
msgstr "%s: Nie można zresetować wszystkich użytkowników\n"
+#. TRANSLATORS: " from <host>"
+#: modules/pam_lastlog/pam_lastlog.c:204
+#, c-format
+msgid " from %.*s"
+msgstr ""
+
+#. TRANSLATORS: " on <terminal>"
+#: modules/pam_lastlog/pam_lastlog.c:215
+#, c-format
+msgid " on %.*s"
+msgstr ""
+
+#. TRANSLATORS: "Last login: <date> from <host> on <terminal>"
+#: modules/pam_lastlog/pam_lastlog.c:223
+#, c-format
+msgid "Last login:%s%s%s"
+msgstr ""
+
+#: modules/pam_lastlog/pam_lastlog.c:229
+msgid "Welcome to your new account!"
+msgstr ""
+
#: modules/pam_limits/pam_limits.c:658
#, c-format
msgid "Too many logins for '%s'."
diff --git a/po/pt.po b/po/pt.po
index baf513a0..3bde46f3 100644
--- 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: 2005-09-20 18:30+0200\n"
+"POT-Creation-Date: 2005-09-21 12:48+0200\n"
"PO-Revision-Date: 2005-08-07 00:41+0100\n"
"Last-Translator: Antonio Cardoso Martins <digiplan@netvisao.pt>\n"
"Language-Team: portuguese\n"
@@ -54,6 +54,28 @@ msgstr ""
msgid "%s: Can't reset all users to non-zero\n"
msgstr "%s: Não foi possível reiniciar todos os utilizadores para não zero\n"
+#. TRANSLATORS: " from <host>"
+#: modules/pam_lastlog/pam_lastlog.c:204
+#, c-format
+msgid " from %.*s"
+msgstr ""
+
+#. TRANSLATORS: " on <terminal>"
+#: modules/pam_lastlog/pam_lastlog.c:215
+#, c-format
+msgid " on %.*s"
+msgstr ""
+
+#. TRANSLATORS: "Last login: <date> from <host> on <terminal>"
+#: modules/pam_lastlog/pam_lastlog.c:223
+#, c-format
+msgid "Last login:%s%s%s"
+msgstr ""
+
+#: modules/pam_lastlog/pam_lastlog.c:229
+msgid "Welcome to your new account!"
+msgstr ""
+
#: modules/pam_limits/pam_limits.c:658
#, c-format
msgid "Too many logins for '%s'."
diff --git a/po/pt_BR.po b/po/pt_BR.po
index 6aea1ba9..3f01e299 100644
--- a/po/pt_BR.po
+++ b/po/pt_BR.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: 2005-09-20 18:30+0200\n"
+"POT-Creation-Date: 2005-09-21 12:48+0200\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"
@@ -53,6 +53,28 @@ msgstr ""
msgid "%s: Can't reset all users to non-zero\n"
msgstr "%s: Impossível redefinir todos os usuários para não-zero\n"
+#. TRANSLATORS: " from <host>"
+#: modules/pam_lastlog/pam_lastlog.c:204
+#, c-format
+msgid " from %.*s"
+msgstr ""
+
+#. TRANSLATORS: " on <terminal>"
+#: modules/pam_lastlog/pam_lastlog.c:215
+#, c-format
+msgid " on %.*s"
+msgstr ""
+
+#. TRANSLATORS: "Last login: <date> from <host> on <terminal>"
+#: modules/pam_lastlog/pam_lastlog.c:223
+#, c-format
+msgid "Last login:%s%s%s"
+msgstr ""
+
+#: modules/pam_lastlog/pam_lastlog.c:229
+msgid "Welcome to your new account!"
+msgstr ""
+
#: modules/pam_limits/pam_limits.c:658
#, c-format
msgid "Too many logins for '%s'."
diff --git a/po/zh_CN.po b/po/zh_CN.po
index 3c9420ab..a2b9932c 100644
--- a/po/zh_CN.po
+++ b/po/zh_CN.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: 2005-09-20 18:30+0200\n"
+"POT-Creation-Date: 2005-09-21 12:48+0200\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"
@@ -52,6 +52,28 @@ msgstr "%s: [--文件 根文件名] [--用户 用户名] [--重设置[=n]] [--
msgid "%s: Can't reset all users to non-zero\n"
msgstr "%s: 无法将所有用户重设置为非零\n"
+#. TRANSLATORS: " from <host>"
+#: modules/pam_lastlog/pam_lastlog.c:204
+#, c-format
+msgid " from %.*s"
+msgstr ""
+
+#. TRANSLATORS: " on <terminal>"
+#: modules/pam_lastlog/pam_lastlog.c:215
+#, c-format
+msgid " on %.*s"
+msgstr ""
+
+#. TRANSLATORS: "Last login: <date> from <host> on <terminal>"
+#: modules/pam_lastlog/pam_lastlog.c:223
+#, c-format
+msgid "Last login:%s%s%s"
+msgstr ""
+
+#: modules/pam_lastlog/pam_lastlog.c:229
+msgid "Welcome to your new account!"
+msgstr ""
+
#: modules/pam_limits/pam_limits.c:658
#, c-format
msgid "Too many logins for '%s'."
diff --git a/po/zh_TW.po b/po/zh_TW.po
index 615acc0c..973a58f4 100644
--- a/po/zh_TW.po
+++ b/po/zh_TW.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: 2005-09-20 18:30+0200\n"
+"POT-Creation-Date: 2005-09-21 12:48+0200\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"
@@ -53,6 +53,28 @@ msgstr ""
msgid "%s: Can't reset all users to non-zero\n"
msgstr "%s: 無法將所有使用者重新設定為非零\n"
+#. TRANSLATORS: " from <host>"
+#: modules/pam_lastlog/pam_lastlog.c:204
+#, c-format
+msgid " from %.*s"
+msgstr ""
+
+#. TRANSLATORS: " on <terminal>"
+#: modules/pam_lastlog/pam_lastlog.c:215
+#, c-format
+msgid " on %.*s"
+msgstr ""
+
+#. TRANSLATORS: "Last login: <date> from <host> on <terminal>"
+#: modules/pam_lastlog/pam_lastlog.c:223
+#, c-format
+msgid "Last login:%s%s%s"
+msgstr ""
+
+#: modules/pam_lastlog/pam_lastlog.c:229
+msgid "Welcome to your new account!"
+msgstr ""
+
#: modules/pam_limits/pam_limits.c:658
#, c-format
msgid "Too many logins for '%s'."