commit - b8b20b3c52fa4f90a1ac5b20e7d8a24fae8d9e27
commit + cdfd248aa718819d40d0bf972b7efbb2eabd31c9
blob - ff4e4df2ca69c232fb996d70160f9de9e52d0347
blob + 8a18107cdc7ef357964ae5a8c38a6e1205874e12
--- gotwebd/Makefile
+++ gotwebd/Makefile
gotconfig.c diff_main.c diff_atomize_text.c diff_myers.c \
diff_output.c diff_output_plain.c diff_output_unidiff.c \
diff_output_edscript.c diff_patience.c bloom.c murmurhash2.c \
- sigs.c date.c sockaddr.c \
+ sigs.c date.c \
object_open_privsep.c read_gitconfig_privsep.c \
read_gotconfig_privsep.c pollfd.c reference_parse.c \
object_qid.c
blob - 3aa096b3ae2f9aa0d09d4724ebd87802d2feec54
blob + d5fda8da9e59b01cc49feab0b96c7ebec5256b68
--- gotwebd/gotwebd.h
+++ gotwebd/gotwebd.h
struct address {
TAILQ_ENTRY(address) entry;
struct sockaddr_storage ss;
- int ipproto;
+ socklen_t slen;
in_port_t port;
char ifname[IFNAMSIZ];
};
blob - cf8c89590e35a8671f7a6587dc7aa75e7f2e6cd3
blob + 4b2db2c1ab45af5408ec20a9ce4e350fa0877b05
--- gotwebd/parse.y
+++ gotwebd/parse.y
#include <syslog.h>
#include <unistd.h>
-#include "got_sockaddr.h"
#include "got_reference.h"
#include "proc.h"
{
struct addrinfo hints, *res0, *res;
int error;
- struct sockaddr_in *sain, *ra;
- struct sockaddr_in6 *sin6, *ra6;
+ struct sockaddr_in *sin;
+ struct sockaddr_in6 *sin6;
struct address *h;
memset(&hints, 0, sizeof(hints));
}
}
h->ss.ss_family = res->ai_family;
+
+ memcpy(&h->ss, res->ai_addr, res->ai_addrlen);
+ h->slen = res->ai_addrlen;
switch (res->ai_family) {
case AF_INET:
- sain = (struct sockaddr_in *)&h->ss;
- ra = (struct sockaddr_in *)res->ai_addr;
- h->port = ntohs(ra->sin_port);
- got_sockaddr_inet_init(sain, &ra->sin_addr);
+ sin = (struct sockaddr_in *)res->ai_addr;
+ h->port = ntohs(sin->sin_port);
break;
case AF_INET6:
- sin6 = (struct sockaddr_in6 *)&h->ss;
- ra6 = (struct sockaddr_in6 *)res->ai_addr;
- h->port = ntohs(ra6->sin6_port);
- got_sockaddr_inet6_init(sin6, &ra6->sin6_addr, 0);
+ sin6 = (struct sockaddr_in6 *)res->ai_addr;
+ h->port = ntohs(sin6->sin6_port);
break;
default:
fatalx("unknown address family %d", res->ai_family);
const char *addrstr;
TAILQ_FOREACH(a, al, entry) {
- if (memcmp(&a->ss, &h->ss, sizeof(h->ss)) != 0 ||
- a->port != h->port)
+ if (a->slen != h->slen ||
+ memcmp(&a->ss, &h->ss, a->slen) != 0)
continue;
switch (h->ss.ss_family) {
blob - 62a293eeac4877b0dbd3ba7efad3968b35396de3
blob + dedacef4dfcf53fb027cced30494bbc5781d81c3
--- gotwebd/sockets.c
+++ gotwebd/sockets.c
acp = &sock->conf.addr;
memcpy(&acp->ss, &a->ss, sizeof(acp->ss));
- acp->ipproto = a->ipproto;
+ acp->slen = a->slen;
acp->port = a->port;
if (*a->ifname != '\0') {
if (strlcpy(acp->ifname, a->ifname,
hints.ai_socktype = SOCK_STREAM;
hints.ai_flags |= AI_PASSIVE;
- switch (a->ss.ss_family) {
- case AF_INET:
- ((struct sockaddr_in *)(&a->ss))->sin_port = htons(port);
- break;
- case AF_INET6:
- ((struct sockaddr_in6 *)(&a->ss))->sin6_port = htons(port);
- break;
- default:
- log_warnx("%s: unknown address family", __func__);
- return -1;
- }
-
- fd = socket(a->ss.ss_family, hints.ai_socktype, a->ipproto);
+ fd = socket(a->ss.ss_family, hints.ai_socktype, 0);
if (fd == -1)
return -1;
return -1;
}
- if (bind(fd, (struct sockaddr *)&a->ss, a->ss.ss_len) == -1) {
+ if (bind(fd, (struct sockaddr *)&a->ss, a->slen) == -1) {
close(fd);
log_info("%s: can't bind to port %d", __func__,
ntohs(port));
blob - 809c5c9b65985619eabf4ad948d80348f606762c (mode 644)
blob + /dev/null
--- include/got_sockaddr.h
+++ /dev/null
-/*
- * Copyright (c) 2022 Stefan Sperling <stsp@openbsd.org>
- *
- * Permission to use, copy, modify, and distribute this software for any
- * purpose with or without fee is hereby granted, provided that the above
- * copyright notice and this permission notice appear in all copies.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
- * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
- * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
- * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
- * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- */
-
-void got_sockaddr_inet_init(struct sockaddr_in *in, struct in_addr *ina);
-void got_sockaddr_inet6_init(struct sockaddr_in6 *in6, struct in6_addr *in6a,
- uint32_t sin6_scope_id);
blob - 7a76593a59f98468b3891e3823c6d7fd0cfa960d (mode 644)
blob + /dev/null
--- lib/sockaddr.c
+++ /dev/null
-/*
- * Copyright (c) 2022 Stefan Sperling <stsp@openbsd.org>
- *
- * Permission to use, copy, modify, and distribute this software for any
- * purpose with or without fee is hereby granted, provided that the above
- * copyright notice and this permission notice appear in all copies.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
- * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
- * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
- * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
- * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- */
-
-#include <sys/socket.h>
-#include <netinet/in.h>
-
-#include <string.h>
-
-#include "got_sockaddr.h"
-
-/*
- * These interfaces wrap BSD-specific internals of internet address
- * data structures in a single compilation unit, allowing got-portable
- * to override them as needed, without a need for #ifdef macros.
- */
-
-void
-got_sockaddr_inet_init(struct sockaddr_in *in, struct in_addr *ina)
-{
- in->sin_len = sizeof(struct sockaddr_in); /* BSD-specific */
- in->sin_family = AF_INET;
- in->sin_addr.s_addr = ina->s_addr;
-}
-
-void
-got_sockaddr_inet6_init(struct sockaddr_in6 *in6, struct in6_addr *in6a,
- uint32_t sin6_scope_id)
-{
- in6->sin6_len = sizeof(struct sockaddr_in6); /* BSD-specific */
- in6->sin6_family = AF_INET6;
- memcpy(&in6->sin6_addr, in6a, sizeof(in6->sin6_addr));
- in6->sin6_scope_id = sin6_scope_id;
-}