summaryrefslogtreecommitdiff
path: root/debian/patches-applied/update-motd
diff options
context:
space:
mode:
Diffstat (limited to 'debian/patches-applied/update-motd')
-rw-r--r--debian/patches-applied/update-motd98
1 files changed, 98 insertions, 0 deletions
diff --git a/debian/patches-applied/update-motd b/debian/patches-applied/update-motd
new file mode 100644
index 00000000..448e3c14
--- /dev/null
+++ b/debian/patches-applied/update-motd
@@ -0,0 +1,98 @@
+Patch for Ubuntu bug #399071
+
+Provide a more dynamic MOTD, based on the short-lived update-motd project.
+
+Authors: Dustin Kirkland <kirkland@canonical.com>
+
+Upstream status: not yet submitted
+
+Index: pam.deb/modules/pam_motd/pam_motd.c
+===================================================================
+--- pam.deb.orig/modules/pam_motd/pam_motd.c
++++ pam.deb/modules/pam_motd/pam_motd.c
+@@ -48,14 +48,38 @@
+
+ static char default_motd[] = DEFAULT_MOTD;
+
++void display_file(pam_handle_t *pamh, const char *motd_path)
++{
++ int fd;
++ char *mtmp = NULL;
++ while ((fd = open(motd_path, O_RDONLY, 0)) >= 0) {
++ struct stat st;
++ /* fill in message buffer with contents of motd */
++ if ((fstat(fd, &st) < 0) || !st.st_size || st.st_size > 0x10000)
++ break;
++ if (!(mtmp = malloc(st.st_size+1)))
++ break;
++ if (pam_modutil_read(fd, mtmp, st.st_size) != st.st_size)
++ break;
++ if (mtmp[st.st_size-1] == '\n')
++ mtmp[st.st_size-1] = '\0';
++ else
++ mtmp[st.st_size] = '\0';
++ pam_info (pamh, "%s", mtmp);
++ break;
++ }
++ _pam_drop (mtmp);
++ if (fd >= 0)
++ close(fd);
++}
++
+ PAM_EXTERN
+ int pam_sm_open_session(pam_handle_t *pamh, int flags,
+ int argc, const char **argv)
+ {
+ int retval = PAM_IGNORE;
+- int fd;
+ const char *motd_path = NULL;
+- char *mtmp = NULL;
++ struct stat st;
+
+ if (flags & PAM_SILENT) {
+ return retval;
+@@ -80,34 +104,19 @@
+ if (motd_path == NULL)
+ motd_path = default_motd;
+
+- while ((fd = open(motd_path, O_RDONLY, 0)) >= 0) {
+- struct stat st;
+-
+- /* fill in message buffer with contents of motd */
+- if ((fstat(fd, &st) < 0) || !st.st_size || st.st_size > 0x10000)
+- break;
+-
+- if (!(mtmp = malloc(st.st_size+1)))
+- break;
+-
+- if (pam_modutil_read(fd, mtmp, st.st_size) != st.st_size)
+- break;
+-
+- if (mtmp[st.st_size-1] == '\n')
+- mtmp[st.st_size-1] = '\0';
+- else
+- mtmp[st.st_size] = '\0';
+-
+- pam_info (pamh, "%s", mtmp);
+- break;
++ /* Run the update-motd dynamic motd scripts, outputting to /var/run/motd.
++ If /etc/motd -> /var/run/motd, the displayed MOTD will be dynamic.
++ Otherwise, the admin can force a static MOTD by breaking that symlink
++ and publishing into an /etc/motd text file. */
++ if ((stat("/etc/update-motd.d", &st) == 0) && S_IDIR(st.st_mode)) {
++ if (!system("run-parts --lsbsysinit /etc/update-motd.d > /var/run/motd.new"))
++ rename("/var/run/motd.new", "/var/run/motd");
+ }
+
+- _pam_drop (mtmp);
+-
+- if (fd >= 0)
+- close(fd);
++ /* Display the updated motd */
++ display_file(pamh, motd_path);
+
+- return retval;
++ return retval;
+ }
+
+