diff --git a/gmid.c b/gmid.c index 346333c..287ac7d 100644 --- a/gmid.c +++ b/gmid.c @@ -28,6 +28,35 @@ #include "gmid.h" +#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) + const char *dir, *cgi; int dirfd; int port; @@ -56,6 +85,14 @@ struct etm { /* file extension to mime */ {NULL, NULL} }; +static inline void +safe_setenv(const char *name, const char *val) +{ + if (val == NULL) + val = ""; + setenv(name, val, 1); +} + void sig_handler(int sig) { @@ -301,24 +338,24 @@ start_cgi(const char *spath, const char *relpath, const char *query, argv[0] = argv[1] = ex; /* fix the env */ - SAFE_SETENV("GATEWAY_INTERFACE", "CGI/1.1"); - SAFE_SETENV("SERVER_SOFTWARE", "gmid"); - SAFE_SETENV("SERVER_PORT", portno); + safe_setenv("GATEWAY_INTERFACE", "CGI/1.1"); + safe_setenv("SERVER_SOFTWARE", "gmid"); + safe_setenv("SERVER_PORT", portno); /* setenv("SERVER_NAME", "", 1); */ - SAFE_SETENV("SCRIPT_NAME", spath); - SAFE_SETENV("SCRIPT_EXECUTABLE", ex); - SAFE_SETENV("REQUEST_URI", requri); - SAFE_SETENV("REQUEST_RELATIVE", relpath); - SAFE_SETENV("QUERY_STRING", query); - SAFE_SETENV("REMOTE_HOST", addr); - SAFE_SETENV("REMOTE_ADDR", addr); - SAFE_SETENV("DOCUMENT_ROOT", dir); + safe_setenv("SCRIPT_NAME", spath); + safe_setenv("SCRIPT_EXECUTABLE", ex); + safe_setenv("REQUEST_URI", requri); + safe_setenv("REQUEST_RELATIVE", relpath); + safe_setenv("QUERY_STRING", query); + safe_setenv("REMOTE_HOST", addr); + safe_setenv("REMOTE_ADDR", addr); + safe_setenv("DOCUMENT_ROOT", dir); if (tls_peer_cert_provided(c->ctx)) { - SAFE_SETENV("AUTH_TYPE", "Certificate"); - SAFE_SETENV("REMOTE_USER", tls_peer_cert_subject(c->ctx)); - SAFE_SETENV("TLS_CLIENT_ISSUER", tls_peer_cert_issuer(c->ctx)); - SAFE_SETENV("TLS_CLIENT_HASH", tls_peer_cert_hash(c->ctx)); + safe_setenv("AUTH_TYPE", "Certificate"); + safe_setenv("REMOTE_USER", tls_peer_cert_subject(c->ctx)); + safe_setenv("TLS_CLIENT_ISSUER", tls_peer_cert_issuer(c->ctx)); + safe_setenv("TLS_CLIENT_HASH", tls_peer_cert_hash(c->ctx)); } execvp(ex, argv); diff --git a/gmid.h b/gmid.h index 3ee5fe4..16d96a7 100644 --- a/gmid.h +++ b/gmid.h @@ -46,45 +46,7 @@ #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,