X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=libs%2Fshttpd%2Flog.c;fp=libs%2Fshttpd%2Flog.c;h=4b436106781f1a4868df414df02ccc1770ed3b01;hb=d8ccfe2b3944adf07d35534459cdda19d15217c8;hp=0000000000000000000000000000000000000000;hpb=21f835f30b4e092c847bf4569a00995774f7330e;p=fms.git diff --git a/libs/shttpd/log.c b/libs/shttpd/log.c new file mode 100644 index 0000000..4b43610 --- /dev/null +++ b/libs/shttpd/log.c @@ -0,0 +1,111 @@ +/* + * Copyright (c) 2004-2005 Sergey Lyubka + * All rights reserved + * + * "THE BEER-WARE LICENSE" (Revision 42): + * Sergey Lyubka wrote this file. As long as you retain this notice you + * can do whatever you want with this stuff. If we meet some day, and you think + * this stuff is worth it, you can buy me a beer in return. + */ + +#include "defs.h" + +/* + * Log function + */ +void +elog(int flags, struct conn *c, const char *fmt, ...) +{ + char date[64], buf[URI_MAX]; + int len; + FILE *fp = c == NULL ? NULL : c->ctx->error_log; + va_list ap; + + /* Print to stderr */ + if (c == NULL || c->ctx->inetd_mode == 0) { + va_start(ap, fmt); + (void) vfprintf(stderr, fmt, ap); + (void) fputc('\n', stderr); + va_end(ap); + } + + strftime(date, sizeof(date), "%a %b %d %H:%M:%S %Y", + localtime(¤t_time)); + + len = my_snprintf(buf, sizeof(buf), + "[%s] [error] [client %s] \"%s\" ", + date, c ? inet_ntoa(c->sa.u.sin.sin_addr) : "-", + c && c->request ? c->request : "-"); + + va_start(ap, fmt); + (void) vsnprintf(buf + len, sizeof(buf) - len, fmt, ap); + va_end(ap); + + buf[sizeof(buf) - 1] = '\0'; + + if (fp != NULL && (flags & (E_FATAL | E_LOG))) { + (void) fprintf(fp, "%s\n", buf); + (void) fflush(fp); + } + +#if defined(_WIN32) && !defined(NO_GUI) + { + extern HWND hLog; + + if (hLog != NULL) + SendMessage(hLog, WM_APP, 0, (LPARAM) buf); + } +#endif /* _WIN32 */ + + if (flags & E_FATAL) + exit(EXIT_FAILURE); +} + +void +log_access(FILE *fp, const struct conn *c) +{ + static const struct vec dash = {"-", 1}; + + const struct vec *user = &c->ch.user.v_vec; + const struct vec *referer = &c->ch.referer.v_vec; + const struct vec *user_agent = &c->ch.useragent.v_vec; + char date[64], buf[URI_MAX], *q1 = "\"", *q2 = "\""; + + if (user->len == 0) + user = ‐ + + if (referer->len == 0) { + referer = ‐ + q1 = ""; + } + + if (user_agent->len == 0) { + user_agent = ‐ + q2 = ""; + } + + (void) strftime(date, sizeof(date), "%d/%b/%Y:%H:%M:%S", + localtime(¤t_time)); + + (void) my_snprintf(buf, sizeof(buf), + "%s - %.*s [%s %+05d] \"%s\" %d %lu %s%.*s%s %s%.*s%s", + inet_ntoa(c->sa.u.sin.sin_addr), user->len, user->ptr, + date, tz_offset, c->request ? c->request : "-", + c->status, (unsigned long) c->loc.io.total, + q1, referer->len, referer->ptr, q1, + q2, user_agent->len, user_agent->ptr, q2); + + if (fp != NULL) { + (void) fprintf(fp, "%s\n", buf); + (void) fflush(fp); + } + +#if defined(_WIN32) && !defined(NO_GUI) + { + extern HWND hLog; + + if (hLog != NULL) + SendMessage(hLog, WM_APP, 0, (LPARAM) buf); + } +#endif /* _WIN32 */ +}