diff --git a/tpws/tpws.c b/tpws/tpws.c index 19dc72a..aed463b 100644 --- a/tpws/tpws.c +++ b/tpws/tpws.c @@ -20,6 +20,7 @@ #include #include #include +#include #include "tpws.h" #include "tpws_conn.h" @@ -69,6 +70,7 @@ struct params_s enum splithttpreq split_http_req; int split_pos; int maxconn; + char hostfile[256]; cptr *hostlist; }; @@ -86,6 +88,29 @@ unsigned char *find_bin(void *data, ssize_t len, const void *blk, ssize_t blk_le return NULL; } +bool bHup = false; +void onhup(int sig) +{ + printf("HUP received !\n"); + if (params.hostlist) + printf("Will reload hostlist on next request\n"); + bHup = true; +} +// should be called in normal execution +void dohup() +{ + if (bHup) + { + if (params.hostlist) + { + CharTreeDestroy(params.hostlist); + if (!LoadHostList(¶ms.hostlist, params.hostfile)) + exit(1); + } + bHup = false; + } +} + ssize_t send_with_flush(int sockfd, const void *buf, size_t len, int flags) { int flag, err; @@ -118,6 +143,8 @@ bool handle_epollin(tproxy_conn_t *conn, int *data_transferred) { bool bOutgoing; ssize_t rd = 0, wr = 0, bs; + dohup(); + //Easy way to determin which socket is ready for reading //TODO: Optimize. This one allows me quick lookup for conn, but //I need to make a system call to determin which socket @@ -168,31 +195,26 @@ bool handle_epollin(tproxy_conn_t *conn, int *data_transferred) { { printf("Data block looks like http request start : %s\n", *method); - if (params.hostlist) + if (params.hostlist && (p = find_bin(buf, bs, "\nHost: ", 7))) { - pHost = find_bin(buf, bs, "\nHost: ", 7); - if (pHost) + bool bInHostList = false; + p += 7; + while (p < (buf + bs) && (*p == ' ' || *p == '\t')) p++; + pp = p; + while (pp < (buf + bs) && (pp - p) < (sizeof(Host) - 1) && *pp != '\r' && *pp != '\n') pp++; + memcpy(Host, p, pp - p); + Host[pp - p] = '\0'; + p = Host; + printf("Requested Host is : %s\n", Host); + while (p) { - bool bInHostList = false; - p = pHost + 7; - while (p < (buf + bs) && (*p == ' ' || *p == '\t')) p++; - pp = p; - while (pp < (buf + bs) && (pp - p) < (sizeof(Host) - 1) && *pp != '\r' && *pp != '\n') pp++; - memcpy(Host, p, pp - p); - Host[pp - p] = '\0'; - p = Host; - printf("Requested Host is : %s\n", Host); - while (p) - { - bInHostList = CharTreeCheckStrLower(params.hostlist, p); - printf("Hostlist check for %s : %s\n", p, bInHostList ? "positive" : "negative"); - if (bInHostList) break; - p = strchr(p, '.'); - if (p) p++; - } - bBypass = !bInHostList; + bInHostList = CharTreeCheckStrLower(params.hostlist, p); + printf("Hostlist check for %s : %s\n", p, bInHostList ? "positive" : "negative"); + if (bInHostList) break; + p = strchr(p, '.'); + if (p) p++; } - + bBypass = !bInHostList; } if (!bBypass) { @@ -212,7 +234,6 @@ bool handle_epollin(tproxy_conn_t *conn, int *data_transferred) { } pp = p; } - pHost = NULL; } if (params.methodspace) @@ -224,7 +245,6 @@ bool handle_epollin(tproxy_conn_t *conn, int *data_transferred) { memmove(p + 1, p, bs - pos); *p = ' '; // insert extra space bs++; // block will grow by 1 byte - pHost = NULL; } // search for Host only if required (save some CPU) @@ -655,6 +675,8 @@ void parse_params(int argc, char *argv[]) case 17: /* hostlist */ if (!LoadHostList(¶ms.hostlist, optarg)) exit(1); + strncpy(params.hostfile,optarg,sizeof(params.hostfile)); + params.hostfile[sizeof(params.hostfile)-1]='\0'; break; } } @@ -818,6 +840,8 @@ int main(int argc, char *argv[]) { fprintf(stderr, "Will listen to port %d\n", params.port); + signal(SIGHUP, onhup); + retval = event_loop(listen_fd); close(listen_fd);