summaryrefslogtreecommitdiff
path: root/debian/patches-applied/update-motd
blob: 1018a2963c6e9c4e1e0a8ecf9f845d1e6921e80f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
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-debian/modules/pam_motd/pam_motd.c
===================================================================
--- pam-debian.orig/modules/pam_motd/pam_motd.c	2011-10-10 16:21:50.998512220 -0700
+++ pam-debian/modules/pam_motd/pam_motd.c	2011-10-13 11:35:02.921398033 -0700
@@ -48,14 +48,38 @@
 
 static char default_motd[] = DEFAULT_MOTD;
 
+static 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_ISDIR(st.st_mode)) {
+	if (!system("/usr/bin/env -i PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin 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;
 }