iInitial commit at 0.16 of geomyidae. - geomyidae - A small C-based gopherd. Err bitreich.org 70 hgit clone git://bitreich.org/geomyidae/ git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/geomyidae/ URL:git://bitreich.org/geomyidae/ git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/geomyidae/ bitreich.org 70 1Log /scm/geomyidae/log.gph bitreich.org 70 1Files /scm/geomyidae/files.gph bitreich.org 70 1Refs /scm/geomyidae/refs.gph bitreich.org 70 1Tags /scm/geomyidae/tag bitreich.org 70 1README /scm/geomyidae/file/README.gph bitreich.org 70 1LICENSE /scm/geomyidae/file/LICENSE.gph bitreich.org 70 i--- Err bitreich.org 70 1commit 97230aa165bee0bffae624707ff98d6098da1823 /scm/geomyidae/commit/97230aa165bee0bffae624707ff98d6098da1823.gph bitreich.org 70 hAuthor: Christoph Lohmann <20h@r-36.net> URL:mailto:20h@r-36.net bitreich.org 70 iDate: Fri, 19 Nov 2010 09:20:38 +0100 Err bitreich.org 70 i Err bitreich.org 70 iInitial commit at 0.16 of geomyidae. Err bitreich.org 70 i Err bitreich.org 70 iDiffstat: Err bitreich.org 70 i A LICENSE | 24 ++++++++++++++++++++++++ Err bitreich.org 70 i A Makefile | 56 +++++++++++++++++++++++++++++++ Err bitreich.org 70 i A README | 43 ++++++++++++++++++++++++++++++ Err bitreich.org 70 i A arg.h | 19 +++++++++++++++++++ Err bitreich.org 70 i A geomyidae.8 | 407 +++++++++++++++++++++++++++++++ Err bitreich.org 70 i A handlr.c | 196 +++++++++++++++++++++++++++++++ Err bitreich.org 70 i A handlr.h | 20 ++++++++++++++++++++ Err bitreich.org 70 i A ind.c | 287 +++++++++++++++++++++++++++++++ Err bitreich.org 70 i A ind.h | 48 +++++++++++++++++++++++++++++++ Err bitreich.org 70 i A index.gph | 6 ++++++ Err bitreich.org 70 i A main.c | 385 +++++++++++++++++++++++++++++++ Err bitreich.org 70 i A rc.d/Archlinux.conf.d | 4 ++++ Err bitreich.org 70 i A rc.d/Archlinux.rc.d | 38 +++++++++++++++++++++++++++++++ Err bitreich.org 70 i A rc.d/Gentoo.conf.d | 5 +++++ Err bitreich.org 70 i A rc.d/Gentoo.init.d | 17 +++++++++++++++++ Err bitreich.org 70 i A rc.d/NetBSD.rc.d | 55 +++++++++++++++++++++++++++++++ Err bitreich.org 70 i A rc.d/README | 5 +++++ Err bitreich.org 70 i Err bitreich.org 70 i17 files changed, 1615 insertions(+), 0 deletions(-) Err bitreich.org 70 i--- Err bitreich.org 70 1diff --git a/LICENSE b/LICENSE /scm/geomyidae/file/LICENSE.gph bitreich.org 70 i@@ -0,0 +1,24 @@ Err bitreich.org 70 i+MIT/X Consortium License Err bitreich.org 70 i+ Err bitreich.org 70 i+© 2006-2010 Christoph Lohmann <20h@r-36.net> Err bitreich.org 70 i+© 2007 Jeff Woodall Err bitreich.org 70 i+© 2008 J. A. Neitzel Err bitreich.org 70 i+© 2010 James Penketh Err bitreich.org 70 i+ Err bitreich.org 70 i+Permission is hereby granted, free of charge, to any person obtaining a Err bitreich.org 70 i+copy of this software and associated documentation files (the "Software"), Err bitreich.org 70 i+to deal in the Software without restriction, including without limitation Err bitreich.org 70 i+the rights to use, copy, modify, merge, publish, distribute, sublicense, Err bitreich.org 70 i+and/or sell copies of the Software, and to permit persons to whom the Err bitreich.org 70 i+Software is furnished to do so, subject to the following conditions: Err bitreich.org 70 i+ Err bitreich.org 70 i+The above copyright notice and this permission notice shall be included in Err bitreich.org 70 i+all copies or substantial portions of the Software. Err bitreich.org 70 i+ Err bitreich.org 70 i+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR Err bitreich.org 70 i+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, Err bitreich.org 70 i+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL Err bitreich.org 70 i+THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER Err bitreich.org 70 i+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING Err bitreich.org 70 i+FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER Err bitreich.org 70 i+DEALINGS IN THE SOFTWARE. Err bitreich.org 70 1diff --git a/Makefile b/Makefile /scm/geomyidae/file/Makefile.gph bitreich.org 70 i@@ -0,0 +1,56 @@ Err bitreich.org 70 i+PROGRAM = geomyidae Err bitreich.org 70 i+VERSION = 0.16 Err bitreich.org 70 i+ Err bitreich.org 70 i+PREFIX ?= /usr Err bitreich.org 70 i+BINDIR ?= $(PREFIX)/bin Err bitreich.org 70 i+MANDIR ?= $(PREFIX)/man/man8 Err bitreich.org 70 i+ Err bitreich.org 70 i+#CPPFLAGS += -D_BSD_SOURCE Err bitreich.org 70 i+CFLAGS += -O2 -Wall -I. -I/usr/include Err bitreich.org 70 i+LDFLAGS += -L/usr/lib -L. -lc Err bitreich.org 70 i+ Err bitreich.org 70 i+CFILES = main.c ind.c handlr.c Err bitreich.org 70 i+ Err bitreich.org 70 i+OBJECTS = ${CFILES:.c=.o} Err bitreich.org 70 i+ Err bitreich.org 70 i+all: $(PROGRAM) Err bitreich.org 70 i+ Err bitreich.org 70 i+${PROGRAM}: ${OBJECTS} Err bitreich.org 70 i+ ${CC} ${LDFLAGS} -o ${PROGRAM} ${OBJECTS} Err bitreich.org 70 i+ Err bitreich.org 70 i+.SUFFIXES : .c .h Err bitreich.org 70 i+ Err bitreich.org 70 i+.c.o : Err bitreich.org 70 i+ ${CC} ${CFLAGS} ${CPPFLAGS} -c $< Err bitreich.org 70 i+.c : Err bitreich.org 70 i+ ${CC} ${CFLAGS} ${CPPFLAGS} -c $< Err bitreich.org 70 i+ Err bitreich.org 70 i+clean : Err bitreich.org 70 i+ @rm -f *.o ${PROGRAM} core *~ Err bitreich.org 70 i+ Err bitreich.org 70 i+install: $(PROGRAM) Err bitreich.org 70 i+ @mkdir -p ${DESTDIR}${BINDIR} Err bitreich.org 70 i+ @cp -f ${PROGRAM} ${DESTDIR}${BINDIR} Err bitreich.org 70 i+ @strip ${DESTDIR}${BINDIR}/${PROGRAM} Err bitreich.org 70 i+ @chmod 755 ${DESTDIR}${BINDIR}/${PROGRAM} Err bitreich.org 70 i+ @mkdir -p ${DESTDIR}${MANDIR} Err bitreich.org 70 i+ @cp -f geomyidae.8 ${DESTDIR}${MANDIR} Err bitreich.org 70 i+ @chmod 644 ${DESTDIR}${MANDIR}/${PROGRAM}.8 Err bitreich.org 70 i+ Err bitreich.org 70 i+uninstall: Err bitreich.org 70 i+ @rm -f ${DESTDIR}${BINDIR}/${PROGRAM} Err bitreich.org 70 i+ @rm -f ${DESTDIR}${MANDIR}/${PROGRAM}.8 Err bitreich.org 70 i+ Err bitreich.org 70 i+dist: clean Err bitreich.org 70 i+ @mkdir -p "${PROGRAM}-${VERSION}" Err bitreich.org 70 i+ @cp -r rc.d README LICENSE index.gph Makefile geomyidae.8 \ Err bitreich.org 70 i+ *.c *.h "${PROGRAM}-${VERSION}" Err bitreich.org 70 i+ @chmod 755 "${PROGRAM}-${VERSION}" Err bitreich.org 70 i+ @chmod 744 "${PROGRAM}-${VERSION}"/* Err bitreich.org 70 i+ @tar -cf "${PROGRAM}-${VERSION}.tar" "${PROGRAM}-${VERSION}" Err bitreich.org 70 i+ @gzip "${PROGRAM}-${VERSION}.tar" Err bitreich.org 70 i+ @mv "${PROGRAM}-${VERSION}.tar.gz" "${PROGRAM}-${VERSION}.tgz" Err bitreich.org 70 i+ @rm -rf "${PROGRAM}-${VERSION}" Err bitreich.org 70 i+ Err bitreich.org 70 i+.PHONY: all clean dist install uninstall Err bitreich.org 70 i+ Err bitreich.org 70 1diff --git a/README b/README /scm/geomyidae/file/README.gph bitreich.org 70 i@@ -0,0 +1,43 @@ Err bitreich.org 70 i+A gopherd for Linux/BSD. Err bitreich.org 70 i+ Err bitreich.org 70 i+Features: Err bitreich.org 70 i+ * gopher menus (see index.gph for an example) Err bitreich.org 70 i+ * dir listings (if no index.gph was found) Err bitreich.org 70 i+ * cgi support (.cgi files are executed) Err bitreich.org 70 i+ * search support in CGI files Err bitreich.org 70 i+ * logging (-l option) and loglevels (-v option) Err bitreich.org 70 i+ Err bitreich.org 70 i+Usage: Err bitreich.org 70 i+ Err bitreich.org 70 i+ geomyidae [-d] [-l logfile] [-v loglvl] [-b htdocs] [-p port] [-o sport] Err bitreich.org 70 i+ [-u user] [-g group] [-h host] [-i IP] Err bitreich.org 70 i+ -d don't fork into background Err bitreich.org 70 i+ -l logfile setting this will turn on logging into logfile Err bitreich.org 70 i+ -v loglevel see below (default 7) Err bitreich.org 70 i+ -b htdocs the htdocs root for serving files (default Err bitreich.org 70 i+ /var/gopher) Err bitreich.org 70 i+ -p port set the port where geomyidae should listen on Err bitreich.org 70 i+ (default 70) Err bitreich.org 70 i+ -o sport set the port that should be shown in the dir Err bitreich.org 70 i+ listings Err bitreich.org 70 i+ -u user which user rights the serving children should get Err bitreich.org 70 i+ -g group which group rights the serving children should get Err bitreich.org 70 i+ -i IP IP which geomyidae should bind to Err bitreich.org 70 i+ -h host host that should be used in the dir listings Err bitreich.org 70 i+ Err bitreich.org 70 i+Loglevels: Err bitreich.org 70 i+ Err bitreich.org 70 i+ 0 - no logging Err bitreich.org 70 i+ 1 - served plain files Err bitreich.org 70 i+ 2 - dir listings Err bitreich.org 70 i+ 4 - HTTP redirects Err bitreich.org 70 i+ 8 - not found queries Err bitreich.org 70 i+ Err bitreich.org 70 i+ 1 + 2 + 4 = 7 (files + dir listings + HTTP) Err bitreich.org 70 i+ Err bitreich.org 70 i+Init scripts: Err bitreich.org 70 i+ The rc.d directory includes startup scripts for various distributions. Err bitreich.org 70 i+ Err bitreich.org 70 i+ Err bitreich.org 70 i+Have fun! Err bitreich.org 70 i+ Err bitreich.org 70 1diff --git a/arg.h b/arg.h /scm/geomyidae/file/arg.h.gph bitreich.org 70 i@@ -0,0 +1,19 @@ Err bitreich.org 70 i+#ifndef ARG_H Err bitreich.org 70 i+#define ARG_H Err bitreich.org 70 i+ Err bitreich.org 70 i+#define USED(x) ((void)(x)) Err bitreich.org 70 i+ Err bitreich.org 70 i+extern char *argv0; Err bitreich.org 70 i+ Err bitreich.org 70 i+#define ARGBEGIN for(argv0 = *argv, argv++, argc--;\ Err bitreich.org 70 i+ argv[0] && argv[0][0]=='-' && argv[0][1];\ Err bitreich.org 70 i+ argc--, argv++) {\ Err bitreich.org 70 i+ char _argc;\ Err bitreich.org 70 i+ _argc = argv[0][1];\ Err bitreich.org 70 i+ switch(_argc) Err bitreich.org 70 i+#define ARGEND USED(_argc);} USED(argv);USED(argc); Err bitreich.org 70 i+#define EARGF(x) ((argv[1] == nil)? ((x), abort(), (char *)0) :\ Err bitreich.org 70 i+ (argc--, argv++, argv[0])) Err bitreich.org 70 i+ Err bitreich.org 70 i+#endif Err bitreich.org 70 i+ Err bitreich.org 70 1diff --git a/geomyidae.8 b/geomyidae.8 /scm/geomyidae/file/geomyidae.8.gph bitreich.org 70 i@@ -0,0 +1,407 @@ Err bitreich.org 70 i+.\" geomyidae.8 handcrafted in GNU groff -mdoc using nvi Err bitreich.org 70 i+.\" Err bitreich.org 70 i+.Dd March 9, 2008 Err bitreich.org 70 i+.Dt GEOMYIDAE 8 Err bitreich.org 70 i+.Os Err bitreich.org 70 i+. Err bitreich.org 70 i+.Sh NAME Err bitreich.org 70 i+.Nm geomyidae Err bitreich.org 70 i+.Nd a gopher daemon for Linux/BSD Err bitreich.org 70 i+. Err bitreich.org 70 i+.Sh SYNOPSIS Err bitreich.org 70 i+.Nm Err bitreich.org 70 i+.Bk -words Err bitreich.org 70 i+.Op Fl d Err bitreich.org 70 i+.Op Fl l Ar logfile Err bitreich.org 70 i+.Op Fl v Ar loglevel Err bitreich.org 70 i+.Op Fl b Ar base Err bitreich.org 70 i+.Op Fl p Ar port Err bitreich.org 70 i+.Op Fl o Ar sport Err bitreich.org 70 i+.Op Fl u Ar user Err bitreich.org 70 i+.Op Fl g Ar group Err bitreich.org 70 i+.Op Fl h Ar host Err bitreich.org 70 i+.Op Fl i Ar IP Err bitreich.org 70 i+.Ek Err bitreich.org 70 i+. Err bitreich.org 70 i+.Sh DESCRIPTION Err bitreich.org 70 i+.Nm Err bitreich.org 70 i+is a daemon for serving the protocol specified in Err bitreich.org 70 i+.Em RFC 1436 Err bitreich.org 70 i+(Gopher). Under 1000 lines of C by design, it is lightweight yet supports Err bitreich.org 70 i+dynamic content, automatic file/directory indexing, logging and privilege Err bitreich.org 70 i+separation. Err bitreich.org 70 i+. Err bitreich.org 70 i+.Sh IMPLEMENTATION Err bitreich.org 70 i+Installation is straightforward: grab the zipped tar file, expand it in Err bitreich.org 70 i+an appropriate temp directory, change to the Err bitreich.org 70 i+.Qq "../geomyidae-x.xx" Err bitreich.org 70 i+directory, tweak the Makefile if desired (installs in Err bitreich.org 70 i+.Qq "/usr/bin" Err bitreich.org 70 i+by default), then run the Err bitreich.org 70 i+.Sq "make ; make install" Err bitreich.org 70 i+commands. The resulting executable should be run by root. Err bitreich.org 70 i+. Err bitreich.org 70 i+.Ss Installation example: Err bitreich.org 70 i+.Pp Err bitreich.org 70 i+.Bd -literal Err bitreich.org 70 i+ % wget http://www.r-36.net/src/geomyidae/geomyidae-current.tgz; Err bitreich.org 70 i+ % tar -xzvf geomyidae-*.tgz; Err bitreich.org 70 i+ % cd geomyidae-*; Err bitreich.org 70 i+ % make; sudo make install; Err bitreich.org 70 i+ % sudo mkdir -p /var/gopher; Err bitreich.org 70 i+ % sudo cp index.gph /var/gopher; Err bitreich.org 70 i+ % sudo eomyidae -l /var/log/geomyidae.log -b /var/gopher -p 70; Err bitreich.org 70 i+ % tail -f /var/log/geomyidae.log; Err bitreich.org 70 i+ # Err bitreich.org 70 i+ # Use whatever gopher client you like to gopher to Err bitreich.org 70 i+ # gopher://localhost Err bitreich.org 70 i+ # Err bitreich.org 70 i+ # Have fun! Err bitreich.org 70 i+.Ed Err bitreich.org 70 i+. Err bitreich.org 70 i+.Ss Running Err bitreich.org 70 i+Geomyidae should normally be started by root. Though, it can be started Err bitreich.org 70 i+by a regular user provided that the base directory and its contents are owned Err bitreich.org 70 i+by the same user. Geomyidae will only serve content within the base directory Err bitreich.org 70 i+tree and will drop privileges to the Err bitreich.org 70 i+.Fl u Ar user Err bitreich.org 70 i+and Err bitreich.org 70 i+.Fl g Ar group Err bitreich.org 70 i+values if set. See Err bitreich.org 70 i+.Ic OPTIONS Err bitreich.org 70 i+below for specifics. Err bitreich.org 70 i+. Err bitreich.org 70 i+.Sh OPTIONS Err bitreich.org 70 i+geomyidae options and default settings: Err bitreich.org 70 i+.Pp Err bitreich.org 70 i+.Bl -tag -width ".Fl test Ao Ar string Ac" Err bitreich.org 70 i+. Err bitreich.org 70 i+.It Fl d Err bitreich.org 70 i+Don't fork into background. Err bitreich.org 70 i+. Err bitreich.org 70 i+.It Fl l Ar logfile Err bitreich.org 70 i+Specify the file where the log output will be written (default: no default). Err bitreich.org 70 i+. Err bitreich.org 70 i+.It Fl v Ar loglevel Err bitreich.org 70 i+Set the logging level (default: 15). Err bitreich.org 70 i+. Err bitreich.org 70 i+.Bd -literal Err bitreich.org 70 i+Loglevels: Err bitreich.org 70 i+ 0 - no logging Err bitreich.org 70 i+ 1 - served plain files Err bitreich.org 70 i+ 2 - directory listings Err bitreich.org 70 i+ 4 - HTTP redirects Err bitreich.org 70 i+ 8 - errors (e.g., not found) Err bitreich.org 70 i+ e.g.: Err bitreich.org 70 i+ 1 + 2 + 4 + 8 = 15 Err bitreich.org 70 i+ (files + directories + HTTP + errors) Err bitreich.org 70 i+.Ed Err bitreich.org 70 i+. Err bitreich.org 70 i+.It Fl b Ar base Err bitreich.org 70 i+Root directory to serve (default: /var/gopher) Err bitreich.org 70 i+. Err bitreich.org 70 i+.It Fl p Ar port Err bitreich.org 70 i+Port geomyidae should listen on (default: 70) Err bitreich.org 70 i+. Err bitreich.org 70 i+.It Fl o Ar sport Err bitreich.org 70 i+Port geomyidae displays within base directory (default: 70). Err bitreich.org 70 i+. Err bitreich.org 70 i+Use in conjunction with Err bitreich.org 70 i+.Ic -p Err bitreich.org 70 i+for obfuscating actual port neomyidae is running on. Err bitreich.org 70 i+. Err bitreich.org 70 i+.It Fl u Ar user Err bitreich.org 70 i+Sets the user to which privileges drop when geomyidae is ready Err bitreich.org 70 i+to accept network connections (default: user geomyidae runs as). Err bitreich.org 70 i+Helps improve security by reducing privileges during request Err bitreich.org 70 i+processing. Err bitreich.org 70 i+. Err bitreich.org 70 i+.It Fl g Ar group Err bitreich.org 70 i+Sets the group to which privileges drop when geomyidae is ready Err bitreich.org 70 i+to accept network connections (default: group geomyidae runs as). Err bitreich.org 70 i+Helps improve security by reducing privileges during request Err bitreich.org 70 i+processing. Err bitreich.org 70 i+. Err bitreich.org 70 i+.It Fl h Ar host Err bitreich.org 70 i+Host to use in directory listings (default: localhost) Err bitreich.org 70 i+. Err bitreich.org 70 i+.It Fl i Ar IP Err bitreich.org 70 i+IP to which geomyidae binds to (default: 127.0.0.1) Err bitreich.org 70 i+.El Err bitreich.org 70 i+. Err bitreich.org 70 i+.Sh FORMATTING Err bitreich.org 70 i+Structured Gopher space(s) can be created with geomyidae through the Err bitreich.org 70 i+use of special indexing files of the form Err bitreich.org 70 i+.Ic .gph Err bitreich.org 70 i+which, if present, geomyidae uses to format and/or filter the contents of Err bitreich.org 70 i+the base directory (/var/gopher by default) and create gopher menus. Err bitreich.org 70 i+However, index files are Err bitreich.org 70 i+.Em not Err bitreich.org 70 i+required: if no .gph files are found geomyidae simply lists the directory Err bitreich.org 70 i+contents in alphanumeric order. In addition, a directory can utilize Err bitreich.org 70 i+multiple index files to create a layered gopher environment without the Err bitreich.org 70 i+use of sub-directories: ie. pictures.gph, music.gph, documents.gph could Err bitreich.org 70 i+be "directories" within main.gph, yet all reside in /var/gopher along with Err bitreich.org 70 i+their respective files (*.jpg, *.mp3, *.pdf for example). Err bitreich.org 70 i+. Err bitreich.org 70 i+.Ss Anatomy of an index.gph file Err bitreich.org 70 i+In general, each line of an index.gph file has the following structure: Err bitreich.org 70 i+.Pp Err bitreich.org 70 i+.Bl -inset -offset indent Err bitreich.org 70 i+.It Ic [|||] Err bitreich.org 70 i+.El Err bitreich.org 70 i+.Pp Err bitreich.org 70 i+where, Err bitreich.org 70 i+.Bl -inset -offset indent Err bitreich.org 70 i+.It Ic Err bitreich.org 70 i+= A valid gopher Item Type. Err bitreich.org 70 i+.Pp Err bitreich.org 70 i+Some common Gopher Types as defined in Err bitreich.org 70 i+.Em RFC 1436 Err bitreich.org 70 i+: Err bitreich.org 70 i+. Err bitreich.org 70 i+.Bd -literal Err bitreich.org 70 i+ 0 Item is a file Err bitreich.org 70 i+ 1 Gopher directory Err bitreich.org 70 i+ 3 Error Err bitreich.org 70 i+ 7 Item is an Index-Search server. Err bitreich.org 70 i+ 8 Item points to a text-based telnet session. Err bitreich.org 70 i+ 9 Binary file. Client reads until TCP connection closes! Err bitreich.org 70 i+ g GIF format graphics file. Err bitreich.org 70 i+ I Indeterminate image file. Client decides how to display. Err bitreich.org 70 i+.Ed Err bitreich.org 70 i+.Pp Err bitreich.org 70 i+In addition, geomyidae provides these: Err bitreich.org 70 i+.Bd -literal Err bitreich.org 70 i+ h Item is a hypertext (HTTP) link Err bitreich.org 70 i+ i Informational Item (used for descriptive purposes) Err bitreich.org 70 i+.Ed Err bitreich.org 70 i+. Err bitreich.org 70 i+.Pp Err bitreich.org 70 i+Note: geomyidae doesn't require "informational" text to be formally Err bitreich.org 70 i+Typed as "[i|...]"; any line Err bitreich.org 70 i+.Em not Err bitreich.org 70 i+beginning with "[" is treated as informational, greatly simplifying the Err bitreich.org 70 i+formatting of index.gph files. Err bitreich.org 70 i+If a line begins with "t", this "t" is left out. This measurement is Err bitreich.org 70 i+there to allow lines "informational" text beginning with "[". Err bitreich.org 70 i+. Err bitreich.org 70 i+.It Ic Err bitreich.org 70 i+= description of gopher item. Most printable characters should work. Err bitreich.org 70 i+. Err bitreich.org 70 i+.It Ic Err bitreich.org 70 i+= full path to gopher item (base value is / ). Use the "Err" path for Err bitreich.org 70 i+items not intended to be served. Err bitreich.org 70 i+. Err bitreich.org 70 i+.It Ic Err bitreich.org 70 i+= hostname or IP hosting the gopher item. Must be resolvable for the Err bitreich.org 70 i+intended clients. Err bitreich.org 70 i+. Err bitreich.org 70 i+.It Ic Err bitreich.org 70 i+= TCP port number ( usually 70) Err bitreich.org 70 i+. Err bitreich.org 70 i+May be omitted if defaults are used. Err bitreich.org 70 i+.El Err bitreich.org 70 i+. Err bitreich.org 70 i+.Ss index.gph Example Err bitreich.org 70 i+A root.gph file for a server running on host=frog.bog, port=70. Note use Err bitreich.org 70 i+of optional [i]nformational Item (line 2) for vertical space insertion: Err bitreich.org 70 i+.Pp Err bitreich.org 70 i+.Bd -literal -offset indent Err bitreich.org 70 i+Welcome to Frog.bog Err bitreich.org 70 i+[i||||] Err bitreich.org 70 i+[0|About this server|about.txt|frog.bog|70] Err bitreich.org 70 i+[0|Daily Log|/dtail.cgi|frog.bog|70] Err bitreich.org 70 i+[1|Phlog: like a blog, but not|/PHLOG|frog.bog|70] Err bitreich.org 70 i+[9|Some binary file|widget.exe|frog.bog|70] Err bitreich.org 70 i+[I|Snowflake picture|snowflake.jpg|frog.bog|70] Err bitreich.org 70 i+ Err bitreich.org 70 i+Links and Searches Err bitreich.org 70 i+[1|Go to R-36.net|/|gopher.r-36.net|70] Err bitreich.org 70 i+[h|Go to NetBSD.org|URL:http://netbsd.org|frog.bog|70] Err bitreich.org 70 i+[7|Query US Weather by Zipcode|/weather.cgi?|frog.bog|70] Err bitreich.org 70 i+[7|Search Veronica II|/v2/vs|gopher.floodgap.com|70] Err bitreich.org 70 i+[8|Telnet to SDF Public Access Unix System||freeshell.org|23] Err bitreich.org 70 i+.Ed Err bitreich.org 70 i+. Err bitreich.org 70 i+.Pp Err bitreich.org 70 i+The above looks something like this in a text-based gopher client: Err bitreich.org 70 i+.Pp Err bitreich.org 70 i+.Bl -tag -width ".It Ic WIDTHS" -compact -offset indent Err bitreich.org 70 i+.D1 Welcome to Frog.bog Err bitreich.org 70 i+.Pp Err bitreich.org 70 i+.It Ic (FILE) Err bitreich.org 70 i+About this server Err bitreich.org 70 i+.It Ic (FILE) Err bitreich.org 70 i+Daily Log Err bitreich.org 70 i+.It Ic (DIR) Err bitreich.org 70 i+Phlog: like a blog, but not Err bitreich.org 70 i+.It Ic (BIN) Err bitreich.org 70 i+Some binary file Err bitreich.org 70 i+.It Ic (IMG) Err bitreich.org 70 i+Snowflake picture Err bitreich.org 70 i+.El Err bitreich.org 70 i+.Pp Err bitreich.org 70 i+.Bl -tag -width ".It Ic WIDTHS" -compact -offset indent Err bitreich.org 70 i+.D1 Links and Searches Err bitreich.org 70 i+.It Ic (DIR) Err bitreich.org 70 i+Go to R-36.net Err bitreich.org 70 i+.It Ic (HTML) Err bitreich.org 70 i+Go to NetBSD.org Err bitreich.org 70 i+.It Ic (?) Err bitreich.org 70 i+Query US Weather by Zipcode Err bitreich.org 70 i+.It Ic (?) Err bitreich.org 70 i+Search Veronica II Err bitreich.org 70 i+.It Ic (TEL) Err bitreich.org 70 i+Telnet to SDF Public Access Unix System Err bitreich.org 70 i+.El Err bitreich.org 70 i+.Pp Err bitreich.org 70 i+.Sh USING DYNAMIC CONTENT Err bitreich.org 70 i+Dynamic content can be generated under geomyidae by simply creating a file Err bitreich.org 70 i+in for form of Err bitreich.org 70 i+.Ic .cgi Err bitreich.org 70 i+in a directory that is being served. Such files are run as a shell script. Err bitreich.org 70 i+(See below for description.) Err bitreich.org 70 i+.Pp Err bitreich.org 70 i+ex. dtail.cgi - prints daily log entries Err bitreich.org 70 i+. Err bitreich.org 70 i+.Bd -literal -offset indent Err bitreich.org 70 i+#!/bin/sh -e Err bitreich.org 70 i+echo "Logged activity for `date '+%A, %B %d, %Y'` :" Err bitreich.org 70 i+echo "===============================================" Err bitreich.org 70 i+LOG="/var/log/gopherd.log" Err bitreich.org 70 i+DATE=`date "+%a %b %d"` Err bitreich.org 70 i+/usr/bin/grep "$DATE" $LOG Err bitreich.org 70 i+exit 0 Err bitreich.org 70 i+.Ed Err bitreich.org 70 i+. Err bitreich.org 70 i+.Pp Err bitreich.org 70 i+Geomyidae supports two variable queries. The basic form is Err bitreich.org 70 i+.Pp Err bitreich.org 70 i+.D1 executable.cgi{argv[1]}?{argv[2]} Err bitreich.org 70 i+.Pp Err bitreich.org 70 i+where Err bitreich.org 70 i+.Pp Err bitreich.org 70 i+.D1 argv[1] = strings (everything before the '?' in the query) Err bitreich.org 70 i+.D1 argv[2] = arguments (everything behind the '?' in the query) Err bitreich.org 70 i+.Pp Err bitreich.org 70 i+A search query request must have an item Type of "7" to be called Err bitreich.org 70 i+from an index.gph file. It may also need a "?" suffix in the Err bitreich.org 70 i+field. Err bitreich.org 70 i+. Err bitreich.org 70 i+.Pp Err bitreich.org 70 i+ex. hello.cgi - say hello to user Err bitreich.org 70 i+. Err bitreich.org 70 i+.Bd -literal -offset indent Err bitreich.org 70 i+#!/bin/sh Err bitreich.org 70 i+NAME=$1 Err bitreich.org 70 i+echo "" Err bitreich.org 70 i+echo Hello $NAME - welcome to Frog.bog Err bitreich.org 70 i+exit 0 Err bitreich.org 70 i+.Ed Err bitreich.org 70 i+. Err bitreich.org 70 i+.Pp Err bitreich.org 70 i+Call the above with the following index.gph entry: Err bitreich.org 70 i+.Pp Err bitreich.org 70 i+.D1 [7|Hello You - Please enter your name|/hello.cgi?|frog.bog|70] Err bitreich.org 70 i+. Err bitreich.org 70 i+.Pp Err bitreich.org 70 i+And do a simple Err bitreich.org 70 i+.Xr snarf 1 Err bitreich.org 70 i+query: Err bitreich.org 70 i+.Pp Err bitreich.org 70 i+.D1 % snarf Qo gopher://frog.bog/7/hello.cgi?Christoph Qc - Err bitreich.org 70 i+.D1 Hello Christoph - welcome to Frog.bog Err bitreich.org 70 i+.Dl % Err bitreich.org 70 i+. Err bitreich.org 70 i+.Sh LOG FILES Err bitreich.org 70 i+.Pp Err bitreich.org 70 i+The log file (/var/log/gopherd.log is default) has the following structure: Err bitreich.org 70 i+. Err bitreich.org 70 i+.Pp Err bitreich.org 70 i+.Ic [|] () Err bitreich.org 70 i+. Err bitreich.org 70 i+.Pp Err bitreich.org 70 i+where, Err bitreich.org 70 i+. Err bitreich.org 70 i+.Bl -inset Err bitreich.org 70 i+.It Ic Err bitreich.org 70 i+= access date and time (std 'date' format) Err bitreich.org 70 i+.Bl -inset -offset indent Err bitreich.org 70 i+ex. Err bitreich.org 70 i+.Qq "Sun Feb 17 06:11:10 PST 2008" Err bitreich.org 70 i+.El Err bitreich.org 70 i+.It Ic Err bitreich.org 70 i+= client IP address and port served Err bitreich.org 70 i+.Bl -inset -offset indent Err bitreich.org 70 i+ex. Err bitreich.org 70 i+.Qq "24.208.18.127:16857" Err bitreich.org 70 i+.El Err bitreich.org 70 i+.Pp Err bitreich.org 70 i+.It Ic Err bitreich.org 70 i+= full path to item served Err bitreich.org 70 i+.Bl -inset -offset indent Err bitreich.org 70 i+ex. Err bitreich.org 70 i+.D1 Qo "/PICS/simple2.jpg" Qc for an image file Err bitreich.org 70 i+.D1 Qo "/PICS" Qc for a directory access Err bitreich.org 70 i+.El Err bitreich.org 70 i+.It Ic Err bitreich.org 70 i+= query term submitted (Type 7 requests only) Err bitreich.org 70 i+.Bl -inset -offset indent Err bitreich.org 70 i+ex. Err bitreich.org 70 i+.Dl % snarf Qq "gopher://frog.bog/7/hello.cgi?Christoph" Err bitreich.org 70 i+.Dl would log Qo "Christoph" Qc as the query term. Err bitreich.org 70 i+.El Err bitreich.org 70 i+.It Ic () Err bitreich.org 70 i+= status of client request Err bitreich.org 70 i+.Bl -inset -offset indent Err bitreich.org 70 i+ex. - some common status entries: Err bitreich.org 70 i+.El Err bitreich.org 70 i+.Pp Err bitreich.org 70 i+.Bl -hang -width XXXXXXXXXXXXXXXX -compact -offset XXXXXXXXXXXX Err bitreich.org 70 i+.It Qo (serving) Qc Err bitreich.org 70 i+=> a successful request Err bitreich.org 70 i+.It Qo (not found) Qc Err bitreich.org 70 i+=> an unsuccessful request Err bitreich.org 70 i+.It Qo (HTTP redirect) Qc Err bitreich.org 70 i+=> web link redirect (Type h) Err bitreich.org 70 i+.It Qo (dir listing) Qc Err bitreich.org 70 i+=> unindexed directory listing Err bitreich.org 70 i+.El Err bitreich.org 70 i+.El Err bitreich.org 70 i+. Err bitreich.org 70 i+.Sh FILES Err bitreich.org 70 i+README, LICENSE, index.gph Err bitreich.org 70 i+. Err bitreich.org 70 i+.Sh "SEE ALSO" Err bitreich.org 70 i+Links for further information on gopher: Err bitreich.org 70 i+.Pp Err bitreich.org 70 i+.D1 Pa gopher://gopher.gopherproject.org Err bitreich.org 70 i+.D1 Pa http://www.gopherproject.org Err bitreich.org 70 i+.Pp Err bitreich.org 70 i+.Sh STANDARDS Err bitreich.org 70 i+.Em Internet RFC 1436 Err bitreich.org 70 i+. Err bitreich.org 70 i+.Sh HISTORY Err bitreich.org 70 i+Geomyidae started as a Linux/BSD port of the Plan 9 gopherd_P9 server. Err bitreich.org 70 i+Originally called gopherd_BSD, the name was later changed to Geomyidae Err bitreich.org 70 i+(latin), the taxonomic family of burrowing rodents known as "pocket Err bitreich.org 70 i+gophers" which are in fact the true gophers. Because of inconsitencies Err bitreich.org 70 i+and the UNIX culture, the name was changed to lowercase in 2010. Err bitreich.org 70 i+. Err bitreich.org 70 i+.Sh AUTHORS Err bitreich.org 70 i+See LICENSE file for authors in the distribution. Err bitreich.org 70 i+. Err bitreich.org 70 i+.Sh LICENSE Err bitreich.org 70 i+Geomyidae is released under the MIT/X Consortium License. Err bitreich.org 70 i+. Err bitreich.org 70 i+.Sh BUGS Err bitreich.org 70 i+Geomyidae occasionally aborts silently if too many simultaneous Err bitreich.org 70 i+requests are made. Limiting gopher traffic via firewall rules Err bitreich.org 70 i+may help. Err bitreich.org 70 i+.Pp Err bitreich.org 70 i+Dynamic content functionality may vary across gopher clients. Err bitreich.org 70 i+. Err bitreich.org 70 i+.Ss "Reporting Bugs" Err bitreich.org 70 i+Report bugs to: Err bitreich.org 70 i+.An "Christoph Lohmann" Aq 20h@R-36.net Err bitreich.org 70 1diff --git a/handlr.c b/handlr.c /scm/geomyidae/file/handlr.c.gph bitreich.org 70 i@@ -0,0 +1,196 @@ Err bitreich.org 70 i+/* Err bitreich.org 70 i+ * Copy me if you can. Err bitreich.org 70 i+ * by 20h Err bitreich.org 70 i+ */ Err bitreich.org 70 i+ Err bitreich.org 70 i+#include Err bitreich.org 70 i+#include Err bitreich.org 70 i+#include Err bitreich.org 70 i+#include Err bitreich.org 70 i+#include Err bitreich.org 70 i+#include Err bitreich.org 70 i+#include Err bitreich.org 70 i+#include Err bitreich.org 70 i+#include Err bitreich.org 70 i+#include Err bitreich.org 70 i+#include Err bitreich.org 70 i+#include Err bitreich.org 70 i+#include "ind.h" Err bitreich.org 70 i+#include "arg.h" Err bitreich.org 70 i+ Err bitreich.org 70 i+void Err bitreich.org 70 i+handledir(int sock, char *path, char *port, char *base, char *args, Err bitreich.org 70 i+ char *sear) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ char *pa, *file, *e, *addr, *par, *b; Err bitreich.org 70 i+ struct dirent **dirent; Err bitreich.org 70 i+ int ndir, i; Err bitreich.org 70 i+ struct stat st; Err bitreich.org 70 i+ filetype *type; Err bitreich.org 70 i+ Err bitreich.org 70 i+ USED(sear); Err bitreich.org 70 i+ addr = nil; Err bitreich.org 70 i+ Err bitreich.org 70 i+ pa = gstrdup(path); Err bitreich.org 70 i+ e = strrchr(pa, '/'); Err bitreich.org 70 i+ if(e != nil) { Err bitreich.org 70 i+ *e = '\0'; Err bitreich.org 70 i+ Err bitreich.org 70 i+ if(args == nil) { Err bitreich.org 70 i+ addr = gmallocz(512, 2); Err bitreich.org 70 i+ if(gethostname(addr, 512) == -1) { Err bitreich.org 70 i+ perror("gethostname"); Err bitreich.org 70 i+ close(sock); Err bitreich.org 70 i+ free(addr); Err bitreich.org 70 i+ free(pa); Err bitreich.org 70 i+ return; Err bitreich.org 70 i+ } Err bitreich.org 70 i+ } else Err bitreich.org 70 i+ addr = gstrdup(args); Err bitreich.org 70 i+ Err bitreich.org 70 i+ par = gstrdup(pa); Err bitreich.org 70 i+ b = strrchr(par + strlen(base), '/'); Err bitreich.org 70 i+ if(b != nil) { Err bitreich.org 70 i+ *b = '\0'; Err bitreich.org 70 i+ tprintf(sock, "1..\t%s\t%s\t%s\r\n", Err bitreich.org 70 i+ par + strlen(base), addr, port); Err bitreich.org 70 i+ } Err bitreich.org 70 i+ free(par); Err bitreich.org 70 i+ Err bitreich.org 70 i+ ndir = scandir(pa, &dirent, 0, alphasort); Err bitreich.org 70 i+ if(ndir < 0) { Err bitreich.org 70 i+ perror("scandir"); Err bitreich.org 70 i+ close(sock); Err bitreich.org 70 i+ free(addr); Err bitreich.org 70 i+ free(pa); Err bitreich.org 70 i+ return; Err bitreich.org 70 i+ } else { Err bitreich.org 70 i+ for(i = 0; i < ndir; i++) { Err bitreich.org 70 i+ if(dirent[i]->d_name[0] == '.') { Err bitreich.org 70 i+ free(dirent[i]); Err bitreich.org 70 i+ continue; Err bitreich.org 70 i+ } Err bitreich.org 70 i+ Err bitreich.org 70 i+ type = gettype(dirent[i]->d_name); Err bitreich.org 70 i+ file = smprintf("%s/%s", pa, Err bitreich.org 70 i+ dirent[i]->d_name); Err bitreich.org 70 i+ if(stat(file, &st) >= 0 && S_ISDIR(st.st_mode)) Err bitreich.org 70 i+ type = gettype("index.gph"); Err bitreich.org 70 i+ e = file + strlen(base); Err bitreich.org 70 i+ tprintf(sock, "%c%s\t%s\t%s\t%s\r\n", *type->type, Err bitreich.org 70 i+ dirent[i]->d_name, e, addr, port); Err bitreich.org 70 i+ free(file); Err bitreich.org 70 i+ free(dirent[i]); Err bitreich.org 70 i+ } Err bitreich.org 70 i+ free(dirent); Err bitreich.org 70 i+ } Err bitreich.org 70 i+ tprintf(sock, "\r\n"); Err bitreich.org 70 i+ } Err bitreich.org 70 i+ Err bitreich.org 70 i+ if(addr != nil) Err bitreich.org 70 i+ free(addr); Err bitreich.org 70 i+ free(pa); Err bitreich.org 70 i+ close(sock); Err bitreich.org 70 i+ return; Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+void Err bitreich.org 70 i+handlegph(int sock, char *file, char *port, char *base, char *args, Err bitreich.org 70 i+ char *sear) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ Indexs *act; Err bitreich.org 70 i+ int i; Err bitreich.org 70 i+ char addr[512]; Err bitreich.org 70 i+ Err bitreich.org 70 i+ USED(base); Err bitreich.org 70 i+ USED(args); Err bitreich.org 70 i+ USED(sear); Err bitreich.org 70 i+ Err bitreich.org 70 i+ act = scanfile(file); Err bitreich.org 70 i+ if(act != nil) { Err bitreich.org 70 i+ if(args == nil) { Err bitreich.org 70 i+ if(gethostname(addr, sizeof(addr)) == -1) { Err bitreich.org 70 i+ perror("gethostname"); Err bitreich.org 70 i+ close(sock); Err bitreich.org 70 i+ return; Err bitreich.org 70 i+ } Err bitreich.org 70 i+ } else Err bitreich.org 70 i+ snprintf(addr, sizeof(addr), "%s", args); Err bitreich.org 70 i+ Err bitreich.org 70 i+ Err bitreich.org 70 i+ for(i = 0; i < act->num; i++) { Err bitreich.org 70 i+ if(!strncmp(act->n[i]->e[3], "server", 6)) { Err bitreich.org 70 i+ free(act->n[i]->e[3]); Err bitreich.org 70 i+ act->n[i]->e[3] = gstrdup(addr); Err bitreich.org 70 i+ } Err bitreich.org 70 i+ if(!strncmp(act->n[i]->e[4], "port", 4)) { Err bitreich.org 70 i+ free(act->n[i]->e[4]); Err bitreich.org 70 i+ act->n[i]->e[4] = gstrdup(port); Err bitreich.org 70 i+ } Err bitreich.org 70 i+ tprintf(sock, "%.1s%s\t%s\t%s\t%s\r\n", Err bitreich.org 70 i+ act->n[i]->e[0], act->n[i]->e[1], Err bitreich.org 70 i+ act->n[i]->e[2], act->n[i]->e[3], Err bitreich.org 70 i+ act->n[i]->e[4]); Err bitreich.org 70 i+ Err bitreich.org 70 i+ freeelem(act->n[i]); Err bitreich.org 70 i+ act->n[i] = nil; Err bitreich.org 70 i+ } Err bitreich.org 70 i+ tprintf(sock, "\r\n.\r\n\r\n"); Err bitreich.org 70 i+ Err bitreich.org 70 i+ freeindex(act); Err bitreich.org 70 i+ } Err bitreich.org 70 i+ Err bitreich.org 70 i+ close(sock); Err bitreich.org 70 i+ return; Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+void Err bitreich.org 70 i+handlebin(int sock, char *file, char *port, char *base, char *args, Err bitreich.org 70 i+ char *sear) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ char sendb[1024]; Err bitreich.org 70 i+ int len, fd; Err bitreich.org 70 i+ Err bitreich.org 70 i+ len = -1; Err bitreich.org 70 i+ USED(port); Err bitreich.org 70 i+ USED(base); Err bitreich.org 70 i+ USED(args); Err bitreich.org 70 i+ USED(sear); Err bitreich.org 70 i+ Err bitreich.org 70 i+ fd = open(file, O_RDONLY); Err bitreich.org 70 i+ if(fd >= 0) { Err bitreich.org 70 i+ while((len = read(fd, sendb, sizeof(sendb))) > 0) Err bitreich.org 70 i+ send(sock, sendb, len, 0); Err bitreich.org 70 i+ close(fd); Err bitreich.org 70 i+ } Err bitreich.org 70 i+ Err bitreich.org 70 i+ close(sock); Err bitreich.org 70 i+ return; Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+void Err bitreich.org 70 i+handlecgi(int sock, char *file, char *port, char *base, char *args, Err bitreich.org 70 i+ char *sear) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ char *p; Err bitreich.org 70 i+ Err bitreich.org 70 i+ USED(port); Err bitreich.org 70 i+ USED(base); Err bitreich.org 70 i+ Err bitreich.org 70 i+ p = strrchr(file, '/'); Err bitreich.org 70 i+ if(p == nil) Err bitreich.org 70 i+ p = file; Err bitreich.org 70 i+ Err bitreich.org 70 i+ dup2(sock, 1); Err bitreich.org 70 i+ dup2(sock, 0); Err bitreich.org 70 i+ dup2(sock, 2); Err bitreich.org 70 i+ Err bitreich.org 70 i+ if(sear == nil) Err bitreich.org 70 i+ sear = ""; Err bitreich.org 70 i+ Err bitreich.org 70 i+ execl(file, p, sear, args, nil); Err bitreich.org 70 i+ Err bitreich.org 70 i+ close(sock); Err bitreich.org 70 i+ return; Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 1diff --git a/handlr.h b/handlr.h /scm/geomyidae/file/handlr.h.gph bitreich.org 70 i@@ -0,0 +1,20 @@ Err bitreich.org 70 i+/* Err bitreich.org 70 i+ * Copy me if you can. Err bitreich.org 70 i+ * by 20h Err bitreich.org 70 i+ */ Err bitreich.org 70 i+ Err bitreich.org 70 i+#ifndef HANDLR_H Err bitreich.org 70 i+#define HANDLR_H Err bitreich.org 70 i+ Err bitreich.org 70 i+#define nil NULL Err bitreich.org 70 i+ Err bitreich.org 70 i+void handledir(int sock, char *path, char *port, char *base, char *args, Err bitreich.org 70 i+ char *sear); Err bitreich.org 70 i+void handlegph(int sock, char *file, char *port, char *base, char *args, Err bitreich.org 70 i+ char *sear); Err bitreich.org 70 i+void handlebin(int sock, char *file, char *port, char *base, char *args, Err bitreich.org 70 i+ char *sear); Err bitreich.org 70 i+void handlecgi(int sock, char *file, char *port, char *base, char *args, Err bitreich.org 70 i+ char *sear); Err bitreich.org 70 i+ Err bitreich.org 70 i+#endif Err bitreich.org 70 1diff --git a/ind.c b/ind.c /scm/geomyidae/file/ind.c.gph bitreich.org 70 i@@ -0,0 +1,287 @@ Err bitreich.org 70 i+/* Err bitreich.org 70 i+ * Copy me if you can. Err bitreich.org 70 i+ * by 20h Err bitreich.org 70 i+ */ Err bitreich.org 70 i+ Err bitreich.org 70 i+#include Err bitreich.org 70 i+#include Err bitreich.org 70 i+#include Err bitreich.org 70 i+#include Err bitreich.org 70 i+#include Err bitreich.org 70 i+#include Err bitreich.org 70 i+#include Err bitreich.org 70 i+#include "ind.h" Err bitreich.org 70 i+#include "handlr.h" Err bitreich.org 70 i+ Err bitreich.org 70 i+filetype type[] = { Err bitreich.org 70 i+ {"default", "0", handlebin}, Err bitreich.org 70 i+ {"gph", "1", handlegph}, Err bitreich.org 70 i+ {"cgi", "0", handlecgi}, Err bitreich.org 70 i+ {"bin", "9", handlebin}, Err bitreich.org 70 i+ {"tgz", "9", handlebin}, Err bitreich.org 70 i+ {"gz", "9", handlebin}, Err bitreich.org 70 i+ {"jpg", "I", handlebin}, Err bitreich.org 70 i+ {"gif", "g", handlebin}, Err bitreich.org 70 i+ {"png", "I", handlebin}, Err bitreich.org 70 i+ {"bmp", "I", handlebin}, Err bitreich.org 70 i+ {"txt", "0", handlebin}, Err bitreich.org 70 i+ {"html", "0", handlebin}, Err bitreich.org 70 i+ {"htm", "0", handlebin}, Err bitreich.org 70 i+ {"xhtml", "0", handlebin}, Err bitreich.org 70 i+ {"css", "0", handlebin}, Err bitreich.org 70 i+ {nil, nil, nil}, Err bitreich.org 70 i+}; Err bitreich.org 70 i+ Err bitreich.org 70 i+filetype * Err bitreich.org 70 i+gettype(char *filename) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ char *end; Err bitreich.org 70 i+ int i; Err bitreich.org 70 i+ Err bitreich.org 70 i+ end = strrchr(filename, '.'); Err bitreich.org 70 i+ if(end == nil) Err bitreich.org 70 i+ return &type[0]; Err bitreich.org 70 i+ end++; Err bitreich.org 70 i+ Err bitreich.org 70 i+ for(i = 0; type[i].end != nil; i++) Err bitreich.org 70 i+ if(!strncasecmp(end, type[i].end, strlen(type[i].end))) Err bitreich.org 70 i+ return &type[i]; Err bitreich.org 70 i+ Err bitreich.org 70 i+ return &type[0]; Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+void * Err bitreich.org 70 i+gmallocz(int l, int d) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ char *ret; Err bitreich.org 70 i+ Err bitreich.org 70 i+ ret = malloc(l); Err bitreich.org 70 i+ if(ret == nil) { Err bitreich.org 70 i+ perror("malloc"); Err bitreich.org 70 i+ exit(1); Err bitreich.org 70 i+ } Err bitreich.org 70 i+ Err bitreich.org 70 i+ if(d) Err bitreich.org 70 i+ memset(ret, 0, l); Err bitreich.org 70 i+ Err bitreich.org 70 i+ return (void *)ret; Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+char * Err bitreich.org 70 i+gstrdup(char *str) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ char *ret; Err bitreich.org 70 i+ Err bitreich.org 70 i+ ret = strdup(str); Err bitreich.org 70 i+ if(ret == nil) { Err bitreich.org 70 i+ perror("strdup"); Err bitreich.org 70 i+ exit(1); Err bitreich.org 70 i+ } Err bitreich.org 70 i+ Err bitreich.org 70 i+ return ret; Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+char * Err bitreich.org 70 i+readln(int fd) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ char *ret; Err bitreich.org 70 i+ int len; Err bitreich.org 70 i+ Err bitreich.org 70 i+ len = 1; Err bitreich.org 70 i+ Err bitreich.org 70 i+ ret = malloc(2); Err bitreich.org 70 i+ while(read(fd, &ret[len - 1], 1) > 0 && ret[len - 1] != '\n') Err bitreich.org 70 i+ ret = realloc(ret, ++len + 1); Err bitreich.org 70 i+ if(ret[len - 1] != '\n') { Err bitreich.org 70 i+ free(ret); Err bitreich.org 70 i+ return nil; Err bitreich.org 70 i+ } Err bitreich.org 70 i+ ret[len - 1] = '\0'; Err bitreich.org 70 i+ Err bitreich.org 70 i+ return ret; Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+void Err bitreich.org 70 i+freeelem(Elems *e) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ Err bitreich.org 70 i+ if(e != nil) { Err bitreich.org 70 i+ if(e->e != nil) { Err bitreich.org 70 i+ for(;e->num > 0; e->num--) Err bitreich.org 70 i+ if(e->e[e->num - 1] != nil) Err bitreich.org 70 i+ free(e->e[e->num - 1]); Err bitreich.org 70 i+ free(e->e); Err bitreich.org 70 i+ } Err bitreich.org 70 i+ free(e); Err bitreich.org 70 i+ } Err bitreich.org 70 i+ return; Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+void Err bitreich.org 70 i+freeindex(Indexs *i) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ Err bitreich.org 70 i+ if(i != nil) { Err bitreich.org 70 i+ if(i->n != nil) { Err bitreich.org 70 i+ for(;i->num > 0; i->num--) Err bitreich.org 70 i+ if(i->n[i->num - 1] != nil) Err bitreich.org 70 i+ freeelem(i->n[i->num - 1]); Err bitreich.org 70 i+ free(i->n); Err bitreich.org 70 i+ } Err bitreich.org 70 i+ free(i); Err bitreich.org 70 i+ } Err bitreich.org 70 i+ Err bitreich.org 70 i+ return; Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+void Err bitreich.org 70 i+addelem(Elems *e, char *s) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ Err bitreich.org 70 i+ e->num++; Err bitreich.org 70 i+ e->e = realloc(e->e, sizeof(char *) * e->num); Err bitreich.org 70 i+ e->e[e->num - 1] = gmallocz(strlen(s) + 1, 0); Err bitreich.org 70 i+ strcpy(e->e[e->num - 1], s); Err bitreich.org 70 i+ Err bitreich.org 70 i+ return; Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+Elems * Err bitreich.org 70 i+getadv(char *str) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ char *b, *e; Err bitreich.org 70 i+ Elems *ret; Err bitreich.org 70 i+ Err bitreich.org 70 i+ ret = gmallocz(sizeof(Elems), 2); Err bitreich.org 70 i+ if(*str != '[') { Err bitreich.org 70 i+ b = str; Err bitreich.org 70 i+ if(*str == 't') Err bitreich.org 70 i+ b++; Err bitreich.org 70 i+ addelem(ret, "i"); Err bitreich.org 70 i+ addelem(ret, b); Err bitreich.org 70 i+ addelem(ret, "Err"); Err bitreich.org 70 i+ addelem(ret, "server"); Err bitreich.org 70 i+ addelem(ret, "port"); Err bitreich.org 70 i+ Err bitreich.org 70 i+ return ret; Err bitreich.org 70 i+ } Err bitreich.org 70 i+ Err bitreich.org 70 i+ b = str + 1; Err bitreich.org 70 i+ while((e = strchr(b, '|')) != nil) { Err bitreich.org 70 i+ *e = '\0'; Err bitreich.org 70 i+ e++; Err bitreich.org 70 i+ addelem(ret, b); Err bitreich.org 70 i+ b = e; Err bitreich.org 70 i+ } Err bitreich.org 70 i+ Err bitreich.org 70 i+ e = strchr(b, ']'); Err bitreich.org 70 i+ if(e != nil) { Err bitreich.org 70 i+ *e = '\0'; Err bitreich.org 70 i+ addelem(ret, b); Err bitreich.org 70 i+ } Err bitreich.org 70 i+ if(ret->e == nil) { Err bitreich.org 70 i+ free(ret); Err bitreich.org 70 i+ return nil; Err bitreich.org 70 i+ } Err bitreich.org 70 i+ Err bitreich.org 70 i+ return ret; Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+Indexs * Err bitreich.org 70 i+scanfile(char *fname) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ char *ln; Err bitreich.org 70 i+ int fd; Err bitreich.org 70 i+ Indexs *ret; Err bitreich.org 70 i+ Elems *el; Err bitreich.org 70 i+ Err bitreich.org 70 i+ fd = open(fname, O_RDONLY); Err bitreich.org 70 i+ if(fd < 0) Err bitreich.org 70 i+ return nil; Err bitreich.org 70 i+ Err bitreich.org 70 i+ ret = gmallocz(sizeof(Indexs), 2); Err bitreich.org 70 i+ Err bitreich.org 70 i+ while((ln = readln(fd)) != nil) { Err bitreich.org 70 i+ el = getadv(ln); Err bitreich.org 70 i+ free(ln); Err bitreich.org 70 i+ if(el == nil) Err bitreich.org 70 i+ continue; Err bitreich.org 70 i+ Err bitreich.org 70 i+ ret->num++; Err bitreich.org 70 i+ ret->n = realloc(ret->n, sizeof(Elems) * ret->num); Err bitreich.org 70 i+ ret->n[ret->num - 1] = el; Err bitreich.org 70 i+ el = nil; Err bitreich.org 70 i+ } Err bitreich.org 70 i+ close(fd); Err bitreich.org 70 i+ Err bitreich.org 70 i+ if(ret->n == nil) { Err bitreich.org 70 i+ free(ret); Err bitreich.org 70 i+ return nil; Err bitreich.org 70 i+ } Err bitreich.org 70 i+ Err bitreich.org 70 i+ return ret; Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+void Err bitreich.org 70 i+tprintf(int fd, char *fmt, ...) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ va_list fmtargs; Err bitreich.org 70 i+ int fd2; Err bitreich.org 70 i+ FILE *fp; Err bitreich.org 70 i+ Err bitreich.org 70 i+ fd2 = dup(fd); Err bitreich.org 70 i+ fp = fdopen(fd2, "w"); Err bitreich.org 70 i+ if(fp == nil) { Err bitreich.org 70 i+ perror("fdopen"); Err bitreich.org 70 i+ return; Err bitreich.org 70 i+ } Err bitreich.org 70 i+ Err bitreich.org 70 i+ va_start(fmtargs, fmt); Err bitreich.org 70 i+ vfprintf(fp, fmt, fmtargs); Err bitreich.org 70 i+ va_end(fmtargs); Err bitreich.org 70 i+ Err bitreich.org 70 i+ fclose(fp); Err bitreich.org 70 i+ Err bitreich.org 70 i+ return; Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+int Err bitreich.org 70 i+initlogging(char *logf) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ int fd; Err bitreich.org 70 i+ Err bitreich.org 70 i+ fd = open(logf, O_APPEND | O_WRONLY | O_CREAT, 0644); Err bitreich.org 70 i+ Err bitreich.org 70 i+ return fd; Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+void Err bitreich.org 70 i+stoplogging(int fd) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ Err bitreich.org 70 i+ close(fd); Err bitreich.org 70 i+ Err bitreich.org 70 i+ return; Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+char * Err bitreich.org 70 i+smprintf(char *fmt, ...) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ va_list fmtargs; Err bitreich.org 70 i+ char *ret; Err bitreich.org 70 i+ int size; Err bitreich.org 70 i+ Err bitreich.org 70 i+ ret = ""; Err bitreich.org 70 i+ Err bitreich.org 70 i+ va_start(fmtargs, fmt); Err bitreich.org 70 i+ size = vsnprintf(ret, 0, fmt, fmtargs); Err bitreich.org 70 i+ va_end(fmtargs); Err bitreich.org 70 i+ Err bitreich.org 70 i+ ret = gmallocz(++size, 2); Err bitreich.org 70 i+ va_start(fmtargs, fmt); Err bitreich.org 70 i+ vsnprintf(ret, size, fmt, fmtargs); Err bitreich.org 70 i+ va_end(fmtargs); Err bitreich.org 70 i+ Err bitreich.org 70 i+ return ret; Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 1diff --git a/ind.h b/ind.h /scm/geomyidae/file/ind.h.gph bitreich.org 70 i@@ -0,0 +1,48 @@ Err bitreich.org 70 i+/* Err bitreich.org 70 i+ * Copy me if you can. Err bitreich.org 70 i+ * by 20h Err bitreich.org 70 i+ */ Err bitreich.org 70 i+ Err bitreich.org 70 i+#ifndef IND_H Err bitreich.org 70 i+#define IND_H Err bitreich.org 70 i+ Err bitreich.org 70 i+#include Err bitreich.org 70 i+#define nil NULL Err bitreich.org 70 i+ Err bitreich.org 70 i+extern int glfd; Err bitreich.org 70 i+ Err bitreich.org 70 i+typedef struct Elems Elems; Err bitreich.org 70 i+struct Elems { Err bitreich.org 70 i+ char **e; Err bitreich.org 70 i+ int num; Err bitreich.org 70 i+}; Err bitreich.org 70 i+ Err bitreich.org 70 i+typedef struct Indexs Indexs; Err bitreich.org 70 i+struct Indexs { Err bitreich.org 70 i+ Elems **n; Err bitreich.org 70 i+ int num; Err bitreich.org 70 i+}; Err bitreich.org 70 i+ Err bitreich.org 70 i+typedef struct filetype filetype; Err bitreich.org 70 i+struct filetype { Err bitreich.org 70 i+ char *end; Err bitreich.org 70 i+ char *type; Err bitreich.org 70 i+ void (* f)(int, char *, char *, char *, char *, char *); Err bitreich.org 70 i+}; Err bitreich.org 70 i+ Err bitreich.org 70 i+filetype *gettype(char *filename); Err bitreich.org 70 i+void *gmallocz(int l, int d); Err bitreich.org 70 i+char *gstrdup(char *str); Err bitreich.org 70 i+Indexs *scanfile(char *fname); Err bitreich.org 70 i+Elems *getadv(char *str); Err bitreich.org 70 i+void addelem(Elems *e, char *s); Err bitreich.org 70 i+void freeindex(Indexs *i); Err bitreich.org 70 i+void freeelem(Elems *e); Err bitreich.org 70 i+char *readln(int fd); Err bitreich.org 70 i+void tprintf(int fd, char *fmt, ...); Err bitreich.org 70 i+int initlogging(char *logf); Err bitreich.org 70 i+void stoplogging(int fd); Err bitreich.org 70 i+char *smprintf(char *fmt, ...); Err bitreich.org 70 i+ Err bitreich.org 70 i+#endif Err bitreich.org 70 i+ Err bitreich.org 70 1diff --git a/index.gph b/index.gph /scm/geomyidae/file/index.gph.gph bitreich.org 70 i@@ -0,0 +1,6 @@ Err bitreich.org 70 i+comment Err bitreich.org 70 i+tcomment Err bitreich.org 70 i+[1|R-36|/|server|port] Err bitreich.org 70 i+[0|file - comment|/file.dat|server|port] Err bitreich.org 70 i+[h|http://www.heise.de|URL:http://www.heise.de|server|port] Err bitreich.org 70 i+ Err bitreich.org 70 1diff --git a/main.c b/main.c /scm/geomyidae/file/main.c.gph bitreich.org 70 i@@ -0,0 +1,385 @@ Err bitreich.org 70 i+/* Err bitreich.org 70 i+ * Copy me if you can. Err bitreich.org 70 i+ * by 20h Err bitreich.org 70 i+ */ Err bitreich.org 70 i+ Err bitreich.org 70 i+#include Err bitreich.org 70 i+#include Err bitreich.org 70 i+#include Err bitreich.org 70 i+#include Err bitreich.org 70 i+#include Err bitreich.org 70 i+#include Err bitreich.org 70 i+#include Err bitreich.org 70 i+#include Err bitreich.org 70 i+#include Err bitreich.org 70 i+#include Err bitreich.org 70 i+#include Err bitreich.org 70 i+#include Err bitreich.org 70 i+#include Err bitreich.org 70 i+#include Err bitreich.org 70 i+#include Err bitreich.org 70 i+#include Err bitreich.org 70 i+#include "ind.h" Err bitreich.org 70 i+#include "handlr.h" Err bitreich.org 70 i+#include "arg.h" Err bitreich.org 70 i+ Err bitreich.org 70 i+enum { Err bitreich.org 70 i+ NOLOG = 0, Err bitreich.org 70 i+ FILES = 1, Err bitreich.org 70 i+ DIRS = 2, Err bitreich.org 70 i+ HTTP = 4, Err bitreich.org 70 i+ ERRORS = 8, Err bitreich.org 70 i+}; Err bitreich.org 70 i+ Err bitreich.org 70 i+int glfd = -1; Err bitreich.org 70 i+int loglvl = 15; Err bitreich.org 70 i+ Err bitreich.org 70 i+char *argv0; Err bitreich.org 70 i+char *stdbase = "/var/gopher"; Err bitreich.org 70 i+char *stdport = "70"; Err bitreich.org 70 i+char *indexf = "/index.gph"; Err bitreich.org 70 i+char *err = "0Sorry, but the requested token could not be found\tErr" Err bitreich.org 70 i+ "\tlocalhost\t70\r\n.\r\n\r\n"; Err bitreich.org 70 i+char *htredir = "\n" Err bitreich.org 70 i+ "\n" Err bitreich.org 70 i+ "\n" Err bitreich.org 70 i+ " \n" Err bitreich.org 70 i+ " gopher redirect\n" Err bitreich.org 70 i+ "\n" Err bitreich.org 70 i+ " \n" Err bitreich.org 70 i+ " \n" Err bitreich.org 70 i+ " \n" Err bitreich.org 70 i+ " This page is for redirecting you to: %s.\n" Err bitreich.org 70 i+ " \n" Err bitreich.org 70 i+ "\n"; Err bitreich.org 70 i+ Err bitreich.org 70 i+int Err bitreich.org 70 i+dropprivileges(struct group *gr, struct passwd *pw) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ Err bitreich.org 70 i+ if(gr != nil) Err bitreich.org 70 i+ if(setgroups(1, &gr->gr_gid) != 0 || setgid(gr->gr_gid) != 0) Err bitreich.org 70 i+ return -1; Err bitreich.org 70 i+ if(pw != nil) { Err bitreich.org 70 i+ if(gr == nil) { Err bitreich.org 70 i+ if(setgroups(1, &pw->pw_gid) != 0 || Err bitreich.org 70 i+ setgid(pw->pw_gid) != 0) Err bitreich.org 70 i+ return -1; Err bitreich.org 70 i+ } Err bitreich.org 70 i+ if(setuid(pw->pw_uid) != 0) Err bitreich.org 70 i+ return -1; Err bitreich.org 70 i+ } Err bitreich.org 70 i+ Err bitreich.org 70 i+ return 0; Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+char * Err bitreich.org 70 i+securepath(char *p, int len) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ int i; Err bitreich.org 70 i+ Err bitreich.org 70 i+ if(len < 2) Err bitreich.org 70 i+ return p; Err bitreich.org 70 i+ Err bitreich.org 70 i+ for(i = 1; i < strlen(p); i++) { Err bitreich.org 70 i+ if(p[i - 1] == '.' && p[i] == '.') { Err bitreich.org 70 i+ if(p[i - 2] == '/') Err bitreich.org 70 i+ p[i] = '/'; Err bitreich.org 70 i+ if(p[i + 1] == '/') Err bitreich.org 70 i+ p[i] = '/'; Err bitreich.org 70 i+ if(len == 2) Err bitreich.org 70 i+ p[i] = '/'; Err bitreich.org 70 i+ } Err bitreich.org 70 i+ } Err bitreich.org 70 i+ Err bitreich.org 70 i+ return p; Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+void Err bitreich.org 70 i+logentry(char *host, char *port, char *qry, char *status) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ time_t tim; Err bitreich.org 70 i+ struct tm *ptr; Err bitreich.org 70 i+ char timstr[128]; Err bitreich.org 70 i+ Err bitreich.org 70 i+ if(glfd >= 0) { Err bitreich.org 70 i+ tim = time(0); Err bitreich.org 70 i+ ptr = localtime(&tim); Err bitreich.org 70 i+ Err bitreich.org 70 i+ strftime(timstr, sizeof(timstr), "%a %b %d %H:%M:%S %Z %Y", Err bitreich.org 70 i+ ptr); Err bitreich.org 70 i+ Err bitreich.org 70 i+ tprintf(glfd, "[%s|%s:%s] %s (%s)\n", Err bitreich.org 70 i+ timstr, host, port, qry, status); Err bitreich.org 70 i+ } Err bitreich.org 70 i+ Err bitreich.org 70 i+ return; Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+void Err bitreich.org 70 i+handlerequest(int sock, char *base, char *ohost, char *port, char *clienth, Err bitreich.org 70 i+ char *clientp) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ struct stat dir; Err bitreich.org 70 i+ char recvc[1024], recvb[1024], path[1024], *args, *sear, *c; Err bitreich.org 70 i+ int len, fd; Err bitreich.org 70 i+ filetype *type; Err bitreich.org 70 i+ Err bitreich.org 70 i+ memset(&dir, 0, sizeof(dir)); Err bitreich.org 70 i+ memset(recvb, 0, sizeof(recvb)); Err bitreich.org 70 i+ memset(recvc, 0, sizeof(recvc)); Err bitreich.org 70 i+ Err bitreich.org 70 i+ len = recv(sock, recvb, sizeof(recvb), 0); Err bitreich.org 70 i+ if(len > 1) { Err bitreich.org 70 i+ if(recvb[len - 2] == '\r') Err bitreich.org 70 i+ recvb[len - 2] = '\0'; Err bitreich.org 70 i+ if(recvb[len - 1] == '\n') Err bitreich.org 70 i+ recvb[len - 1] = '\0'; Err bitreich.org 70 i+ } Err bitreich.org 70 i+ strcpy(recvc, recvb); Err bitreich.org 70 i+ Err bitreich.org 70 i+ if(!strncmp(recvb, "URL:", 4)) { Err bitreich.org 70 i+ len = snprintf(path, sizeof(path), htredir, Err bitreich.org 70 i+ recvb + 4, recvb + 4, recvb + 4); Err bitreich.org 70 i+ if(len > sizeof(path)) Err bitreich.org 70 i+ len = sizeof(path); Err bitreich.org 70 i+ send(sock, path, len, 0); Err bitreich.org 70 i+ if(loglvl & HTTP) Err bitreich.org 70 i+ logentry(clienth, clientp, recvc, "HTTP redirect"); Err bitreich.org 70 i+ return; Err bitreich.org 70 i+ } Err bitreich.org 70 i+ Err bitreich.org 70 i+ sear = strchr(recvb, '\t'); Err bitreich.org 70 i+ if(sear != nil) Err bitreich.org 70 i+ *sear++ = '\0'; Err bitreich.org 70 i+ args = strchr(recvb, '?'); Err bitreich.org 70 i+ if(args != nil) Err bitreich.org 70 i+ *args++ = '\0'; Err bitreich.org 70 i+ else Err bitreich.org 70 i+ args = ohost; Err bitreich.org 70 i+ Err bitreich.org 70 i+ securepath(recvb, len - 2); Err bitreich.org 70 i+ snprintf(path, sizeof(path), "%s%s", base, recvb); Err bitreich.org 70 i+ if(stat(path, &dir) != -1 && S_ISDIR(dir.st_mode)) Err bitreich.org 70 i+ strncat(path, indexf, sizeof(path) - strlen(path)); Err bitreich.org 70 i+ Err bitreich.org 70 i+ fd = open(path, O_RDONLY); Err bitreich.org 70 i+ if(fd >= 0) { Err bitreich.org 70 i+ close(fd); Err bitreich.org 70 i+ if(loglvl & FILES) Err bitreich.org 70 i+ logentry(clienth, clientp, recvc, "serving"); Err bitreich.org 70 i+ Err bitreich.org 70 i+ c = strrchr(path, '/'); Err bitreich.org 70 i+ if(c == nil) Err bitreich.org 70 i+ c = path; Err bitreich.org 70 i+ type = gettype(c); Err bitreich.org 70 i+ type->f(sock, path, port, base, args, sear); Err bitreich.org 70 i+ } else { Err bitreich.org 70 i+ if(S_ISDIR(dir.st_mode)) { Err bitreich.org 70 i+ handledir(sock, path, port, base, args, sear); Err bitreich.org 70 i+ if(loglvl & DIRS) Err bitreich.org 70 i+ logentry(clienth, clientp, recvc, Err bitreich.org 70 i+ "dir listing"); Err bitreich.org 70 i+ return; Err bitreich.org 70 i+ } Err bitreich.org 70 i+ Err bitreich.org 70 i+ send(sock, err, strlen(err), 0); Err bitreich.org 70 i+ if(loglvl & ERRORS) Err bitreich.org 70 i+ logentry(clienth, clientp, recvc, "not found"); Err bitreich.org 70 i+ close(sock); Err bitreich.org 70 i+ } Err bitreich.org 70 i+ Err bitreich.org 70 i+ return; Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+void Err bitreich.org 70 i+hndlsigchld(int signo) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ int status; Err bitreich.org 70 i+ Err bitreich.org 70 i+ while(waitpid(-1, &status, WNOHANG) > 0); Err bitreich.org 70 i+ Err bitreich.org 70 i+ return; Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+void Err bitreich.org 70 i+usage(void) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ Err bitreich.org 70 i+ tprintf(2, "usage: %s [-d] [-l logfile] [-v loglvl] [-b base]" Err bitreich.org 70 i+ " [-p port] [-o sport] [-u user] [-g group] [-h host]" Err bitreich.org 70 i+ " [-i IP]\n", Err bitreich.org 70 i+ argv0); Err bitreich.org 70 i+ Err bitreich.org 70 i+ exit(1); Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+int Err bitreich.org 70 i+main(int argc, char *argv[]) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ struct addrinfo hints, *ai; Err bitreich.org 70 i+ struct sockaddr_storage clt; Err bitreich.org 70 i+ socklen_t cltlen; Err bitreich.org 70 i+ int sock, list, opt, dofork; Err bitreich.org 70 i+ char *port, *base, *logfile, clienth[NI_MAXHOST], clientp[NI_MAXSERV]; Err bitreich.org 70 i+ char *user, *group, *bindip, *ohost, *sport; Err bitreich.org 70 i+ struct passwd *us; Err bitreich.org 70 i+ struct group *gr; Err bitreich.org 70 i+ Err bitreich.org 70 i+ base = stdbase; Err bitreich.org 70 i+ port = stdport; Err bitreich.org 70 i+ dofork = 1; Err bitreich.org 70 i+ logfile = nil; Err bitreich.org 70 i+ user = nil; Err bitreich.org 70 i+ group = nil; Err bitreich.org 70 i+ us = nil; Err bitreich.org 70 i+ gr = nil; Err bitreich.org 70 i+ bindip = nil; Err bitreich.org 70 i+ ohost = nil; Err bitreich.org 70 i+ sport = port; Err bitreich.org 70 i+ Err bitreich.org 70 i+ ARGBEGIN { Err bitreich.org 70 i+ case 'b': Err bitreich.org 70 i+ base = EARGF(usage()); Err bitreich.org 70 i+ break; Err bitreich.org 70 i+ case 'p': Err bitreich.org 70 i+ port = EARGF(usage()); Err bitreich.org 70 i+ break; Err bitreich.org 70 i+ case 'l': Err bitreich.org 70 i+ logfile = EARGF(usage()); Err bitreich.org 70 i+ break; Err bitreich.org 70 i+ case 'd': Err bitreich.org 70 i+ dofork = 0; Err bitreich.org 70 i+ break; Err bitreich.org 70 i+ case 'v': Err bitreich.org 70 i+ loglvl = atoi(EARGF(usage())); Err bitreich.org 70 i+ break; Err bitreich.org 70 i+ case 'u': Err bitreich.org 70 i+ user = EARGF(usage()); Err bitreich.org 70 i+ break; Err bitreich.org 70 i+ case 'g': Err bitreich.org 70 i+ group = EARGF(usage()); Err bitreich.org 70 i+ break; Err bitreich.org 70 i+ case 'i': Err bitreich.org 70 i+ bindip = EARGF(usage()); Err bitreich.org 70 i+ break; Err bitreich.org 70 i+ case 'h': Err bitreich.org 70 i+ ohost = EARGF(usage()); Err bitreich.org 70 i+ break; Err bitreich.org 70 i+ case 'o': Err bitreich.org 70 i+ sport = EARGF(usage()); Err bitreich.org 70 i+ break; Err bitreich.org 70 i+ default: Err bitreich.org 70 i+ usage(); Err bitreich.org 70 i+ } ARGEND; Err bitreich.org 70 i+ Err bitreich.org 70 i+ if(group != nil) { Err bitreich.org 70 i+ if((gr = getgrnam(group)) == nil) { Err bitreich.org 70 i+ perror("no such group"); Err bitreich.org 70 i+ return 1; Err bitreich.org 70 i+ } Err bitreich.org 70 i+ } Err bitreich.org 70 i+ Err bitreich.org 70 i+ if(user != nil) { Err bitreich.org 70 i+ if((us = getpwnam(user)) == nil) { Err bitreich.org 70 i+ perror("no such user"); Err bitreich.org 70 i+ return 1; Err bitreich.org 70 i+ } Err bitreich.org 70 i+ } Err bitreich.org 70 i+ Err bitreich.org 70 i+ if(dofork && fork() != 0) Err bitreich.org 70 i+ return 0; Err bitreich.org 70 i+ Err bitreich.org 70 i+ if(logfile != nil) { Err bitreich.org 70 i+ glfd = initlogging(logfile); Err bitreich.org 70 i+ if(glfd < 0) { Err bitreich.org 70 i+ perror("initlogging"); Err bitreich.org 70 i+ return 1; Err bitreich.org 70 i+ } Err bitreich.org 70 i+ } Err bitreich.org 70 i+ Err bitreich.org 70 i+ memset(&hints, 0, sizeof(hints)); Err bitreich.org 70 i+ hints.ai_flags |= AI_PASSIVE; Err bitreich.org 70 i+ hints.ai_socktype = SOCK_STREAM; Err bitreich.org 70 i+ hints.ai_protocol = IPPROTO_TCP; Err bitreich.org 70 i+ hints.ai_family = AF_INET; Err bitreich.org 70 i+ if(getaddrinfo(bindip, port, &hints, &ai)) { Err bitreich.org 70 i+ perror("getaddrinfo"); Err bitreich.org 70 i+ return 1; Err bitreich.org 70 i+ } Err bitreich.org 70 i+ if(ai == nil) { Err bitreich.org 70 i+ perror("getaddrinfo"); Err bitreich.org 70 i+ return 1; Err bitreich.org 70 i+ } Err bitreich.org 70 i+ Err bitreich.org 70 i+ list = socket(ai->ai_family, ai->ai_socktype, ai->ai_protocol); Err bitreich.org 70 i+ if(list < 0) { Err bitreich.org 70 i+ perror("socket"); Err bitreich.org 70 i+ return 1; Err bitreich.org 70 i+ } Err bitreich.org 70 i+ Err bitreich.org 70 i+ opt = 1; Err bitreich.org 70 i+ if(setsockopt(list, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt))) { Err bitreich.org 70 i+ perror("setsockopt"); Err bitreich.org 70 i+ return 1; Err bitreich.org 70 i+ } Err bitreich.org 70 i+ Err bitreich.org 70 i+ if(bind(list, ai->ai_addr, ai->ai_addrlen)) { Err bitreich.org 70 i+ perror("bind"); Err bitreich.org 70 i+ return 1; Err bitreich.org 70 i+ } Err bitreich.org 70 i+ Err bitreich.org 70 i+ if(listen(list, 255)) { Err bitreich.org 70 i+ perror("listen"); Err bitreich.org 70 i+ return 1; Err bitreich.org 70 i+ } Err bitreich.org 70 i+ Err bitreich.org 70 i+ freeaddrinfo(ai); Err bitreich.org 70 i+ Err bitreich.org 70 i+ if(dropprivileges(gr, us) < 0) { Err bitreich.org 70 i+ perror("cannot drop privileges"); Err bitreich.org 70 i+ return 1; Err bitreich.org 70 i+ } Err bitreich.org 70 i+ Err bitreich.org 70 i+ if(dofork) { Err bitreich.org 70 i+ signal(SIGINT, SIG_IGN); Err bitreich.org 70 i+ signal(SIGQUIT, SIG_IGN); Err bitreich.org 70 i+ } Err bitreich.org 70 i+ signal(SIGCHLD, hndlsigchld); Err bitreich.org 70 i+ Err bitreich.org 70 i+ cltlen = sizeof(clt); Err bitreich.org 70 i+ for(;;) { Err bitreich.org 70 i+ sock = accept(list, (struct sockaddr *)&clt, &cltlen); Err bitreich.org 70 i+ if(sock < 0) { Err bitreich.org 70 i+ perror("accept"); Err bitreich.org 70 i+ close(list); Err bitreich.org 70 i+ return 1; Err bitreich.org 70 i+ } Err bitreich.org 70 i+ Err bitreich.org 70 i+ getnameinfo((struct sockaddr *)&clt, cltlen, clienth, Err bitreich.org 70 i+ sizeof(clienth), clientp, sizeof(clientp), Err bitreich.org 70 i+ NI_NUMERICHOST); Err bitreich.org 70 i+ Err bitreich.org 70 i+ switch(fork()) { Err bitreich.org 70 i+ case -1: Err bitreich.org 70 i+ perror("fork"); Err bitreich.org 70 i+ close(sock); Err bitreich.org 70 i+ break; Err bitreich.org 70 i+ case 0: Err bitreich.org 70 i+ handlerequest(sock, base, ohost, sport, clienth, Err bitreich.org 70 i+ clientp); Err bitreich.org 70 i+ return 1; Err bitreich.org 70 i+ default: Err bitreich.org 70 i+ wait(&opt); Err bitreich.org 70 i+ close(sock); Err bitreich.org 70 i+ break; Err bitreich.org 70 i+ } Err bitreich.org 70 i+ } Err bitreich.org 70 i+ Err bitreich.org 70 i+ close(list); Err bitreich.org 70 i+ if(logfile != nil) Err bitreich.org 70 i+ stoplogging(glfd); Err bitreich.org 70 i+ return 0; Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 1diff --git a/rc.d/Archlinux.conf.d b/rc.d/Archlinux.conf.d /scm/geomyidae/file/rc.d/Archlinux.conf.d.gph bitreich.org 70 i@@ -0,0 +1,4 @@ Err bitreich.org 70 i+# Err bitreich.org 70 i+# Parameters to be passed to geomyidae Err bitreich.org 70 i+# Err bitreich.org 70 i+GEOMYIDAE_ARGS="-u nobody -g nobody -b /srv/gopher -o 70 -l /var/log/geomyidae.log -h localhost" Err bitreich.org 70 1diff --git a/rc.d/Archlinux.rc.d b/rc.d/Archlinux.rc.d /scm/geomyidae/file/rc.d/Archlinux.rc.d.gph bitreich.org 70 i@@ -0,0 +1,38 @@ Err bitreich.org 70 i+#!/bin/bash Err bitreich.org 70 i+ Err bitreich.org 70 i+. /etc/rc.conf Err bitreich.org 70 i+. /etc/rc.d/functions Err bitreich.org 70 i+. /etc/conf.d/geomyidae Err bitreich.org 70 i+ Err bitreich.org 70 i+PID=`pidof -o %PPID /usr/bin/geomyidae` Err bitreich.org 70 i+case "$1" in Err bitreich.org 70 i+ start) Err bitreich.org 70 i+ stat_busy "Starting geomyidae" Err bitreich.org 70 i+ [ -z "$PID" ] && /usr/bin/geomyidae $GEOMYIDAE_ARGS 2>&1 Err bitreich.org 70 i+ if [ $? -gt 0 ]; then Err bitreich.org 70 i+ stat_fail Err bitreich.org 70 i+ else Err bitreich.org 70 i+ PID=`pidof -o %PPID /usr/bin/geomyidae` Err bitreich.org 70 i+ echo $PID >/var/run/geomyidae.pid Err bitreich.org 70 i+ add_daemon geomyidae Err bitreich.org 70 i+ stat_done Err bitreich.org 70 i+ fi Err bitreich.org 70 i+ ;; Err bitreich.org 70 i+ stop) Err bitreich.org 70 i+ stat_busy "Stopping geomyidae" Err bitreich.org 70 i+ [ ! -z "$PID" ] && kill $PID &>/dev/null Err bitreich.org 70 i+ if [ $? -gt 0 ]; then Err bitreich.org 70 i+ stat_fail Err bitreich.org 70 i+ else Err bitreich.org 70 i+ rm_daemon geomyidae Err bitreich.org 70 i+ stat_done Err bitreich.org 70 i+ fi Err bitreich.org 70 i+ ;; Err bitreich.org 70 i+ restart) Err bitreich.org 70 i+ $0 stop Err bitreich.org 70 i+ $0 start Err bitreich.org 70 i+ ;; Err bitreich.org 70 i+ *) Err bitreich.org 70 i+ echo "usage: $0 {start|stop|restart}" Err bitreich.org 70 i+esac Err bitreich.org 70 i+exit 0 Err bitreich.org 70 1diff --git a/rc.d/Gentoo.conf.d b/rc.d/Gentoo.conf.d /scm/geomyidae/file/rc.d/Gentoo.conf.d.gph bitreich.org 70 i@@ -0,0 +1,5 @@ Err bitreich.org 70 i+# Err bitreich.org 70 i+# Parameters to be passed to geomyidae Err bitreich.org 70 i+# Err bitreich.org 70 i+GEOMYIDAE_ARGS="-u gopherd -g gopherd -b /var/gopher -o 70 -l /var/log/geomyidae.log -h localhost" Err bitreich.org 70 i+ Err bitreich.org 70 1diff --git a/rc.d/Gentoo.init.d b/rc.d/Gentoo.init.d /scm/geomyidae/file/rc.d/Gentoo.init.d.gph bitreich.org 70 i@@ -0,0 +1,17 @@ Err bitreich.org 70 i+#!/sbin/runscript Err bitreich.org 70 i+# Copyright 1999-2010 Gentoo Foundation Err bitreich.org 70 i+# Distributed under the terms of the GNU General Public License v2 Err bitreich.org 70 i+# $Header: $ Err bitreich.org 70 i+ Err bitreich.org 70 i+start(){ Err bitreich.org 70 i+ ebegin "Starting geomyidae" Err bitreich.org 70 i+ [ -n "$GEOMYIDAE_ARGS" ] && GEOMYIDAE_ARGS="-- $GEOMYIDAE_ARGS" Err bitreich.org 70 i+ start-stop-daemon --start --pidfile /var/run/geomyidae.pid --exec /usr/sbin/geomyidae $GEOMYIDAE_ARGS Err bitreich.org 70 i+ eend $? "Failed to start geomyidae" Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+stop(){ Err bitreich.org 70 i+ ebegin "Stopping geomyidae" Err bitreich.org 70 i+ start-stop-daemon --stop --pidfile /var/run/geomyidae.pid Err bitreich.org 70 i+ eend $? "Failed to stop geomyidae" Err bitreich.org 70 i+} Err bitreich.org 70 1diff --git a/rc.d/NetBSD.rc.d b/rc.d/NetBSD.rc.d /scm/geomyidae/file/rc.d/NetBSD.rc.d.gph bitreich.org 70 i@@ -0,0 +1,55 @@ Err bitreich.org 70 i+#!/bin/sh Err bitreich.org 70 i+# Err bitreich.org 70 i+ Err bitreich.org 70 i+# REQUIRE: local Err bitreich.org 70 i+# PROVIDE: geomyidae Err bitreich.org 70 i+ Err bitreich.org 70 i+$_rc_subr_loaded . /etc/rc.subr Err bitreich.org 70 i+ Err bitreich.org 70 i+name="geomyidae" Err bitreich.org 70 i+rcvar=$name Err bitreich.org 70 i+command="/usr/pkg/sbin/${name}" Err bitreich.org 70 i+ Err bitreich.org 70 i+##################################################### Err bitreich.org 70 i+# Geomyidae Options Section - "?" => geomyidae(8) # Err bitreich.org 70 i+# Uncomment & define options (defaults are shown) # Err bitreich.org 70 i+##################################################### Err bitreich.org 70 i+# Err bitreich.org 70 i+#LOGFILE="-l /var/log/gopherd.log" Err bitreich.org 70 i+#LOGLEVEL="-v 15" Err bitreich.org 70 i+#HTDOCS="-b /var/gopher" Err bitreich.org 70 i+#PORT="-p 70" Err bitreich.org 70 i+#SPORT="-o 70" Err bitreich.org 70 i+#USR="-u $USER" Err bitreich.org 70 i+#GRP="-g $GROUP" Err bitreich.org 70 i+#HOST="-h localhost" Err bitreich.org 70 i+#IP="-i 127.0.0.1" Err bitreich.org 70 i+ Err bitreich.org 70 i+###################################################### Err bitreich.org 70 i+# Now remove any UNDEFINED options from line below: # Err bitreich.org 70 i+###################################################### Err bitreich.org 70 i+# Err bitreich.org 70 i+command_args="$LOGFILE $LOGLEVEL $HTDOCS $PORT $SPORT $USR $GRP $HOST $IP" Err bitreich.org 70 i+ Err bitreich.org 70 i+ Err bitreich.org 70 i+###################################################### Err bitreich.org 70 i+# Uncomment this section if a PID file is desired # Err bitreich.org 70 i+###################################################### Err bitreich.org 70 i+ Err bitreich.org 70 i+#pidfile="/var/run/${name}.pid" Err bitreich.org 70 i+#start_cmd="geomyidae_start" Err bitreich.org 70 i+# Err bitreich.org 70 i+#geomyidae_start() Err bitreich.org 70 i+#{ Err bitreich.org 70 i+# echo "Starting $name" Err bitreich.org 70 i+# $command $command_args Err bitreich.org 70 i+# pgrep -x $name > $pidfile Err bitreich.org 70 i+#} Err bitreich.org 70 i+ Err bitreich.org 70 i+###################################################### Err bitreich.org 70 i+# Lastly, add the following to /etc/rc.conf: # Err bitreich.org 70 i+# "geomyidae=YES" (without the quotes) # Err bitreich.org 70 i+###################################################### Err bitreich.org 70 i+ Err bitreich.org 70 i+load_rc_config $name Err bitreich.org 70 i+run_rc_command "$1" Err bitreich.org 70 1diff --git a/rc.d/README b/rc.d/README /scm/geomyidae/file/rc.d/README.gph bitreich.org 70 i@@ -0,0 +1,5 @@ Err bitreich.org 70 i+These are init scripts, used in various distribution, for Geomyidae. Err bitreich.org 70 i+ Err bitreich.org 70 i+All files are examples sent in by users. Please review them before Err bitreich.org 70 i+using. Err bitreich.org 70 i+ Err bitreich.org 70 .