openssh-3.1p1 on GNU/Hurd
James A Morrison
ja2morri at student.math.uwaterloo.ca
Wed Apr 10 11:33:27 EST 2002
Hi,
I've gone and ported the latest version of openssh, 3.1p1, to GNU/Hurd.
I've tried to learn from the other threads on this topic, but I still had
to get rid of MAXHOSTNAMELEN where I could.
James A. Morrison
diff -urN openssh-3.1p1.old/Makefile.in openssh-3.1p1/Makefile.in
--- openssh-3.1p1.old/Makefile.in Tue Feb 26 14:24:22 2002
+++ openssh-3.1p1/Makefile.in Tue Apr 9 16:16:49 2002
@@ -54,7 +54,7 @@
SSHOBJS= ssh.o sshconnect.o sshconnect1.o sshconnect2.o sshtty.o readconf.o clientloop.o
-SSHDOBJS= sshd.o auth.o auth1.o auth2.o auth-chall.o auth2-chall.o auth-rhosts.o auth-options.o auth-krb4.o auth-pam.o auth2-pam.o auth-passwd.o auth-rsa.o auth-rh-rsa.o auth-sia.o sshpty.o sshlogin.o loginrec.o servconf.o serverloop.o md5crypt.o session.o groupaccess.o auth-skey.o auth-bsdauth.o
+SSHDOBJS= sshd.o auth.o auth1.o auth2.o auth-chall.o auth2-chall.o auth-rhosts.o auth-options.o auth-krb4.o auth-pam.o auth2-pam.o auth-passwd.o auth-rsa.o auth-rh-rsa.o auth-sia.o sshpty.o sshlogin.o loginrec.o servconf.o serverloop.o md5crypt.o session.o groupaccess.o auth-skey.o auth-bsdauth.o xgethostname.o
MANPAGES = scp.1.out ssh-add.1.out ssh-agent.1.out ssh-keygen.1.out ssh-keyscan.1.out ssh.1.out sshd.8.out sftp-server.8.out sftp.1.out
MANPAGES_IN = scp.1 ssh-add.1 ssh-agent.1 ssh-keygen.1 ssh-keyscan.1 ssh.1 sshd.8 sftp-server.8 sftp.1
@@ -113,8 +113,8 @@
ssh-agent$(EXEEXT): $(LIBCOMPAT) libssh.a ssh-agent.o
$(LD) -o $@ ssh-agent.o $(LDFLAGS) -lssh -lopenbsd-compat $(LIBS)
-ssh-keygen$(EXEEXT): $(LIBCOMPAT) libssh.a ssh-keygen.o
- $(LD) -o $@ ssh-keygen.o $(LDFLAGS) -lssh -lopenbsd-compat $(LIBS)
+ssh-keygen$(EXEEXT): $(LIBCOMPAT) libssh.a ssh-keygen.o xgethostname.o
+ $(LD) -o $@ xgethostname.o ssh-keygen.o $(LDFLAGS) -lssh -lopenbsd-compat $(LIBS)
ssh-keyscan$(EXEEXT): $(LIBCOMPAT) libssh.a ssh-keyscan.o
$(LD) -o $@ ssh-keyscan.o $(LDFLAGS) -lssh -lopenbsd-compat -lssh $(LIBS)
diff -urN openssh-3.1p1.old/canohost.c openssh-3.1p1/canohost.c
--- openssh-3.1p1.old/canohost.c Mon Mar 4 20:31:29 2002
+++ openssh-3.1p1/canohost.c Tue Apr 9 21:05:15 2002
@@ -284,9 +284,11 @@
get_remote_name_or_ip(u_int utmp_len, int verify_reverse_mapping)
{
static const char *remote = "";
- if (utmp_len > 0)
+ /* Assume that if utmp_len = -1 then there is no limit on the
+ hostname length */
+ if (utmp_len > 0 || utmp_len == -1)
remote = get_canonical_hostname(verify_reverse_mapping);
- if (utmp_len == 0 || strlen(remote) > utmp_len)
+ if (utmp_len == 0 || (utmp_len != -1 && strlen(remote) > utmp_len))
remote = get_remote_ipaddr();
return remote;
}
diff -urN openssh-3.1p1.old/configure.ac openssh-3.1p1/configure.ac
--- openssh-3.1p1.old/configure.ac Wed Feb 27 01:12:35 2002
+++ openssh-3.1p1/configure.ac Tue Apr 9 16:36:19 2002
@@ -126,6 +126,9 @@
AC_DEFINE(HAVE_BOGUS_SYS_QUEUE_H)
inet6_default_4in6=yes
;;
+*-*-gnu*)
+ AC_DEFINE(HAVE_BOGUS_SYS_QUEUE_H)
+ ;;
mips-sony-bsd|mips-sony-newsos4)
AC_DEFINE(HAVE_NEWS4)
SONY=1
diff -urN openssh-3.1p1.old/session.c openssh-3.1p1/session.c
--- openssh-3.1p1.old/session.c Mon Feb 25 10:48:03 2002
+++ openssh-3.1p1/session.c Tue Apr 9 20:59:48 2002
@@ -56,6 +56,7 @@
#include "serverloop.h"
#include "canohost.h"
#include "session.h"
+#include "xgethostname.h"
#ifdef HAVE_CYGWIN
#include <windows.h>
@@ -659,7 +660,7 @@
do_login(Session *s, const char *command)
{
char *time_string;
- char hostname[MAXHOSTNAMELEN];
+ char *hostname;
socklen_t fromlen;
struct sockaddr_storage from;
time_t last_login_time;
@@ -681,11 +682,9 @@
}
/* Get the time and hostname when the user last logged in. */
- if (options.print_lastlog) {
- hostname[0] = '\0';
+ if (options.print_lastlog)
last_login_time = get_last_login_time(pw->pw_uid, pw->pw_name,
- hostname, sizeof(hostname));
- }
+ &hostname);
/* Record that there was a login on that tty from the remote host. */
record_login(pid, s->tty, pw->pw_name, pw->pw_uid,
@@ -715,14 +714,17 @@
printf("%s\n", aixloginmsg);
#endif /* WITH_AIXAUTHENTICATE */
- if (options.print_lastlog && last_login_time != 0) {
- time_string = ctime(&last_login_time);
- if (strchr(time_string, '\n'))
- *strchr(time_string, '\n') = 0;
- if (strcmp(hostname, "") == 0)
- printf("Last login: %s\r\n", time_string);
- else
- printf("Last login: %s from %s\r\n", time_string, hostname);
+ if (options.print_lastlog )
+ if (last_login_time != 0) {
+ time_string = ctime(&last_login_time);
+ if (strchr(time_string, '\n'))
+ *strchr(time_string, '\n') = 0;
+ if (strcmp(hostname, "") == 0)
+ printf("Last login: %s\r\n", time_string);
+ else
+ printf("Last login: %s from %s\r\n", time_string, hostname);
+ }
+ xfree(hostname);
}
do_motd();
@@ -1849,7 +1851,7 @@
{
struct stat st;
char display[512], auth_display[512];
- char hostname[MAXHOSTNAMELEN];
+ char *hostname;
if (no_x11_forwarding_flag) {
packet_send_debug("X11 forwarding disabled in user configuration file.");
@@ -1881,7 +1883,7 @@
}
/* Set up a suitable value for the DISPLAY variable. */
- if (gethostname(hostname, sizeof(hostname)) < 0)
+ if (!(hostname = xgethostname()))
fatal("gethostname: %.100s", strerror(errno));
/*
* auth_display must be used as the displayname when the
diff -urN openssh-3.1p1.old/ssh-keygen.c openssh-3.1p1/ssh-keygen.c
--- openssh-3.1p1.old/ssh-keygen.c Tue Feb 26 13:15:10 2002
+++ openssh-3.1p1/ssh-keygen.c Tue Apr 9 16:15:47 2002
@@ -27,6 +27,7 @@
#include "pathnames.h"
#include "log.h"
#include "readpass.h"
+#include "xgethostname.h"
#ifdef SMARTCARD
#include <sectok.h>
@@ -82,7 +83,7 @@
char *__progname;
#endif
-char hostname[MAXHOSTNAMELEN];
+char *hostname;
static void
ask_filename(struct passwd *pw, const char *prompt)
@@ -860,7 +861,7 @@
printf("You don't exist, go away!\n");
exit(1);
}
- if (gethostname(hostname, sizeof(hostname)) < 0) {
+ if (!(hostname = xgethostname())) {
perror("gethostname");
exit(1);
}
diff -urN openssh-3.1p1.old/sshd.c openssh-3.1p1/sshd.c
--- openssh-3.1p1.old/sshd.c Mon Mar 4 20:31:30 2002
+++ openssh-3.1p1/sshd.c Tue Apr 9 14:09:55 2002
@@ -183,7 +183,7 @@
int session_id2_len = 0;
/* record remote hostname or ip */
-u_int utmp_len = MAXHOSTNAMELEN;
+u_int utmp_len = 0;
/* options.max_startup sized array of fd ints */
int *startup_pipes = NULL;
@@ -603,6 +603,13 @@
/* Save argv. */
saved_argc = ac;
saved_argv = av;
+
+ /* find max hostname length */
+#ifdef _SC_HOST_NAME_MAX
+ utmp_len = sysconf(_SC_HOST_NAME_MAX);
+#elif MAXHOSTNAMELEN
+ utmp_len = MAXHOSTNAMELEN;
+#endif
/* Initialize configuration options to their default values. */
initialize_server_options(&options);
diff -urN openssh-3.1p1.old/sshlogin.c openssh-3.1p1/sshlogin.c
--- openssh-3.1p1.old/sshlogin.c Sun Feb 24 20:56:47 2002
+++ openssh-3.1p1/sshlogin.c Tue Apr 9 20:57:38 2002
@@ -51,12 +51,12 @@
u_long
get_last_login_time(uid_t uid, const char *logname,
- char *buf, u_int bufsize)
+ char **buf)
{
struct logininfo li;
login_get_lastlog(&li, uid);
- strlcpy(buf, li.hostname, bufsize);
+ *buf = xstrdup(li.hostname);
return li.tv_sec;
}
diff -urN openssh-3.1p1.old/sshlogin.h openssh-3.1p1/sshlogin.h
--- openssh-3.1p1.old/sshlogin.h Sun Feb 24 20:56:47 2002
+++ openssh-3.1p1/sshlogin.h Tue Apr 9 14:33:16 2002
@@ -18,7 +18,7 @@
record_login(pid_t, const char *, const char *, uid_t,
const char *, struct sockaddr *);
void record_logout(pid_t, const char *, const char *);
-u_long get_last_login_time(uid_t, const char *, char *, u_int);
+u_long get_last_login_time(uid_t, const char *, char **);
#ifdef LOGIN_NEEDS_UTMPX
void record_utmp_only(pid_t, const char *, const char *, const char *,
diff -urN openssh-3.1p1.old/xgethostname.c openssh-3.1p1/xgethostname.c
--- openssh-3.1p1.old/xgethostname.c Wed Dec 31 19:00:00 1969
+++ openssh-3.1p1/xgethostname.c Tue Apr 9 21:14:55 2002
@@ -0,0 +1,85 @@
+/* Copyright (c) 2001 Neal H Walfield <neal at cs.uml.edu>.
+
+ This file is placed into the public domain. Its distribution
+ is unlimited.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR ANY
+ DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+ GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
+ IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+ IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/* NAME
+
+ xgethostname - get the host name.
+
+ SYNOPSIS
+
+ char *xgethostname (void);
+
+ DESCRIPTION
+
+ The xhostname function is intended to replace gethostname(2), a
+ function used to access the host name. The old interface is
+ inflexable given that it assumes the existance of the
+ MAXHOSTNAMELEN macro, which neither POSIX nor the proposed
+ Single Unix Specification version 3 guarantee to be defined.
+
+ RETURN VALUE
+
+ On success, a malloced, null terminated (possibly truncated)
+ string containing the host name is returned. On failure, NULL
+ is returned and errno is set.
+ */
+
+#include <sys/param.h> /* For MAXHOSTNAMELEN */
+#include <stdlib.h>
+#include <errno.h>
+#include <unistd.h>
+
+char *
+xgethostname (void)
+{
+ int size = 0;
+ int addnull = 0;
+ char *buf;
+ int err;
+ char *tmp;
+
+#ifdef MAXHOSTNAMELEN
+ size = MAXHOSTNAMELEN;
+ addnull = 1;
+#else /* MAXHOSTNAMELEN */
+#ifdef _SC_HOST_NAME_MAX
+ size = sysconf (_SC_HOST_NAME_MAX);
+ addnull = 1;
+#endif /* _SC_HOST_NAME_MAX */
+ if (size <= 0)
+ size = 256;
+#endif /* MAXHOSTNAMELEN */
+
+ buf = xmalloc (size + addnull);
+
+ err = gethostname (buf, size);
+ while (err == -1 && errno == ENAMETOOLONG)
+ {
+ size *= 2;
+ buf = xrealloc (buf, size + addnull);
+ err = gethostname (buf, size);
+ }
+
+ if (err)
+ return NULL;
+
+ if (addnull)
+ buf[size] = '\0';
+
+ return buf;
+}
diff -urN openssh-3.1p1.old/xgethostname.h openssh-3.1p1/xgethostname.h
--- openssh-3.1p1.old/xgethostname.h Wed Dec 31 19:00:00 1969
+++ openssh-3.1p1/xgethostname.h Tue Apr 9 20:54:38 2002
@@ -0,0 +1,48 @@
+/* Copyright (c) 2001 Neal H Walfield <neal at cs.uml.edu>.
+
+ This file is placed into the public domain. Its distribution
+ is unlimited.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR ANY
+ DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+ GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
+ IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+ IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/* NAME
+
+ xgethostname - get the host name.
+
+ SYNOPSIS
+
+ char *xgethostname (void);
+
+ DESCRIPTION
+
+ The xhostname function is intended to replace gethostname(2), a
+ function used to access the host name. The old interface is
+ inflexable given that it assumes the existance of the
+ MAXHOSTNAMELEN macro, which neither POSIX nor the proposed
+ Single Unix Specification version 3 guarantee to be defined.
+
+ RETURN VALUE
+
+ On success, a malloced, null terminated (possibly truncated)
+ string containing the host name is returned. On failure,
+ NULL is returned and errno is set.
+ */
+
+#ifndef XGETHOSTNAME
+#define XGETHOSTNAME
+
+char * xgethostname (void);
+
+#endif /* XGETHOSTNAME */
+
More information about the openssh-unix-dev
mailing list