--- fgetty-0.6/fgetty.c.orig	2005-11-25 12:35:04.000000000 -0400
+++ fgetty-0.6/fgetty.c	2005-11-25 12:35:47.000000000 -0400
@@ -10,9 +10,13 @@
 #include <sys/ioctl.h>
 #include <errno.h>
 #include <termios.h>
+#include <stdlib.h>
 
 #include "fmt.h"
 
+#undef TEST
+#undef DEBUG
+
 static struct utsname uts;
 static char hn[MAXHOSTNAMELEN + 6]="HOST=";
 static int hn_len=5;
@@ -21,8 +25,12 @@
 
 static int noclear=0;
 
-void error(char *message,int exitcode) {
+void whine(const char* message) {
   write(2,message,strlen(message));
+}
+
+void error(char *message,int exitcode) {
+  whine(message);
   exit(exitcode);
 }
 
@@ -77,22 +85,26 @@
   struct sigaction sa;
   int fd;
   if (chown(tty,0,0) || chmod(tty,0600))
-    error("could not chown/chmod tty device\n",1);
+    error("fgetty: could not chown/chmod tty device\n",1);
   sa.sa_handler=SIG_IGN;
   sa.sa_flags=0;
   sigemptyset(&sa.sa_mask);
   sigaction(SIGHUP,&sa,NULL);
   sa.sa_handler=sigquit_handler;
   sigaction(SIGQUIT,&sa,NULL);
-  if ((fd=open(tty, O_RDWR, 0))<0 || ioctl (fd, TIOCSCTTY, (void *)1)==-1)
-    error("could not open tty device\n",3);
+  setsid();
+  if ((fd=open(tty, O_RDWR, 0))<0)
+    error("fgetty: could not open tty device\n",3);
   if (!isatty(fd))
-    error("\"not a typewriter\" ;-)\n",4);
-  if (vhangup())	/* linux specific */
-    error("vhangup failed\n",5);
+    error("fgetty: \"not a typewriter\" ;-)\n",4);
+  if (ioctl (fd, TIOCSCTTY, (void *)1)==0) {
+    if (vhangup())	/* linux specific */
+      error("fgetty: vhangup failed\n",5);
+  } else
+    whine("fgetty: warning: could not set controlling tty!\n");
   close(2); close(1); close(0); close(fd);
   if (open(tty,O_RDWR,0) != 0)
-    error("could not open tty\n",6);
+    error("fgetty: could not open tty\n",6);
   if (dup(0) != 1 || dup(0) != 2)
     error("could not dup stdout and stderr\n",7);
   if (!noclear)
@@ -211,7 +223,7 @@
   write(1," login: ",8);
 }
 
-static inline int isprint(char c) {
+static inline int _isprint(char c) {
   return ((c>='A' && c<='Z') ||
           (c>='a' && c<='z') ||
           (c>='0' && c<='9') ||
@@ -233,7 +245,7 @@
       if (*c == '\n' || *c == '\r') {
 	*c=0;
 	break;
-      } else if (!isprint(*c))
+      } else if (!_isprint(*c))
 	error("unprintable character in login name\n",10);
       else if (c-logname >= sizeof(logname)-1)
 	error("login name too long\n",11);
@@ -260,9 +272,20 @@
   int  i;
   char hostname_end='.';
   tty=argv[1];
+  if (!tty)
+    error("usage: fgetty 1\n"
+	  "       fgetty vc/1\n"
+	  "       fgetty /dev/tty1\n",111);
   if (tty[0]=='/')
     strncpy(ttybuf,tty,15);
-  else
+  else if (isdigit(tty[0])) {
+    struct stat ss;
+    /* try prepending /dev/vc/1 and /dev/tty1 */
+    strcpy(ttybuf,"/dev/vc/"); strncpy(ttybuf+8,tty,3);
+    if (stat(ttybuf,&ss) && errno==ENOENT) {
+      ttybuf[5]=ttybuf[6]='t'; ttybuf[7]='y';
+    }
+  } else
     strncpy(ttybuf+5,tty,10);
   tty=ttybuf;
   strcpy(ttybuf2+4,ttybuf);
