Package: util-linux
Version: 2.12p

I've created a little patch to allow a loginname like
[EMAIL PROTECTED]:1
or [EMAIL PROTECTED]
that'll run ssh -p1 [EMAIL PROTECTED] or [EMAIL PROTECTED]

this is not well tested, what are your thoughts of the usefulness (or not of 
it)?

yours,
Gürkan
<agetty.c.remote.patch>
--- agetty.c.orig	2002-07-29 09:36:42.000000000 +0200
+++ agetty.c	2005-09-17 13:42:20.000000000 +0200
@@ -11,6 +11,8 @@
    1999-05-05 Thorsten Kranzkowski <[EMAIL PROTECTED]>
    - enable hardware flow control before displaying /etc/issue
    
+   2005-09-17 Guerkan Senguen <[EMAIL PROTECTED]>
+   - enable remote logins without local account via ssh   
 */
 
 #include <stdio.h>
@@ -30,6 +32,8 @@
 #include <getopt.h>
 #include <time.h>
 #include <sys/file.h>
+#include <sys/vt.h>
+#include <linux/tty.h>
 #include "xstrncpy.h"
 #include "nls.h"
 
@@ -249,11 +253,64 @@
 #define debug(s) /* nothing */
 #endif
 
+int numtokens(char *str, char delimiter)
+{
+    int i,c=1;
+    for(i=0; i<strlen(str); i++) {
+        if(str[i]==delimiter) c++;
+    }
+    return c;
+}
+
+char *gettoken(char *str, int num, char delimiter)
+{
+    char *ret;
+    int c;
+    int p=0;
+    int last=0;
+    int slen=strlen(str);
+
+    for(c=0; c<=slen; c++) {
+        if (c==slen-1+1) {
+            /*printf("eos(%d/%d)\n",c,slen-1);*/
+            p++;
+        }
+        if (str[c]==delimiter) {
+            c++;
+            p++;
+            /*printf("%d %d\n",p,c);*/
+            if (p==num) break;
+            last=c;
+        }
+    }
+    /*printf("%d %d: %d %d (%d)\n",p,num,last,c,c-last);*/
+
+    ret=malloc(c-last+1); /*-1*/
+    strncpy(ret,str+last,c-last); 
+    /*ret[c-last-1]='\0';*/ /* -1 */
+    if (c-1==slen-1) {
+        ret[c-last]='\0';
+    } else {
+        ret[c-last-1]='\0';
+    }
+
+    if (p!=num) {
+        /*printf("oops\n");*/
+        strcpy(ret,"");
+    }
+    return ret;
+}
+
 int
 main(argc, argv)
      int     argc;
      char  **argv;
 {
+    char   *remoteuser = NULL;
+    char   *remotehost = NULL;
+    char   *remoteport = NULL;
+    char   rport[512] = "";
+    char   rcommand[512] = "";
     char   *logname = NULL;		/* login name, given to /bin/login */
     struct chardata chardata;		/* set by get_logname() */
     struct termio termio;		/* terminal mode bits */
@@ -380,6 +437,32 @@
 
     (void) write(1, "\n", 1);
 
+    /* Allow remote logins using ssh [EMAIL PROTECTED]:anotherport] */
+
+    if (strstr(logname,"@") != NULL) {
+	remoteuser=gettoken(logname,1,'@');
+	remotehost=gettoken(logname,2,'@');
+	remoteport=gettoken(logname,2,':');
+
+	if (strstr(logname,":") != NULL) {
+	    strcpy(rport,"-p");
+	    strcat(rport,remoteport);
+	    remotehost=gettoken(remotehost,1,':');
+	}
+	
+	strcat(rcommand,remoteuser);
+	strcat(rcommand,"@");
+    	strcat(rcommand,remotehost);
+
+	/* printf("EXECLP ssh %s\n",rcommand);
+	printf("user %s\n",remoteuser);
+	printf("host %s\n",remotehost);
+	printf("port %s\n",remoteport); */
+	execlp("ssh", "ssh", rport, rcommand, NULL);
+	error(_("ssh: can't exec %s: %m"), rcommand);
+	exit(0);  /* quiet GCC */
+    }
+
     /* Let the login program take care of password validation. */
 
     (void) execl(options.login, options.login, "--", logname, (char *) 0);
@@ -652,6 +735,91 @@
 	if ((st.st_mode & S_IFMT) != S_IFCHR)
 	    error(_("/dev/%s: not a character device"), tty);
 
+	/*
+	 * Try to avoid opening a vt that is already open, as this will
+	 * mean that the keyboard will be unusable.
+	 *
+	 * Unfortunately, all the kernel gives us to find out is an ioctl
+	 * for the next available vt.  As the kernel doesn't open the vt for
+	 * you with the ioctl, there is still a chance of both processes
+	 * opening the same vt, but this check is far better than nothing at
+	 * all.
+	 *
+	 * The kernel API sucks, and is unusable for this situation.  What
+	 * we really need is an ioctl that says 'does anyone _ELSE_ have
+	 * this tty open', and that doesn't exist.  Or better yet, the
+	 * kernel really shouldn't allow two processes to have read access
+	 * on the same tty at the same time (other than with dup...)  Opens
+	 * of the same tty device shouldn't be able to steal reads from
+	 * each other.
+	 *
+	 * Similar to the check added to gdm.
+	 *
+	 * For now, just turn off this check, restoring the bug that ?dm
+	 * (and the system) occasionally get their keyboard locked out by
+	 * getty showing up after they've taken a vt that inittab says
+	 * goes to a getty.
+	 * Bummer.
+	 *
+	 */
+#if 0
+	if (strncmp(tty,"tty",3) == 0)
+	{
+	    char *end;
+	    int vtno;
+
+	    vtno = strtol(tty+3,&end,10);
+	    if (end != tty+3 && *end == '\0' && vtno > 1)
+	    {
+		int fd;
+		int newvtno;
+		int fds[MAX_NR_CONSOLES];
+		int vt_cnt = 0;
+		int i;
+
+		for ( i = 0 ; i < MAX_NR_CONSOLES ; i++ )
+		    fds[i] = -1;
+
+		if ((fd = open("/dev/tty0", O_WRONLY, 0) ) < 0
+		    && errno != ENOENT)
+		    error(_("/dev/tty0: cannot open: %m"));
+
+		if (fd >= 0) do
+		{
+		    if ((ioctl(fd, VT_OPENQRY, &newvtno ) < 0))
+			error(_("failed to query next available vt"));
+
+		    if (newvtno == -1)
+			error(_("all vts are in use"));
+
+		    if (newvtno > vtno)
+			error(_("/dev/%s: already in use"), tty);
+
+		    if (newvtno < vtno)
+		    {
+			char vtname[TTY_NAME_MAX+3];
+
+			sprintf( vtname, "tty%d", newvtno );
+
+			if ((fds[vt_cnt++] =
+			    open(vtname, O_RDWR|O_NONBLOCK, 0)) < 0)
+			{
+			    error(_("/dev/%s: cannot open: %m"), tty);
+			}
+		    }
+		} while (newvtno != vtno);
+
+		close(fd);
+		for ( i = 0 ; i < MAX_NR_CONSOLES ; i++ )
+		{
+		    if (fds[i] == -1)
+			break;
+		    close(fds[i]);
+		}
+	    }
+	}
+#endif
+
 	/* Open the tty as standard input. */
 
 	(void) close(0);
@@ -1055,13 +1223,13 @@
 		}
 		break;
 	    case CTL('U'):
-	    case '@':
-		cp->kill = ascval;		/* set kill character */
+/*	    case '@':
+		cp->kill = ascval;		// set kill character
 		while (bp > logname) {
 		    (void) write(1, erase[cp->parity], 3);
 		    bp--;
 		}
-		break;
+		break; */
 	    case CTL('D'):
 		exit(0);
 	    default:

Reply via email to