Dear OpenSSH porting developers, finally I succeded in porting OpenSSH to QNX 4. To get things going I had to take over some definitions from Linux' include files, since they are not available under QNX (e.g. the howmany makro, NFDBITS, the lastlog structure). With this email I send a patch with all my changes as well as the file "qnx-term.h" which I created because IXANY and ONLCR are not supported under QNX. Please include my changes into the OpenSSH portable distribution to allow others to install OpenSSH under QNX easily. Greetings Andreas -------------- next part -------------- /* Things the system doesn't provide under QNX */ #if defined(__QNX__) && !defined(__QNXNTO__) #ifndef QNX_TERM_H #define QNX_TERM_H #define IXANY 0 /* not supported on QNX; under Linux 0004000 */ #define ONLCR 0 /* not supported on QNX; under Linux 0000004 */ #endif /* !QNX_TERM_H */ #endif /* __QNX__ && !__QNXNTO__ */ -------------- next part -------------- diff -cr openssh-2.2.0p1.orig/clientloop.c openssh-2.2.0p1.qnx/clientloop.c *** openssh-2.2.0p1.orig/clientloop.c Wed Aug 23 02:46:24 2000 --- openssh-2.2.0p1.qnx/clientloop.c Tue Sep 12 10:23:58 2000 *************** *** 32,37 **** --- 32,41 ---- #include "buffer.h" #include "bufaux.h" + #if defined(__QNX__) && !defined(__QNXNTO__) + #include "qnx-term.h" + #endif /* __QNX__ && !__QNXNTO__ */ + /* Flag indicating that stdin should be redirected from /dev/null. */ extern int stdin_null_flag; diff -cr openssh-2.2.0p1.orig/includes.h openssh-2.2.0p1.qnx/includes.h *** openssh-2.2.0p1.orig/includes.h Fri Aug 18 06:59:59 2000 --- openssh-2.2.0p1.qnx/includes.h Tue Sep 12 10:26:21 2000 *************** *** 27,33 **** --- 27,35 ---- #include <sys/socket.h> #include <sys/ioctl.h> #include <sys/wait.h> + #if !defined(__QNX__) || defined(__QNXNTO__) #include <sys/resource.h> + #endif /* !__QNX__ || __QNXNTO__ */ #include <netinet/tcp.h> #include <arpa/inet.h> diff -cr openssh-2.2.0p1.orig/loginrec.c openssh-2.2.0p1.qnx/loginrec.c *** openssh-2.2.0p1.orig/loginrec.c Tue Aug 29 05:30:37 2000 --- openssh-2.2.0p1.qnx/loginrec.c Tue Sep 12 09:26:36 2000 *************** *** 744,755 **** --- 744,760 ---- } #else /* FIXME */ + #if defined(__QNX__) && !defined(__QNXNTO__) + tty = 1; + #else tty = ttyslot(); /* seems only to work for /dev/ttyp? style names */ + #endif /* __QNX__ && !__QNXNTO__ */ #endif /* HAVE_GETTTYENT */ if (tty > 0 && (fd = open(UTMP_FILE, O_RDWR|O_CREAT, 0644)) >= 0) { (void)lseek(fd, (off_t)(tty * sizeof(struct utmp)), SEEK_SET); + #ifdef HAVE_HOST_IN_UTMP /* * Prevent luser from zero'ing out ut_host. * If the new ut_line is empty but the old one is not *************** *** 761,766 **** --- 766,772 ---- (strncmp(old_ut.ut_name, ut->ut_name, sizeof(ut->ut_name)) == 0)) { (void)memcpy(ut->ut_host, old_ut.ut_host, sizeof(ut->ut_host)); } + #endif /* HAVE_HOST_IN_UTMP */ (void)lseek(fd, (off_t)(tty * sizeof(struct utmp)), SEEK_SET); if (atomicio(write, fd, ut, sizeof(*ut)) != sizeof(*ut)) *************** *** 1319,1324 **** --- 1325,1349 ---- #define LL_FILE 1 #define LL_DIR 2 #define LL_OTHER 3 + + /* struct lastlog is not defined under QNX: define it */ + #if defined(__QNX__) && !defined(__QNXNTO__) + #define __time_t time_t + + /* from Linux's <bits/utmp.h> */ + #define UT_LINESIZE 32 + #define UT_NAMESIZE 32 + #define UT_HOSTSIZE 256 + + /* The structure describing an entry in the database of + previous logins. */ + struct lastlog + { + __time_t ll_time; + char ll_line[UT_LINESIZE]; + char ll_host[UT_HOSTSIZE]; + }; + #endif /* __QNX__ && !__QNXNTO__ */ static void lastlog_construct(struct logininfo *li, struct lastlog *last) diff -cr openssh-2.2.0p1.orig/scp.c openssh-2.2.0p1.qnx/scp.c *** openssh-2.2.0p1.orig/scp.c Wed Aug 30 01:11:30 2000 --- openssh-2.2.0p1.qnx/scp.c Tue Sep 12 10:29:21 2000 *************** *** 650,656 **** --- 650,660 ---- return; } while ((dp = readdir(dirp))) { + #if defined(__QNX__) && !defined(__QNXNTO__) + if (dp->d_stat.st_ino == 0) + #else /* !__QNX__ || __QNXNTO__ */ if (dp->d_ino == 0) + #endif /* !__QNX__ || __QNXNTO__ */ continue; if (!strcmp(dp->d_name, ".") || !strcmp(dp->d_name, "..")) continue; *************** *** 1050,1055 **** --- 1054,1064 ---- bad: fprintf(stderr, "%s: invalid user name\n", cp0); return (0); } + + + #if defined(__QNX__) && !defined(__QNXNTO__) + #define st_blksize st_size /* other naming under QNX */ + #endif /* __QNX__ && !__QNX_NTO__ */ BUF * allocbuf(bp, fd, blksize) diff -cr openssh-2.2.0p1.orig/session.c openssh-2.2.0p1.qnx/session.c *** openssh-2.2.0p1.orig/session.c Wed Aug 30 00:21:22 2000 --- openssh-2.2.0p1.qnx/session.c Tue Sep 12 09:27:19 2000 *************** *** 1861,1863 **** --- 1861,1874 ---- if (xauthfile) xauthfile_cleanup_proc(NULL); } + + + #if defined(__QNX__) && !defined(__QNXNTO__) + /* Thanks to liug at mama.indstate.edu */ + + int initgroups(char *name,gid_t id) + { + return(0); + } + + #endif /* __QNX__ && !__QNXNTO__ */ diff -cr openssh-2.2.0p1.orig/ssh.c openssh-2.2.0p1.qnx/ssh.c *** openssh-2.2.0p1.orig/ssh.c Tue Aug 29 02:33:51 2000 --- openssh-2.2.0p1.qnx/ssh.c Tue Sep 12 10:30:53 2000 *************** *** 215,220 **** --- 215,221 ---- original_real_uid = getuid(); original_effective_uid = geteuid(); + #if !defined(__QNX__) || defined(__QNXNTO__) /* If we are installed setuid root be careful to not drop core. */ if (original_real_uid != original_effective_uid) { struct rlimit rlim; *************** *** 222,227 **** --- 223,229 ---- if (setrlimit(RLIMIT_CORE, &rlim) < 0) fatal("setrlimit failed: %.100s", strerror(errno)); } + #endif /* !__QNX__ || __QNXNTO__ */ /* * Use uid-swapping to give up root privileges for the duration of * option processing. We will re-instantiate the rights when we are diff -cr openssh-2.2.0p1.orig/sshd.c openssh-2.2.0p1.qnx/sshd.c *** openssh-2.2.0p1.orig/sshd.c Tue Aug 29 02:05:50 2000 --- openssh-2.2.0p1.qnx/sshd.c Tue Sep 12 12:21:29 2000 *************** *** 49,54 **** --- 49,76 ---- int deny_severity = LOG_WARNING; #endif /* LIBWRAP */ + #if defined(__QNX__) && !defined(__QNXNTO__) + /* Define some things not available under QNX */ + + /* from Linux's <sys/param.h> */ + #ifndef howmany + # define howmany(x, y) (((x)+((y)-1))/(y)) + #endif /* !howmany */ + /* from the Linux kernel */ + //#define __NFDBITS (8 * sizeof(unsigned long)) /* results in 32 under QNX and Linux (A.S.) */ + + /* from Linux's <bits/types.h> */ + /* One element in the file descriptor mask array. */ + typedef unsigned long int __fd_mask; + /* It's easier to assume 8-bit bytes than to get CHAR_BIT. */ + #define __NFDBITS (8 * sizeof (__fd_mask)) /* results in 32 under QNX and Linux (A.S.) */ + + /* from Linux's <sys/select.h> */ + /* Number of bits per word of `fd_set' (some code assumes this is 32). */ + #define NFDBITS __NFDBITS + typedef __fd_mask fd_mask; + #endif /* __QNX__ && !__QNXNTO__ */ + #ifndef O_NOCTTY #define O_NOCTTY 0 #endif diff -cr openssh-2.2.0p1.orig/ttymodes.h openssh-2.2.0p1.qnx/ttymodes.h *** openssh-2.2.0p1.orig/ttymodes.h Thu Jun 22 13:32:32 2000 --- openssh-2.2.0p1.qnx/ttymodes.h Tue Sep 12 10:32:13 2000 *************** *** 32,37 **** --- 32,41 ---- * is only intended for including from ttymodes.c. */ + #if defined(__QNX__) && !defined(__QNXNTO__) + #include "qnx-term.h" + #endif /* __QNX__ && !__QNXNTO__ */ + /* termios macro */ /* sgtty macro */ /* name, op */ TTYCHAR(VINTR, 1) SGTTYCHAR(tiotc.t_intrc, 1)