Subject: WU-FTPD on UnixWare

From: Jim Carroll <[email-masked]>
Date: Wed, 15 Feb 1995 15:40:01 -0500

Greetings from a new list member.

Just wondering if anybody has successfully built a recent version of wu-ftpd on
a UnixWare 1.1 host.

If this is a FAQ, someone shunt me in the right direction.

Since I'd prefer not to fill up everybody's mailboxes with what might be (to
them) uninteresting drivel, feel free to mail me directly, and I'll summarize.

-- 
Jim Carroll --  [email-masked] -- Standard disclaimer here.
e-Commerce, Inc., 1030 Kamato Road, Suite 201 
Mississauga, Ontario, Canada   L4W 4B6        
   ** http://www.e-Commerce.com/~jimc/home.html **

---

From: [email-masked] (Mark Powell)
Date: Fri, 17 Feb 1995 10:09 +0000 (GMT)

In article <[email-masked]>,
>Greetings from a new list member.

Greetings.

>them) uninteresting drivel, feel free to mail me directly, and I'll summarize.

I too had problems getting wu-ftpd-2.4 to compile on this Dell SVR4 v2.2 machine.
I think most of the mod.s I made will be relevant to yourself.
First the makefiles:

I added free code for strcasecmp.c to the support directory as I try
not to use the BSD compatiblilty libraries, if possible.

---wu-ftpd-2.4/support/makefiles/Makefile.sv4---
CC     = gcc
AR     = ar cq
RANLIB = ranlib
LIBC   = -lnsl -lsocket
IFLAGS = 
LFLAGS = 
CFLAGS = -O2 -fomit-frame-pointer -DDEBUG ${IFLAGS} ${LFLAGS}

SRCS   = getusershell.c fnmatch.c strcasestr.c strsep.c \
		 authuser.c strcasecmp.c
OBJS   = getusershell.o fnmatch.o strcasestr.o strsep.o \
		 authuser.o strcasecmp.o

all: $(OBJS)
	-rm -f libsupport.a
	${AR} libsupport.a $(OBJS)
	${RANLIB} libsupport.a

clean:
	-rm -f *.o libsupport.a

ftp.h:
	install -c -m 444 ftp.h /usr/include/arpa

paths.h:
	install -c -m 444 paths.h /usr/include

fnmatch.o: fnmatch.c
	${CC} ${CFLAGS} -c fnmatch.c

getusershell.o: getusershell.c
	${CC} ${CFLAGS} -c getusershell.c

strerror.o: strerror.c
	${CC} ${CFLAGS} -c strerror.c

strdup.o: strdup.c
	${CC} ${CFLAGS} -c strdup.c

strcasestr.o: strcasestr.c
	${CC} ${CFLAGS} -c strcasestr.c

strcasecmp.o: strcasecmp.c
	${CC} ${CFLAGS} -c strcasecmp.c

strsep.o: strsep.c
	${CC} ${CFLAGS} -c strsep.c

authuser.o: authuser.c
	${CC} ${CFLAGS} -c authuser.c

ftw.o: ftw.c
	${CC} ${CFLAGS} -c ftw.c
---

---wu-ftpd-2.4/src/makefiles/Makefile.sv4---
CC       = gcc
IFLAGS   = -I.. -I../support
LFLAGS   = -L../support
CFLAGS   = -O2 -fomit-frame-pointer -DDEBUG ${IFLAGS} ${LFLAGS}
LIBES    = -lsupport -lgen -lnsl -lsocket
LIBC     = -lc
LINTFLAGS=	
LKERB    = -lauth -lckrb -lkrb -ldes
MKDEP    = ../util/mkdep

SRCS   = ftpd.c ftpcmd.c glob.c logwtmp.c popen.c vers.c access.c extensions.c \
		 realpath.c acl.c private.c authenticate.c conversions.c hostacc.c
OBJS   = ftpd.o ftpcmd.o glob.o logwtmp.o popen.o vers.o access.o extensions.o \
		 realpath.o acl.o private.o authenticate.o conversions.o hostacc.o

all: ftpd ftpcount ftpshut ckconfig

ftpcount:	ftpcount.c pathnames.h
	${CC} ${CFLAGS} -o $@ ftpcount.c vers.o ${LIBES}

ftpshut:    ftpshut.c pathnames.h
	${CC} ${CFLAGS} -o $@ ftpshut.c vers.o ${LIBES}

ftpd: ${OBJS} ${LIBC}
	${CC} ${CFLAGS} -o $@ ${OBJS} ${LIBES}

ckconfig:   ckconfig.c
	${CC} ${CFLAGS} -o $@ ckconfig.c

index:	index.o ${LIBC}
	${CC} -Bstatic -o $@ index.o

vers.o: ftpd.c ftpcmd.y
	sh newvers.sh
	${CC} ${CFLAGS} -c vers.c

clean:
	rm -f ${OBJS} ftpd ftpcmd.c ftpshut ftpshut.o ftpcount ftpcount.o
	rm -f core index index.o ckconfig ckconfig.o

cleandir: clean
	rm -f tags .depend

depend: ${SRCS}
	${MKDEP} ${CFLAGS} ${SRCS}

lint: ${SRCS}
	lint ${CFLAGS} ${LINTFLAGS} ${SRCS}

tags: ${SRCS}
	ctags ${SRCS}
---

I made the following patches to the src directory to enable the SO_LINGER
option on the data socket. Otherwise the last chunk of data is generally
not sent. I also modifed logwtmp.c to support the SVR4 wtmpx file as well
as the usual wtmp. Pipe this article to patch, when in the parent of the
wu-ftpd-2.4 directory.

-----cut-here----
*** wu-ftpd-2.4.old/src/ftpd.c	Wed Apr 13 21:17:18 1994
--- wu-ftpd-2.4/src/ftpd.c	Wed Feb  8 11:01:00 1995
***************
*** 92,97 ****
--- 92,98 ----
  #endif
  
  #ifdef HAVE_SYSINFO
+ #include <limits.h>
  #include <sys/systeminfo.h>
  #endif
  
***************
*** 139,146 ****
   *freopen(const char *, const char *, FILE *);
  extern int ftpd_pclose(FILE *iop),
    fclose(FILE *);
! extern char *getline(),
!  *realpath(char *pathname, char *result);
  extern char cbuf[];
  extern off_t restart_point;
  
--- 140,147 ----
   *freopen(const char *, const char *, FILE *);
  extern int ftpd_pclose(FILE *iop),
    fclose(FILE *);
! extern char *getline();/*,
!  *realpath(char *pathname, char *result);*/
  extern char cbuf[];
  extern off_t restart_point;
  
***************
*** 1659,1665 ****
              goto bad;
          sleep(tries);
      }
! #if defined(M_UNIX) && !defined(_M_UNIX)  /* bug in old TCP/IP release */
      {
          struct linger li;
          li.l_onoff = 1;
--- 1660,1666 ----
              goto bad;
          sleep(tries);
      }
! #if defined(SVR4) || (defined(M_UNIX) && !defined(_M_UNIX))  /* bug in old TCP/IP release */
      {
          struct linger li;
          li.l_onoff = 1;
*** wu-ftpd-2.4.old/src/logwtmp.c	Wed Apr 13 21:03:47 1994
--- wu-ftpd-2.4/src/logwtmp.c	Wed Feb  8 11:45:01 1995
***************
*** 55,60 ****
--- 55,61 ----
  /* Modified version of logwtmp that holds wtmp file open after first call,
   * for use with ftp (which may chroot after login, but before logout). */
  
+ #ifndef SVR4
  logwtmp(char *line, char *name, char *host)
  {
      struct utmp ut;
***************
*** 94,96 ****
--- 95,121 ----
                (void) ftruncate(fd, buf.st_size);
      }
  }
+ #else
+ #include <utmpx.h>
+ 
+ logwtmp(char *line, char *name, char *host)
+ {
+ 	struct utmpx ut;
+ 
+ 	memset((void *)&ut, 0, sizeof(ut));
+ 	strncpy(ut.ut_user, name, sizeof(ut.ut_user));
+ 	strncpy(ut.ut_id, "ftp", sizeof(ut.ut_id));
+ 	strncpy(ut.ut_line, line, sizeof(ut.ut_line));
+ 	ut.ut_pid = getpid();
+ 	if (name && *name)
+ 		ut.ut_type = USER_PROCESS;
+ 	else
+ 		ut.ut_type = DEAD_PROCESS;
+ 	ut.ut_exit.e_termination = 0;
+ 	ut.ut_exit.e_exit = 0;
+ 	time(&ut.ut_tv.tv_sec);
+ 	strncpy(ut.ut_host, host, sizeof(ut.ut_host));
+ 
+ 	updwtmpx(WTMPX_FILE, &ut);
+ }
+ #endif
-----cut-here-----

This is the config.h file for SVR4

---wu-ftpd-2.4/src/config.h
#define HAVE_SYMLINK
#define HAVE_DIRENT
#undef  HAVE_D_NAMLEN
#undef HAVE_FLOCK
#define HAVE_FTW
#define HAVE_GETCWD
#undef HAVE_GETDTABLESIZE
#undef  HAVE_PSTAT
#define HAVE_ST_BLKSIZE
#define HAVE_SYSINFO
#undef  HAVE_UT_UT_HOST
#define HAVE_VPRINTF
#define HAVE_STATVFS
#undef  HAVE_REGEX_H
#define OVERWRITE
#define REGEX
#define SETPROCTITLE
#define SHADOW_PASSWORD
#define UPLOAD
#define USG
#undef NO_MALLOC_PROTO
#define SVR4
#define L_INCR  SEEK_CUR
#define NCARGS 5120
/*
#define setegid(x)      setregid(-1,x)
#define seteuid(x)      setreuid(-1,x)
*/

#define bzero(s,n)      memset(s,0,n)

#include <malloc.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>

#ifndef FACILITY
#define FACILITY LOG_DAEMON
#endif

typedef void	SIGNAL_TYPE;

#include "../config.h"
------------

I hope I've not forgotten anything here. Comments welcome on whether
I've done the right thing. 
Oh, here's the UCB strcasecmp.c in case you haven't got it.

---wu-ftpd-2.4/support/strcasecmp.c---
/*
 * ++Copyright++ 1987, 1993
 * -
 * Copyright (c) 1987, 1993
 *    The Regents of the University of California.  All rights reserved.
 * 
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 * 3. All advertising materials mentioning features or use of this software
 *    must display the following acknowledgement:
 * 	This product includes software developed by the University of
 * 	California, Berkeley and its contributors.
 * 4. Neither the name of the University nor the names of its contributors
 *    may be used to endorse or promote products derived from this software
 *    without specific prior written permission.
 * 
 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``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 REGENTS 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.
 * -
 * Portions Copyright (c) 1993 by Digital Equipment Corporation.
 * 
 * Permission to use, copy, modify, and distribute this software for any
 * purpose with or without fee is hereby granted, provided that the above
 * copyright notice and this permission notice appear in all copies, and that
 * the name of Digital Equipment Corporation not be used in advertising or
 * publicity pertaining to distribution of the document or software without
 * specific, written prior permission.
 * 
 * THE SOFTWARE IS PROVIDED "AS IS" AND DIGITAL EQUIPMENT CORP. DISCLAIMS ALL
 * WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES
 * OF MERCHANTABILITY AND FITNESS.   IN NO EVENT SHALL DIGITAL EQUIPMENT
 * CORPORATION BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
 * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
 * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
 * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
 * SOFTWARE.
 * -
 * --Copyright--
 */

#if defined(LIBC_SCCS) && !defined(lint)
static char sccsid[] = "@(#)strcasecmp.c	8.1 (Berkeley) 6/4/93";
static char rcsid[] = "$Id: strcasecmp.c,v 4.9.1.4 1994/06/06 09:08:03 vixie Exp $";
#endif /* LIBC_SCCS and not lint */

#include <sys/param.h>
#include <sys/types.h>
#include <sys/cdefs.h>
#include <string.h>

/*
 * This array is designed for mapping upper and lower case letter
 * together for a case independent comparison.  The mappings are
 * based upon ascii character sequences.
 */
static const u_char charmap[] = {
	0000, 0001, 0002, 0003, 0004, 0005, 0006, 0007,
	0010, 0011, 0012, 0013, 0014, 0015, 0016, 0017,
	0020, 0021, 0022, 0023, 0024, 0025, 0026, 0027,
	0030, 0031, 0032, 0033, 0034, 0035, 0036, 0037,
	0040, 0041, 0042, 0043, 0044, 0045, 0046, 0047,
	0050, 0051, 0052, 0053, 0054, 0055, 0056, 0057,
	0060, 0061, 0062, 0063, 0064, 0065, 0066, 0067,
	0070, 0071, 0072, 0073, 0074, 0075, 0076, 0077,
	0100, 0141, 0142, 0143, 0144, 0145, 0146, 0147,
	0150, 0151, 0152, 0153, 0154, 0155, 0156, 0157,
	0160, 0161, 0162, 0163, 0164, 0165, 0166, 0167,
	0170, 0171, 0172, 0133, 0134, 0135, 0136, 0137,
	0140, 0141, 0142, 0143, 0144, 0145, 0146, 0147,
	0150, 0151, 0152, 0153, 0154, 0155, 0156, 0157,
	0160, 0161, 0162, 0163, 0164, 0165, 0166, 0167,
	0170, 0171, 0172, 0173, 0174, 0175, 0176, 0177,
	0200, 0201, 0202, 0203, 0204, 0205, 0206, 0207,
	0210, 0211, 0212, 0213, 0214, 0215, 0216, 0217,
	0220, 0221, 0222, 0223, 0224, 0225, 0226, 0227,
	0230, 0231, 0232, 0233, 0234, 0235, 0236, 0237,
	0240, 0241, 0242, 0243, 0244, 0245, 0246, 0247,
	0250, 0251, 0252, 0253, 0254, 0255, 0256, 0257,
	0260, 0261, 0262, 0263, 0264, 0265, 0266, 0267,
	0270, 0271, 0272, 0273, 0274, 0275, 0276, 0277,
	0300, 0301, 0302, 0303, 0304, 0305, 0306, 0307,
	0310, 0311, 0312, 0313, 0314, 0315, 0316, 0317,
	0320, 0321, 0322, 0323, 0324, 0325, 0326, 0327,
	0330, 0331, 0332, 0333, 0334, 0335, 0336, 0337,
	0340, 0341, 0342, 0343, 0344, 0345, 0346, 0347,
	0350, 0351, 0352, 0353, 0354, 0355, 0356, 0357,
	0360, 0361, 0362, 0363, 0364, 0365, 0366, 0367,
	0370, 0371, 0372, 0373, 0374, 0375, 0376, 0377
};

int
strcasecmp(s1, s2)
#ifdef __convex__
	char	    *s1, *s2;
#else
	const char  *s1, *s2;
#endif
{
	register const u_char *cm = charmap,
			*us1 = (const u_char *)s1,
			*us2 = (const u_char *)s2;

	while (cm[*us1] == cm[*us2++])
		if (*us1++ == '\0')
			return (0);
	return (cm[*us1] - cm[*--us2]);
}

int
strncasecmp(s1, s2, n)
#ifdef	__convex__
	char	    *s1, *s2;
#else
	const char  *s1, *s2;
#endif
	register size_t n;
{
	if (n != 0) {
		register const u_char *cm = charmap,
				*us1 = (const u_char *)s1,
				*us2 = (const u_char *)s2;

		do {
			if (cm[*us1] != cm[*us2++])
				return (cm[*us1] - cm[*--us2]);
			if (*us1++ == '\0')
				break;
		} while (--n != 0);
	}
	return (0);
}
-----------

-- 
Mark Powell - Network Technician - Room: C806
Computer Services Unit, University College Salford, Salford, UK.
Tel:	+44 161 745 3376		Fax:	+44 161 736 3596
Email:	[email-masked]	PGP key available
<A HREF="http://plato.ucsalf.ac.uk/~mark/">Home Page</A>