commit ed164e7221f75d3d7f48351e9427f2ce53ab284a from: Omar Polo date: Mon Jun 26 09:44:46 2023 UTC call getnameinfo() only once per request commit - da0821b6cb54a85bcbe76cdf0a9a16f8f1a14619 commit + ed164e7221f75d3d7f48351e9427f2ce53ab284a blob - eb22d380447e3ecb6f96dd2ed298d1acf09a24bf blob + e29c7135e1906ec838ffb0ec272bce1435614cf2 --- fcgi.c +++ fcgi.c @@ -343,26 +343,18 @@ fcgi_error(struct bufferevent *bev, short err, void *d void fcgi_req(struct client *c) { - char addr[NI_MAXHOST], buf[22]; + char buf[22]; char *qs; - int e; time_t tim; struct tm tminfo; struct envlist *p; - - e = getnameinfo((struct sockaddr*)&c->raddr, c->raddrlen, - addr, sizeof(addr), - NULL, 0, - NI_NUMERICHOST); - if (e != 0) - fatalx("getnameinfo failed: %s", gai_strerror(e)); fcgi_begin_request(c->cgibev); fcgi_send_param(c->cgibev, "GATEWAY_INTERFACE", "CGI/1.1"); fcgi_send_param(c->cgibev, "GEMINI_URL_PATH", c->iri.path); fcgi_send_param(c->cgibev, "QUERY_STRING", c->iri.query); - fcgi_send_param(c->cgibev, "REMOTE_ADDR", addr); - fcgi_send_param(c->cgibev, "REMOTE_HOST", addr); + fcgi_send_param(c->cgibev, "REMOTE_ADDR", c->rhost); + fcgi_send_param(c->cgibev, "REMOTE_HOST", c->rhost); fcgi_send_param(c->cgibev, "REQUEST_METHOD", ""); fcgi_send_param(c->cgibev, "SERVER_NAME", c->iri.host); fcgi_send_param(c->cgibev, "SERVER_PROTOCOL", "GEMINI"); blob - dff310548e409634afd6452c73463d954d770e11 blob + 57a02afd9009e99d9b20a7a6c7287a07c1a2bfe3 --- ge.c +++ ge.c @@ -42,16 +42,8 @@ static const struct option opts[] = { void log_request(struct client *c, char *meta, size_t l) { - char hbuf[NI_MAXHOST], sbuf[NI_MAXSERV], b[GEMINI_URL_LEN]; + char b[GEMINI_URL_LEN]; const char *t; - int ec; - - ec = getnameinfo((struct sockaddr*)&c->raddr, c->raddrlen, - hbuf, sizeof(hbuf), - sbuf, sizeof(sbuf), - NI_NUMERICHOST | NI_NUMERICSERV); - if (ec != 0) - fatalx("getnameinfo: %s", gai_strerror(ec)); if (c->iri.schema != NULL) { /* serialize the IRI */ @@ -81,7 +73,7 @@ log_request(struct client *c, char *meta, size_t l) if ((t = memchr(meta, '\r', l)) == NULL) t = meta + l; - fprintf(stderr, "%s:%s GET %s %.*s\n", hbuf, sbuf, b, + fprintf(stderr, "%s:%s GET %s %.*s\n", c->rhost, c->rserv, b, (int)(t-meta), meta); } blob - 7d8f2c8a4960ec7ae2264567460e1e089143f575 blob + b59c5a9a341e938df94e506abdd52f42331ce864 --- gmid.c +++ gmid.c @@ -84,18 +84,11 @@ void log_request(struct client *c, char *meta, size_t l) { struct conf *conf = c->conf; - char hbuf[NI_MAXHOST], sbuf[NI_MAXSERV], b[GEMINI_URL_LEN]; + char b[GEMINI_URL_LEN]; char *fmted; const char *t; int ec; - ec = getnameinfo((struct sockaddr*)&c->raddr, c->raddrlen, - hbuf, sizeof(hbuf), - sbuf, sizeof(sbuf), - NI_NUMERICHOST | NI_NUMERICSERV); - if (ec != 0) - fatalx("getnameinfo: %s", gai_strerror(ec)); - if (c->iri.schema != NULL) { /* serialize the IRI */ strlcpy(b, c->iri.schema, sizeof(b)); @@ -124,7 +117,7 @@ log_request(struct client *c, char *meta, size_t l) if ((t = memchr(meta, '\r', l)) == NULL) t = meta + l; - ec = asprintf(&fmted, "%s:%s GET %s %.*s", hbuf, sbuf, b, + ec = asprintf(&fmted, "%s:%s GET %s %.*s", c->rhost, c->rserv, b, (int)(t-meta), meta); if (ec == -1) fatal("asprintf"); blob - 71c9815568d598bfd247e8412eb17b2eae8b37a7 blob + 8cad48585a7dd8e2efc2a9660b19aac44fa6ba21 --- gmid.h +++ gmid.h @@ -281,6 +281,8 @@ struct client { size_t reqlen; struct iri iri; char domain[DOMAIN_NAME_LEN]; + char rhost[NI_MAXHOST]; + char rserv[NI_MAXSERV]; struct bufferevent *bev; blob - 0a0b3e341082f692a6cd069acda42f69f3d4ce32 blob + 09b26450753fa543bb800936d24f0430f8ff8055 --- server.c +++ server.c @@ -1343,7 +1343,7 @@ do_accept(int sock, short et, void *d) struct sockaddr_storage raddr; struct sockaddr *sraddr; socklen_t len; - int fd; + int e, fd; sraddr = (struct sockaddr *)&raddr; len = sizeof(raddr); @@ -1365,6 +1365,15 @@ do_accept(int sock, short et, void *d) memcpy(&c->raddr, &raddr, sizeof(raddr)); c->raddrlen = len; + e = getnameinfo(sraddr, len, c->rhost, sizeof(c->rhost), + c->rserv, sizeof(c->rserv), NI_NUMERICHOST | NI_NUMERICSERV); + if (e != 0) { + log_warnx("getnameinfo failed: %s", gai_strerror(e)); + close(c->fd); + free(c); + return; + } + if (tls_accept_socket(addr->ctx, &c->ctx, fd) == -1) { log_warnx("failed to accept socket: %s", tls_error(c->ctx)); close(c->fd);