[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

/etc/issue, now usable



Hi all,

I've modified hurd/daemons/getty.c to be able to print the file
/etc/issue just before /etc/motd is print. The new getty allows escape
secuences as linux getty does, but only a few of them.

I've attached the patch file and an example issue file, which prints
the same as the original message of the hurd, but in green color :)
Ah, if /etc/issue is not found, this new version prints the original
message instead.

Hope it's useful,
Bye!


-- 
Juli-Manel Merino Vidal <jmmv@mail.com>

----------------------------------------
   Become a GNU! (http://www.gnu.org)
     Running Debian GNU/Linux woody
----------------------------------------
diff -ru hurd/daemons/getty.c hurd-jmmv/daemons/getty.c
--- hurd/daemons/getty.c	Wed Aug  9 15:10:36 2000
+++ hurd-jmmv/daemons/getty.c	Wed Aug  9 14:43:47 2000
@@ -18,6 +18,8 @@
    along with this program; if not, write to the Free Software
    Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111, USA. */
 
+/* Modified by Julio Merino to add /etc/issue support */
+
 #include <syslog.h>
 #include <unistd.h>
 #include <ttyent.h>
@@ -36,22 +38,72 @@
 extern char *localhost ();
 
 #define _PATH_LOGIN "/bin/login"
+#define _BANNER_FILE "/etc/issue"
 
 /* Print a suitable welcome banner */
 static void
 print_banner (int fd, char *ttyname)
 {
   int cc;
-  char *s;
+  char *s, c;
   struct utsname u;
   char *hostname = localhost ();
+  FILE *f;
 
   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);
+  f = fopen (_BANNER_FILE, "r");
+  if (!f)
+    {
+      /* Issue can't be open; print a default message */
+      cc = asprintf (&s, "\r\n\n%s %s (%s) (%s)\r\n\n",
+                     u.sysname, u.release, hostname ?: "?", basename
+                     (ttyname));
+      write (fd, s, cc);
+    }
+  else
+    {
+      /* Read issue and print it */
+      while (!feof (f))
+        {
+          c = fgetc (f);
+          switch (c)
+            {
+            case '\\':
+              /* Found escape secuence */
+              c = fgetc (f);
+              switch (c)
+                {
+                case 's': /* System name */
+                  write (fd, u.sysname, strlen (u.sysname));
+                  c = 0;
+                  break;
+                case 'r': /* Release */
+                  write (fd, u.release, strlen (u.release));
+                  c = 0;
+                  break;
+                case 'n': /* Hostname */
+                  write (fd, hostname, strlen (hostname));
+                  c = 0;
+                  break;
+                case 'l': /* TTY name */
+                  write (fd, basename (ttyname), strlen (basename
+                                                        (ttyname)));
+                  c = 0;
+                  break;
+                default:
+                }
+              if (!c) break;
+            default:
+              s = (char*) malloc (2);
+              s[0] = c; s[1] = '\0';
+              write (fd, s, 1);
+              free (s);
+            }
+        }
+      fclose (f);
+    }
 }
 
 int

Attachment: issue
Description: Binary data


Reply to: