Mailing List Archive

r1500 - in trunk/varnish-cache: bin/varnishd include lib/libvarnish
Author: des
Date: 2007-06-06 13:24:06 +0200 (Wed, 06 Jun 2007)
New Revision: 1500

Added:
trunk/varnish-cache/include/vss.h
trunk/varnish-cache/lib/libvarnish/vss.c
Modified:
trunk/varnish-cache/bin/varnishd/common.h
trunk/varnish-cache/bin/varnishd/heritage.h
trunk/varnish-cache/bin/varnishd/mgt_child.c
trunk/varnish-cache/bin/varnishd/mgt_cli.c
trunk/varnish-cache/bin/varnishd/mgt_param.c
trunk/varnish-cache/bin/varnishd/mgt_vcc.c
trunk/varnish-cache/bin/varnishd/tcp.c
trunk/varnish-cache/include/Makefile.am
trunk/varnish-cache/lib/libvarnish/Makefile.am
Log:
Move parts of tcp.c out into libvarnish. Rename the API from "TCP" to "VSS"
(Varnish Stream Sockets) as I intend to eventually add support for AF_UNIX
sockets.

This also moves the accept filter code out from VSS_listen() (previously
TCP_open()) and into a separate function in tcp.c


Modified: trunk/varnish-cache/bin/varnishd/common.h
===================================================================
--- trunk/varnish-cache/bin/varnishd/common.h 2007-06-05 15:46:07 UTC (rev 1499)
+++ trunk/varnish-cache/bin/varnishd/common.h 2007-06-06 11:24:06 UTC (rev 1500)
@@ -45,6 +45,4 @@

void TCP_name(struct sockaddr *addr, unsigned l, char *abuf, unsigned alen, char *pbuf, unsigned plen);
void TCP_myname(int sock, char *abuf, unsigned alen, char *pbuf, unsigned plen);
-int TCP_parse(const char *str, char **addr, char **port);
-int TCP_resolve(const char *addr, const char *port, struct tcp_addr ***ta);
-int TCP_open(const struct tcp_addr *addr, int http);
+int TCP_filter_http(int sock);

Modified: trunk/varnish-cache/bin/varnishd/heritage.h
===================================================================
--- trunk/varnish-cache/bin/varnishd/heritage.h 2007-06-05 15:46:07 UTC (rev 1499)
+++ trunk/varnish-cache/bin/varnishd/heritage.h 2007-06-06 11:24:06 UTC (rev 1500)
@@ -36,7 +36,7 @@
struct listen_sock {
TAILQ_ENTRY(listen_sock) list;
int sock;
- struct tcp_addr *addr;
+ struct vss_addr *addr;
};

TAILQ_HEAD(listen_sock_head, listen_sock);

Modified: trunk/varnish-cache/bin/varnishd/mgt_child.c
===================================================================
--- trunk/varnish-cache/bin/varnishd/mgt_child.c 2007-06-05 15:46:07 UTC (rev 1499)
+++ trunk/varnish-cache/bin/varnishd/mgt_child.c 2007-06-06 11:24:06 UTC (rev 1500)
@@ -54,6 +54,7 @@
#include "cli_priv.h"
#include "mgt_cli.h"
#include "mgt_event.h"
+#include "vss.h"

pid_t mgt_pid;
pid_t child_pid = -1;
@@ -130,7 +131,8 @@
TAILQ_FOREACH(ls, &heritage.socks, list) {
if (ls->sock >= 0)
continue;
- ls->sock = TCP_open(ls->addr, 1);
+ ls->sock = VSS_listen(ls->addr, params->listen_depth);
+ TCP_filter_http(ls->sock);
if (ls->sock < 0)
return (1);
}

Modified: trunk/varnish-cache/bin/varnishd/mgt_cli.c
===================================================================
--- trunk/varnish-cache/bin/varnishd/mgt_cli.c 2007-06-05 15:46:07 UTC (rev 1499)
+++ trunk/varnish-cache/bin/varnishd/mgt_cli.c 2007-06-06 11:24:06 UTC (rev 1500)
@@ -54,6 +54,8 @@
#include "mgt_event.h"
#include "shmlog.h"

+#include "vss.h"
+
static int cli_i = -1, cli_o = -1;

/*--------------------------------------------------------------------*/
@@ -389,12 +391,12 @@
int
mgt_cli_telnet(const char *T_arg)
{
- struct tcp_addr **ta;
+ struct vss_addr **ta;
char *addr, *port;
int i, n;

- XXXAZ(TCP_parse(T_arg, &addr, &port));
- XXXAN(n = TCP_resolve(addr, port, &ta));
+ XXXAZ(VSS_parse(T_arg, &addr, &port));
+ XXXAN(n = VSS_resolve(addr, port, &ta));
free(addr);
free(port);
if (n == 0) {
@@ -402,7 +404,7 @@
exit(2);
}
for (i = 0; i < n; ++i) {
- int sock = TCP_open(ta[i], 0);
+ int sock = VSS_listen(ta[i], 1);
struct ev *ev = ev_new();
XXXAN(ev);
ev->fd = sock;

Modified: trunk/varnish-cache/bin/varnishd/mgt_param.c
===================================================================
--- trunk/varnish-cache/bin/varnishd/mgt_param.c 2007-06-05 15:46:07 UTC (rev 1499)
+++ trunk/varnish-cache/bin/varnishd/mgt_param.c 2007-06-06 11:24:06 UTC (rev 1500)
@@ -47,6 +47,8 @@

#include "heritage.h"

+#include "vss.h"
+
struct parspec;

typedef void tweak_t(struct cli *, struct parspec *, const char *arg);
@@ -392,16 +394,16 @@
}
TAILQ_INIT(&lsh);
for (i = 1; av[i] != NULL; i++) {
- struct tcp_addr **ta;
+ struct vss_addr **ta;
char *host, *port;
int j, n;

- if (TCP_parse(av[i], &host, &port) != 0) {
+ if (VSS_parse(av[i], &host, &port) != 0) {
cli_out(cli, "Invalid listen address \"%s\"", av[i]);
cli_result(cli, CLIS_PARAM);
break;
}
- n = TCP_resolve(host, port ? port : "http", &ta);
+ n = VSS_resolve(host, port ? port : "http", &ta);
free(host);
free(port);
if (n == 0) {

Modified: trunk/varnish-cache/bin/varnishd/mgt_vcc.c
===================================================================
--- trunk/varnish-cache/bin/varnishd/mgt_vcc.c 2007-06-05 15:46:07 UTC (rev 1499)
+++ trunk/varnish-cache/bin/varnishd/mgt_vcc.c 2007-06-06 11:24:06 UTC (rev 1500)
@@ -53,6 +53,8 @@
#include "mgt.h"
#include "mgt_cli.h"

+#include "vss.h"
+
struct vclprog {
TAILQ_ENTRY(vclprog) list;
char *name;
@@ -320,7 +322,7 @@
* XXX: a bug for a backend to not reply at that time, so then
* XXX: again: we should check it here in the "trivial" case.
*/
- if (TCP_parse(b_arg, &addr, &port) != 0 || addr == NULL) {
+ if (VSS_parse(b_arg, &addr, &port) != 0 || addr == NULL) {
fprintf(stderr, "invalid backend address\n");
return (1);
}

Modified: trunk/varnish-cache/bin/varnishd/tcp.c
===================================================================
--- trunk/varnish-cache/bin/varnishd/tcp.c 2007-06-05 15:46:07 UTC (rev 1499)
+++ trunk/varnish-cache/bin/varnishd/tcp.c 2007-06-06 11:24:06 UTC (rev 1500)
@@ -53,15 +53,6 @@
#include "cli.h"
#include "cli_priv.h"

-/* lightweight addrinfo */
-struct tcp_addr {
- int ta_family;
- int ta_socktype;
- int ta_protocol;
- socklen_t ta_addrlen;
- struct sockaddr_storage ta_addr;
-};
-
/*--------------------------------------------------------------------*/

void
@@ -100,166 +91,25 @@

/*--------------------------------------------------------------------*/

-#ifdef HAVE_ACCEPT_FILTERS
-static void
-accept_filter(int fd)
+int
+TCP_filter_http(int sock)
{
+#ifdef HAVE_ACCEPT_FILTERS
struct accept_filter_arg afa;
int i;

bzero(&afa, sizeof(afa));
strcpy(afa.af_name, "httpready");
errno = 0;
- i = setsockopt(fd, SOL_SOCKET, SO_ACCEPTFILTER,
+ i = setsockopt(sock, SOL_SOCKET, SO_ACCEPTFILTER,
&afa, sizeof(afa));
+ /* XXX ugly */
if (i)
printf("Acceptfilter(%d, httpready): %d %s\n",
- fd, i, strerror(errno));
-}
-#endif
-
-/*
- * Take a string provided by the user and break it up into address and
- * port parts. Examples of acceptable input include:
- *
- * "localhost" - "localhost:80"
- * "127.0.0.1" - "127.0.0.1:80"
- * "0.0.0.0" - "0.0.0.0:80"
- * "[::1]" - "[::1]:80"
- * "[::]" - "[::]:80"
- */
-int
-TCP_parse(const char *str, char **addr, char **port)
-{
- const char *p;
-
- *addr = *port = NULL;
-
- if (str[0] == '[') {
- /* IPv6 address of the form [::1]:80 */
- if ((p = strchr(str, ']')) == NULL ||
- p == str + 1 ||
- (p[1] != '\0' && p[1] != ':'))
- return (-1);
- *addr = strndup(str + 1, p - (str + 1));
- XXXAN(*addr);
- if (p[1] == ':') {
- *port = strdup(p + 2);
- XXXAN(*port);
- }
- } else {
- /* IPv4 address of the form 127.0.0.1:80, or non-numeric */
- p = strchr(str, ':');
- if (p == NULL) {
- *addr = strdup(str);
- XXXAN(*addr);
- } else {
- if (p > str) {
- *addr = strndup(str, p - str);
- XXXAN(*addr);
- }
- *port = strdup(p + 1);
- XXXAN(*port);
- }
- }
- return (0);
-}
-
-/*
- * For a given host and port, return a list of struct tcp_addr, which
- * contains all the information necessary to open and bind a socket. One
- * tcp_addr is returned for each distinct address returned by
- * getaddrinfo().
- *
- * The value pointed to by the tap parameter receives a pointer to an
- * array of pointers to struct tcp_addr. The caller is responsible for
- * freeing each individual struct tcp_addr as well as the array.
- *
- * The return value is the number of addresses resoved, or zero.
- */
-int
-TCP_resolve(const char *addr, const char *port, struct tcp_addr ***tap)
-{
- struct addrinfo hints, *res0, *res;
- struct tcp_addr **ta;
- int i, ret;
-
- memset(&hints, 0, sizeof hints);
- hints.ai_socktype = SOCK_STREAM;
- hints.ai_flags = AI_PASSIVE;
- ret = getaddrinfo(addr, port, &hints, &res0);
- if (ret != 0) {
- fprintf(stderr, "getaddrinfo(): %s\n", gai_strerror(ret));
- return (0);
- }
- for (res = res0, i = 0; res != NULL; res = res->ai_next)
- ++i;
- ta = calloc(i, sizeof *ta);
- XXXAN(ta);
- *tap = ta;
- for (res = res0, i = 0; res != NULL; res = res->ai_next, ++i) {
- ta[i] = calloc(1, sizeof *ta[i]);
- XXXAN(ta[i]);
- ta[i]->ta_family = res->ai_family;
- ta[i]->ta_socktype = res->ai_socktype;
- ta[i]->ta_protocol = res->ai_protocol;
- ta[i]->ta_addrlen = res->ai_addrlen;
- xxxassert(ta[i]->ta_addrlen <= sizeof ta[i]->ta_addr);
- memcpy(&ta[i]->ta_addr, res->ai_addr, ta[i]->ta_addrlen);
- }
- freeaddrinfo(res0);
+ sock, i, strerror(errno));
return (i);
-}
-
-/*
- * Given a struct tcp_addr, open a socket of the appropriate type, bind it
- * to the requested address, and start listening.
- *
- * If the address is an IPv6 address, the IPV6_V6ONLY option is set to
- * avoid conflicts between INADDR_ANY and IN6ADDR_ANY.
- *
- * If the http parameter is non-zero and accept filters are available,
- * install an HTTP accept filter on the socket.
- */
-int
-TCP_open(const struct tcp_addr *ta, int http)
-{
- int sd, val;
-
- sd = socket(ta->ta_family, ta->ta_socktype, ta->ta_protocol);
- if (sd < 0) {
- perror("socket()");
- return (-1);
- }
- val = 1;
- if (setsockopt(sd, SOL_SOCKET, SO_REUSEADDR, &val, sizeof val) != 0) {
- perror("setsockopt(SO_REUSEADDR, 1)");
- close(sd);
- return (-1);
- }
-#ifdef IPV6_V6ONLY
- /* forcibly use separate sockets for IPv4 and IPv6 */
- val = 1;
- if (ta->ta_family == AF_INET6 &&
- setsockopt(sd, IPPROTO_IPV6, IPV6_V6ONLY, &val, sizeof val) != 0) {
- perror("setsockopt(IPV6_V6ONLY, 1)");
- close(sd);
- return (-1);
- }
+#else
+ (void)sock;
+ return (0);
#endif
- if (bind(sd, (const struct sockaddr *)&ta->ta_addr, ta->ta_addrlen) != 0) {
- perror("bind()");
- close(sd);
- return (-1);
- }
- if (listen(sd, http ? params->listen_depth : 16) != 0) {
- perror("listen()");
- close(sd);
- return (-1);
- }
-#ifdef HAVE_ACCEPT_FILTERS
- if (http)
- accept_filter(sd);
-#endif
- return (sd);
}

Modified: trunk/varnish-cache/include/Makefile.am
===================================================================
--- trunk/varnish-cache/include/Makefile.am 2007-06-05 15:46:07 UTC (rev 1499)
+++ trunk/varnish-cache/include/Makefile.am 2007-06-06 11:24:06 UTC (rev 1500)
@@ -30,5 +30,5 @@
vcl.h \
vcl_returns.h \
vrt.h \
- vrt_obj.h
-
+ vrt_obj.h \
+ vss.h

Added: trunk/varnish-cache/include/vss.h
===================================================================
--- trunk/varnish-cache/include/vss.h (rev 0)
+++ trunk/varnish-cache/include/vss.h 2007-06-06 11:24:06 UTC (rev 1500)
@@ -0,0 +1,36 @@
+/*-
+ * Copyright (c) 2006 Verdens Gang AS
+ * Copyright (c) 2006 Linpro AS
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $Id$
+ */
+
+/* vss.c */
+struct vss_addr;
+
+int VSS_parse(const char *str, char **addr, char **port);
+int VSS_resolve(const char *addr, const char *port, struct vss_addr ***ta);
+int VSS_listen(const struct vss_addr *addr, int depth);
+int VSS_connect(const struct vss_addr *addr);


Property changes on: trunk/varnish-cache/include/vss.h
___________________________________________________________________
Name: svn:keywords
+ Id

Modified: trunk/varnish-cache/lib/libvarnish/Makefile.am
===================================================================
--- trunk/varnish-cache/lib/libvarnish/Makefile.am 2007-06-05 15:46:07 UTC (rev 1499)
+++ trunk/varnish-cache/lib/libvarnish/Makefile.am 2007-06-06 11:24:06 UTC (rev 1500)
@@ -15,6 +15,7 @@
time.c \
version.c \
vpf.c \
- vsb.c
+ vsb.c \
+ vss.c

libvarnish_la_CFLAGS = -include config.h

Added: trunk/varnish-cache/lib/libvarnish/vss.c
===================================================================
--- trunk/varnish-cache/lib/libvarnish/vss.c (rev 0)
+++ trunk/varnish-cache/lib/libvarnish/vss.c 2007-06-06 11:24:06 UTC (rev 1500)
@@ -0,0 +1,223 @@
+/*-
+ * Copyright (c) 2006 Verdens Gang AS
+ * Copyright (c) 2006 Linpro AS
+ * All rights reserved.
+ *
+ * Author: Dag-Erling Sm?rgrav <des at linpro.no>
+ * Author: Cecilie Fritzvold <cecilihf at linpro.no>
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $Id$
+ */
+
+#include <sys/types.h>
+#include <sys/socket.h>
+
+#include <netinet/in.h>
+
+#include <errno.h>
+#include <netdb.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+#ifndef HAVE_STRLCPY
+#include "compat/strlcpy.h"
+#endif
+#ifndef HAVE_STRNDUP
+#include "compat/strndup.h"
+#endif
+
+#include "libvarnish.h"
+#include "vss.h"
+
+/* lightweight addrinfo */
+struct vss_addr {
+ int va_family;
+ int va_socktype;
+ int va_protocol;
+ socklen_t va_addrlen;
+ struct sockaddr_storage va_addr;
+};
+
+/*
+ * Take a string provided by the user and break it up into address and
+ * port parts. Examples of acceptable input include:
+ *
+ * "localhost" - "localhost:80"
+ * "127.0.0.1" - "127.0.0.1:80"
+ * "0.0.0.0" - "0.0.0.0:80"
+ * "[::1]" - "[::1]:80"
+ * "[::]" - "[::]:80"
+ */
+int
+VSS_parse(const char *str, char **addr, char **port)
+{
+ const char *p;
+
+ *addr = *port = NULL;
+
+ if (str[0] == '[') {
+ /* IPv6 address of the form [::1]:80 */
+ if ((p = strchr(str, ']')) == NULL ||
+ p == str + 1 ||
+ (p[1] != '\0' && p[1] != ':'))
+ return (-1);
+ *addr = strndup(str + 1, p - (str + 1));
+ XXXAN(*addr);
+ if (p[1] == ':') {
+ *port = strdup(p + 2);
+ XXXAN(*port);
+ }
+ } else {
+ /* IPv4 address of the form 127.0.0.1:80, or non-numeric */
+ p = strchr(str, ':');
+ if (p == NULL) {
+ *addr = strdup(str);
+ XXXAN(*addr);
+ } else {
+ if (p > str) {
+ *addr = strndup(str, p - str);
+ XXXAN(*addr);
+ }
+ *port = strdup(p + 1);
+ XXXAN(*port);
+ }
+ }
+ return (0);
+}
+
+/*
+ * For a given host and port, return a list of struct vss_addr, which
+ * contains all the information necessary to open and bind a socket. One
+ * vss_addr is returned for each distinct address returned by
+ * getaddrinfo().
+ *
+ * The value pointed to by the tap parameter receives a pointer to an
+ * array of pointers to struct vss_addr. The caller is responsible for
+ * freeing each individual struct vss_addr as well as the array.
+ *
+ * The return value is the number of addresses resoved, or zero.
+ */
+int
+VSS_resolve(const char *addr, const char *port, struct vss_addr ***vap)
+{
+ struct addrinfo hints, *res0, *res;
+ struct vss_addr **va;
+ int i, ret;
+
+ memset(&hints, 0, sizeof hints);
+ hints.ai_socktype = SOCK_STREAM;
+ hints.ai_flags = AI_PASSIVE;
+ ret = getaddrinfo(addr, port, &hints, &res0);
+ if (ret != 0) {
+ fprintf(stderr, "getaddrinfo(): %s\n", gai_strerror(ret));
+ return (0);
+ }
+ for (res = res0, i = 0; res != NULL; res = res->ai_next)
+ ++i;
+ va = calloc(i, sizeof *va);
+ XXXAN(va);
+ *vap = va;
+ for (res = res0, i = 0; res != NULL; res = res->ai_next, ++i) {
+ va[i] = calloc(1, sizeof *va[i]);
+ XXXAN(va[i]);
+ va[i]->va_family = res->ai_family;
+ va[i]->va_socktype = res->ai_socktype;
+ va[i]->va_protocol = res->ai_protocol;
+ va[i]->va_addrlen = res->ai_addrlen;
+ xxxassert(va[i]->va_addrlen <= sizeof va[i]->va_addr);
+ memcpy(&va[i]->va_addr, res->ai_addr, va[i]->va_addrlen);
+ }
+ freeaddrinfo(res0);
+ return (i);
+}
+
+/*
+ * Given a struct vss_addr, open a socket of the appropriate type, bind it
+ * to the requested address, and start listening.
+ *
+ * If the address is an IPv6 address, the IPV6_V6ONLY option is set to
+ * avoid conflicts between INADDR_ANY and IN6ADDR_ANY.
+ */
+int
+VSS_listen(const struct vss_addr *va, int depth)
+{
+ int sd, val;
+
+ sd = socket(va->va_family, va->va_socktype, va->va_protocol);
+ if (sd < 0) {
+ perror("socket()");
+ return (-1);
+ }
+ val = 1;
+ if (setsockopt(sd, SOL_SOCKET, SO_REUSEADDR, &val, sizeof val) != 0) {
+ perror("setsockopt(SO_REUSEADDR, 1)");
+ close(sd);
+ return (-1);
+ }
+#ifdef IPV6_V6ONLY
+ /* forcibly use separate sockets for IPv4 and IPv6 */
+ val = 1;
+ if (va->va_family == AF_INET6 &&
+ setsockopt(sd, IPPROTO_IPV6, IPV6_V6ONLY, &val, sizeof val) != 0) {
+ perror("setsockopt(IPV6_V6ONLY, 1)");
+ close(sd);
+ return (-1);
+ }
+#endif
+ if (bind(sd, (const struct sockaddr *)&va->va_addr, va->va_addrlen) != 0) {
+ perror("bind()");
+ close(sd);
+ return (-1);
+ }
+ if (listen(sd, depth) != 0) {
+ perror("listen()");
+ close(sd);
+ return (-1);
+ }
+ return (sd);
+}
+
+/*
+ * Connect to the socket specified by the address info in va.
+ * Return the socket.
+ */
+int
+VSS_connect(const struct vss_addr *va)
+{
+ int sd;
+
+ sd = socket(va->va_family, va->va_socktype, va->va_protocol);
+ if (sd < 0) {
+ perror("socket()");
+ return (-1);
+ }
+ if (connect(sd, (const struct sockaddr *)&va->va_addr, va->va_addrlen) != 0) {
+ perror("connect()");
+ close(sd);
+ return (-1);
+ }
+ return (sd);
+}


Property changes on: trunk/varnish-cache/lib/libvarnish/vss.c
___________________________________________________________________
Name: svn:keywords
+ Id