From 6b7150cbb61a72036fa19718c2bca430034e85b3 Mon Sep 17 00:00:00 2001 From: phk Date: Thu, 23 Mar 2006 08:45:44 +0000 Subject: [PATCH] Open TCP sockets git-svn-id: svn+ssh://projects.linpro.no/svn/varnish/trunk@60 d4fa192b-c00b-0410-8231-f00ffab90ce4 --- varnish-cache/bin/varnishd/Makefile.am | 1 + varnish-cache/bin/varnishd/heritage.h | 14 ++++++ varnish-cache/bin/varnishd/mgt.h | 3 ++ varnish-cache/bin/varnishd/tcp.c | 66 ++++++++++++++++++++++++++ varnish-cache/bin/varnishd/varnishd.c | 7 +++ 5 files changed, 91 insertions(+) create mode 100644 varnish-cache/bin/varnishd/tcp.c diff --git a/varnish-cache/bin/varnishd/Makefile.am b/varnish-cache/bin/varnishd/Makefile.am index 32d8553c..4f89f09f 100644 --- a/varnish-cache/bin/varnishd/Makefile.am +++ b/varnish-cache/bin/varnishd/Makefile.am @@ -8,6 +8,7 @@ varnishd_SOURCES = \ cache_main.c \ cli_event.c \ mgt_child.c \ + tcp.c \ varnishd.c varnishd_LDADD = \ diff --git a/varnish-cache/bin/varnishd/heritage.h b/varnish-cache/bin/varnishd/heritage.h index c1b8e78b..e555b79f 100644 --- a/varnish-cache/bin/varnishd/heritage.h +++ b/varnish-cache/bin/varnishd/heritage.h @@ -5,7 +5,21 @@ */ struct heritage { + + /* + * Two pipe(2)'s for CLI connection between cache and mgt. + * cache reads [2] and writes [1]. Mgt reads [0] and writes [3]. + */ int fds[4]; + + /* + * Two sockets from which to accept connections, one bound to + * loopback only and one bound for wildcard (or possibly a specific + * interface IP number). + */ +#define HERITAGE_NSOCKS 2 /* IPv4 + IPv6 */ + int sock_local[HERITAGE_NSOCKS]; + int sock_remote[HERITAGE_NSOCKS]; }; extern struct heritage heritage; diff --git a/varnish-cache/bin/varnishd/mgt.h b/varnish-cache/bin/varnishd/mgt.h index 255c23d0..9b6a7063 100644 --- a/varnish-cache/bin/varnishd/mgt.h +++ b/varnish-cache/bin/varnishd/mgt.h @@ -10,3 +10,6 @@ void mgt_sigchld(int, short, void *); typedef void mgt_ccb_f(unsigned, const char *, void *); void mgt_child_request(mgt_ccb_f *, void *, char **argv, const char *fmt, ...); + +/* tcp.c */ +int open_tcp(const char *port); diff --git a/varnish-cache/bin/varnishd/tcp.c b/varnish-cache/bin/varnishd/tcp.c new file mode 100644 index 00000000..3db866dd --- /dev/null +++ b/varnish-cache/bin/varnishd/tcp.c @@ -0,0 +1,66 @@ +/* + * $Id$ + */ + +#include +#include +#include +#include +#include +#include + +#include "heritage.h" + +static void +create_listen_socket(const char *addr, const char *port, int *sp, int nsp) +{ + struct addrinfo ai, *r0, *r1; + int i, j, s; + + memset(&ai, 0, sizeof ai); + ai.ai_family = PF_UNSPEC; + ai.ai_socktype = SOCK_STREAM; + ai.ai_flags = AI_PASSIVE; + i = getaddrinfo(addr, port, &ai, &r0); + + if (i) { + fprintf("getaddrinfo failed: %s\n", gai_strerror(i)); + return; + } + + for (r1 = r0; r1 != NULL && nsp > 0; r1 = r1->ai_next) { + s = socket(r1->ai_family, r1->ai_socktype, r1->ai_protocol); + if (s < 0) + continue; + j = 1; + i = setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &j, sizeof j); + assert(i == 0); + + i = bind(s, r1->ai_addr, r1->ai_addrlen); + assert(i == 0); + *sp = s; + sp++; + nsp--; + } + + freeaddrinfo(r0); +} + +int +open_tcp(const char *port) +{ + unsigned u; + + for (u = 0; u < HERITAGE_NSOCKS; u++) { + heritage.sock_local[u] = -1; + heritage.sock_remote[u] = -1; + } + + create_listen_socket("localhost", port, + &heritage.sock_local[0], HERITAGE_NSOCKS); + + create_listen_socket(NULL, port, + &heritage.sock_remote[0], HERITAGE_NSOCKS); + + return (0); +} diff --git a/varnish-cache/bin/varnishd/varnishd.c b/varnish-cache/bin/varnishd/varnishd.c index ee340958..6f77ca53 100644 --- a/varnish-cache/bin/varnishd/varnishd.c +++ b/varnish-cache/bin/varnishd/varnishd.c @@ -169,6 +169,9 @@ usage(void) /*--------------------------------------------------------------------*/ +/* for development purposes */ +#include + int main(int argc, char *argv[]) { @@ -176,6 +179,10 @@ main(int argc, char *argv[]) unsigned portnumber = 8080; unsigned dflag = 1; /* XXX: debug=on for now */ + register_printf_render_std((const unsigned char *)"HVQ"); + + open_tcp("8080"); + while ((o = getopt(argc, argv, "dp:")) != -1) switch (o) { case 'd': -- 2.39.5