Remove some gotos

This commit is contained in:
2023-01-26 17:13:41 +01:00
parent 240ed6bc25
commit 9ee0e11c86
8 changed files with 78 additions and 80 deletions

View File

@ -81,10 +81,10 @@ static async_evt_t async_e2a(unsigned int events) {
} }
static int async_add_to_queue(evt_listen_t *evt) { static int async_add_to_queue(evt_listen_t *evt) {
try_again: while (sem_wait(&lock) != 0) {
if (sem_wait(&lock) != 0) {
if (errno == EINTR) { if (errno == EINTR) {
goto try_again; errno = 0;
continue;
} else { } else {
return -1; return -1;
} }

View File

@ -53,11 +53,10 @@ static int magic_init(void) {
} }
static void magic_mime_type(const char *restrict filename, char *buf) { static void magic_mime_type(const char *restrict filename, char *buf) {
retry: while (sem_wait(&sem_magic) != 0) {
if (sem_wait(&sem_magic) != 0) {
if (errno == EINTR) { if (errno == EINTR) {
errno = 0; errno = 0;
goto retry; continue;
} else { } else {
critical("Unable to lock magic semaphore"); critical("Unable to lock magic semaphore");
return; return;
@ -84,11 +83,10 @@ static void magic_mime_type(const char *restrict filename, char *buf) {
} }
static void magic_charset(const char *restrict filename, char *buf) { static void magic_charset(const char *restrict filename, char *buf) {
retry: while (sem_wait(&sem_magic) != 0) {
if (sem_wait(&sem_magic) != 0) {
if (errno == EINTR) { if (errno == EINTR) {
errno = 0; errno = 0;
goto retry; continue;
} else { } else {
critical("Unable to lock magic semaphore"); critical("Unable to lock magic semaphore");
return; return;
@ -136,10 +134,10 @@ static cache_entry_t *cache_get_entry(cache_t *cache, const char *filename) {
static cache_entry_t *cache_get_new_entry(cache_t *cache) { static cache_entry_t *cache_get_new_entry(cache_t *cache) {
// globally lock cache // globally lock cache
retry: while (sem_wait(&sem_cache) != 0) {
if (sem_wait(&sem_cache) != 0) {
if (errno == EINTR) { if (errno == EINTR) {
goto retry; errno = 0;
continue;
} else { } else {
return NULL; return NULL;
} }
@ -376,11 +374,10 @@ static void cache_mark_entry_dirty(cache_entry_t *entry) {
memset(entry->meta.filename_comp_gz, 0, sizeof(entry->meta.filename_comp_gz)); memset(entry->meta.filename_comp_gz, 0, sizeof(entry->meta.filename_comp_gz));
memset(entry->meta.filename_comp_br, 0, sizeof(entry->meta.filename_comp_br)); memset(entry->meta.filename_comp_br, 0, sizeof(entry->meta.filename_comp_br));
try_again_free: while (sem_wait(&sem_free) != 0) {
if (sem_wait(&sem_free) != 0) {
if (errno == EINTR) { if (errno == EINTR) {
errno = 0; errno = 0;
goto try_again_free; continue;
} else { } else {
error("Unable to lock semaphore"); error("Unable to lock semaphore");
errno = 0; errno = 0;
@ -389,11 +386,10 @@ static void cache_mark_entry_dirty(cache_entry_t *entry) {
} }
// try to lock buffer // try to lock buffer
try_again_lock: while (sem_wait(&sem_lock) != 0) {
if (sem_wait(&sem_lock) != 0) {
if (errno == EINTR) { if (errno == EINTR) {
errno = 0; errno = 0;
goto try_again_lock; continue;
} else { } else {
error("Unable to lock semaphore"); error("Unable to lock semaphore");
errno = 0; errno = 0;

View File

@ -191,7 +191,8 @@ int http_parse_request(char *buf, http_req *req) {
if (req->version[0] == 0) { if (req->version[0] == 0) {
pos1 = (char *) strchr(ptr, ' ') + 1; pos1 = (char *) strchr(ptr, ' ') + 1;
if (pos1 == NULL) goto err_hdr_fmt; if (pos1 == NULL)
return http_error(HTTP_ERROR_HEADER_MALFORMED);
if (pos1 - ptr - 1 >= sizeof(req->method)) if (pos1 - ptr - 1 >= sizeof(req->method))
return http_error(HTTP_ERROR_HEADER_MALFORMED); return http_error(HTTP_ERROR_HEADER_MALFORMED);
@ -203,10 +204,8 @@ int http_parse_request(char *buf, http_req *req) {
snprintf(req->method, sizeof(req->method), "%.*s", (int) (pos1 - ptr - 1), ptr); snprintf(req->method, sizeof(req->method), "%.*s", (int) (pos1 - ptr - 1), ptr);
pos2 = (char *) strchr(pos1, ' ') + 1; pos2 = (char *) strchr(pos1, ' ') + 1;
if (pos2 == NULL) { if (pos2 == NULL)
err_hdr_fmt:
return http_error(HTTP_ERROR_HEADER_MALFORMED); return http_error(HTTP_ERROR_HEADER_MALFORMED);
}
if (memcmp(pos2, "HTTP/", 5) != 0 || memcmp(pos2 + 8, "\r\n", 2) != 0) if (memcmp(pos2, "HTTP/", 5) != 0 || memcmp(pos2 + 8, "\r\n", 2) != 0)
return http_error(HTTP_ERROR_INVALID_VERSION); return http_error(HTTP_ERROR_INVALID_VERSION);

View File

@ -52,22 +52,20 @@ int mpmc_init(mpmc_t *ctx, int n_workers, int buf_size, void (*consumer)(void *o
int mpmc_queue(mpmc_t *ctx, void *obj) { int mpmc_queue(mpmc_t *ctx, void *obj) {
// wait for buffer to be emptied // wait for buffer to be emptied
try_again_1: while (sem_wait(&ctx->free) != 0) {
if (sem_wait(&ctx->free) != 0) {
if (errno == EINTR) { if (errno == EINTR) {
errno = 0; errno = 0;
goto try_again_1; continue;
} else { } else {
return -1; return -1;
} }
} }
// lock wr field // lock wr field
try_again_2: while (sem_wait(&ctx->lck_wr) != 0) {
if (sem_wait(&ctx->lck_wr) != 0) {
if (errno == EINTR) { if (errno == EINTR) {
errno = 0; errno = 0;
goto try_again_2; continue;
} else { } else {
sem_post(&ctx->free); sem_post(&ctx->free);
return -1; return -1;

View File

@ -105,19 +105,19 @@ proxy_ctx_t *proxy_get_by_conf(host_config_t *conf) {
n++; n++;
} }
try_again_1: while (sem_wait(&available[n]) != 0) {
if (sem_wait(&available[n]) != 0) {
if (errno == EINTR) { if (errno == EINTR) {
goto try_again_1; errno = 0;
continue;
} else { } else {
return NULL; return NULL;
} }
} }
try_again_2: while (sem_wait(&lock) != 0) {
if (sem_wait(&lock) != 0) {
if (errno == EINTR) { if (errno == EINTR) {
goto try_again_2; errno = 0;
continue;
} else { } else {
sem_post(&available[n]); sem_post(&available[n]);
return NULL; return NULL;
@ -269,24 +269,28 @@ int proxy_response_header(http_req *req, http_res *res, host_config_t *conf) {
const char *location = http_get_header_field(&res->hdr, "Location"); const char *location = http_get_header_field(&res->hdr, "Location");
if (location != NULL) { if (location != NULL) {
char *hostnames[] = {conf->name, conf->proxy.hostname}; char *hostnames[] = {conf->name, conf->proxy.hostname};
int found = 0;
for (int i = 0; i < sizeof(hostnames) / sizeof(hostnames[0]); i++) { for (int i = 0; i < sizeof(hostnames) / sizeof(hostnames[0]); i++) {
char *hostname = hostnames[i]; char *hostname = hostnames[i];
found = 1;
p_len = snprintf(buf1, sizeof(buf1), "http://%s/", hostname); p_len = snprintf(buf1, sizeof(buf1), "http://%s/", hostname);
if (strncmp(location, buf1, p_len) == 0) goto match; if (strstarts(location, buf1)) break;
p_len = snprintf(buf1, sizeof(buf1), "https://%s/", hostname); p_len = snprintf(buf1, sizeof(buf1), "https://%s/", hostname);
if (strncmp(location, buf1, p_len) == 0) goto match; if (strstarts(location, buf1)) break;
p_len = snprintf(buf1, sizeof(buf1), "http://%s:%i/", hostname, conf->proxy.port); p_len = snprintf(buf1, sizeof(buf1), "http://%s:%i/", hostname, conf->proxy.port);
if (strncmp(location, buf1, p_len) == 0) goto match; if (strstarts(location, buf1)) break;
p_len = snprintf(buf1, sizeof(buf1), "https://%s:%i/", hostname, conf->proxy.port); p_len = snprintf(buf1, sizeof(buf1), "https://%s:%i/", hostname, conf->proxy.port);
if (strncmp(location, buf1, p_len) == 0) goto match; if (strstarts(location, buf1)) break;
found = 0;
} }
if (0) { if (found) {
match:
strcpy(buf1, location + p_len - 1); strcpy(buf1, location + p_len - 1);
http_remove_header_field(&res->hdr, "Location", HTTP_REMOVE_ALL); http_remove_header_field(&res->hdr, "Location", HTTP_REMOVE_ALL);
http_add_header_field(&res->hdr, "Location", buf1); http_add_header_field(&res->hdr, "Location", buf1);

View File

@ -102,11 +102,10 @@ void logmsgf(log_lvl_t level, const char *restrict format, ...) {
printf("\n"); printf("\n");
} else { } else {
// wait for free slot in buffer // wait for free slot in buffer
try_again_free: while (sem_wait(&sem_buf_free) != 0) {
if (sem_wait(&sem_buf_free) != 0) {
if (errno == EINTR) { if (errno == EINTR) {
errno = 0; errno = 0;
goto try_again_free; continue;
} else { } else {
err("Unable to lock semaphore"); err("Unable to lock semaphore");
errno = 0; errno = 0;
@ -117,11 +116,10 @@ void logmsgf(log_lvl_t level, const char *restrict format, ...) {
} }
// try to lock buffer // try to lock buffer
try_again_buf: while (sem_wait(&sem_buf) != 0) {
if (sem_wait(&sem_buf) != 0) {
if (errno == EINTR) { if (errno == EINTR) {
errno = 0; errno = 0;
goto try_again_buf; continue;
} else { } else {
err("Unable to lock semaphore"); err("Unable to lock semaphore");
errno = 0; errno = 0;

View File

@ -82,10 +82,10 @@ static int ssl_servername_cb(SSL *ssl, int *ad, void *arg) {
void server_free_client(client_ctx_t *ctx) { void server_free_client(client_ctx_t *ctx) {
// try to lock clients list // try to lock clients list
retry: while (sem_wait(&sem_clients_lock) != 0) {
if (sem_wait(&sem_clients_lock) != 0) {
if (errno == EINTR) { if (errno == EINTR) {
goto retry; errno = 0;
continue;
} else { } else {
critical("Unable to lock clients list"); critical("Unable to lock clients list");
return; return;
@ -140,10 +140,10 @@ static void accept_cb(void *arg) {
client_ctx->cnx_e = -1, client_ctx->req_s = -1, client_ctx->req_e = -1, client_ctx->res_ts = -1; client_ctx->cnx_e = -1, client_ctx->req_s = -1, client_ctx->req_e = -1, client_ctx->res_ts = -1;
// try to lock clients list // try to lock clients list
retry: while (sem_wait(&sem_clients_lock) != 0) {
if (sem_wait(&sem_clients_lock) != 0) {
if (errno == EINTR) { if (errno == EINTR) {
goto retry; errno = 0;
continue;
} else { } else {
critical("Unable to lock clients list"); critical("Unable to lock clients list");
return; return;

View File

@ -28,6 +28,32 @@ void tcp_acceptor_func(client_ctx_t *ctx) {
} }
} }
static int dig(const char *addr, char *host, size_t host_size) {
char buf[1024];
FILE *out;
int ret;
sprintf(buf, "dig @%s +short +time=1 -x %s", config.dns_server, addr);
if ((out = popen(buf, "r")) == NULL) {
error("Unable to start dig: %s");
return -1;
}
unsigned long read = fread(buf, 1, sizeof(buf), out);
if ((ret = pclose(out)) != 0) {
error("Dig terminated with exit code %i", ret);
return -1;
}
char *ptr = memchr(buf, '\n', read);
if (ptr == buf || ptr == NULL) return -1;
ptr[-1] = 0;
strncpy(host, buf, host_size);
return 0;
}
static int tcp_acceptor(client_ctx_t *ctx) { static int tcp_acceptor(client_ctx_t *ctx) {
struct sockaddr_in6 server_addr; struct sockaddr_in6 server_addr;
@ -55,35 +81,12 @@ static int tcp_acceptor(client_ctx_t *ctx) {
logger_set_prefix("[%*s]%s", ADDRSTRLEN, ctx->socket.s_addr, ctx->log_prefix); logger_set_prefix("[%*s]%s", ADDRSTRLEN, ctx->socket.s_addr, ctx->log_prefix);
int ret;
char buf[1024];
sock *client = &ctx->socket; sock *client = &ctx->socket;
ctx->cnx_s = clock_micros(); ctx->cnx_s = clock_micros();
if (config.dns_server[0] != 0) { ctx->host[0] = 0;
sprintf(buf, "dig @%s +short +time=1 -x %s", config.dns_server, ctx->socket.addr); if (config.dns_server[0] != 0)
FILE *dig = popen(buf, "r"); dig(ctx->socket.addr, ctx->host, sizeof(ctx->host));
if (dig == NULL) {
error("Unable to start dig: %s");
goto dig_err;
}
unsigned long read = fread(buf, 1, sizeof(buf), dig);
ret = pclose(dig);
if (ret != 0) {
error("Dig terminated with exit code %i", ret);
goto dig_err;
}
char *ptr = memchr(buf, '\n', read);
if (ptr == buf || ptr == NULL) {
goto dig_err;
}
ptr[-1] = 0;
strncpy(ctx->host, buf, sizeof(ctx->host));
} else {
dig_err:
ctx->host[0] = 0;
}
ctx->cc[0] = 0; ctx->cc[0] = 0;
geoip_lookup_country(&client->_addr.sock, ctx->cc); geoip_lookup_country(&client->_addr.sock, ctx->cc);
@ -102,8 +105,8 @@ static int tcp_acceptor(client_ctx_t *ctx) {
SSL_set_fd(client->ssl, client->socket); SSL_set_fd(client->ssl, client->socket);
SSL_set_accept_state(client->ssl); SSL_set_accept_state(client->ssl);
ret = SSL_accept(client->ssl); int ret;
if (ret != 1) { if ((ret = SSL_accept(client->ssl)) != 1) {
sock_error(client, ret); sock_error(client, ret);
info("Unable to perform handshake"); info("Unable to perform handshake");
return -1; return -1;