Stdout unbuffered
This commit is contained in:
		
							
								
								
									
										14
									
								
								src/cache.c
									
									
									
									
									
								
							
							
						
						
									
										14
									
								
								src/cache.c
									
									
									
									
									
								
							@@ -13,12 +13,10 @@ int magic_init() {
 | 
				
			|||||||
    magic = magic_open(MAGIC_MIME);
 | 
					    magic = magic_open(MAGIC_MIME);
 | 
				
			||||||
    if (magic == NULL) {
 | 
					    if (magic == NULL) {
 | 
				
			||||||
        fprintf(stderr, ERR_STR "Unable to open magic cookie: %s" CLR_STR "\n", strerror(errno));
 | 
					        fprintf(stderr, ERR_STR "Unable to open magic cookie: %s" CLR_STR "\n", strerror(errno));
 | 
				
			||||||
        fflush(stderr);
 | 
					 | 
				
			||||||
        return -1;
 | 
					        return -1;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    if (magic_load(magic, MAGIC_FILE) != 0) {
 | 
					    if (magic_load(magic, MAGIC_FILE) != 0) {
 | 
				
			||||||
        fprintf(stderr, ERR_STR "Unable to load magic cookie: %s" CLR_STR "\n", magic_error(magic));
 | 
					        fprintf(stderr, ERR_STR "Unable to load magic cookie: %s" CLR_STR "\n", magic_error(magic));
 | 
				
			||||||
        fflush(stderr);
 | 
					 | 
				
			||||||
        return -2;
 | 
					        return -2;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    return 0;
 | 
					    return 0;
 | 
				
			||||||
@@ -35,7 +33,6 @@ int cache_process() {
 | 
				
			|||||||
    int shm_id = shmget(SHM_KEY, FILE_CACHE_SIZE * sizeof(cache_entry), 0);
 | 
					    int shm_id = shmget(SHM_KEY, FILE_CACHE_SIZE * sizeof(cache_entry), 0);
 | 
				
			||||||
    if (shm_id < 0) {
 | 
					    if (shm_id < 0) {
 | 
				
			||||||
        fprintf(stderr, ERR_STR "Unable to create shared memory: %s" CLR_STR "\n", strerror(errno));
 | 
					        fprintf(stderr, ERR_STR "Unable to create shared memory: %s" CLR_STR "\n", strerror(errno));
 | 
				
			||||||
        fflush(stderr);
 | 
					 | 
				
			||||||
        return -1;
 | 
					        return -1;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -43,7 +40,6 @@ int cache_process() {
 | 
				
			|||||||
    void *shm_rw = shmat(shm_id, NULL, 0);
 | 
					    void *shm_rw = shmat(shm_id, NULL, 0);
 | 
				
			||||||
    if (shm_rw == (void *) -1) {
 | 
					    if (shm_rw == (void *) -1) {
 | 
				
			||||||
        fprintf(stderr, ERR_STR "Unable to attach shared memory (rw): %s" CLR_STR "\n", strerror(errno));
 | 
					        fprintf(stderr, ERR_STR "Unable to attach shared memory (rw): %s" CLR_STR "\n", strerror(errno));
 | 
				
			||||||
        fflush(stderr);
 | 
					 | 
				
			||||||
        return -2;
 | 
					        return -2;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    cache = shm_rw;
 | 
					    cache = shm_rw;
 | 
				
			||||||
@@ -51,7 +47,6 @@ int cache_process() {
 | 
				
			|||||||
    if (mkdir("/var/necronda-server/", 0755) < 0) {
 | 
					    if (mkdir("/var/necronda-server/", 0755) < 0) {
 | 
				
			||||||
        if (errno != EEXIST) {
 | 
					        if (errno != EEXIST) {
 | 
				
			||||||
            fprintf(stderr, ERR_STR "Unable to create directory '/var/necronda-server/': %s" CLR_STR "\n", strerror(errno));
 | 
					            fprintf(stderr, ERR_STR "Unable to create directory '/var/necronda-server/': %s" CLR_STR "\n", strerror(errno));
 | 
				
			||||||
            fflush(stderr);
 | 
					 | 
				
			||||||
            return -3;
 | 
					            return -3;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
@@ -106,14 +101,12 @@ int cache_process() {
 | 
				
			|||||||
                    if (comp_file == NULL) {
 | 
					                    if (comp_file == NULL) {
 | 
				
			||||||
                        compress = 0;
 | 
					                        compress = 0;
 | 
				
			||||||
                        fprintf(stderr, ERR_STR "Unable to open cache file: %s" CLR_STR "\n", strerror(errno));
 | 
					                        fprintf(stderr, ERR_STR "Unable to open cache file: %s" CLR_STR "\n", strerror(errno));
 | 
				
			||||||
                        fflush(stderr);
 | 
					 | 
				
			||||||
                    } else {
 | 
					                    } else {
 | 
				
			||||||
                        strm.zalloc = Z_NULL;
 | 
					                        strm.zalloc = Z_NULL;
 | 
				
			||||||
                        strm.zfree = Z_NULL;
 | 
					                        strm.zfree = Z_NULL;
 | 
				
			||||||
                        strm.opaque = Z_NULL;
 | 
					                        strm.opaque = Z_NULL;
 | 
				
			||||||
                        if (deflateInit(&strm, level) != Z_OK) {
 | 
					                        if (deflateInit(&strm, level) != Z_OK) {
 | 
				
			||||||
                            fprintf(stderr, ERR_STR "Unable to init deflate: %s" CLR_STR "\n", strerror(errno));
 | 
					                            fprintf(stderr, ERR_STR "Unable to init deflate: %s" CLR_STR "\n", strerror(errno));
 | 
				
			||||||
                            fflush(stderr);
 | 
					 | 
				
			||||||
                            compress = 0;
 | 
					                            compress = 0;
 | 
				
			||||||
                            fclose(comp_file);
 | 
					                            fclose(comp_file);
 | 
				
			||||||
                        }
 | 
					                        }
 | 
				
			||||||
@@ -168,14 +161,12 @@ int cache_init() {
 | 
				
			|||||||
    int shm_id = shmget(SHM_KEY, FILE_CACHE_SIZE * sizeof(cache_entry), IPC_CREAT | IPC_EXCL | 0600);
 | 
					    int shm_id = shmget(SHM_KEY, FILE_CACHE_SIZE * sizeof(cache_entry), IPC_CREAT | IPC_EXCL | 0600);
 | 
				
			||||||
    if (shm_id < 0) {
 | 
					    if (shm_id < 0) {
 | 
				
			||||||
        fprintf(stderr, ERR_STR "Unable to create shared memory: %s" CLR_STR "\n", strerror(errno));
 | 
					        fprintf(stderr, ERR_STR "Unable to create shared memory: %s" CLR_STR "\n", strerror(errno));
 | 
				
			||||||
        fflush(stderr);
 | 
					 | 
				
			||||||
        return -2;
 | 
					        return -2;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    void *shm = shmat(shm_id, NULL, SHM_RDONLY);
 | 
					    void *shm = shmat(shm_id, NULL, SHM_RDONLY);
 | 
				
			||||||
    if (shm == (void *) -1) {
 | 
					    if (shm == (void *) -1) {
 | 
				
			||||||
        fprintf(stderr, ERR_STR "Unable to attach shared memory (ro): %s" CLR_STR "\n", strerror(errno));
 | 
					        fprintf(stderr, ERR_STR "Unable to attach shared memory (ro): %s" CLR_STR "\n", strerror(errno));
 | 
				
			||||||
        fflush(stderr);
 | 
					 | 
				
			||||||
        return -3;
 | 
					        return -3;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    cache = shm;
 | 
					    cache = shm;
 | 
				
			||||||
@@ -183,7 +174,6 @@ int cache_init() {
 | 
				
			|||||||
    void *shm_rw = shmat(shm_id, NULL, 0);
 | 
					    void *shm_rw = shmat(shm_id, NULL, 0);
 | 
				
			||||||
    if (shm_rw == (void *) -1) {
 | 
					    if (shm_rw == (void *) -1) {
 | 
				
			||||||
        fprintf(stderr, ERR_STR "Unable to attach shared memory (rw): %s" CLR_STR "\n", strerror(errno));
 | 
					        fprintf(stderr, ERR_STR "Unable to attach shared memory (rw): %s" CLR_STR "\n", strerror(errno));
 | 
				
			||||||
        fflush(stderr);
 | 
					 | 
				
			||||||
        return -4;
 | 
					        return -4;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    cache = shm_rw;
 | 
					    cache = shm_rw;
 | 
				
			||||||
@@ -202,11 +192,9 @@ int cache_init() {
 | 
				
			|||||||
    } else if (pid > 0) {
 | 
					    } else if (pid > 0) {
 | 
				
			||||||
        // parent
 | 
					        // parent
 | 
				
			||||||
        fprintf(stderr, "Started child process with PID %i as cache-updater\n", pid);
 | 
					        fprintf(stderr, "Started child process with PID %i as cache-updater\n", pid);
 | 
				
			||||||
        fflush(stderr);
 | 
					 | 
				
			||||||
        children[0] = pid;
 | 
					        children[0] = pid;
 | 
				
			||||||
    } else {
 | 
					    } else {
 | 
				
			||||||
        fprintf(stderr, ERR_STR "Unable to create child process: %s" CLR_STR "\n", strerror(errno));
 | 
					        fprintf(stderr, ERR_STR "Unable to create child process: %s" CLR_STR "\n", strerror(errno));
 | 
				
			||||||
        fflush(stderr);
 | 
					 | 
				
			||||||
        return -5;
 | 
					        return -5;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -217,10 +205,8 @@ int cache_unload() {
 | 
				
			|||||||
    int shm_id = shmget(SHM_KEY, 0, 0);
 | 
					    int shm_id = shmget(SHM_KEY, 0, 0);
 | 
				
			||||||
    if (shm_id < 0) {
 | 
					    if (shm_id < 0) {
 | 
				
			||||||
        fprintf(stderr, ERR_STR "Unable to create shared memory: %s" CLR_STR "\n", strerror(errno));
 | 
					        fprintf(stderr, ERR_STR "Unable to create shared memory: %s" CLR_STR "\n", strerror(errno));
 | 
				
			||||||
        fflush(stderr);
 | 
					 | 
				
			||||||
    } else if (shmctl(shm_id, IPC_RMID, NULL) < 0) {
 | 
					    } else if (shmctl(shm_id, IPC_RMID, NULL) < 0) {
 | 
				
			||||||
        fprintf(stderr, ERR_STR "Unable to configure shared memory: %s" CLR_STR "\n", strerror(errno));
 | 
					        fprintf(stderr, ERR_STR "Unable to configure shared memory: %s" CLR_STR "\n", strerror(errno));
 | 
				
			||||||
        fflush(stderr);
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    shmdt(cache);
 | 
					    shmdt(cache);
 | 
				
			||||||
    return 0;
 | 
					    return 0;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -62,7 +62,6 @@ char *ssl_get_error(SSL *ssl, int ret) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
void destroy() {
 | 
					void destroy() {
 | 
				
			||||||
    fprintf(stderr, "\n" ERR_STR "Terminating forcefully!" CLR_STR "\n");
 | 
					    fprintf(stderr, "\n" ERR_STR "Terminating forcefully!" CLR_STR "\n");
 | 
				
			||||||
    fflush(stderr);
 | 
					 | 
				
			||||||
    int status = 0;
 | 
					    int status = 0;
 | 
				
			||||||
    int ret;
 | 
					    int ret;
 | 
				
			||||||
    int kills = 0;
 | 
					    int kills = 0;
 | 
				
			||||||
@@ -72,13 +71,11 @@ void destroy() {
 | 
				
			|||||||
            if (ret < 0) {
 | 
					            if (ret < 0) {
 | 
				
			||||||
                fprintf(stderr, ERR_STR "Unable to wait for child process (PID %i): %s" CLR_STR "\n",
 | 
					                fprintf(stderr, ERR_STR "Unable to wait for child process (PID %i): %s" CLR_STR "\n",
 | 
				
			||||||
                        children[i], strerror(errno));
 | 
					                        children[i], strerror(errno));
 | 
				
			||||||
                fflush(stderr);
 | 
					 | 
				
			||||||
            } else if (ret == children[i]) {
 | 
					            } else if (ret == children[i]) {
 | 
				
			||||||
                children[i] = 0;
 | 
					                children[i] = 0;
 | 
				
			||||||
                if (status != 0) {
 | 
					                if (status != 0) {
 | 
				
			||||||
                    fprintf(stderr, ERR_STR "Child process with PID %i terminated with exit code %i" CLR_STR "\n",
 | 
					                    fprintf(stderr, ERR_STR "Child process with PID %i terminated with exit code %i" CLR_STR "\n",
 | 
				
			||||||
                            ret, status);
 | 
					                            ret, status);
 | 
				
			||||||
                    fflush(stderr);
 | 
					 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            } else {
 | 
					            } else {
 | 
				
			||||||
                kill(children[i], SIGKILL);
 | 
					                kill(children[i], SIGKILL);
 | 
				
			||||||
@@ -88,7 +85,6 @@ void destroy() {
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
    if (kills > 0) {
 | 
					    if (kills > 0) {
 | 
				
			||||||
        fprintf(stderr, ERR_STR "Killed %i child process(es)" CLR_STR "\n", kills);
 | 
					        fprintf(stderr, ERR_STR "Killed %i child process(es)" CLR_STR "\n", kills);
 | 
				
			||||||
        fflush(stderr);
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    cache_unload();
 | 
					    cache_unload();
 | 
				
			||||||
    exit(2);
 | 
					    exit(2);
 | 
				
			||||||
@@ -96,7 +92,6 @@ void destroy() {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
void terminate() {
 | 
					void terminate() {
 | 
				
			||||||
    fprintf(stderr, "\nTerminating gracefully...\n");
 | 
					    fprintf(stderr, "\nTerminating gracefully...\n");
 | 
				
			||||||
    fflush(stderr);
 | 
					 | 
				
			||||||
    active = 0;
 | 
					    active = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    signal(SIGINT, destroy);
 | 
					    signal(SIGINT, destroy);
 | 
				
			||||||
@@ -116,13 +111,11 @@ void terminate() {
 | 
				
			|||||||
            if (ret < 0) {
 | 
					            if (ret < 0) {
 | 
				
			||||||
                fprintf(stderr, ERR_STR "Unable to wait for child process (PID %i): %s" CLR_STR "\n",
 | 
					                fprintf(stderr, ERR_STR "Unable to wait for child process (PID %i): %s" CLR_STR "\n",
 | 
				
			||||||
                        children[i], strerror(errno));
 | 
					                        children[i], strerror(errno));
 | 
				
			||||||
                fflush(stderr);
 | 
					 | 
				
			||||||
            } else if (ret == children[i]) {
 | 
					            } else if (ret == children[i]) {
 | 
				
			||||||
                children[i] = 0;
 | 
					                children[i] = 0;
 | 
				
			||||||
                if (status != 0) {
 | 
					                if (status != 0) {
 | 
				
			||||||
                    fprintf(stderr, ERR_STR "Child process with PID %i terminated with exit code %i" CLR_STR "\n",
 | 
					                    fprintf(stderr, ERR_STR "Child process with PID %i terminated with exit code %i" CLR_STR "\n",
 | 
				
			||||||
                            ret, status);
 | 
					                            ret, status);
 | 
				
			||||||
                    fflush(stderr);
 | 
					 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            } else {
 | 
					            } else {
 | 
				
			||||||
                kill(children[i], SIGTERM);
 | 
					                kill(children[i], SIGTERM);
 | 
				
			||||||
@@ -133,7 +126,6 @@ void terminate() {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    if (wait_num > 0) {
 | 
					    if (wait_num > 0) {
 | 
				
			||||||
        fprintf(stderr, "Waiting for %i child process(es)...\n", wait_num);
 | 
					        fprintf(stderr, "Waiting for %i child process(es)...\n", wait_num);
 | 
				
			||||||
        fflush(stderr);
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    for (int i = 0; i < MAX_CHILDREN; i++) {
 | 
					    for (int i = 0; i < MAX_CHILDREN; i++) {
 | 
				
			||||||
@@ -142,13 +134,11 @@ void terminate() {
 | 
				
			|||||||
            if (ret < 0) {
 | 
					            if (ret < 0) {
 | 
				
			||||||
                fprintf(stderr, ERR_STR "Unable to wait for child process (PID %i): %s" CLR_STR "\n",
 | 
					                fprintf(stderr, ERR_STR "Unable to wait for child process (PID %i): %s" CLR_STR "\n",
 | 
				
			||||||
                        children[i], strerror(errno));
 | 
					                        children[i], strerror(errno));
 | 
				
			||||||
                fflush(stderr);
 | 
					 | 
				
			||||||
            } else if (ret == children[i]) {
 | 
					            } else if (ret == children[i]) {
 | 
				
			||||||
                children[i] = 0;
 | 
					                children[i] = 0;
 | 
				
			||||||
                if (status != 0) {
 | 
					                if (status != 0) {
 | 
				
			||||||
                    fprintf(stderr, ERR_STR "Child process with PID %i terminated with exit code %i" CLR_STR "\n",
 | 
					                    fprintf(stderr, ERR_STR "Child process with PID %i terminated with exit code %i" CLR_STR "\n",
 | 
				
			||||||
                            ret, status);
 | 
					                            ret, status);
 | 
				
			||||||
                    fflush(stderr);
 | 
					 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
@@ -161,10 +151,8 @@ void terminate() {
 | 
				
			|||||||
        struct timespec ts = {.tv_sec = 0, .tv_nsec = 50000000};
 | 
					        struct timespec ts = {.tv_sec = 0, .tv_nsec = 50000000};
 | 
				
			||||||
        nanosleep(&ts, &ts);
 | 
					        nanosleep(&ts, &ts);
 | 
				
			||||||
        fprintf(stderr, "\nGoodbye\n");
 | 
					        fprintf(stderr, "\nGoodbye\n");
 | 
				
			||||||
        fflush(stderr);
 | 
					 | 
				
			||||||
    } else {
 | 
					    } else {
 | 
				
			||||||
        fprintf(stderr, "Goodbye\n");
 | 
					        fprintf(stderr, "Goodbye\n");
 | 
				
			||||||
        fflush(stderr);
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    cache_unload();
 | 
					    cache_unload();
 | 
				
			||||||
    exit(0);
 | 
					    exit(0);
 | 
				
			||||||
@@ -191,8 +179,11 @@ int main(int argc, const char *argv[]) {
 | 
				
			|||||||
            {.sin6_family = AF_INET6, .sin6_addr = IN6ADDR_ANY_INIT, .sin6_port = htons(443)}
 | 
					            {.sin6_family = AF_INET6, .sin6_addr = IN6ADDR_ANY_INIT, .sin6_port = htons(443)}
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (setvbuf(stdout, NULL, _IONBF, 0) != 0) {
 | 
				
			||||||
 | 
					        fprintf(stderr, ERR_STR "Unable to set stdout to unbuffered mode: %s" CLR_STR, strerror(errno));
 | 
				
			||||||
 | 
					        return 1;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
    printf("Necronda Web Server\n");
 | 
					    printf("Necronda Web Server\n");
 | 
				
			||||||
    fflush(stdout);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    for (int i = 1; i < argc; i++) {
 | 
					    for (int i = 1; i < argc; i++) {
 | 
				
			||||||
        const char *arg = argv[i];
 | 
					        const char *arg = argv[i];
 | 
				
			||||||
@@ -210,51 +201,43 @@ int main(int argc, const char *argv[]) {
 | 
				
			|||||||
        } else if ((len == 2 && strncmp(arg, "-w", 2) == 0) || (len == 9 && strncmp(arg, "--webroot", 9) == 0)) {
 | 
					        } else if ((len == 2 && strncmp(arg, "-w", 2) == 0) || (len == 9 && strncmp(arg, "--webroot", 9) == 0)) {
 | 
				
			||||||
            if (i == argc - 1) {
 | 
					            if (i == argc - 1) {
 | 
				
			||||||
                fprintf(stderr, ERR_STR "Unable to parse argument %s, usage: --webroot <WEBROOT>" CLR_STR "\n", arg);
 | 
					                fprintf(stderr, ERR_STR "Unable to parse argument %s, usage: --webroot <WEBROOT>" CLR_STR "\n", arg);
 | 
				
			||||||
                fflush(stderr);
 | 
					 | 
				
			||||||
                return 1;
 | 
					                return 1;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            webroot_base = argv[++i];
 | 
					            webroot_base = argv[++i];
 | 
				
			||||||
        } else if ((len == 2 && strncmp(arg, "-c", 2) == 0) || (len == 6 && strncmp(arg, "--cert", 6) == 0)) {
 | 
					        } else if ((len == 2 && strncmp(arg, "-c", 2) == 0) || (len == 6 && strncmp(arg, "--cert", 6) == 0)) {
 | 
				
			||||||
            if (i == argc - 1) {
 | 
					            if (i == argc - 1) {
 | 
				
			||||||
                fprintf(stderr, ERR_STR "Unable to parse argument %s, usage: --cert <CERT-FILE>" CLR_STR "\n", arg);
 | 
					                fprintf(stderr, ERR_STR "Unable to parse argument %s, usage: --cert <CERT-FILE>" CLR_STR "\n", arg);
 | 
				
			||||||
                fflush(stderr);
 | 
					 | 
				
			||||||
                return 1;
 | 
					                return 1;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            cert_file = argv[++i];
 | 
					            cert_file = argv[++i];
 | 
				
			||||||
        } else if ((len == 2 && strncmp(arg, "-p", 2) == 0) || (len == 9 && strncmp(arg, "--privkey", 9) == 0)) {
 | 
					        } else if ((len == 2 && strncmp(arg, "-p", 2) == 0) || (len == 9 && strncmp(arg, "--privkey", 9) == 0)) {
 | 
				
			||||||
            if (i == argc - 1) {
 | 
					            if (i == argc - 1) {
 | 
				
			||||||
                fprintf(stderr, ERR_STR "Unable to parse argument %s, usage: --privkey <KEY-FILE>" CLR_STR "\n", arg);
 | 
					                fprintf(stderr, ERR_STR "Unable to parse argument %s, usage: --privkey <KEY-FILE>" CLR_STR "\n", arg);
 | 
				
			||||||
                fflush(stderr);
 | 
					 | 
				
			||||||
                return 1;
 | 
					                return 1;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            key_file = argv[++i];
 | 
					            key_file = argv[++i];
 | 
				
			||||||
        } else if ((len == 2 && strncmp(arg, "-g", 2) == 0) || (len == 7 && strncmp(arg, "--geoip", 7) == 0)) {
 | 
					        } else if ((len == 2 && strncmp(arg, "-g", 2) == 0) || (len == 7 && strncmp(arg, "--geoip", 7) == 0)) {
 | 
				
			||||||
            if (i == argc - 1) {
 | 
					            if (i == argc - 1) {
 | 
				
			||||||
                fprintf(stderr, ERR_STR "Unable to parse argument %s, usage: --geoip <DB-FILE>" CLR_STR "\n", arg);
 | 
					                fprintf(stderr, ERR_STR "Unable to parse argument %s, usage: --geoip <DB-FILE>" CLR_STR "\n", arg);
 | 
				
			||||||
                fflush(stderr);
 | 
					 | 
				
			||||||
                return 1;
 | 
					                return 1;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            geoip_file = argv[++i];
 | 
					            geoip_file = argv[++i];
 | 
				
			||||||
        } else {
 | 
					        } else {
 | 
				
			||||||
            fprintf(stderr, ERR_STR "Unable to parse argument '%s'" CLR_STR "\n", arg);
 | 
					            fprintf(stderr, ERR_STR "Unable to parse argument '%s'" CLR_STR "\n", arg);
 | 
				
			||||||
            fflush(stderr);
 | 
					 | 
				
			||||||
            return 1;
 | 
					            return 1;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (webroot_base == NULL) {
 | 
					    if (webroot_base == NULL) {
 | 
				
			||||||
        fprintf(stderr, ERR_STR "Error: --webroot is missing" CLR_STR "\n");
 | 
					        fprintf(stderr, ERR_STR "Error: --webroot is missing" CLR_STR "\n");
 | 
				
			||||||
        fflush(stderr);
 | 
					 | 
				
			||||||
        return 1;
 | 
					        return 1;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    if (cert_file == NULL) {
 | 
					    if (cert_file == NULL) {
 | 
				
			||||||
        fprintf(stderr, ERR_STR "Error: --cert is missing" CLR_STR "\n");
 | 
					        fprintf(stderr, ERR_STR "Error: --cert is missing" CLR_STR "\n");
 | 
				
			||||||
        fflush(stderr);
 | 
					 | 
				
			||||||
        return 1;
 | 
					        return 1;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    if (key_file == NULL) {
 | 
					    if (key_file == NULL) {
 | 
				
			||||||
        fprintf(stderr, ERR_STR "Error: --privkey is missing" CLR_STR "\n");
 | 
					        fprintf(stderr, ERR_STR "Error: --privkey is missing" CLR_STR "\n");
 | 
				
			||||||
        fflush(stderr);
 | 
					 | 
				
			||||||
        return 1;
 | 
					        return 1;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -264,14 +247,12 @@ int main(int argc, const char *argv[]) {
 | 
				
			|||||||
    if (sockets[1] < 0) {
 | 
					    if (sockets[1] < 0) {
 | 
				
			||||||
        socket_err:
 | 
					        socket_err:
 | 
				
			||||||
        fprintf(stderr, ERR_STR "Unable to create socket: %s" CLR_STR "\n", strerror(errno));
 | 
					        fprintf(stderr, ERR_STR "Unable to create socket: %s" CLR_STR "\n", strerror(errno));
 | 
				
			||||||
        fflush(stderr);
 | 
					 | 
				
			||||||
        return 1;
 | 
					        return 1;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    for (int i = 0; i < NUM_SOCKETS; i++) {
 | 
					    for (int i = 0; i < NUM_SOCKETS; i++) {
 | 
				
			||||||
        if (setsockopt(sockets[i], SOL_SOCKET, SO_REUSEADDR, &YES, sizeof(YES)) < 0) {
 | 
					        if (setsockopt(sockets[i], SOL_SOCKET, SO_REUSEADDR, &YES, sizeof(YES)) < 0) {
 | 
				
			||||||
            fprintf(stderr, ERR_STR "Unable to set options for socket %i: %s" CLR_STR "\n", i, strerror(errno));
 | 
					            fprintf(stderr, ERR_STR "Unable to set options for socket %i: %s" CLR_STR "\n", i, strerror(errno));
 | 
				
			||||||
            fflush(stderr);
 | 
					 | 
				
			||||||
            return 1;
 | 
					            return 1;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
@@ -280,7 +261,6 @@ int main(int argc, const char *argv[]) {
 | 
				
			|||||||
    if (bind(sockets[1], (struct sockaddr *) &addresses[1], sizeof(addresses[1])) < 0) {
 | 
					    if (bind(sockets[1], (struct sockaddr *) &addresses[1], sizeof(addresses[1])) < 0) {
 | 
				
			||||||
        bind_err:
 | 
					        bind_err:
 | 
				
			||||||
        fprintf(stderr, ERR_STR "Unable to bind socket to address: %s" CLR_STR "\n", strerror(errno));
 | 
					        fprintf(stderr, ERR_STR "Unable to bind socket to address: %s" CLR_STR "\n", strerror(errno));
 | 
				
			||||||
        fflush(stderr);
 | 
					 | 
				
			||||||
        return 1;
 | 
					        return 1;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -309,20 +289,17 @@ int main(int argc, const char *argv[]) {
 | 
				
			|||||||
    if (SSL_CTX_use_certificate_chain_file(client.ctx, cert_file) != 1) {
 | 
					    if (SSL_CTX_use_certificate_chain_file(client.ctx, cert_file) != 1) {
 | 
				
			||||||
        fprintf(stderr, ERR_STR "Unable to load certificate chain file: %s: %s" CLR_STR "\n",
 | 
					        fprintf(stderr, ERR_STR "Unable to load certificate chain file: %s: %s" CLR_STR "\n",
 | 
				
			||||||
                ERR_reason_error_string(ERR_get_error()), cert_file);
 | 
					                ERR_reason_error_string(ERR_get_error()), cert_file);
 | 
				
			||||||
        fflush(stderr);
 | 
					 | 
				
			||||||
        return 1;
 | 
					        return 1;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    if (SSL_CTX_use_PrivateKey_file(client.ctx, key_file, SSL_FILETYPE_PEM) != 1) {
 | 
					    if (SSL_CTX_use_PrivateKey_file(client.ctx, key_file, SSL_FILETYPE_PEM) != 1) {
 | 
				
			||||||
        fprintf(stderr, ERR_STR "Unable to load private key file: %s: %s" CLR_STR "\n",
 | 
					        fprintf(stderr, ERR_STR "Unable to load private key file: %s: %s" CLR_STR "\n",
 | 
				
			||||||
                ERR_reason_error_string(ERR_get_error()), key_file);
 | 
					                ERR_reason_error_string(ERR_get_error()), key_file);
 | 
				
			||||||
        fflush(stderr);
 | 
					 | 
				
			||||||
        return 1;
 | 
					        return 1;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    for (int i = 0; i < NUM_SOCKETS; i++) {
 | 
					    for (int i = 0; i < NUM_SOCKETS; i++) {
 | 
				
			||||||
        if (listen(sockets[i], LISTEN_BACKLOG) < 0) {
 | 
					        if (listen(sockets[i], LISTEN_BACKLOG) < 0) {
 | 
				
			||||||
            fprintf(stderr, ERR_STR "Unable to listen on socket %i: %s" CLR_STR "\n", i, strerror(errno));
 | 
					            fprintf(stderr, ERR_STR "Unable to listen on socket %i: %s" CLR_STR "\n", i, strerror(errno));
 | 
				
			||||||
            fflush(stderr);
 | 
					 | 
				
			||||||
            return 1;
 | 
					            return 1;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
@@ -336,7 +313,6 @@ int main(int argc, const char *argv[]) {
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    fprintf(stderr, "Ready to accept connections\n");
 | 
					    fprintf(stderr, "Ready to accept connections\n");
 | 
				
			||||||
    fflush(stderr);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    while (active) {
 | 
					    while (active) {
 | 
				
			||||||
        timeout.tv_sec = 1;
 | 
					        timeout.tv_sec = 1;
 | 
				
			||||||
@@ -345,7 +321,6 @@ int main(int argc, const char *argv[]) {
 | 
				
			|||||||
        ready_sockets_num = select(max_socket_fd + 1, &read_socket_fds, NULL, NULL, &timeout);
 | 
					        ready_sockets_num = select(max_socket_fd + 1, &read_socket_fds, NULL, NULL, &timeout);
 | 
				
			||||||
        if (ready_sockets_num < 0) {
 | 
					        if (ready_sockets_num < 0) {
 | 
				
			||||||
            fprintf(stderr, ERR_STR "Unable to select sockets: %s" CLR_STR "\n", strerror(errno));
 | 
					            fprintf(stderr, ERR_STR "Unable to select sockets: %s" CLR_STR "\n", strerror(errno));
 | 
				
			||||||
            fflush(stderr);
 | 
					 | 
				
			||||||
            return 1;
 | 
					            return 1;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -354,7 +329,6 @@ int main(int argc, const char *argv[]) {
 | 
				
			|||||||
                client_fd = accept(sockets[i], (struct sockaddr *) &client_addr, &client_addr_len);
 | 
					                client_fd = accept(sockets[i], (struct sockaddr *) &client_addr, &client_addr_len);
 | 
				
			||||||
                if (client_fd < 0) {
 | 
					                if (client_fd < 0) {
 | 
				
			||||||
                    fprintf(stderr, ERR_STR "Unable to accept connection: %s" CLR_STR "\n", strerror(errno));
 | 
					                    fprintf(stderr, ERR_STR "Unable to accept connection: %s" CLR_STR "\n", strerror(errno));
 | 
				
			||||||
                    fflush(stderr);
 | 
					 | 
				
			||||||
                    continue;
 | 
					                    continue;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -379,7 +353,6 @@ int main(int argc, const char *argv[]) {
 | 
				
			|||||||
                    }
 | 
					                    }
 | 
				
			||||||
                } else {
 | 
					                } else {
 | 
				
			||||||
                    fprintf(stderr, ERR_STR "Unable to create child process: %s" CLR_STR "\n", strerror(errno));
 | 
					                    fprintf(stderr, ERR_STR "Unable to create child process: %s" CLR_STR "\n", strerror(errno));
 | 
				
			||||||
                    fflush(stderr);
 | 
					 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
@@ -391,13 +364,11 @@ int main(int argc, const char *argv[]) {
 | 
				
			|||||||
                if (ret < 0) {
 | 
					                if (ret < 0) {
 | 
				
			||||||
                    fprintf(stderr, ERR_STR "Unable to wait for child process (PID %i): %s" CLR_STR "\n",
 | 
					                    fprintf(stderr, ERR_STR "Unable to wait for child process (PID %i): %s" CLR_STR "\n",
 | 
				
			||||||
                            children[i], strerror(errno));
 | 
					                            children[i], strerror(errno));
 | 
				
			||||||
                    fflush(stderr);
 | 
					 | 
				
			||||||
                } else if (ret == children[i]) {
 | 
					                } else if (ret == children[i]) {
 | 
				
			||||||
                    children[i] = 0;
 | 
					                    children[i] = 0;
 | 
				
			||||||
                    if (status != 0) {
 | 
					                    if (status != 0) {
 | 
				
			||||||
                        fprintf(stderr, ERR_STR "Child process with PID %i terminated with exit code %i" CLR_STR "\n",
 | 
					                        fprintf(stderr, ERR_STR "Child process with PID %i terminated with exit code %i" CLR_STR "\n",
 | 
				
			||||||
                                ret, status);
 | 
					                                ret, status);
 | 
				
			||||||
                        fflush(stderr);
 | 
					 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -17,7 +17,7 @@ char *log_prefix;
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
#define print(...) out_x(, ##__VA_ARGS__, out_2(__VA_ARGS__), out_2(__VA_ARGS__), out_2(__VA_ARGS__), \
 | 
					#define print(...) out_x(, ##__VA_ARGS__, out_2(__VA_ARGS__), out_2(__VA_ARGS__), out_2(__VA_ARGS__), \
 | 
				
			||||||
                         out_2(__VA_ARGS__), out_2(__VA_ARGS__), out_2(__VA_ARGS__), out_2(__VA_ARGS__), \
 | 
					                         out_2(__VA_ARGS__), out_2(__VA_ARGS__), out_2(__VA_ARGS__), out_2(__VA_ARGS__), \
 | 
				
			||||||
                         out_2(__VA_ARGS__), out_1(__VA_ARGS__)); fflush(stdout)
 | 
					                         out_2(__VA_ARGS__), out_1(__VA_ARGS__))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
char *format_duration(unsigned long micros, char *buf);
 | 
					char *format_duration(unsigned long micros, char *buf);
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user