#############################################################################
# You need to do a successful 'make' in the bsd_src directory first before
# trying to run 'make' in this directory.  The bsd_src directory contains
# several files derived from those found in the uunet.uu.net archive.
# Run "make install" to install binaries.
# Run "make installm" to install man pages.
# Run "make de-install" to remove installed binaries and man pages.

#############################################################################
# This is where you want to install the binary
#
BIN=/usr/local

#############################################################################
# This is where you want to install the man pages
#
MAN=/usr/local/man/man1

#############################################################################
# If you want to provide FSP service, this should be set to the working
# directory of the FSP server.
#
DEF_FSP_HOME=/u1/fsp

#############################################################################
# If the server is to run on a machine with file name length limit, set the
# following variable to the length.  Otherwise, set it to something big.
FILE_NAME_LIMIT=99999

#############################################################################
# If you want to provide FSP service, this should be set to the UDP socket
# port number the FSP server should use.
#
DEF_FSP_PORT=21

#############################################################################
# FSP servers normally keep a directory listing file in each directory it
# exports.  In situation where this is not appropriate, FSP can store the
# listing in another directory instead.  DEF_DIRECTORY_CACHE should contain
# a directory where such a listing is to be placed.  The path is relative
# to DEF_FSP_HOME unless it starts with a '/'.  FSP server also uses this
# directory to hold temporary files during upload, so this variable must
# refer to a valid directory even if all subdirectories are writable by
# the fspd process.

DEF_DIRECTORY_CACHE=.

# MAX_DIR_CACHE_COUNT should contain the number of listings to be cached in
# DEF_DIRECTORY_CACHE.  The number should be a power of 2.

MAX_DIR_CACHE_COUNT=16

# ALWAYS_USE_CACHE_DIR should be 1 if you want it used as the default way to
# store directory listing files.  (Note, .FSP_CONTENT files will still be
# used if they alreay exist.

ALWAYS_USE_CACHE_DIR=1

#############################################################################
# This is where the version number string comes from:
#
VERSION_STR="Original Caltech version 2.6.3, September 1992"

#############################################################################
# FSP uses BSD random/srandom functions.  If your system does not have
# them, include them from the bsd_src directory.
#
#RANDOM=bsd_src/random.o

#############################################################################
# If your machine has either lockf or flock functions, you may be able to
# compile the client codes so that multiple client commands can be run
# concurrently.  Uncomment one of the following and set the LOCK_PREFIX
# string appropriately.  In most cases, they are prefixes used to create 
# a lock file in your file system.  There are some restrictions, for example
# on SunOS, lock files may not be on a file system of type tmp.  The most
# efficient locking choice is the one that uses SysV shared memory plus lockf.
# Note, it is possible for some UNIX to have hooks for the locking mechanism
# exist in the C library but unsupported in the kernel.  In such a case,
# compilation will complete normally, but you will get run time errors.
#
#LOCK_FLAGS= -DUSE_SHAREMEM_AND_LOCKF -DKEY_PREFIX=\"/usr/tmp/.FL\"
LOCK_FLAGS= -DUSE_FLOCK -DKEY_PREFIX=\"/usr/tmp/.FL\"
#LOCK_FLAGS= -DUSE_LOCKF -DKEY_PREFIX=\"/usr/tmp/.FL\"
#LOCK_FLAGS= -DNOLOCKING

#############################################################################
# The following variable defines the compiler to use in your compilation.
CC=cc

#############################################################################
# Include -DDIRENT in CFLAGS if you have /usr/include/dirent.h.
# Remove  -DDIRENT if you do not.
CFLAGS=-g 
# -DDIRENT

#############################################################################
# If you need to link in any additional libraries, do it here.
# AT&T 3B2/600G + AT&T Unix Sys V R 3.2.3 + WIN/TCP R 3.2 use -lnet -lnsl_s 
LIB=
SHELL=/bin/sh

PROGS=	flscmd fcdcmd fgetcmd frmcmd frmdircmd fprocmd \
	fmkdir fput fver fcatcmd fgrabcmd

IPROGS=	${BIN}/flscmd ${BIN}/fcdcmd \
	${BIN}/fgetcmd ${BIN}/frmcmd ${BIN}/frmdircmd ${BIN}/fprocmd \
	${BIN}/fmkdir ${BIN}/fput ${BIN}/fver ${BIN}/fcatcmd ${BIN}/fgrabcmd

IMANS=	${MAN}/fcatcmd.1 ${MAN}/fcat.1 ${MAN}/fcdcmd.1 ${MAN}/fcd.1 \
	${MAN}/fgetcmd.1 ${MAN}/fget.1 ${MAN}/flscmd.1 ${MAN}/fls.1 \
	${MAN}/fmkdir.1 ${MAN}/fprocmd.1 ${MAN}/fpro.1 ${MAN}/fput.1 \
	${MAN}/frmcmd.1 ${MAN}/frm.1 ${MAN}/frmdircmd.1 ${MAN}/frmdir.1 \
	${MAN}/fspd.1 ${MAN}/fver.1 ${MAN}/fgrab.1 ${MAN}/fgrabcmd.1

all:
	@ cd bsd_src; make
	@ make all1

merge:
	@ cd bsd_src; make
	@ make fspd fsp_client_merge

all1:	  ${PROGS} fspd
install:  ${IPROGS} ${BIN}/fspd
installm: ${IMANS}

install-merge: ${BIN}/fspd fsp_client_merge
	- rm -f ${IPROGS} ${BIN}/fsp_client_merge
	cp fsp_client_merge ${BIN}/fsp_client_merge
	for A in ${IPROGS} ; do ln ${BIN}/fsp_client_merge $$A; done
	rm -f ${BIN}/fsp_client_merge

SERVER_OBJ= server_main.o server_lib.o server_host.o udp_io.o server_file.o
CLIENT_OBJ= client_lib.o udp_io.o client_util.o client_lock.o
GLOB_OBJ= bsd_src/glob.o
UTIL_LS_OBJ= bsd_src/cmp.o bsd_src/ls.o bsd_src/print.o bsd_src/util.o \
		${GLOB_OBJ}

#############################################################################

fspd: ${SERVER_OBJ} ${RANDOM}
	${CC} ${CFLAGS} -o fspd ${SERVER_OBJ} ${RANDOM} ${LIB}

fgetcmd: fgetcmd.o ${CLIENT_OBJ} ${GLOB_OBJ}
	${CC} ${CFLAGS} -o fgetcmd fgetcmd.o ${CLIENT_OBJ} ${GLOB_OBJ} ${LIB}

fgrabcmd: fgrabcmd.o ${CLIENT_OBJ} ${GLOB_OBJ}
	${CC} ${CFLAGS} -o fgrabcmd fgrabcmd.o ${CLIENT_OBJ} ${GLOB_OBJ} ${LIB}

fcatcmd: fcatcmd.o ${CLIENT_OBJ} ${GLOB_OBJ}
	${CC} ${CFLAGS} -o fcatcmd fcatcmd.o ${CLIENT_OBJ} ${GLOB_OBJ} ${LIB}

fput: fput.o ${CLIENT_OBJ}
	${CC} ${CFLAGS} -o fput fput.o ${CLIENT_OBJ} ${LIB}

frmcmd: frmcmd.o ${CLIENT_OBJ} ${GLOB_OBJ}
	${CC} ${CFLAGS} -o frmcmd frmcmd.o ${CLIENT_OBJ} ${GLOB_OBJ} ${LIB}

flscmd: flscmd.o ${CLIENT_OBJ} ${UTIL_LS_OBJ}
	${CC} ${CFLAGS} -o flscmd flscmd.o ${CLIENT_OBJ} ${UTIL_LS_OBJ} ${LIB}

fcdcmd: fcdcmd.o ${CLIENT_OBJ} ${GLOB_OBJ}
	${CC} ${CFLAGS} -o fcdcmd fcdcmd.o ${CLIENT_OBJ} ${GLOB_OBJ} ${LIB}

frmdircmd: frmdircmd.o ${CLIENT_OBJ} ${GLOB_OBJ}
	${CC} ${CFLAGS} -o frmdircmd frmdircmd.o ${CLIENT_OBJ} ${GLOB_OBJ} \
									${LIB}

fprocmd: fprocmd.o ${CLIENT_OBJ} ${GLOB_OBJ}
	${CC} ${CFLAGS} -o fprocmd fprocmd.o ${CLIENT_OBJ} ${GLOB_OBJ} ${LIB}

fmkdir: fmkdir.o ${CLIENT_OBJ}
	${CC} ${CFLAGS} -o fmkdir fmkdir.o ${CLIENT_OBJ} ${LIB}

fver: fver.o ${CLIENT_OBJ}
	${CC} ${CFLAGS} -o fver fver.o ${CLIENT_OBJ} ${LIB}

fver.o: fver.c client_def.h common_def.h Makefile
	${CC} ${CFLAGS} -c -DVERSION_STR=\"${VERSION_STR}\" fver.c

#############################################################################

MERGE_OBJ = fcatcmd_merge.o fcdcmd_merge.o fgetcmd_merge.o fgrabcmd_merge.o \
	    flscmd_merge.o fmkdir_merge.o fprocmd_merge.o fput_merge.o \
	    frmcmd_merge.o frmdircmd_merge.o fver_merge.o

fgetcmd_merge.o: fgetcmd.o
	echo '#include "fgetcmd.c"' > fgetcmd_merge.c
	${CC} ${CFLAGS} -c -Dmain=fgetcmd_main fgetcmd_merge.c
	rm -f fgetcmd_merge.c

fgrabcmd_merge.o: fgrabcmd.o
	echo '#include "fgrabcmd.c"' > fgrabcmd_merge.c
	${CC} ${CFLAGS} -c -Dmain=fgrabcmd_main fgrabcmd_merge.c
	rm -f fgrabcmd_merge.c

fcatcmd_merge.o: fcatcmd.o
	echo '#include "fcatcmd.c"' > fcatcmd_merge.c
	${CC} ${CFLAGS} -c -Dmain=fcatcmd_main fcatcmd_merge.c
	rm -f fcatcmd_merge.c

fput_merge.o: fput.o
	echo '#include "fput.c"' > fput_merge.c
	${CC} ${CFLAGS} -c -Dmain=fput_main fput_merge.c
	rm -f fput_merge.c

frmcmd_merge.o: frmcmd.o
	echo '#include "frmcmd.c"' > frmcmd_merge.c
	${CC} ${CFLAGS} -c -Dmain=frmcmd_main frmcmd_merge.c
	rm -f frmcmd_merge.c

flscmd_merge.o: flscmd.o
	echo '#include "flscmd.c"' > flscmd_merge.c
	${CC} ${CFLAGS} -c -Dmain=flscmd_main flscmd_merge.c
	rm -f flscmd_merge.c

fcdcmd_merge.o: fcdcmd.o
	echo '#include "fcdcmd.c"' > fcdcmd_merge.c
	${CC} ${CFLAGS} -c -Dmain=fcdcmd_main fcdcmd_merge.c
	rm -f fcdcmd_merge.c

frmdircmd_merge.o: frmdircmd.o
	echo '#include "frmdircmd.c"' > frmdircmd_merge.c
	${CC} ${CFLAGS} -c -Dmain=frmdircmd_main frmdircmd_merge.c
	rm -f frmdircmd_merge.c

fprocmd_merge.o: fprocmd.o
	echo '#include "fprocmd.c"' > fprocmd_merge.c
	${CC} ${CFLAGS} -c -Dmain=fprocmd_main fprocmd_merge.c
	rm -f fprocmd_merge.c

fmkdir_merge.o: fmkdir.o
	echo '#include "fmkdir.c"' > fmkdir_merge.c
	${CC} ${CFLAGS} -c -Dmain=fmkdir_main fmkdir_merge.c
	rm -f fmkdir_merge.c

fver_merge.o: fver.o Makefile
	echo '#include "fver.c"' > fver_merge.c
	${CC} ${CFLAGS} -c -Dmain=fver_main -DVERSION_STR=\"${VERSION_STR}\" \
				fver_merge.c
	rm -f fver_merge.c

fsp_client_merge: merge.o ${MERGE_OBJ} ${CLIENT_OBJ} ${UTIL_LS_OBJ}
	${CC} -o fsp_client_merge merge.o ${MERGE_OBJ} \
				${CLIENT_OBJ} ${UTIL_LS_OBJ} ${LIB}

#############################################################################


${BIN}/fspd     : fspd      ; cp fspd      ${BIN}/fspd
${BIN}/fgetcmd  : fgetcmd   ; cp fgetcmd   ${BIN}/fgetcmd
${BIN}/fgrabcmd : fgrabcmd  ; cp fgrabcmd  ${BIN}/fgrabcmd
${BIN}/fcatcmd  : fcatcmd   ; cp fcatcmd   ${BIN}/fcatcmd
${BIN}/fput     : fput      ; cp fput      ${BIN}/fput
${BIN}/frmcmd   : frmcmd    ; cp frmcmd    ${BIN}/frmcmd
${BIN}/flscmd   : flscmd    ; cp flscmd    ${BIN}/flscmd
${BIN}/fcdcmd   : fcdcmd    ; cp fcdcmd    ${BIN}/fcdcmd
${BIN}/frmdircmd: frmdircmd ; cp frmdircmd ${BIN}/frmdircmd
${BIN}/fprocmd  : fprocmd   ; cp fprocmd   ${BIN}/fprocmd
${BIN}/fmkdir   : fmkdir    ; cp fmkdir    ${BIN}/fmkdir
${BIN}/fver     : fver      ; cp fver      ${BIN}/fver

#############################################################################

${MAN}/fcat.1     : fcatcmd.1  ; cp fcat.1      ${MAN}/fcat.1
${MAN}/fcatcmd.1  : fcatcmd.1  ; cp fcatcmd.1   ${MAN}/fcatcmd.1
${MAN}/fcd.1      : fcdcmd.1   ; cp fcd.1       ${MAN}/fcd.1
${MAN}/fcdcmd.1   : fcdcmd.1   ; cp fcdcmd.1    ${MAN}/fcdcmd.1
${MAN}/fget.1     : fgetcmd.1  ; cp fget.1      ${MAN}/fget.1
${MAN}/fgetcmd.1  : fgetcmd.1  ; cp fgetcmd.1   ${MAN}/fgetcmd.1
${MAN}/fgrab.1    : fgrabcmd.1 ; cp fgrab.1     ${MAN}/fgrab.1
${MAN}/fgrabcmd.1 : fgrabcmd.1 ; cp fgrabcmd.1  ${MAN}/fgrabcmd.1
${MAN}/fls.1      : flscmd.1   ; cp fls.1       ${MAN}/fls.1
${MAN}/flscmd.1   : flscmd.1   ; cp flscmd.1    ${MAN}/flscmd.1
${MAN}/fmkdir.1   : fmkdir.1   ; cp fmkdir.1    ${MAN}/fmkdir.1
${MAN}/fpro.1     : fprocmd.1  ; cp fpro.1      ${MAN}/fpro.1
${MAN}/fprocmd.1  : fprocmd.1  ; cp fprocmd.1   ${MAN}/fprocmd.1
${MAN}/fput.1     : fput.1     ; cp fput.1      ${MAN}/fput.1
${MAN}/frm.1      : frmcmd.1   ; cp frm.1       ${MAN}/frm.1
${MAN}/frmcmd.1   : frmcmd.1   ; cp frmcmd.1    ${MAN}/frmcmd.1
${MAN}/frmdir.1   : frmdircmd.1; cp frmdir.1    ${MAN}/frmdir.1
${MAN}/frmdircmd.1: frmdircmd.1; cp frmdircmd.1 ${MAN}/frmdircmd.1
${MAN}/fspd.1     : fspd.1     ; cp fspd.1      ${MAN}/fspd.1
${MAN}/fver.1     : fver.1     ; cp fver.1      ${MAN}/fver.1

#############################################################################

server_main.o: server_main.c server_def.h common_def.h Makefile
	${CC} ${CFLAGS} -DDEF_FSP_PORT=${DEF_FSP_PORT}	\
		     -DDEF_FSP_HOME=\"${DEF_FSP_HOME}\"	\
		     -DVERSION_STR=\"${VERSION_STR}\"	\
		     -DFILE_NAME_LIMIT=${FILE_NAME_LIMIT} \
		     -DALWAYS_USE_CACHE_DIR=${ALWAYS_USE_CACHE_DIR} \
		     -DMAX_DIR_CACHE_COUNT=${MAX_DIR_CACHE_COUNT} \
		     -DDEF_DIRECTORY_CACHE=\"${DEF_DIRECTORY_CACHE}\"	\
		     -c server_main.c

client_lock.o: client_lock.c client_def.h common_def.h Makefile
	${CC} ${CFLAGS} ${LOCK_FLAGS} -c client_lock.c

client_lib.o: client_lib.c client_def.h common_def.h
client_util.o: client_util.c client_def.h common_def.h
fcatcmd.o: fcatcmd.c client_def.h common_def.h
fcdcmd.o: fcdcmd.c client_def.h common_def.h
fgetcmd.o: fgetcmd.c client_def.h common_def.h
fgrabcmd.o: fgrabcmd.c client_def.h common_def.h
flscmd.o: flscmd.c client_def.h common_def.h
fmkdir.o: fmkdir.c client_def.h common_def.h
fprocmd.o: fprocmd.c client_def.h common_def.h
fput.o: fput.c client_def.h common_def.h
frmcmd.o: frmcmd.c client_def.h common_def.h
fver.o: fver.c client_def.h common_def.h
frmdircmd.o: frmdircmd.c client_def.h common_def.h
server_host.o: server_host.c server_def.h common_def.h
server_file.o: server_file.c server_def.h common_def.h
server_lib.o: server_lib.c server_def.h common_def.h
server_main.o: server_main.c server_def.h common_def.h
udp_io.o: udp_io.c common_def.h

clean:
	rm -f *.o fspd fsp_client_merge ${PROGS}
	@ cd bsd_src; make clean

de-install:
	rm -f ${BIN}/fspd ${IPROGS} ${IMANS}
