Also simplify/depessimize the code a bit. `./toybox getty 300 -` works
for me (including outputting /etc/issue) on Debian after this.

Fixes #508.
---
 toys/pending/getty.c | 43 +++++++++++++++++++++----------------------
 1 file changed, 21 insertions(+), 22 deletions(-)
From 11e9fd923b43e1c7224b2680d50c3eb80641215f Mon Sep 17 00:00:00 2001
From: Elliott Hughes <e...@google.com>
Date: Fri, 2 Aug 2024 14:42:03 -0400
Subject: [PATCH] getty: fix /etc/issue output.

Also simplify/depessimize the code a bit. `./toybox getty 300 -` works
for me (including outputting /etc/issue) on Debian after this.

Fixes #508.
---
 toys/pending/getty.c | 43 +++++++++++++++++++++----------------------
 1 file changed, 21 insertions(+), 22 deletions(-)

diff --git a/toys/pending/getty.c b/toys/pending/getty.c
index 2d68b160..7d0f9b14 100644
--- a/toys/pending/getty.c
+++ b/toys/pending/getty.c
@@ -38,6 +38,7 @@ GLOBALS(
   char *tty_name, buff[128];
   int speeds[20], sc;
   struct termios termios;
+  struct utsname uts;
 )
 
 #define CTL(x)        ((x) ^ 0100)
@@ -133,24 +134,23 @@ static void sense_baud(void)
   if (tcsetattr(0, TCSANOW, &TT.termios) < 0) perror_exit("tcsetattr");
 }
 
-// Print /etc/isuue with taking care of each escape sequence
-void write_issue(char *file, struct utsname *uts)
+// Print /etc/issue, interpreting escape sequences.
+void print_issue(void)
 {
-  char buff[20] = {0,};
-  int fd = open(TT.f, O_RDONLY), size;
-
-  if (fd < 0) return;
-  while ((size = readall(fd, buff, 1)) > 0) {
-    char *ch = buff;
-
-    if (*ch == '\\' || *ch == '%') {
-      if (readall(fd, buff, 1) <= 0) perror_exit("readall");
-      if (*ch == 's') fputs(uts->sysname, stdout);
-      if (*ch == 'n'|| *ch == 'h') fputs(uts->nodename, stdout);
-      if (*ch == 'r') fputs(uts->release, stdout);
-      if (*ch == 'm') fputs(uts->machine, stdout);
-      if (*ch == 'l') fputs(TT.tty_name, stdout);
-    } else xputc(*ch);
+  FILE *fp = fopen(TT.f, "r");
+  int ch;
+
+  if (!fp) return;
+  while ((ch = fgetc(fp)) != -1) {
+    if (ch == '\\' || ch == '%') {
+      ch = fgetc(fp);
+      if (ch == 'h' || ch == 'n') xputsn(TT.uts.nodename);
+      else if (ch == 'm') xputsn(TT.uts.machine);
+      else if (ch == 'r') xputsn(TT.uts.release);
+      else if (ch == 's') xputsn(TT.uts.sysname);
+      else if (ch == 'l') xputsn(TT.tty_name);
+      else printf("<bad escape>");
+    } else xputc(ch);
   }
 }
 
@@ -159,14 +159,12 @@ static int read_login_name(void)
 {
   tcflush(0, TCIFLUSH); // Flush pending speed switches
   while (1) {
-    struct utsname uts;
     int i = 0;
 
-    uname(&uts);
+    if (!FLAG(i)) print_issue();
 
-    if (!FLAG(i)) write_issue(TT.f, &uts);
-
-    dprintf(1, "%s login: ", uts.nodename);
+    printf("%s login: ", TT.uts.nodename);
+    fflush(stdout);
 
     TT.buff[0] = getchar();
     if (!TT.buff[0] && TT.sc > 1) return 0; // Switch speed
@@ -212,6 +210,7 @@ void getty_main(void)
   char ch, *cmd[3] = {TT.l ? : "/bin/login", 0, 0}; // space to add username
 
   if (!FLAG(f)) TT.f = "/etc/issue";
+  uname(&TT.uts);
 
   // parse arguments and set $TERM
   if (isdigit(**toys.optargs)) {
-- 
2.46.0.rc2.264.g509ed76dc8-goog

_______________________________________________
Toybox mailing list
Toybox@lists.landley.net
http://lists.landley.net/listinfo.cgi/toybox-landley.net

Reply via email to