commit 488f059ac4c75b8b2e0e610e6445640bce8152e8 from: Omar Polo date: Thu Dec 24 15:48:39 2020 UTC moving declarations to header file commit - 83000e2dd417e81dabfcad740af63d1ee86e1389 commit + 488f059ac4c75b8b2e0e610e6445640bce8152e8 blob - b20047eb3d1aa1e8208b93cc6b7fbf758e99da14 blob + 7376a34bee2b269d3ebd441edeffba98c21a5391 --- gmid.c +++ gmid.c @@ -18,169 +18,22 @@ #include #include -#include -#include - #include #include #include #include #include -#include #include -#include -#include #include -#include -#include -#include -#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 +#include + +#include +#include +#include +#include +#include +#include + +#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