# source: Makefile.in
# Copyright Gerhard Rieger and contributors (see file CHANGES)
# Published under the GNU General Public License V.2, see file COPYING

# note: @...@ forms are filled in by configure script

SHELL = /bin/sh
AR = ar
RANLIB = ranlib

.SUFFIXES: .c .o

prefix = /usr/local
exec_prefix = ${prefix}

BINDEST = ${exec_prefix}/bin

datarootdir = ${prefix}/share
MANDEST = ${datarootdir}/man

srcdir = .


CC = cc -qlanglvl=extc89
CCOPTS = $(CCOPT) 

SYSDEFS = 
CPPFLAGS = -I. 
#0 INCLS = -I. @V_INCL@
DEFS = -DHAVE_CONFIG_H
LIBS = -lbsd  -lssl -lcrypto
LDFLAGS = 

INSTALL = ./install-sh -c

#OBJ = $(CSRC:.c=.o) $(GENSRC:.c=.o) 


#0 CFLAGS = -O $(CCOPTS) $(DEFS) $(INCLS)
CFLAGS = -O $(CCOPTS) $(DEFS) $(CPPFLAGS)
CLIBS = $(LIBS)
#CLIBS = $(LIBS) -lm -lefence
XIOSRCS = xioinitialize.c xiohelp.c xioparam.c xiodiag.c xioopen.c xioopts.c \
	xiosignal.c xiosigchld.c xioread.c xiowrite.c \
	xiolayer.c xioshutdown.c xioclose.c xioexit.c \
	xio-process.c xio-fd.c xio-fdnum.c xio-stdio.c xio-pipe.c \
	xio-gopen.c xio-creat.c xio-file.c xio-named.c \
	xio-socket.c xio-interface.c xio-listen.c xio-unix.c \
	xio-ip.c xio-ip4.c xio-ip6.c xio-ipapp.c xio-tcp.c \
	xio-sctp.c xio-rawip.c \
	xio-socks.c xio-proxy.c xio-udp.c \
	xio-rawip.c \
	xio-progcall.c xio-exec.c xio-system.c xio-termios.c xio-readline.c \
	xio-pty.c xio-openssl.c xio-streams.c\
	xio-ascii.c xiolockfile.c xio-tcpwrap.c xio-ext2.c xio-tun.c
XIOOBJS = $(XIOSRCS:.c=.o)
UTLSRCS = error.c dalan.c procan.c procan-cdefs.c hostan.c fdname.c sysutils.c utils.c nestlex.c filan.c sycls.c sslcls.c
UTLOBJS = $(UTLSRCS:.c=.o)
CFILES = $(XIOSRCS) $(UTLSRCS) socat.c procan_main.c filan_main.c
OFILES = $(CFILES:.c=.o)
PROGS = socat procan filan

HFILES = sycls.h sslcls.h error.h dalan.h procan.h filan.h hostan.h sysincludes.h xio.h xioopen.h sysutils.h utils.h nestlex.h compat.h \
	xioconfig.h mytypes.h xioopts.h xiodiag.h xiohelp.h xiosysincludes.h \
	xiomodes.h xiolayer.h xio-process.h xio-fd.h xio-fdnum.h xio-stdio.h \
	xio-named.h xio-file.h xio-creat.h xio-gopen.h xio-pipe.h \
	xio-socket.h xio-interface.h xio-listen.h xio-unix.h \
	xio-ip.h xio-ip4.h xio-ip6.h xio-rawip.h \
	xio-ipapp.h xio-tcp.h xio-udp.h xio-sctp.h \
	xio-socks.h xio-proxy.h xio-progcall.h xio-exec.h \
	xio-system.h xio-termios.h xio-readline.h \
	xio-pty.h xio-openssl.h xio-streams.h \
	xio-ascii.h xiolockfile.h xio-tcpwrap.h xio-ext2.h xio-tun.h


DOCFILES = README README.FIPS CHANGES FILES EXAMPLES PORTING SECURITY DEVELOPMENT doc/socat.yo doc/socat.1 doc/socat.html doc/xio.help FAQ BUGREPORTS COPYING COPYING.OpenSSL doc/dest-unreach.css doc/socat-openssltunnel.html doc/socat-multicast.html doc/socat-tun.html doc/socat-genericsocket.html
SHFILES = daemon.sh mail.sh ftp.sh readline.sh
TESTFILES = test.sh socks4echo.sh proxyecho.sh gatherinfo.sh readline-test.sh \
	proxy.sh socks4a-echo.sh testcert.conf
OSFILES = Config/Makefile.Linux-2-6-24 Config/config.Linux-2-6-24.h \
	Config/Makefile.SunOS-5-10 Config/config.SunOS-5-10.h \
	Config/Makefile.FreeBSD-6-1 Config/config.FreeBSD-6-1.h \
	Config/Makefile.NetBSD-4-0 Config/config.NetBSD-4-0.h \
	Config/Makefile.OpenBSD-4-3 Config/config.OpenBSD-4-3.h

all: progs doc

scmclean: gitclean

gitclean: distclean docclean
	rm -f Makefile.bak configure

doc: doc/socat.1 doc/socat.html

docclean:
	rm -f doc/socat.1 doc/socat.html

doc/socat.1: doc/socat.yo
	yodl2man -o $@ $+

doc/socat.html: doc/socat.yo
	cd doc; yodl2html -o socat.html socat.yo; cd ..

progs: $(PROGS)

depend: $(CFILES) $(HFILES)
	makedepend $(SYSDEFS) $(CFILES)

socat: socat.o libxio.a
	$(CC) $(CFLAGS) $(LDFLAGS) -o $@ socat.o libxio.a $(CLIBS)

PROCAN_OBJS=procan_main.o procan.o procan-cdefs.o hostan.o error.o sycls.o sysutils.o utils.o
procan: $(PROCAN_OBJS)
	$(CC) $(CFLAGS) $(LDFLAGS) -o $@ $(PROCAN_OBJS) $(CLIBS)

filan: filan_main.o filan.o fdname.o error.o sycls.o sysutils.o utils.o
	$(CC) $(CFLAGS) $(LDFLAGS) -o $@ filan_main.o filan.o fdname.o error.o sycls.o sysutils.o utils.o $(CLIBS)

libxio.a: $(XIOOBJS) $(UTLOBJS)
	$(AR) r $@ $(XIOOBJS) $(UTLOBJS)
	$(RANLIB) $@

doc: doc/xio.help
#

strip: progs
	strip $(PROGS)

install: progs $(srcdir)/doc/socat.1
	mkdir -p $(DESTDIR)$(BINDEST)
	$(INSTALL) -m 755 socat $(DESTDIR)$(BINDEST)
	$(INSTALL) -m 755 procan $(DESTDIR)$(BINDEST)
	$(INSTALL) -m 755 filan $(DESTDIR)$(BINDEST)
	mkdir -p $(DESTDIR)$(MANDEST)/man1
	$(INSTALL) -m 644 $(srcdir)/doc/socat.1 $(DESTDIR)$(MANDEST)/man1/

uninstall:
	rm -f $(DESTDIR)$(BINDEST)/socat
	rm -f $(DESTDIR)$(BINDEST)/procan
	rm -f $(DESTDIR)$(BINDEST)/filan
	rm -f $(DESTDIR)$(MANDEST)/man1/socat.1

# make a GNU-zipped tar ball of the source files
dist: socat.tar.gz socat.tar.bz2

socat.tar.gz: socat.tar
	gzip -9 <socat.tar >socat.tar.gz

socat.tar.bz2: socat.tar
	bzip2 -9 <socat.tar >socat.tar.bz2

VERSION = `sed 's/"//g' VERSION`
TARDIR = socat-$(VERSION)
socat.tar: configure.in configure Makefile.in config.h.in install-sh VERSION $(CFILES) $(HFILES) $(DOCFILES) $(SHFILES) $(OSFILES) $(TESTFILES) socat.spec
	if [ ! -d $(TARDIR) ]; then mkdir $(TARDIR); fi
	tar cf - $+ |(cd $(TARDIR); tar xf -)
	tar cvf socat.tar $(TARDIR)
	rm -f $(TARDIR)/COPYING		# write protected
	rm -r $(TARDIR)

clean:
	rm -f *.o libxio.a socat procan filan \
	socat.tar socat.tar.Z socat.tar.gz socat.tar.bz2 \
	socat.out compile.log test.log

# remove all files that are generated from the original socat distribution
# note that Makefile is also removed, so you have to start with ./configure
# again
distclean: clean
	rm -f config.status config.cache config.log config.h Makefile
	rm -rf autom4te.cache

info: socat
	uname -a >socat.out
	./socat -V >>socat.out
	./socat -hh >>socat.out

# perform some tests on socat
test: progs
	./test.sh

cert:
	# prepare critical files with correct permissions to avoid race cond
	>cert.key
	>cert.pem
	chmod 600 cert.key cert.pem
	# generate a private key
	openssl genrsa -out cert.key 1024
	# generate a self signed cert
	openssl req -new -key cert.key -x509 -days 3653 -out cert.crt
	# ...enter fields
	# generate the pem file
	cat cert.key cert.crt >cert.pem
	#echo use cert.pem on requestors side, i.e. with option cert=cert.pem
	#echo use cert.crt on checkers side, i.e. with option cafile=cert.crt
