A new user interface for you! Read more...

File netkit-rsh-0.17-tty-4-pam.diff of Package rsh

--- rlogind/auth.c
+++ rlogind/auth.c	2008-05-13 17:17:58.501527680 +0200
@@ -33,6 +33,7 @@
 
 #include <stdio.h>
 #include <sys/types.h>
+#include <grp.h>
 #include <pwd.h>
 
 #include "rlogind.h"
@@ -108,11 +109,11 @@ static int attempt_auth(void) {
  * or return 0 on authentication success. Dying is discouraged.
  */
 int auth_checkauth(const char *remoteuser, const char *host,
-		   char *localuser, size_t localusersize) 
+		   char *localuser, size_t localusersize, const char *line)
 {
     static struct pam_conv conv = { sock_conv, NULL };
     struct passwd *pwd;
-    char *ln;
+    const char *ln;
     int retval;
 
     retval = pam_start("rlogin", localuser, &conv, &pamh);
@@ -124,7 +125,7 @@ int auth_checkauth(const char *remoteuse
     pam_set_item(pamh, PAM_USER, localuser);
     pam_set_item(pamh, PAM_RUSER, remoteuser);
     pam_set_item(pamh, PAM_RHOST, host);
-    pam_set_item(pamh, PAM_TTY, "rlogin");   /* we don't have a tty yet! */
+    pam_set_item(pamh, PAM_TTY, line);
 	
     network_confirm();
     retval = attempt_auth();
@@ -203,7 +204,7 @@ void auth_finish(void) {}
  * or return 0 on authentication success. Dying is discouraged.
  */
 int auth_checkauth(const char *remoteuser, const char *host,
-		   char *localuser, size_t localusersize) 
+		   char *localuser, size_t localusersize, const char *line)
 {
     struct passwd *pwd;
 
--- rlogind/rlogind.c
+++ rlogind/rlogind.c	2008-05-13 17:24:39.865233188 +0200
@@ -63,6 +63,8 @@ char rcsid[] = 
 #include <arpa/inet.h>   /* for ntohs() */
 #include <stdio.h>       /* for EOF, BUFSIZ, snprintf() */
 #include <syslog.h>      /* for syslog() */
+#include <pty.h>         /* for openpty() */
+#include <utmp.h>        /* for login_tty() */
 #include <errno.h>
 #include <unistd.h>
 #include <stdlib.h>
@@ -72,9 +74,6 @@ char rcsid[] = 
 #include "logwtmp.h"
 #include "rlogind.h"
 
-pid_t forkpty(int *, char *, struct termios *, struct winsize *);
-int logout(const char *);
-
 #ifndef TIOCPKT_WINDOW
 #define TIOCPKT_WINDOW 0x80
 #endif
@@ -86,7 +85,7 @@ int allow_root_rhosts = 0;
 int deny_all_rhosts_hequiv = 0;
 
 static char oobdata[] = {(char)TIOCPKT_WINDOW};
-static char line[MAXPATHLEN];
+static char *line;
 struct winsize win = { 0, 0, 0, 0 };
 
 
@@ -382,6 +381,7 @@ static void getstr(char *buf, int cnt, c
 static void doit(int netfd) {
     int master, pid, on = 1;
     int authenticated = 0;
+    int slave;
     char *hname;
     int hostok;
     char lusername[32], rusername[32], termtype[256];
@@ -391,7 +391,13 @@ static void doit(int netfd) {
     getstr(rusername, sizeof(rusername), "remuser too long");
     getstr(lusername, sizeof(lusername), "locuser too long");
     getstr(termtype, sizeof(termtype), "Terminal type too long");
-    
+
+    if (openpty(&master, &slave, 0, 0, &win) != 0) {
+	if (errno == ENOENT) fatal(netfd, "Out of ptys", 0);
+	fatal(netfd, "Openpty", 1);
+    }
+    line = ttyname(slave);
+
     /*
      * This function will either die, return -1 if authentication failed,
      * or return 0 if authentication succeeded.
@@ -402,7 +408,7 @@ static void doit(int netfd) {
      */
     if (hostok) {
 	if (auth_checkauth(rusername, hname, 
-			   lusername, sizeof(lusername)) == 0) {
+			   lusername, sizeof(lusername), line) == 0) {
 	   authenticated=1;
 	}
     }
@@ -412,16 +418,19 @@ static void doit(int netfd) {
 	write(netfd, "rlogind: Host address mismatch.\r\n", 33);
     }
 
-    pid = forkpty(&master, line, NULL, &win);
-    if (pid < 0) {
-	if (errno == ENOENT) fatal(netfd, "Out of ptys", 0);
-	fatal(netfd, "Forkpty", 1);
+    if ((pid = fork()) < 0) {
+	fatal(netfd, "Fork", 1);
     }
     if (pid == 0) {
+	close(master);
+	if (login_tty(slave)) {
+	    fatal(netfd, "Login_tty", 1);
+	}
 	/* netfd should always be 0, but... */ 
 	if (netfd > 2) close(netfd);
 	child(hname, termtype, lusername, authenticated);
     }
+    close(slave);
     on = 1;
     ioctl(netfd, FIONBIO, &on);
     ioctl(master, FIONBIO, &on);
--- rlogind/rlogind.h
+++ rlogind/rlogind.h	2008-05-13 17:18:58.789294627 +0200
@@ -1,6 +1,6 @@
 
 /* rlogind.c */
-void fatal(int f, const char *msg, int syserr);
+void fatal(int f, const char *msg, int syserr) __attribute__ ((__noreturn__));
 
 /* network.c */
 char *network_init(int fd, int *hostokp);
@@ -12,7 +12,8 @@ void network_close(void);
 void auth_checkoptions(void);
 void auth_finish(void);
 int auth_checkauth(const char *remoteuser, const char *host,
-		   char *localuser, size_t localusermaxsize);
+		   char *localuser, size_t localusermaxsize,
+		   const char *line);
 
 /* 
  * Global flag variables