commit - ac485591d020cd11cf0c53e192975f115a9dc40a
commit + 2edd250dd96801661e3eba82e6b3ee229563f38f
blob - ceff3ccc3774187d7c67e2047b1d3cb47319b9ec
blob + 31f76418205c391a63e56e0b2fd815181d3eb53d
--- 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 - ef0410f51260026ece5a8095d5edb93f736def79
blob + 0c4efffac51447f247923bec579926305bb63c84
--- 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 - 17c797a987157d3e18fd32773d765f8c270c2938
blob + 993b8723662b4b9475af9a1db9e910d80afee90c
--- 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, SS_LEN(&a->ss)) == -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;
-}