This is based on openssh-2.0.0beta1. There are a few rough spots: 1) SunOS doesn't have ut_type in struct utmp so I just whacked in the old login() from openssh-1.2.3. 2) There is a SUNOS4 section added to defines.h -- this could probably be a bit cleaner. 3) sigaction on SunOS is implemented via #defines to sigvec, thus there is no SA_RESTART (this is the default behavior). This also supports SunOS 4.x shadow passwords (passwd adjunct). - todd --- configure.in.DIST Fri May 12 15:50:24 2000 +++ configure.in Fri May 12 16:08:22 2000 @@ -107,6 +107,10 @@ need_dash_r=1 AC_DEFINE(USE_UTMPX) ;; +*-*-sunos4*) + CFLAGS="$CFLAGS -DSUNOS4" + AC_CHECK_FUNCS(getpwanam) + ;; *-*-sysv*) CFLAGS="$CFLAGS -I/usr/local/include" LDFLAGS="$LDFLAGS -L/usr/local/lib" @@ -353,17 +357,6 @@ [size_t foo; foo = 1235;], [ AC_DEFINE(HAVE_SIZE_T) - AC_MSG_RESULT(yes) - ], - [AC_MSG_RESULT(no)] -) - -AC_MSG_CHECKING([for ssize_t]) -AC_TRY_COMPILE( - [#include <sys/types.h>], - [ssize_t foo; foo = 1235;], - [ - AC_DEFINE(HAVE_SSIZE_T) AC_MSG_RESULT(yes) ], [AC_MSG_RESULT(no)] --- acconfig.h.DIST Mon May 1 17:56:41 2000 +++ acconfig.h Fri May 12 16:09:17 2000 @@ -101,6 +101,9 @@ /* Define if you want have trusted HPUX */ #undef HAVE_HPUX_TRUSTED_SYSTEM_PW +/* Define if you have getpwanam(3) [SunOS 4.x] */ +#undef HAVE_GETPWANAM + /* Defined if in_systm.h needs to be included with netinet/ip.h (HPUX - <sigh/>) */ #undef NEED_IN_SYSTM_H @@ -117,6 +120,7 @@ #undef HAVE_UINTXX_T #undef HAVE_SOCKLEN_T #undef HAVE_SIZE_T +#undef HAVE_SSIZE_T #undef HAVE_STRUCT_SOCKADDR_STORAGE #undef HAVE_STRUCT_ADDRINFO #undef HAVE_STRUCT_IN6_ADDR --- defines.h.DIST Mon May 1 08:03:56 2000 +++ defines.h Fri May 12 15:54:59 2000 @@ -150,6 +150,11 @@ # define HAVE_SIZE_T #endif /* HAVE_SIZE_T */ +#ifndef HAVE_SSIZE_T +typedef int ssize_t; +# define HAVE_SSIZE_T +#endif /* HAVE_SSIZE_T */ + #if !defined(HAVE_SS_FAMILY_IN_SS) && defined(HAVE___SS_FAMILY_IN_SS) # define ss_family __ss_family #endif /* !defined(HAVE_SS_FAMILY_IN_SS) && defined(HAVE_SA_FAMILY_IN_SS) */ @@ -279,5 +284,10 @@ #if defined(BROKEN_GETADDRINFO) && defined(HAVE_GETADDRINFO) # undef HAVE_GETADDRINFO #endif /* defined(BROKEN_GETADDRINFO) && defined(HAVE_GETADDRINFO) */ + +#ifdef SUNOS4 +# define atexit on_exit +# define WCOREDUMP(x) (((union __wait*)&(x))->__w_coredump) +#endif #endif /* _DEFINES_H */ --- auth-passwd.c.DIST Sat Apr 29 08:47:29 2000 +++ auth-passwd.c Fri May 12 16:07:36 2000 @@ -28,6 +28,11 @@ #ifdef HAVE_SHADOW_H # include <shadow.h> #endif +#ifdef HAVE_GETPWANAM +# include <sys/label.h> +# include <sys/audit.h> +# include <pwdadj.h> +#endif #if defined(HAVE_MD5_PASSWORDS) && !defined(HAVE_MD5_CRYPT) # include "md5crypt.h" #endif /* defined(HAVE_MD5_PASSWORDS) && !defined(HAVE_MD5_CRYPT) */ @@ -46,6 +51,9 @@ #ifdef HAVE_SHADOW_H struct spwd *spw; #endif +#ifdef HAVE_GETPWANAM + struct passwd_adjunct *spw; +#endif #ifdef WITH_AIXAUTHENTICATE char *authmsg; char *loginmsg; @@ -99,6 +107,16 @@ pw_password = spw->sp_pwdp; } #endif /* defined(HAVE_SHADOW_H) && !defined(DISABLE_SHADOW) */ +#if defined(HAVE_GETPWANAM) && !defined(DISABLE_SHADOW) + if (issecure() && (spw = getpwanam(pw->pw_name)) != NULL) + { + /* Check for users with no password. */ + if (strcmp(password, "") == 0 && strcmp(spw->pwa_passwd, "") == 0) + return 1; + + pw_password = spw->pwa_passwd; + } +#endif /* defined(HAVE_GETPWANAM) && !defined(DISABLE_SHADOW) */ if (pw_password[0] != '\0') salt = pw_password; --- bsd-login.c.DIST Mon May 1 06:53:53 2000 +++ bsd-login.c Fri May 5 12:30:48 2000 @@ -60,6 +60,7 @@ #include <stdio.h> #include <string.h> +#ifdef USER_PROCESS /* * find first matching slot in utmp, or "-1" for none * @@ -93,6 +94,13 @@ endutent(); return(-1); } +#else +int find_tty_slot( utp ) +struct utmp * utp; +{ + return(ttyslot()); +} +#endif #if defined(HAVE_UTMPX_H) && defined(USE_UTMPX) void @@ -127,13 +135,16 @@ } else { /* If no tty was found... */ if (tty == -1) { +#ifdef USER_PROCESS /* ... append it to utmp on login */ if (utp->ut_type == USER_PROCESS) { if ((fd = open(_PATH_UTMP, O_WRONLY|O_APPEND, 0)) >= 0) { (void)write(fd, utp, sizeof(struct utmp)); (void)close(fd); } - } else { + } else +#endif + { /* Shouldn't get to here unless somthing happened to utmp */ /* Between login and logout */ log("No tty slot found at logout"); --- packet.c.DIST Fri May 5 11:55:05 2000 +++ packet.c Fri May 5 11:56:42 2000 @@ -1233,21 +1233,24 @@ * IPTOS_LOWDELAY and TCP_NODELAY. */ int lowdelay = IPTOS_LOWDELAY; +#ifdef IP_TOS if (setsockopt(connection_in, IPPROTO_IP, IP_TOS, (void *) &lowdelay, sizeof(lowdelay)) < 0) error("setsockopt IPTOS_LOWDELAY: %.100s", strerror(errno)); +#endif if (setsockopt(connection_in, IPPROTO_TCP, TCP_NODELAY, (void *) &on, sizeof(on)) < 0) error("setsockopt TCP_NODELAY: %.100s", strerror(errno)); +#ifdef IP_TOS } else { /* * Set IP options for a non-interactive connection. Use * IPTOS_THROUGHPUT. */ - int throughput = IPTOS_THROUGHPUT; if (setsockopt(connection_in, IPPROTO_IP, IP_TOS, (void *) &throughput, sizeof(throughput)) < 0) error("setsockopt IPTOS_THROUGHPUT: %.100s", strerror(errno)); +#endif } } --- scp.c.DIST Mon May 1 05:10:33 2000 +++ scp.c Fri May 5 12:19:25 2000 @@ -1235,7 +1235,9 @@ struct sigaction sa; sa.sa_handler = updateprogressmeter; sigemptyset(&sa.sa_mask); +#ifdef SA_RESTART sa.sa_flags = SA_RESTART; +#endif sigaction(SIGALRM, &sa, NULL); alarmtimer(1); } else if (flag == 1) { --- ssh-agent.c.DIST Mon May 1 04:59:51 2000 +++ ssh-agent.c Fri May 5 12:22:05 2000 @@ -507,6 +507,7 @@ struct sockaddr_un sunaddr; pid_t pid; char *shell, *format, *pidstr, pidstrbuf[1 + 3 * sizeof pid]; + extern int optind; /* check if RSA support exists */ if (rsa_alive() == 0) {