9d84b2
diff -up util-linux-2.23.2/include/pathnames.h.kzak util-linux-2.23.2/include/pathnames.h
9d84b2
--- util-linux-2.23.2/include/pathnames.h.kzak	2013-07-30 10:39:26.201738190 +0200
9d84b2
+++ util-linux-2.23.2/include/pathnames.h	2013-09-12 13:05:35.928359383 +0200
9d84b2
@@ -63,6 +63,7 @@
9d84b2
 
9d84b2
 /* used in term-utils/agetty.c */
9d84b2
 #define _PATH_ISSUE		"/etc/issue"
9d84b2
+#define _PATH_OS_RELEASE	"/etc/os-release"
9d84b2
 #define _PATH_NUMLOCK_ON	_PATH_LOCALSTATEDIR "/numlock-on"
9d84b2
 
9d84b2
 #define _PATH_LOGINDEFS		"/etc/login.defs"
9d84b2
diff -up util-linux-2.23.2/term-utils/agetty.8.kzak util-linux-2.23.2/term-utils/agetty.8
9d84b2
--- util-linux-2.23.2/term-utils/agetty.8.kzak	2013-07-30 10:58:20.889261333 +0200
9d84b2
+++ util-linux-2.23.2/term-utils/agetty.8	2013-09-12 13:05:35.928359383 +0200
9d84b2
@@ -310,6 +310,14 @@ Insert the current date.
9d84b2
 .TP
9d84b2
 s
9d84b2
 Insert the system name, the name of the operating system. Same as `uname \-s'.
9d84b2
+See also \\S escape code.
9d84b2
+.TP
9d84b2
+S or S{VARIABLE}
9d84b2
+Insert the VARIABLE data from \fI/etc/os-release\fP.  If the VARIABLE argument
9d84b2
+is not specified then use PRETTY_NAME from the file or the system name (see \\s).
9d84b2
+This escape code allows to keep \fI/etc/issue\fP distribution and release
9d84b2
+independent.  Note that \\S{ANSI_COLOR} is converted to the real terminal
9d84b2
+escape sequence.
9d84b2
 .TP
9d84b2
 l
9d84b2
 Insert the name of the current tty line.
9d84b2
@@ -368,11 +376,14 @@ the system status file.
9d84b2
 .B /etc/issue
9d84b2
 printed before the login prompt.
9d84b2
 .TP
9d84b2
+.B /etc/os-release
9d84b2
+operating system identification data.
9d84b2
+.TP
9d84b2
 .B /dev/console
9d84b2
 problem reports (if syslog(3) is not used).
9d84b2
 .TP
9d84b2
 .B /etc/inittab
9d84b2
-\fIinit\fP(8) configuration file.
9d84b2
+\fIinit\fP(8) configuration file for SysV-style init daemon.
9d84b2
 .SH BUGS
9d84b2
 .ad
9d84b2
 .fi
9d84b2
diff -up util-linux-2.23.2/term-utils/agetty.c.kzak util-linux-2.23.2/term-utils/agetty.c
9d84b2
--- util-linux-2.23.2/term-utils/agetty.c.kzak	2013-09-12 13:05:35.927359379 +0200
9d84b2
+++ util-linux-2.23.2/term-utils/agetty.c	2013-09-12 13:05:35.929359388 +0200
9d84b2
@@ -129,6 +129,7 @@ struct options {
9d84b2
 	char *issue;			/* alternative issue file */
9d84b2
 	char *erasechars;		/* string with erase chars */
9d84b2
 	char *killchars;		/* string with kill chars */
9d84b2
+	char *osrelease;		/* /etc/os-release data */
9d84b2
 	int delay;			/* Sleep seconds before prompt */
9d84b2
 	int nice;			/* Run login with this priority */
9d84b2
 	int numspeed;			/* number of baud rates to try */
9d84b2
@@ -431,7 +432,8 @@ int main(int argc, char **argv)
9d84b2
 			log_warn(_("%s: can't change process priority: %m"),
9d84b2
 				options.tty);
9d84b2
 	}
9d84b2
-
9d84b2
+	if (options.osrelease)
9d84b2
+		free(options.osrelease);
9d84b2
 #ifdef DEBUGGING
9d84b2
 	fprintf(dbf, "read %c\n", ch);
9d84b2
 	if (close_stream(dbf) != 0)
9d84b2
@@ -1279,6 +1281,84 @@ static char *xgetdomainname(void)
9d84b2
 	return NULL;
9d84b2
 }
9d84b2
 
9d84b2
+static char *read_os_release(struct options *op, const char *varname)
9d84b2
+{
9d84b2
+	int fd = -1;
9d84b2
+	struct stat st;
9d84b2
+	size_t varsz = strlen(varname);
9d84b2
+	char *p, *buf = NULL, *ret = NULL;
9d84b2
+
9d84b2
+	/* read the file only once */
9d84b2
+	if (!op->osrelease) {
9d84b2
+		fd = open(_PATH_OS_RELEASE, O_RDONLY);
9d84b2
+		if (fd == -1) {
9d84b2
+			log_warn(_("cannot open: %s: %m"), _PATH_OS_RELEASE);
9d84b2
+			return NULL;
9d84b2
+		}
9d84b2
+
9d84b2
+		if (fstat(fd, &st) < 0 || st.st_size > 4 * 1024 * 1024)
9d84b2
+			goto done;
9d84b2
+
9d84b2
+		op->osrelease = malloc(st.st_size + 1);
9d84b2
+		if (!op->osrelease)
9d84b2
+			log_err(_("failed to allocate memory: %m"));
9d84b2
+		if (read_all(fd, op->osrelease, st.st_size) != (ssize_t) st.st_size) {
9d84b2
+			free(op->osrelease);
9d84b2
+			op->osrelease = NULL;
9d84b2
+			goto done;
9d84b2
+		}
9d84b2
+		op->osrelease[st.st_size] = 0;
9d84b2
+	}
9d84b2
+	buf = strdup(op->osrelease);
9d84b2
+	if (!buf)
9d84b2
+		log_err(_("failed to allocate memory: %m"));
9d84b2
+	p = buf;
9d84b2
+
9d84b2
+	for (;;) {
9d84b2
+		char *eol, *eon;
9d84b2
+
9d84b2
+		p += strspn(p, "\n\r");
9d84b2
+		p += strspn(p, " \t\n\r");
9d84b2
+		if (!*p)
9d84b2
+			break;
9d84b2
+		if (strspn(p, "#;\n") != 0) {
9d84b2
+			p += strcspn(p, "\n\r");
9d84b2
+			continue;
9d84b2
+		}
9d84b2
+		if (strncmp(p, varname, varsz) != 0) {
9d84b2
+			p += strcspn(p, "\n\r");
9d84b2
+			continue;
9d84b2
+		}
9d84b2
+		p += varsz;
9d84b2
+		p += strspn(p, " \t\n\r=\"");
9d84b2
+		eol = p + strcspn(p, "\n\r");
9d84b2
+		*eol = '\0';
9d84b2
+		eon = eol-1;
9d84b2
+		while (eon > p) {
9d84b2
+			if (*eon == '\t' || *eon == ' ') {
9d84b2
+				eon--;
9d84b2
+				continue;
9d84b2
+			}
9d84b2
+			if (*eon == '"') {
9d84b2
+				*eon = '\0';
9d84b2
+				break;
9d84b2
+			}
9d84b2
+			break;
9d84b2
+		}
9d84b2
+		if (ret)
9d84b2
+			free(ret);
9d84b2
+		ret = strdup(p);
9d84b2
+		if (!ret)
9d84b2
+			log_err(_("failed to allocate memory: %m"));
9d84b2
+		p = eol + 1;
9d84b2
+	}
9d84b2
+done:
9d84b2
+	free(buf);
9d84b2
+	if (fd >= 0)
9d84b2
+		close(fd);
9d84b2
+	return ret;
9d84b2
+}
9d84b2
+
9d84b2
 /* Show login prompt, optionally preceded by /etc/issue contents. */
9d84b2
 static void do_prompt(struct options *op, struct termios *tp)
9d84b2
 {
9d84b2
@@ -1968,6 +2048,24 @@ static void output_special_char(unsigned
9d84b2
 		}
9d84b2
 		break;
9d84b2
 	}
9d84b2
+	case 'S':
9d84b2
+	{
9d84b2
+		char *var = NULL, varname[64];
9d84b2
+
9d84b2
+		if (get_escape_argument(fp, varname, sizeof(varname)))
9d84b2
+			var = read_os_release(op, varname);
9d84b2
+		else if (!(var = read_os_release(op, "PRETTY_NAME")))
9d84b2
+			var = uts.sysname;
9d84b2
+		if (var) {
9d84b2
+			if (strcmp(varname, "ANSI_COLOR") == 0)
9d84b2
+				printf("\033[%sm", var);
9d84b2
+			else
9d84b2
+				printf("%s", var);
9d84b2
+			if (var != uts.sysname)
9d84b2
+				free(var);
9d84b2
+		}
9d84b2
+		break;
9d84b2
+	}
9d84b2
 	case 'u':
9d84b2
 	case 'U':
9d84b2
 	{