[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [PATCH] daemons/getty: display /etc/issue if available
From: |
Samuel Thibault |
Subject: |
Re: [PATCH] daemons/getty: display /etc/issue if available |
Date: |
Fri, 31 Jan 2014 19:45:16 +0100 |
User-agent: |
Mutt/1.5.21+34 (58baf7c9f32f) (2010-12-30) |
Justus Winter, le Wed 29 Jan 2014 02:36:12 +0100, a écrit :
> Previously, a banner was hardcoded in Hurds getty. Load /etc/issue
> instead. Fall back to a hardcoded version if that fails. Expand
> common \char sequences. If no /etc/issue is provided, the old
> behavior is retained.
>
> * daemons/getty.c (load_banner): New function.
> (print_banner): Expand \char sequences.
Ack.
> ---
> daemons/getty.c | 86
> ++++++++++++++++++++++++++++++++++++++++++++++++++++-----
> 1 file changed, 79 insertions(+), 7 deletions(-)
>
> diff --git a/daemons/getty.c b/daemons/getty.c
> index 5a2896d..7112660 100644
> --- a/daemons/getty.c
> +++ b/daemons/getty.c
> @@ -1,6 +1,7 @@
> /* Stubby version of getty for Hurd
>
> - Copyright (C) 1996, 1998, 1999, 2007 Free Software Foundation, Inc.
> + Copyright (C) 1996, 1998, 1999, 2007, 2014
> + Free Software Foundation, Inc.
>
> Written by Michael I. Bushnell, p/BSG.
>
> @@ -39,6 +40,7 @@
> extern char *localhost ();
>
> #define _PATH_LOGIN "/bin/login"
> +#define _PATH_ISSUE "/etc/issue"
>
> /* Parse the terminal speed. */
> static void
> @@ -59,22 +61,92 @@ set_speed (int tty, char *speedstr)
> tcsetattr (tty, TCSAFLUSH, &ttystat);
> }
>
> +/* Load a banner from _PATH_ISSUE. If that fails, a built-in version
> + is provided. */
> +static char *
> +load_banner (void)
> +{
> + char *buf = NULL, *p;
> + struct stat st;
> + int fd;
> + ssize_t remaining, count;
> +
> + fd = open (_PATH_ISSUE, O_RDONLY);
> + if (fd == -1)
> + goto out;
> +
> + if (fstat (fd, &st) == -1)
> + goto out;
> +
> + buf = malloc (st.st_size + 1);
> + if (buf == NULL)
> + goto out;
> +
> + remaining = st.st_size;
> + p = buf;
> + while (remaining > 0)
> + {
> + count = read (fd, p, remaining);
> + if (count == -1)
> + {
> + close (fd);
> + goto out;
> + }
> + p += count;
> + remaining -= count;
> + }
> +
> + buf[st.st_size] = '\0';
> + close (fd);
> + return buf;
> +
> + out:
> + free (buf);
> + return "\r\n\n\\s \\r (\\n) (\\l)\r\n\n";
> +}
>
> /* Print a suitable welcome banner */
> static void
> print_banner (int fd, char *ttyname)
> {
> - int cc;
> - char *s;
> + char *s, *t, *expansion;
> struct utsname u;
> - char *hostname = localhost ();
>
> if (uname (&u))
> u.sysname[0] = u.release[0] = '\0';
>
> - cc = asprintf (&s, "\r\n\n%s %s (%s) (%s)\r\n\n",
> - u.sysname, u.release, hostname ?: "?", basename (ttyname));
> - write (fd, s, cc);
> + for (s = load_banner (); *s; s++)
> + {
> + for (t = s; *t && *t != '\\'; t++) /* nomnomnom */;
> +
> + write (fd, s, t - s);
> + if (! *t)
> + return;
> +
> + switch (*(t + 1))
> + {
> + case '\\':
> + expansion = "\\";
> + break;
> + case 's':
> + expansion = u.sysname;
> + break;
> + case 'r':
> + expansion = u.release;
> + break;
> + case 'n':
> + expansion = localhost () ?: "?";
> + break;
> + case 'l':
> + expansion = basename (ttyname);
> + break;
> + default:
> + expansion = "?";
> + }
> + write (fd, expansion, strlen (expansion));
> +
> + s = t + 1;
> + }
> }
>
> int
> --
> 1.8.5.2
>
--
Samuel
(03:13:14) <j> bon
(03:13:19) <j> il est tard :p
(03:13:25) <g> c'est l'heure de manger
(03:13:38) <j> hm j'ai mangé à 1h moi, j'ai des horaires raisonnables