From: Karel Zak Date: Tue, 19 May 2020 08:55:20 +0000 (+0200) Subject: agetty: extend --issue-file to support multiple paths X-Git-Tag: v2.36-rc1~92 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=e327a7acd60c736c9628264bea844ddac1802a4a;p=thirdparty%2Futil-linux.git agetty: extend --issue-file to support multiple paths The current default behavior is to print the first issue file/dir and all alternative locations are used as a backup solution only. If something is found than the rest is ignored. The --issue-file allow to overwrite this default behavior, but currently it supports only one file/dir. This patch extend --issue-file to support ':' separated list of paths and *all* the files (if exist and no empty) in the list are printed. agetty --issue-file=/etc/issue:/etc/issue.d:/run/issue:/run/issue.d:/usr/lib/issue:/usr/lib/issue.d Addresses: https://github.com/karelzak/util-linux/issues/1041 Signed-off-by: Karel Zak --- diff --git a/login-utils/login.1 b/login-utils/login.1 index 8dc77fa433..69b081b14f 100644 --- a/login-utils/login.1 +++ b/login-utils/login.1 @@ -151,7 +151,7 @@ configuration items are relevant for .B MOTD_FILE (string) .RS 4 -Sepecifies a ":" delimited list of "message of the day" files and directories +Specifies a ":" delimited list of "message of the day" files and directories to be displayed upon login. If the specified path is a directory then displays all files with .motd file extension in version-sort order from the directory. .PP diff --git a/term-utils/agetty.8 b/term-utils/agetty.8 index fd6cf4b440..1ad1cddff0 100644 --- a/term-utils/agetty.8 +++ b/term-utils/agetty.8 @@ -32,7 +32,7 @@ Optionally does not hang up when it is given an already opened line .IP \(bu Optionally does not display the contents of the \fI/etc/issue\fP file. .IP \(bu -Optionally displays an alternative issue file or directory instead of \fI/etc/issue\fP or \fI/etc/issue.d\fP. +Optionally displays an alternative issue files or directories instead of \fI/etc/issue\fP or \fI/etc/issue.d\fP. .IP \(bu Optionally does not ask for a login name. .IP \(bu @@ -117,12 +117,13 @@ is added to the \fB/bin/login\fP command line. .IP See \fB\-\-login\-options\fR. .TP -\-f, \-\-issue\-file \fIfile|directory\fP -Display the contents of \fIfile\fP instead of \fI/etc/issue\fP (or other). If the -specified path is a \fIdirectory\fP then displays all files with .issue file -extension in version-sort order from the directory. This allows custom -messages to be displayed on different terminals. The -\-\-noissue option will override this option. +\-f, \-\-issue\-file \fIpath\fP +Specifies a ":" delimited list of files and directories to be displayed instead +of \fI/etc/issue\fP (or other). All specified files and directories are displayed, +missing or empty files are silently ignored. If the specified path is a +directory then display all files with .issue file extension in version-sort +order from the directory. This allows custom messages to be displayed on +different terminals. The \fB\-\-noissue\fP option will override this option. .TP \-\-show\-issue Display the current issue file (or other) on the current terminal and exit. diff --git a/term-utils/agetty.c b/term-utils/agetty.c index 46f1f24343..73041c5c61 100644 --- a/term-utils/agetty.c +++ b/term-utils/agetty.c @@ -700,6 +700,7 @@ static void output_version(void) static void parse_args(int argc, char **argv, struct options *op) { int c; + int opt_show_issue = 0; enum { VERSION_OPTION = CHAR_MAX + 1, @@ -869,8 +870,7 @@ static void parse_args(int argc, char **argv, struct options *op) list_speeds(); exit(EXIT_SUCCESS); case ISSUE_SHOW_OPTION: - show_issue(op); - exit(EXIT_SUCCESS); + opt_show_issue = 1; break; case VERSION_OPTION: output_version(); @@ -882,6 +882,11 @@ static void parse_args(int argc, char **argv, struct options *op) } } + if (opt_show_issue) { + show_issue(op); + exit(EXIT_SUCCESS); + } + debug("after getopt loop\n"); if (argc < optind + 1) { @@ -1929,24 +1934,32 @@ static void eval_issue_file(struct issue *ie, #endif if (!(op->flags & F_ISSUE)) goto done; - /* - * The custom issue file or directory specified by: agetty -f . + * The custom issue file or directory list specified by: + * agetty --isue-file * Note that nothing is printed if the file/dir does not exist. */ if (op->issue) { - struct stat st; + char *list = strdup(op->issue); + char *file; - if (stat(op->issue, &st) < 0) - goto done; - if (S_ISDIR(st.st_mode)) - issuedir_read(ie, op->issue, op, tp); - else - issuefile_read(ie, op->issue, op, tp); + if (!list) + log_err(_("failed to allocate memory: %m")); + + for (file = strtok(list, ":"); file; file = strtok(NULL, ":")) { + struct stat st; + + if (stat(file, &st) < 0) + continue; + if (S_ISDIR(st.st_mode)) + issuedir_read(ie, file, op, tp); + else + issuefile_read(ie, file, op, tp); + } + free(list); goto done; } - /* The default /etc/issue and optional /etc/issue.d directory as * extension to the file. The /etc/issue.d directory is ignored if * there is no /etc/issue file. The file may be empty or symlink. @@ -2428,7 +2441,7 @@ static void __attribute__((__noreturn__)) usage(void) fputs(_(" -a, --autologin login the specified user automatically\n"), out); fputs(_(" -c, --noreset do not reset control mode\n"), out); fputs(_(" -E, --remote use -r for login(1)\n"), out); - fputs(_(" -f, --issue-file display issue file\n"), out); + fputs(_(" -f, --issue-file display issue files or directories\n"), out); fputs(_(" --show-issue display issue file and exit\n"), out); fputs(_(" -h, --flow-control enable hardware flow control\n"), out); fputs(_(" -H, --host specify login host\n"), out);