diff --git a/.gitignore b/.gitignore index c744658..0a62130 100644 --- a/.gitignore +++ b/.gitignore @@ -6,26 +6,7 @@ src/files.h src/filetypes.h src/bin2c src/gophernicus +Makefile README README.options - -# -# Test leftovers -# -test.output - -# -# Release files -# -*.gz - -# -# Debian packaging leftovers -# -build-stamp -debian/files -debian/gophernicus.debhelper.log -debian/gophernicus.postrm.debhelper -debian/gophernicus.substvars -debian/gophernicus/ diff --git a/Makefile b/Makefile deleted file mode 100644 index b1e2a46..0000000 --- a/Makefile +++ /dev/null @@ -1,269 +0,0 @@ -NAME = gophernicus -PACKAGE = $(NAME) -BINARY = $(NAME) -VERSION = 3.1 -CODENAME = Dungeon Edition - -SOURCES = src/$(NAME).c src/file.c src/menu.c src/string.c src/platform.c src/session.c src/options.c src/log.c -HEADERS = src/files.h src/filetypes.h -OBJECTS = $(SOURCES:.c=.o) -README = README.md - -DESTDIR = /usr -OSXDIR = /usr/local -SBINDIR = $(DESTDIR)/sbin -DOCDIR = $(DESTDIR)/share/doc/$(PACKAGE) -MANPAGE = gophernicus.1 -MANDEST = $(DESTDIR)/share/man/man1/gophernicus.1 - -INSTALL = PATH=$$PATH:/usr/sbin ./install-sh -o 0 -g 0 -ROOT = /var/gopher -OSXROOT = /Library/GopherServer -WRTROOT = /gopher -MAP = gophermap - -INETD = /etc/inetd.conf -XINETD = /etc/xinetd.d -# get OPTIONS line from gophernicus.env and use that also for inetd -INETOPT = $$(grep '^OPTIONS=' $(NAME).env | tail -n 1 | sed -e 's/OPTIONS="*//;s/"*$$//') -INETLIN = "gopher stream tcp nowait nobody $(SBINDIR)/$(BINARY) $(BINARY) $(INETOPT)" -INETPID = /var/run/inetd.pid -LAUNCHD = /Library/LaunchDaemons -PLIST = org.$(NAME).server.plist -NET_SRV = /boot/common/settings/network/services -SYSTEMD = /lib/systemd/system /usr/lib/systemd/system -HAS_STD = /run/systemd/system -SYSCONF = /etc/sysconfig -DEFAULT = /etc/default - -CC ?= cc -CFLAGS := -O2 -Wall $(CFLAGS) -LDFLAGS := $(LDFLAGS) - -IPCRM = /usr/bin/ipcrm - -all: - @case $$(uname) in \ - Darwin) $(MAKE) ROOT="$(OSXROOT)" DESTDIR="$(OSXDIr)" src/$(BINARY); ;; \ - Haiku) $(MAKE) LDFLAGS="$(LDFLAGS) -lnetwork" src/$(BINARY); ;; \ - *) if [ -f "/usr/include/tcpd.h" ]; then $(MAKE) withwrap; else $(MAKE) src/$(BINARY); fi; ;; \ - esac - -withwrap: - $(MAKE) CFLAGS="$(CFLAGS) -DHAVE_LIBWRAP" LDFLAGS="$(LDFLAGS) -lwrap" src/$(BINARY) - -deb: - dpkg-buildpackage -rfakeroot -uc -us - -headers: $(HEADERS) - -src/$(NAME).c: headers src/$(NAME).h - -src/$(BINARY): $(OBJECTS) - $(CC) $(OBJECTS) $(CFLAGS) -o $@ $(LDFLAGS) - -.c.o: - $(CC) -c $(CFLAGS) -DVERSION="\"$(VERSION)\"" -DCODENAME="\"$(CODENAME)\"" -DDEFAULT_ROOT="\"$(ROOT)\"" $< -o $@ - -src/filetypes.h: src/filetypes.conf - sh src/filetypes.sh < src/filetypes.conf > $@ - -src/bin2c: src/bin2c.c - $(CC) src/bin2c.c -o $@ - -README: $(README) - cat $(README) > $@ - -src/files.h: src/bin2c README - sed -e '/^(end of option list)/,$$d' README > README.options - ./src/bin2c -0 -n README README.options > $@ - ./src/bin2c -0 LICENSE >> $@ - ./src/bin2c -n ERROR_GIF error.gif >> $@ - @echo - -# Clean cases - -clean: clean-build clean-deb - -clean-build: - rm -rf src/$(BINARY) $(OBJECTS) $(HEADERS) README.options README src/bin2c - -clean-deb: - if [ -d debian/$(PACKAGE) ]; then fakeroot debian/rules clean; fi - -clean-shm: - if [ -x $(IPCRM) ]; then $(IPCRM) -M $$(awk '/SHM_KEY/ { print $$3 }' src/$(NAME).h) || true; fi - -# Install cases - -install: clean-shm - @case $$(uname) in \ - Darwin) $(MAKE) ROOT="$(OSXROOT)" DESTDIR="$(OSXDIR)" install-files install-docs install-root install-osx install-done; ;; \ - Haiku) $(MAKE) SBINDIR=/boot/common/bin DOCDIR=/boot/common/share/doc/$(PACKAGE) \ - install-files install-docs install-root install-haiku install-done; ;; \ - *) $(MAKE) install-files install-docs install-root; ;; \ - esac - @if [ -d "$(HAS_STD)" ]; then $(MAKE) install-systemd install-done; \ - elif [ -d "$(XINETD)" ]; then $(MAKE) install-xinetd install-done; \ - elif [ -f "$(INETD)" ]; then $(MAKE) install-inetd install-done; fi - -.PHONY: install - -install-done: - @echo - @echo "======================================================================" - @echo - @echo "If there were no errors shown above," - @echo "Gophernicus has now been succesfully installed. To try it out, launch" - @echo "your favorite gopher browser and navigate to your gopher root." - @echo - @echo "Gopher URL...: gopher://$$(hostname)/" - @for CONFFILE in /etc/sysconfig/gophernicus \ - /etc/default/gophernicus \ - /Library/LaunchDaemons/org.gophernicus.server.plist \ - /boot/common/settings/network/services \ - /lib/systemd/system/gophernicus\@.service \ - /etc/xinetd.d/gophernicus \ - /etc/inetd.conf; do \ - if [ -f $$CONFFILE ]; then echo "Configuration: $$CONFFILE"; break; fi; done; - @echo - @echo "======================================================================" - @echo - -install-files: src/$(BINARY) - mkdir -p $(SBINDIR) - $(INSTALL) -s -m 755 src/$(BINARY) $(SBINDIR) - @echo - -install-docs: - mkdir -p $(DOCDIR) - $(INSTALL) -m 644 $(MANPAGE) $(MANDEST) - @echo - -install-root: - if [ ! -d "$(ROOT)" -o ! -f "$(ROOT)/$(MAP)" ]; then \ - mkdir -p $(ROOT); \ - $(INSTALL) -m 644 $(MAP).sample $(ROOT); \ - ln -fs $(DOCDIR) $(ROOT)/docs; \ - fi - @echo - -install-inetd: install-files install-docs install-root - @if update-inetd --add $(INETLIN); then \ - echo update-inetd install worked ; \ - else if grep '^gopher' $(INETD) >/dev/null 2>&1 ; then \ - echo "::::: Gopher entry in $(INETD) already present -- please check! :::::"; \ - else echo "Trying to add gopher entry to $(INETD)" ; \ - echo "$(INETLIN)" >> $(INETD) ; \ - if [ -r $(INETPID) ] ; then kill -HUP $$(cat $(INETPID)) ; \ - else echo "::::: No PID for inetd found, not restarted -- please check! :::::" ; fi ; \ - fi ; \ - fi - @echo - -install-xinetd: install-files install-docs install-root - if [ -d "$(XINETD)" -a ! -f "$(XINETD)/$(NAME)" ]; then \ - sed -e "s/@HOSTNAME@/$$(hostname)/g" $(NAME).xinetd > $(XINETD)/$(NAME); \ - [ -x /sbin/service ] && /sbin/service xinetd reload; \ - fi - @echo - -install-osx: - if [ -d "$(LAUNCHD)" -a ! -f "$(LAUNCHD)/$(PLIST)" ]; then \ - sed -e "s/@HOSTNAME@/$$(hostname)/g" src/$(PLIST) > $(LAUNCHD)/$(PLIST); \ - launchctl load $(LAUNCHD)/$(PLIST); \ - fi - @echo - chown -h root:admin $(ROOT) $(ROOT)/* - chmod -h 0775 $(ROOT) $(ROOT)/docs - @echo - -install-haiku: - if [ -f "$(NET_SRV)" -a ! "$$(grep -m1 gopher $(NET_SRV))" ]; then \ - (echo ""; \ - echo "service gopher {"; \ - echo " family inet"; \ - echo " protocol tcp"; \ - echo " port 70"; \ - echo " launch $(BINARY) -h $$(hostname)"; \ - echo "}") >> $(NET_SRV); \ - fi - @echo - chown user:root $(DOCDIR)/* $(SBINDIR)/$(BINARY) $(ROOT)/$(MAP) - @echo - ps | grep net_server | grep -v grep | awk '{ print $$2 }' | xargs kill - nohup /boot/system/servers/net_server >/dev/null 2>/dev/null & - @echo - -install-systemd: install-files install-docs install-root - if [ -d "$(HAS_STD)" ]; then \ - if [ -d "$(SYSCONF)" -a ! -f "$(SYSCONF)/$(NAME)" ]; then \ - $(INSTALL) -m 644 init/$(NAME).env $(SYSCONF)/$(NAME); \ - fi; \ - if [ ! -d "$(SYSCONF)" -a -d "$(DEFAULT)" -a ! -f $(DEFAULT)/$(NAME) ]; then \ - $(INSTALL) -m 644 init/$(NAME).env $(DEFAULT)/$(NAME); \ - fi; \ - for DIR in $(SYSTEMD); do \ - if [ -d "$$DIR" ]; then \ - $(INSTALL) -m 644 init/$(NAME).socket init/$(NAME)\@.service $$DIR; \ - break; \ - fi; \ - done; \ - if pidof systemd ; then \ - systemctl daemon-reload; \ - systemctl enable $(NAME).socket; \ - systemctl start $(NAME).socket; \ - fi; \ - fi - @echo - -# Uninstall cases -uninstall: uninstall-xinetd uninstall-launchd uninstall-systemd uninstall-inetd - rm -f $(SBINDIR)/$(BINARY) - for DOC in $(DOCS); do rm -f $(DOCDIR)/$$DOC; done - rmdir -p $(SBINDIR) $(DOCDIR) 2>/dev/null || true - rm -rf $(MANDEST) - @echo - -uninstall-inetd: - @if [ -f "$(INETD)" ] && update-inetd --remove "^gopher.*gophernicus" ; then \ - echo update-inetd remove worked ; \ - else if grep '^gopher' $(INETD) >/dev/null 2>&1 && \ - sed -i .bak -e 's/^gopher/#gopher/' $(INETD) ; then \ - echo "commented out gopher entry in $(INETD), reloading inetd" ; \ - [ -r $(INETPID) ] && kill -HUP $$(cat $(INETPID)) ; \ - else echo "::::: could not find gopher entry in $(INETD) :::::" ; \ - fi ; \ - fi - @echo - -uninstall-xinetd: - if grep -q $(BINARY) "$(XINETD)/gopher" 2>/dev/null; then \ - rm -f $(XINETD)/gopher; \ - [ -x /sbin/service ] && service xinetd reload; \ - fi - @echo - -uninstall-launchd: - if [ -f $(LAUNCHD)/$(PLIST) ]; then \ - launchctl unload $(LAUNCHD)/$(PLIST); \ - rm -f $(LAUNCHD)/$(PLIST); \ - fi - if [ -L $(ROOT) ]; then \ - rm -f $(ROOT); \ - fi - @echo - -uninstall-systemd: - if [ -d "$(HAS_STD)" ]; then \ - for DIR in $(SYSTEMD); do \ - if [ -f "$$DIR/$(NAME).socket" ]; then \ - systemctl stop $(NAME).socket; \ - systemctl disable $(NAME).socket; \ - rm -f $$DIR/$(NAME).socket $$DIR/$(NAME)\@.service $(SYSCONF)/$(NAME) $(DEFAULT)/$(NAME); \ - systemctl daemon-reload; \ - break; \ - fi; \ - done; \ - fi - @echo diff --git a/Makefile.in b/Makefile.in new file mode 100644 index 0000000..24ddacc --- /dev/null +++ b/Makefile.in @@ -0,0 +1,149 @@ +NAME = gophernicus +PACKAGE = $(NAME) +BINARY = $(NAME) +VERSION = 3.1 +CODENAME = Dungeon Edition + +SOURCES = src/$(NAME).c src/file.c src/menu.c src/string.c src/platform.c src/session.c src/options.c src/log.c +HEADERS = src/files.h src/filetypes.h +OBJECTS = $(SOURCES:.c=.o) +README = README.md +MANPAGE = $(DESTDIR)gophernicus.1 + +DESTDIR ?= / +PREFIX = @PREFIX@ +BINDIR = @BINDIR@ +SBINDIR = @SBINDIR@ +MANDIR = @MANDIR@ +MAN1DIR = @MAN1DIR@ + +INSTALL = @INSTALL@ +INSTALL_ARGS = -o 0 -g 0 +ROOT = @ROOT@ +OSXROOT = /Library/GopherServer + +INETD = @INETD_CONF@ +XINETD = @XINETD_CONF@ +# get OPTIONS line from gophernicus.env and use that also for inetd +INETOPT = $$(grep '^OPTIONS=' $(NAME).env | tail -n 1 | sed -e 's/OPTIONS="*//;s/"*$$//') +LAUNCHD = @LAUNCHD@ +PLIST = org.$(NAME).server.plist +HAIKU_SRV = @HAIKUSRV@ +DEFAULT = @DEFAULT@ +SYSCONF = @SYSCONF@ +HOSTNAME = @HOSTNAME@ + +CC ?= @CC@ +CFLAGS := -O2 -Wall @LIBWRAP@ $(CFLAGS) +LDFLAGS := $(LDFLAGS) + +IPCRM ?= @IPCRM@ +MAKE ?= @MAKE@ + +all: + $(MAKE) headers + $(MAKE) src/$(BINARY) + +headers: $(HEADERS) + +src/$(NAME).c: src/$(NAME).h + +src/$(BINARY): $(OBJECTS) + $(CC) $(OBJECTS) $(CFLAGS) -o $@ $(LDFLAGS) + +.c.o: + $(CC) -c $(CFLAGS) -DVERSION="\"$(VERSION)\"" -DCODENAME="\"$(CODENAME)\"" -DDEFAULT_ROOT="\"$(ROOT)\"" $< -o $@ + +src/filetypes.h: src/filetypes.conf + sh src/filetypes.sh < src/filetypes.conf > $@ + +src/bin2c: src/bin2c.c + $(CC) src/bin2c.c -o $@ + +src/files.h: src/bin2c + sed -e '/^(end of option list)/,$$d' README.md > README.options + ./src/bin2c -0 -n README README.options > $@ + ./src/bin2c -0 LICENSE >> $@ + ./src/bin2c -n ERROR_GIF error.gif >> $@ + +# Clean cases + +clean: @CLEAN_SHM@ + rm -rf src/$(BINARY) $(OBJECTS) $(HEADERS) README.options README src/bin2c + +clean-shm: + $(IPCRM) -M $$(awk '/SHM_KEY/ { print $$3 }' src/$(NAME).h) || true + +# Install cases + +install: src/$(BINARY) @CLEAN_SHM@ install-man @INSTALL_ROOT@ @INSTALL_OSX@ @INSTALL_HAIKU@ @INSTALL_SYSTEMD@ @INSTALL_XINETD@ @INSTALL_INETD_MANUAL@ @INSTALL_INETD_UPDATE@ install-done + $(INSTALL) -s -m 755 src/$(BINARY) $(DESTDIR)$(SBINDIR) +.PHONY: install + +install-done: + @echo + @echo "======================================================================" + @echo + @echo "If there were no errors shown above," + @echo "Gophernicus has now been succesfully installed. To try it out, launch" + @echo "your favorite gopher browser and navigate to your gopher root." + @echo + @echo "Gopher URL...: gopher://$$(hostname)/" + @echo + @echo "======================================================================" + @echo + +install-man: + $(INSTALL) -m 644 $(MANPAGE) $(DESTDIR)$(MANDEST) + +install-root: + $(INSTALL) -m 644 $(MAP).sample $(DESTDIR)$(ROOT) + +install-inetd-update: install-root + update-inetd --add $$(sed -e "s/@BINARY_PATH@/$(DESTDIR)$(SBINDIR)$(BINARY)/g" -e "s/@BINARY_NAME@/$(BINARY)/g" -e "s/@OPTIONS@/$(INETOPT)/g" init/inetlin.in) + +install-inetd-manual: install-root + sed -e "s/@BINARY_PATH@/$(DESTDIR)$(SBINDIR)$(BINARY)/g" -e "s/@BINARY_NAME@/$(BINARY)/g" -e "s/@OPTIONS@/$(INETOPT)/g" init/inetlin.in > $(DESTDIR)$(INETD) + +install-xinetd: install-root + sed -e "s/@HOSTNAME@/$(HOSTNAME)/g" init/$(NAME).xinetd.in > $(DESTDIR)$(XINETD)/$(NAME) + +install-osx: install-root + sed -e "s/@HOSTNAME@/$(HOSTNAME)/g" init/$(PLIST).in > $(DESTDIR)$(LAUNCHD)/$(PLIST) + chown -h root:admin $(DESTDIR)$(ROOT) $(DESTDIR)$(ROOT)/* + chmod -h 0775 $(DESTDIR)$(ROOT) $(DESTDIR)$(ROOT)/docs + +install-haiku: install-root + sed -e "s/@HOSTNAME@/$(HOSTNAME)/g" -e "s/@BINARY@/$(BINARY)/g" init/haiku_snippet.in >> $(DESTDIR)$(HAIKU_SRV) + chown user:root $(DESTDIR)$(DOCDIR)/* $(DESTDIR)$(SBINDIR)/$(BINARY) $(DESTDIR)$(ROOT)/$(MAP) + +install-systemd: install-root + $(INSTALL) -m 644 init/$(NAME).env init/$(NAME).socket init/$(NAME)\@.service $(DESTDIR)$(SYSCONF)/$(NAME) + $(INSTALL) -m 644 init/$(NAME).env init/$(NAME).socket init/$(NAME)\@.service $(DESTDIR)$(DEFAULT)/$(NAME) + +uninstall: @UNINSTALL_INETD_UPDATE@ @UNINSTALL_INETD_MANUAL@ @UNINSTALL_XINETD@ @UNINSTALL_OSX@ @UNINSTALL_SYSTEMD@ + rm -f $(DESTDIR)$(SBINDIR)/$(BINARY) + rm -f $(DESTDIR)$(MANDEST)/$(MANPAGE) + +uninstall-inetd-update: + update-inetd --remove "^gopher.*gophernicus" + +uninstall-inetd-manual: + sed -i '/^gopher/d' $(DESTDIR)$(INETD) + +uninstall-xinetd: + rm -f $(DESTDIR)$(XINETD)/gopher + +uninstall-osx: + rm -f $(DESTDIR)$(LAUNCHD)/$(PLIST) + +uninstall-haiku: + rm -f $(DESTDIR)$(HAIKU_SRV) + +uninstall-systemd: + rm -f $(DESTDIR)$(SYSCONF)/$(NAME)/$(NAME).env + rm -f $(DESTDIR)$(SYSCONF)/$(NAME)/$(NAME).socket + rm -f $(DESTDIR)$(SYSCONF)/$(NAME)/$(NAME)\@.service + rm -f $(DESTDIR)$(DEFAULT)/$(NAME)/$(NAME).env + rm -f $(DESTDIR)$(DEFAULT)/$(NAME)/$(NAME).socket + rm -f $(DESTDIR)$(DEFAULT)/$(NAME)/$(NAME)\@.service diff --git a/install-sh b/build-aux/install-sh similarity index 100% rename from install-sh rename to build-aux/install-sh diff --git a/configure b/configure new file mode 100755 index 0000000..579a5db --- /dev/null +++ b/configure @@ -0,0 +1,310 @@ +#!/bin/sh + +# Is similar to an autoconf configure script, but is written by hand + +usage() { + printf "Usage: %s [options]\\n\\n" "$0" + printf " --prefix=/usr/local Prefix for all files\\n" + printf " --bindir=PREFIX/bin Prefix for binaries\\n" + printf " --sbindir=PREFIX/sbin Prefix for system binaries\\n" + printf " --mandir=PREFIX/share/man Prefix for manpages\\n" + printf " --man1dir=MANDIR/man1 Prefix for section 1 manpages\\n" + printf " --gopherroot=/var/gopher Path to gopher root\\n" + printf " --sysconfig=/etc/sysconfig Path to sysconfig directory\\n\\n" + printf " --default=/etc/default Path to 'default' configuration directory\\n\\n" + printf " --launchd=/Library/LaunchDaemons Path to launchd for MacOS\\n" + printf " --haikusrv=/boot/common/settings/network/services Path to services directory in Haiku\\n\\n" + printf " --os=autodetected Your target OS, one of linux, mac, haiku, netbsd, openbsd or freebsd\\n" + printf " --listener=autodetected Program to recieve and pass network requests; one or more of systemd, inetd, xinetd, comma-seperated, or autodetect, mac or haiku (parameter required, mac/haiku required on respective OSes)\\n" + printf " --hostname=autodetected Desired hostname for gophernicus to identify as\\n" +} + +# Set values for each option +while [ "$#" -gt 0 ] ; do + opt="${1%%=*}" + opt="${opt##--}" + value="${1##*=}" + case "${opt}" in + prefix) PREFIX="${value}"; shift ;; + bindir) BINDIR="${value}"; shift ;; + sbindir) SBINDIR="${value}"; shift ;; + docdir) DOCDIR="${value}"; shift ;; + mandir) MANDIR="${value}"; shift ;; + man1dir) MAN1DIR="${value}"; shift ;; + gopherroot) GOPHERROOT="${value}"; shift ;; + sysconfig) SYSCONFIG="${value}"; shift ;; + default) DEFAULTCONF="${value}"; shift ;; + os) OS="${value}"; shift ;; + launchd) LAUNCHD="${value}"; shift ;; + haikusrv) HAIKUSRV="${value}"; shift ;; + listener) LISTENER="${value}"; shift ;; + hostname) HOSTNAME="${value}"; shift ;; + help) usage; exit 0 ;; + *) usage; exit 2 ;; + esac +done + +# Set default values +: ${PREFIX:=/usr/local} +: ${BINDIR:=${PREFIX}/bin} +: ${SBINDIR:=${PREFIX}/sbin} +: ${DOCDIR:=${PREFIX}/share/doc} +: ${MANDIR:=${PREFIX}/share/man} +: ${MAN1DIR:=${MANDIR}/man1} +: ${GOPHERROOT:=/var/gopher} +: ${SYSCONFIG:=/etc/sysconfig} +: ${DEFAULTCONF:=/etc/default} +: ${LAUNCHD:=/Library/LaunchDaemons} +: ${HAIKUSRV:=/boot/common/settings/network/services} +: ${CC:=cc} +: ${CFLAGS:=-O2} +: ${HOSTNAME:=autodetect} + +# Check for a compiler that actually works +printf "checking for working compiler... " +cat > conftest.c < +int main() { return 0; } +EOF +if ! ${CC} -o conftest conftest.c; then + printf "no\\n" + exit 1 +else + printf "${CC}\\n" +fi + +# Autodetect the OS +if ! [ "${OS:=1}" ]; then + # If it can't find uname, it needs to be manually specified + printf "checking for uname... " + if ! UNAME="$(command -v uname)"; then + printf "please provide OS in options\\n" + exit 1 + else + printf "%s\\n" "${UNAME}" + fi + + # If it can, it presses on + printf "checking for OS... " + case "$(${UNAME})" in + Linux) OS=linux ;; + Haiku) OS=haiku + INSTALL_HAIKU="install-haiku" ;; + Darwin) OS=mac + INSTALL_OSX="install-osx" ;; + NetBSD) OS=netbsd ;; + OpenBSD) OS=openbsd ;; + FreeBSD) OS=freebsd ;; + *) printf "unknown, pressing on anyway\\n" ;; + esac + printf "%s\\n" "${OS}" +fi + +# Checks for an install command and falls back to install-sh +printf "checking for install... " +if ! INSTALL="$(command -v install)"; then + printf "install-sh" + INSTALL=build-aux/install-sh +else + printf "%s" "${INSTALL}" +fi +printf "\\n" + +# Check for listener validity and autodetect if required +# Checks that take place: +# mac OS = mac listener (both ways) +# haiku OS = haiku listener (both ways) +# systemd listener = linux OS +printf "checking for listener... " +if [ -z "${LISTENER}" ]; then + printf "not given\\n" + exit 1 +elif [ "${LISTENER}" = "mac" ] && [ "${OS}" != "mac" ]; then + printf "mac listener only valid with macos\\n" + exit 1 +elif [ "${LISTENER}" = "haiku" ] && [ "${OS}" != "haiku" ]; then + printf "haiku listener only valid with haiku\\n" + exit 1 +elif [ "${LISTENER}" = "systemd" ] && [ "${OS}" != "linux" ]; then + printf "systemd listener only valid with linux\\n" + exit 1 +elif [ "${LISTENER}" = "autodetect" ]; then + # OS-specific listeners + case "${OS}" in + mac) + LISTENER=mac + printf "mac\\n" + break ;; + haiku) + LISTENER=haiku + printf "haiku\\n" + break ;; + esac + + if [ -d "/lib/systemd/system" ] ; then + LISTENER=systemd + printf "systemd\\n" + break + fi + + printf "checking for inetd... " + if command -v update-inetd; then + LISTENER=inetd + printf "inetd\\n" + break + fi + + printf "checking for xinetd... " + if XINETD="$(command -v xinetd)"; then + LISTENER=xinetd + printf "xinetd\\n" + break + fi + + # Ensure we detected something + if [ "${LISTENER}" = "autodetect" ]; then + printf "unable to autodetect, please manually specify\\n" + exit 1 + fi +elif [ "${OS}" = "haiku" ] && [ "${LISTENER}" != "haiku" ]; then + printf "only haiku listener supported on haiku\\n" + exit 1 +elif [ "${OS}" = "mac" ] && [ "${LISTENER}" != "mac" ]; then + printf "only mac listener supported on mac\\n" + exit 1 +else + printf "%s\\n" "${LISTENER}" +fi + +# Act accordingly based on whichever listener we are given +case "${LISTENER}" in + systemd) + INSTALL_SYSTEMD="install-systemd" + UNINSTALL_SYSTEMD="uninstall-systemd" ;; + xinetd) + INSTALL_XINETD="install-xinetd" + UNINSTALL_XINETD="uninstall-xinetd" + XINETD_CONF="/etc/xinetd.d/gophernicus" ;; + inetd) + INSTALL_INETD="install-inetd" + INETD_CONF="/etc/inetd.conf" + printf "checking for update-inetd... " + if ! UPDATE_INETD="$(command -v update-inetd)"; then + printf "not found\\n" + INSTALL_INETD_MANUAL="install-inetd-manual" + UNINSTALL_INETD_UPDATE="uninstall-inetd-update" + else + printf "%s\\n" "${UPDATE_INETD}" + INSTALL_INETD_UPDATE="install-inetd-update" + UNINSTALL_INETD_UPDATE="uninstall-inetd-update" + fi + ;; + mac) INSTALL_OSX="install-osx" UNINSTALL_OSX="uninstall-osx" ;; + haiku) INSTALL_HAIKU="install-haiku" UNINSTALL_HAIKU="uninstall-haiku" ;; + *) printf "The listener %s is not offically supported; continuing anyway.\\n" "${LISTENER}" ;; +esac + +# Try to detect hostname +printf "getting hostname... " +if [ "${HOSTNAME}" = "autodetect" ]; then + HOSTNAME="$(hostname)" + # If no hostname then we couldn't autodetect + if [ $? != 0 ] || [ -z "${HOSTNAME}" ]; then + printf "unable to detect hostname\\n" + exit 1 + fi +fi +printf "%s\\n" "${HOSTNAME}" + +# Use libwrap when it is avaliable +printf "checking for libwrap... " +cat > conftest.c < +int main() {} +EOF +if ${CC} -o conftest -lwrap conftest.c 2>/dev/null; then + LIBWRAP="-DHAVE_LIBWRAP" + printf "yes" +else + LIBWRAP= + printf "no, but program will still work" +fi +printf "\\n" + +# Check and use SHM if avaliable +printf "checking for ipcrm (SHM management)... " +if ! IPCRM="$(command -v ipcrm)"; then + printf "not found" +else + printf "%s" "${IPCRM}" + CLEAN_SHM="clean-shm" +fi +printf "\\n" + +# Trying to autodetect make +printf "checking for make... " +if ! MAKE="$(command -v make)"; then + printf "not found, please pass MAKE=/path/to/make to make invocation" + MAKE="make" +else + printf "%s" "${MAKE}" +fi +printf "\\n" + +# Don't replace an existing root +printf "checking for existing gopher root... " +if [ -d "${GOPHERROOT}" ] || [ -f "${GOPHERROOT}/gophermap" ]; then + INSTALL_ROOT="install-root" + printf "yes" +else + printf "no" +fi +printf "\\n" + +# Sub in values +cp Makefile.in Makefile + +printf "creating Makefile... " +sed -i "s:@CC@:${CC}:" Makefile +sed -i "s:@LIBWRAP@:${LIBWRAP}:" Makefile +sed -i "s:@INSTALL@:${INSTALL}:" Makefile +sed -i "s:@MAKE@:${MAKE}:" Makefile + +sed -i "s:@PREFIX@:${PREFIX}:" Makefile +sed -i "s:@BINDIR@:${BINDIR}:" Makefile +sed -i "s:@SBINDIR@:${SBINDIR}:" Makefile +sed -i "s:@DOCDIR@:${DOCDIR}:" Makefile +sed -i "s:@MANDIR@:${MANDIR}:" Makefile +sed -i "s:@MAN1DIR@:${MAN1DIR}:" Makefile + +sed -i "s:@IPCRM@:${IPCRM}:" Makefile +sed -i "s:@CLEAN_SHM@:${CLEAN_SHM}:" Makefile + +sed -i "s:@SYSCONF@:${SYSCONFIG}:" Makefile +sed -i "s:@DEFAULT@:${DEFAULTCONF}:" Makefile +sed -i "s:@HOSTNAME@:${HOSTNAME}:" Makefile +sed -i "s:@ROOT@:${GOPHERROOT}:" Makefile + +sed -i "s:@HAIKUSRV@:${HAIKUSRV}:" Makefile +sed -i "s:@LAUNCHD@:${LAUNCHD}:" Makefile +sed -i "s:@INSTALL_ROOT@:${INSTALL_ROOT}:" Makefile + +sed -i "s:@INSTALL_OSX@:${INSTALL_OSX}:" Makefile +sed -i "s:@INSTALL_INETD_MANUAL@:${INSTALL_INETD_MANUAL}:" Makefile +sed -i "s:@INSTALL_INETD_UPDATE@:${INSTALL_INETD_UPDATE}:" Makefile +sed -i "s:@INSTALL_XINETD@:${INSTALL_XINETD}:" Makefile +sed -i "s:@INSTALL_SYSTEMD@:${INSTALL_SYSTEMD}:" Makefile +sed -i "s:@INSTALL_HAIKU@:${INSTALL_HAIKU}:" Makefile +sed -i "s:@UNINSTALL_OSX@:${UNINSTALL_OSX}:" Makefile +sed -i "s:@UNINSTALL_INETD_MANUAL@:${UNINSTALL_INETD_MANUAL}:" Makefile +sed -i "s:@UNINSTALL_INETD_UPDATE@:${UNINSTALL_INETD_UPDATE}:" Makefile +sed -i "s:@UNINSTALL_XINETD@:${UNINSTALL_XINETD}:" Makefile +sed -i "s:@UNINSTALL_SYSTEMD@:${UNINSTALL_SYSTEMD}:" Makefile +sed -i "s:@UNINSTALL_HAIKU@:${UNINSTALL_HAIKU}:" Makefile + +sed -i "s:@INETD_CONF@:${INETD_CONF}:" Makefile +sed -i "s:@XINETD_CONF@:${XINETD_CONF}:" Makefile +printf "done\\n" + +# Cleanup +rm -f conftest conftest.c diff --git a/init/.gitignore b/init/.gitignore new file mode 100644 index 0000000..882a402 --- /dev/null +++ b/init/.gitignore @@ -0,0 +1,4 @@ +haiku_snippet +org.gophernicus.server.plist +gophernicus.xinetd +inetlin diff --git a/init/gophernicus.xinetd b/init/gophernicus.xinetd.in similarity index 100% rename from init/gophernicus.xinetd rename to init/gophernicus.xinetd.in diff --git a/init/haiku_snippet.in b/init/haiku_snippet.in new file mode 100644 index 0000000..84da366 --- /dev/null +++ b/init/haiku_snippet.in @@ -0,0 +1,7 @@ + +service gopher { + family inet + protocol tcp + port 70 + launch @BINARY@ -h @HOSTNAME@ +} diff --git a/init/inetlin.in b/init/inetlin.in new file mode 100644 index 0000000..aa02d82 --- /dev/null +++ b/init/inetlin.in @@ -0,0 +1 @@ +gopher stream tcp nowait @BINARY_PATH@ @BINARY_NAME@ @OPTIONS@ diff --git a/init/org.gophernicus.server.plist b/init/org.gophernicus.server.plist.in similarity index 100% rename from init/org.gophernicus.server.plist rename to init/org.gophernicus.server.plist.in