Commit Diff


commit - 83000e2dd417e81dabfcad740af63d1ee86e1389
commit + 488f059ac4c75b8b2e0e610e6445640bce8152e8
blob - b20047eb3d1aa1e8208b93cc6b7fbf758e99da14
blob + 7376a34bee2b269d3ebd441edeffba98c21a5391
--- gmid.c
+++ gmid.c
@@ -18,169 +18,22 @@
 #include <sys/socket.h>
 #include <sys/stat.h>
 
-#include <arpa/inet.h>
-#include <netinet/in.h>
-
 #include <assert.h>
 #include <err.h>
 #include <errno.h>
 #include <fcntl.h>
 #include <limits.h>
-#include <poll.h>
 #include <signal.h>
-#include <stdio.h>
-#include <stdlib.h>
 #include <string.h>
-#include <syslog.h>
-#include <tls.h>
-#include <unistd.h>
 
-#ifndef __OpenBSD__
-# define pledge(a, b) 0
-# define unveil(a, b) 0
-#endif
-
-#ifndef INFTIM
-# define INFTIM -1
-#endif
-
-#define GEMINI_URL_LEN (1024+3)	/* URL max len + \r\n + \0 */
-
-/* large enough to hold a copy of a gemini URL and still have extra room */
-#define PATHBUF		2048
-
-#define SUCCESS		20
-#define TEMP_FAILURE	40
-#define NOT_FOUND	51
-#define BAD_REQUEST	59
-
-#ifndef MAX_USERS
-#define MAX_USERS	64
-#endif
-
-#define SAFE_SETENV(var, val) do {		\
-		const char *_tmp = (val);	\
-		if (_tmp == NULL)		\
-			_tmp = "";		\
-		setenv((var), _tmp, 1);		\
-	} while(0)
-
-#define LOG(priority, c, fmt, ...)					\
-	do {								\
-		char buf[INET_ADDRSTRLEN];				\
-		if (inet_ntop((c)->af, &(c)->addr,			\
-		    buf, sizeof(buf)) == NULL)				\
-			FATAL("inet_ntop: %s", strerror(errno));	\
-		if (foreground)						\
-			fprintf(stderr,					\
-			    "%s " fmt "\n", buf, __VA_ARGS__);		\
-		else							\
-			syslog((priority) | LOG_DAEMON,			\
-			    "%s " fmt, buf, __VA_ARGS__);		\
-	} while (0)
-
-#define LOGE(c, fmt, ...) LOG(LOG_ERR,    c, fmt, __VA_ARGS__)
-#define LOGN(c, fmt, ...) LOG(LOG_NOTICE, c, fmt, __VA_ARGS__)
-#define LOGI(c, fmt, ...) LOG(LOG_INFO,   c, fmt, __VA_ARGS__)
-#define LOGD(c, fmt, ...) LOG(LOG_DEBUG,  c, fmt, __VA_ARGS__)
-
-#define FATAL(fmt, ...)							\
-	do {								\
-		if (foreground)						\
-			fprintf(stderr, fmt "\n", __VA_ARGS__);		\
-		else							\
-			syslog(LOG_DAEMON | LOG_CRIT,			\
-			    fmt, __VA_ARGS__);				\
-		exit(1);						\
-	} while (0)
-
-enum {
-	S_OPEN,
-	S_INITIALIZING,
-	S_SENDING,
-	S_CLOSING,
-};
-
-struct client {
-	struct tls	*ctx;
-	int		 state;
-	int		 code;
-	const char	*meta;
-	int		 fd, waiting_on_child;
-	pid_t		 child;
-	char		 sbuf[1024];	  /* static buffer */
-	void		*buf, *i;	  /* mmap buffer */
-	ssize_t		 len, off;	  /* mmap/static buffer  */
-	int		 af;
-	struct in_addr	 addr;
-};
-
-enum {
-	FILE_EXISTS,
-	FILE_EXECUTABLE,
-	FILE_DIRECTORY,
-	FILE_MISSING,
-};
-
-struct etm {			/* file extension to mime */
-	const char	*mime;
-	const char	*ext;
-} filetypes[] = {
-	{"application/pdf",	"pdf"},
-
-	{"image/gif",		"gif"},
-	{"image/jpeg",		"jpg"},
-	{"image/jpeg",		"jpeg"},
-	{"image/png",		"png"},
-	{"image/svg+xml",	"svg"},
-
-	{"text/gemini",		"gemini"},
-	{"text/gemini",		"gmi"},
-	{"text/markdown",	"markdown"},
-	{"text/markdown",	"md"},
-	{"text/plain",		"txt"},
-	{"text/xml",		"xml"},
+#include "gmid.h"
 
-	{NULL, NULL}
-};
-
 const char *dir, *cgi;
 int dirfd;
 int port;
 int foreground;
 int connected_clients;
-
-void		 siginfo_handler(int);
-int		 starts_with(const char*, const char*);
-
-char		*url_after_proto(char*);
-char		*url_start_of_request(char*);
-int		 url_trim(struct client*, char*);
-char		*adjust_path(char*);
-ssize_t		 filesize(int);
-
-int		 start_reply(struct pollfd*, struct client*, int, const char*);
-const char	*path_ext(const char*);
-const char	*mime(const char*);
-int		 check_path(struct client*, const char*, int*);
-int		 check_for_cgi(char *, char*, struct pollfd*, struct client*);
-int		 open_file(char*, char*, struct pollfd*, struct client*);
-int		 start_cgi(const char*, const char*, const char*, struct pollfd*, struct client*);
-void		 cgi_setpoll_on_child(struct pollfd*, struct client*);
-void		 cgi_setpoll_on_client(struct pollfd*, struct client*);
-void		 handle_cgi(struct pollfd*, struct client*);
-void		 send_file(char*, char*, struct pollfd*, struct client*);
-void		 send_dir(char*, struct pollfd*, struct client*);
-void		 handle(struct pollfd*, struct client*);
 
-void		 mark_nonblock(int);
-int		 make_soket(int);
-void		 do_accept(int, struct tls*, struct pollfd*, struct client*);
-void		 goodbye(struct pollfd*, struct client*);
-void		 loop(struct tls*, int);
-
-void		 usage(const char*);
-
 void
 siginfo_handler(int sig)
 {
blob - /dev/null
blob + e4d53db2c6ee75204e128de25d1991af332bcd53 (mode 644)
--- /dev/null
+++ gmid.h
@@ -0,0 +1,154 @@
+#ifndef GMID_H
+#define GMID_H
+
+#include <arpa/inet.h>
+#include <netinet/in.h>
+
+#include <poll.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <syslog.h>
+#include <tls.h>
+#include <unistd.h>
+
+#ifndef __OpenBSD__
+# define pledge(a, b) 0
+# define unveil(a, b) 0
+#endif
+
+#ifndef INFTIM
+# define INFTIM -1
+#endif
+
+#define GEMINI_URL_LEN (1024+3)	/* URL max len + \r\n + \0 */
+
+/* large enough to hold a copy of a gemini URL and still have extra room */
+#define PATHBUF		2048
+
+#define SUCCESS		20
+#define TEMP_FAILURE	40
+#define NOT_FOUND	51
+#define BAD_REQUEST	59
+
+#ifndef MAX_USERS
+#define MAX_USERS	64
+#endif
+
+#define SAFE_SETENV(var, val) do {		\
+		const char *_tmp = (val);	\
+		if (_tmp == NULL)		\
+			_tmp = "";		\
+		setenv((var), _tmp, 1);		\
+	} while(0)
+
+#define LOG(priority, c, fmt, ...)					\
+	do {								\
+		char buf[INET_ADDRSTRLEN];				\
+		if (inet_ntop((c)->af, &(c)->addr,			\
+		    buf, sizeof(buf)) == NULL)				\
+			FATAL("inet_ntop: %s", strerror(errno));	\
+		if (foreground)						\
+			fprintf(stderr,					\
+			    "%s " fmt "\n", buf, __VA_ARGS__);		\
+		else							\
+			syslog((priority) | LOG_DAEMON,			\
+			    "%s " fmt, buf, __VA_ARGS__);		\
+	} while (0)
+
+#define LOGE(c, fmt, ...) LOG(LOG_ERR,    c, fmt, __VA_ARGS__)
+#define LOGN(c, fmt, ...) LOG(LOG_NOTICE, c, fmt, __VA_ARGS__)
+#define LOGI(c, fmt, ...) LOG(LOG_INFO,   c, fmt, __VA_ARGS__)
+#define LOGD(c, fmt, ...) LOG(LOG_DEBUG,  c, fmt, __VA_ARGS__)
+
+#define FATAL(fmt, ...)							\
+	do {								\
+		if (foreground)						\
+			fprintf(stderr, fmt "\n", __VA_ARGS__);		\
+		else							\
+			syslog(LOG_DAEMON | LOG_CRIT,			\
+			    fmt, __VA_ARGS__);				\
+		exit(1);						\
+	} while (0)
+
+enum {
+	S_OPEN,
+	S_INITIALIZING,
+	S_SENDING,
+	S_CLOSING,
+};
+
+struct client {
+	struct tls	*ctx;
+	int		 state;
+	int		 code;
+	const char	*meta;
+	int		 fd, waiting_on_child;
+	pid_t		 child;
+	char		 sbuf[1024];	  /* static buffer */
+	void		*buf, *i;	  /* mmap buffer */
+	ssize_t		 len, off;	  /* mmap/static buffer  */
+	int		 af;
+	struct in_addr	 addr;
+};
+
+enum {
+	FILE_EXISTS,
+	FILE_EXECUTABLE,
+	FILE_DIRECTORY,
+	FILE_MISSING,
+};
+
+struct etm {			/* file extension to mime */
+	const char	*mime;
+	const char	*ext;
+} filetypes[] = {
+	{"application/pdf",	"pdf"},
+
+	{"image/gif",		"gif"},
+	{"image/jpeg",		"jpg"},
+	{"image/jpeg",		"jpeg"},
+	{"image/png",		"png"},
+	{"image/svg+xml",	"svg"},
+
+	{"text/gemini",		"gemini"},
+	{"text/gemini",		"gmi"},
+	{"text/markdown",	"markdown"},
+	{"text/markdown",	"md"},
+	{"text/plain",		"txt"},
+	{"text/xml",		"xml"},
+
+	{NULL, NULL}
+};
+
+void		 siginfo_handler(int);
+int		 starts_with(const char*, const char*);
+
+char		*url_after_proto(char*);
+char		*url_start_of_request(char*);
+int		 url_trim(struct client*, char*);
+char		*adjust_path(char*);
+ssize_t		 filesize(int);
+
+int		 start_reply(struct pollfd*, struct client*, int, const char*);
+const char	*path_ext(const char*);
+const char	*mime(const char*);
+int		 check_path(struct client*, const char*, int*);
+int		 check_for_cgi(char *, char*, struct pollfd*, struct client*);
+int		 open_file(char*, char*, struct pollfd*, struct client*);
+int		 start_cgi(const char*, const char*, const char*, struct pollfd*, struct client*);
+void		 cgi_setpoll_on_child(struct pollfd*, struct client*);
+void		 cgi_setpoll_on_client(struct pollfd*, struct client*);
+void		 handle_cgi(struct pollfd*, struct client*);
+void		 send_file(char*, char*, struct pollfd*, struct client*);
+void		 send_dir(char*, struct pollfd*, struct client*);
+void		 handle(struct pollfd*, struct client*);
+
+void		 mark_nonblock(int);
+int		 make_soket(int);
+void		 do_accept(int, struct tls*, struct pollfd*, struct client*);
+void		 goodbye(struct pollfd*, struct client*);
+void		 loop(struct tls*, int);
+
+void		 usage(const char*);
+
+#endif