From 063c9648a6d4650c800a780c79a2171450c5a030 Mon Sep 17 00:00:00 2001 From: Mark Wooding Date: Sat, 12 May 2018 10:36:27 +0100 Subject: [PATCH] server/: Wrap `udpsock' selectors up in a custom structure. Now we can easily add more per-socket information. No functional change at this stage. --- server/admin.c | 12 ++++++------ server/peer.c | 16 ++++++++-------- server/tripe.h | 6 +++++- 3 files changed, 19 insertions(+), 15 deletions(-) diff --git a/server/admin.c b/server/admin.c index 87bb9053..24f83977 100644 --- a/server/admin.c +++ b/server/admin.c @@ -1233,7 +1233,7 @@ static void a_resolve(admin *a, admin_resop *r, const char *tag, { fam = "ANY"; af = AF_UNSPEC; i++; } else for (j = 0; j < NADDRFAM; j++) { if (mystrieq(av[i], aftab[j].name)) { - if (udpsock[j].fd < 0) { + if (udpsock[j].sf.fd < 0) { a_fail(a, "disabled-address-family", "%s", aftab[j].name, A_END); goto fail; } @@ -1286,7 +1286,7 @@ static void a_resolve(admin *a, admin_resop *r, const char *tag, aihint.ai_flags = AI_NUMERICHOST; if (!getaddrinfo(av[i], 0, &aihint, &ailist)) { for (ai = ailist; ai; ai = ai->ai_next) { - if ((j = afix(ai->ai_family)) >= 0 && udpsock[j].fd >= 0) + if ((j = afix(ai->ai_family)) >= 0 && udpsock[j].sf.fd >= 0) break; } if (!ai) { @@ -1315,7 +1315,7 @@ static void a_resolve(admin *a, admin_resop *r, const char *tag, #ifdef HAVE_LIBADNS qf = adns_qf_search; for (j = 0; j < NADDRFAM; j++) { - if ((af == AF_UNSPEC || af == aftab[i].af) && udpsock[j].fd >= 0) + if ((af == AF_UNSPEC || af == aftab[i].af) && udpsock[j].sf.fd >= 0) qf |= aftab[j].qf; } if ((err = adns_submit(ads, r->addr, adns_r_addr, qf, r, &r->q)) != 0) { @@ -1331,7 +1331,7 @@ static void a_resolve(admin *a, admin_resop *r, const char *tag, a_bgfail(&r->bg, "resolve-error", "%s", r->addr, A_END); goto fail_release; } - if (udpsock[AFIX_INET].fd < 0) { + if (udpsock[AFIX_INET].sf.fd < 0) { a_bgfail(&r->bg, "disabled-address-family", "INET", A_END); goto fail_release; } @@ -1870,13 +1870,13 @@ static void acmd_port(admin *a, unsigned ac, char *av[]) a_fail(a, "unknown-address-family", "%s", av[0], A_END); return; found: - if (udpsock[i].fd < 0) { + if (udpsock[i].sf.fd < 0) { a_fail(a, "disabled-address-family", "%s", aftab[i].name, A_END); return; } } else { for (i = 0; i < NADDRFAM; i++) - if (udpsock[i].fd >= 0) goto found; + if (udpsock[i].sf.fd >= 0) goto found; abort(); } a_info(a, "%u", p_port(i), A_END); diff --git a/server/peer.c b/server/peer.c index 341ea38b..d4155670 100644 --- a/server/peer.c +++ b/server/peer.c @@ -29,7 +29,7 @@ /*----- Global state ------------------------------------------------------*/ -sel_file udpsock[NADDRFAM]; +udpsocket udpsock[NADDRFAM]; /*----- Static variables --------------------------------------------------*/ @@ -534,7 +534,7 @@ int p_txaddr(const addr *a, const void *p, size_t sz) return (-1); } IF_TRACING(T_PEER, trace_block(T_PACKET, "peer: sending packet", p, sz); ) - if (sendto(udpsock[i].fd, p, sz, 0, &a->sa, sasz) < 0) { + if (sendto(udpsock[i].sf.fd, p, sz, 0, &a->sa, sasz) < 0) { a_warn("PEER", "?ADDR", a, "socket-write-error", "?ERRNO", A_END); return (-1); } @@ -562,7 +562,7 @@ static int p_dotxend(peer *p) } IF_TRACING(T_PEER, trace_block(T_PACKET, "peer: sending packet", BBASE(&p->b), BLEN(&p->b)); ) - if (sendto(udpsock[p->afix].fd, BBASE(&p->b), BLEN(&p->b), + if (sendto(udpsock[p->afix].sf.fd, BBASE(&p->b), BLEN(&p->b), 0, &p->spec.sa.sa, sasz) < 0) { a_warn("PEER", "?PEER", p, "socket-write-error", "?ERRNO", A_END); return (0); @@ -836,11 +836,11 @@ void p_init(struct addrinfo *ailist) addr a; socklen_t sz; - for (i = 0; i < NADDRFAM; i++) udpsock[i].fd = -1; + for (i = 0; i < NADDRFAM; i++) udpsock[i].sf.fd = -1; for (ai = ailist; ai; ai = ai->ai_next) { if ((i = afix(ai->ai_family)) < 0) continue; - if (udpsock[i].fd != -1) continue; + if (udpsock[i].sf.fd != -1) continue; /* --- Note on socket buffer sizes --- * * @@ -868,8 +868,8 @@ void p_init(struct addrinfo *ailist) strerror(errno)); } fdflags(fd, O_NONBLOCK, O_NONBLOCK, FD_CLOEXEC, FD_CLOEXEC); - sel_initfile(&sel, &udpsock[i], fd, SEL_READ, p_read, 0); - sel_addfile(&udpsock[i]); + sel_initfile(&sel, &udpsock[i].sf, fd, SEL_READ, p_read, 0); + sel_addfile(&udpsock[i].sf); T( trace(T_PEER, "peer: created %s socket", aftab[i].name); ) if (!port) { sz = sizeof(a); @@ -897,7 +897,7 @@ unsigned p_port(int i) addr a; socklen_t sz = sizeof(addr); - if (getsockname(udpsock[i].fd, &a.sa, &sz)) + if (getsockname(udpsock[i].sf.fd, &a.sa, &sz)) die(EXIT_FAILURE, "couldn't read port number: %s", strerror(errno)); return (getport(&a)); } diff --git a/server/tripe.h b/server/tripe.h index 10a03f5f..a083b719 100644 --- a/server/tripe.h +++ b/server/tripe.h @@ -676,6 +676,10 @@ typedef struct peer { typedef struct peer_iter { sym_iter i; } peer_iter; +typedef struct udpsocket { + sel_file sf; /* Selector for the socket */ +} udpsocket; + typedef struct ping { struct ping *next, *prev; /* Links to next and previous */ peer *p; /* Peer so we can free it */ @@ -812,7 +816,7 @@ extern sel_state sel; /* Global I/O event state */ extern octet buf_i[PKBUFSZ], buf_o[PKBUFSZ], buf_t[PKBUFSZ], buf_u[PKBUFSZ]; extern const tunnel_ops *tunnels[]; /* Table of tunnels (0-term) */ extern const tunnel_ops *tun_default; /* Default tunnel to use */ -extern sel_file udpsock[NADDRFAM]; /* The master UDP sockets */ +extern udpsocket udpsock[NADDRFAM]; /* The master UDP sockets */ extern kdata *master; /* Default private key */ extern const char *tag_priv; /* Default private key tag */ -- 2.11.0