Commit d9f85213 authored by Dag Erling Smørgrav's avatar Dag Erling Smørgrav

Source tree structure as agreed.

git-svn-id: http://www.varnish-cache.org/svn/trunk@24 d4fa192b-c00b-0410-8231-f00ffab90ce4
parent 08fbf649
# $Id$
SUBDIRS = include lib bin
......@@ -3,6 +3,7 @@
# $Id$
#
libtoolize --copy --force
aclocal
autoheader
automake --add-missing --copy --force --foreign
......
# $Id$
SUBDIRS = varnishd
# $Id$
INCLUDES = -I$(top_srcdir)/include
bin_PROGRAMS = varnishd
varnishd_SOURCES = \
varnishd.c
#varnishd_LDADD = $(top_builddir)/lib/libvarnish/libvarnish.la
/*
* $Id$
*/
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
static void
usage(void)
{
fprintf(stderr, "usage: varnishd\n");
exit(1);
}
int
main(int argc, char *argv[])
{
int o;
while ((o = getopt(argc, argv, "")) != -1)
switch (o) {
default:
usage();
}
argc -= optind;
argv += optind;
if (argc != 0)
usage();
exit(0);
}
# $Id$
AC_PREREQ(2.59)
AC_COPYRIGHT([Copyright (c) 2006 Linpro AS])
AC_COPYRIGHT([Copyright (c) 2006 Linpro AS / Verdens Gang AS])
AC_REVISION([$Id$])
AC_INIT([Varnish], [0.1], [varnish-dev@projects.linpro.no])
AC_CONFIG_SRCDIR([varnish.c])
AC_CONFIG_SRCDIR([include/varnishapi.h])
AC_CONFIG_HEADER([config.h])
AC_CANONICAL_SYSTEM
......@@ -29,6 +29,7 @@ AC_ARG_ENABLE(werror,
AC_PROG_CC
AC_PROG_CPP
AC_PROG_INSTALL
AC_PROG_LIBTOOL
AC_PROG_MAKE_SET
# Checks for libraries.
......@@ -62,5 +63,11 @@ AC_CHECK_FUNCS([socket])
AC_CONFIG_FILES([
Makefile
include/Makefile
lib/Makefile
lib/libvarnish/Makefile
lib/libvarnishapi/Makefile
bin/Makefile
bin/varnishd/Makefile
])
AC_OUTPUT
# $Id$
include_HEADERS = varnishapi.h
/*
* $Id$
*/
#ifndef VARNISHAPI_H_INCLUDED
#define VARNISHAPI_H_INCLUDED
/* ... */
#endif
# $Id$
SUBDIRS = \
libvarnish \
libvarnishapi
# $Id$
INCLUDES = -I$(top_srcdir)/include
lib_LIBRARIES = libvarnish.la
libvarnish_la_SOURCES =
# $Id$
INCLUDES = -I$(top_srcdir)/include
lib_LIBRARIES = libvarnishapi.la
libvarnishapi_la_SOURCES =
#!/bin/sh
#
# $Id$
#
aclocal
automake --add-missing --copy --force --foreign
autoconf
# $Id$
AC_PREREQ(2.59)
AC_COPYRIGHT([Copyright (c) 2006 Linpro AS])
AC_REVISION([$Id$])
AC_INIT([Varnish-Documentation], [0.1], [varnish-dev@projects.linpro.no])
AC_CONFIG_SRCDIR([share/bibliography.xml])
AC_CANONICAL_SYSTEM
AM_INIT_AUTOMAKE(AC_PACKAGE_NAME, AC_PACKAGE_VERSION)
# Checks for programs.
AC_CHECK_PROGS(XMLLINT, xmllint,
AC_MSG_ERROR([Can't proceed without xmllint]))
AC_CHECK_PROGS(XSLTPROC, xsltproc,
AC_MSG_ERROR([Can't proceed without xsltproc]))
AC_PROG_INSTALL
AC_PROG_MAKE_SET
AC_ARG_WITH(docbook-xsl,
AS_HELP_STRING([--with-docbook-xsl=path],[use -Wall (default is NO)]),
AC_SUBST(DOCBOOK_XSL, "$withval"),
AC_MSG_ERROR([Can't proceed without DocBook stylesheets]))
AC_CONFIG_FILES([
Makefile
en/Makefile
en/varnish-specification/Makefile
])
AC_OUTPUT
This diff is collapsed.
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE bibliography
PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
"http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
<bibliography lang="en">
<biblioentry id="RFC2119" xreflabel="[RFC2119]">
<abbrev>RFC2119</abbrev>
<title>
<ulink url="http://www.faqs.org/rfcs/rfc2119.html">Key words for
use in RFCs to Indicate Requirement Levels</ulink>
</title>
<authorgroup>
<author>
<surname>Bradner</surname>
<firstname>Scott</firstname>
<affiliation>
<orgname>Harvard University</orgname>
</affiliation>
</author>
</authorgroup>
<date>March 1997</date>
<biblioset>
<title>IETF RFC</title>
<volumenum>2119</volumenum>
</biblioset>
<publisher>
<publishername>Internet Engineering Task Force</publishername>
</publisher>
</biblioentry>
<biblioentry id="RFC2186" xreflabel="[RFC2186]">
<abbrev>RFC2186</abbrev>
<title>
<ulink url="http://www.faqs.org/rfcs/rfc2186.html">Internet
Cache Protocol (ICP), version 2</ulink>
</title>
<authorgroup>
<author>
<surname>Wessels</surname>
<firstname>Duane</firstname>
<affiliation>
<orgname>National Laboratory for Applied Network Research</orgname>
</affiliation>
</author>
<author>
<surname>Claffy</surname>
<firstname>Kim</firstname>
<affiliation>
<orgname>National Laboratory for Applied Network Research</orgname>
</affiliation>
</author>
</authorgroup>
<date>September 1997</date>
<biblioset>
<title>IETF RFC</title>
<volumenum>2186</volumenum>
</biblioset>
<publisher>
<publishername>Internet Engineering Task Force</publishername>
</publisher>
</biblioentry>
<biblioentry id="RFC2616" xreflabel="[RFC2616]">
<abbrev>RFC2616</abbrev>
<title>
<ulink url="http://www.faqs.org/rfcs/rfc2616.html">Hypertext
Transfer Protocol&mdash;HTTP/1.1</ulink>
</title>
<authorgroup>
<author>
<surname>Fielding</surname>
<othername role="mi">T.</othername>
<firstname>Roy</firstname>
<affiliation>
<orgname>University of California Irvine</orgname>
</affiliation>
</author>
<author>
<surname>Gettys</surname>
<firstname>James</firstname>
<affiliation>
<orgname>World Wide Web Consortium</orgname>
</affiliation>
</author>
<author>
<surname>Mogul</surname>
<othername role="mi">C.</othername>
<firstname>Jeffrey</firstname>
<affiliation>
<orgdiv>Western Research Laboratory</orgdiv>
<orgname>Compaq Computer Corporation</orgname>
</affiliation>
</author>
<author>
<surname>Nielsen</surname>
<othername role="mi">Frystyk</othername>
<firstname>Henrik</firstname>
<affiliation>
<orgname>World Wide Web Consortium</orgname>
</affiliation>
</author>
<author>
<surname>Masinter</surname>
<firstname>Larry</firstname>
<affiliation>
<orgname>Xerox Corporation</orgname>
</affiliation>
</author>
</authorgroup>
<date>June 1999</date>
<biblioset>
<title>IETF RFC</title>
<volumenum>2616</volumenum>
</biblioset>
<publisher>
<publishername>Internet Engineering Task Force</publishername>
</publisher>
</biblioentry>
<biblioentry id="RFC2756" xreflabel="[RFC2756]">
<abbrev>RFC2756</abbrev>
<title>
<ulink url="http://www.faqs.org/rfcs/rfc2756.html">Hyper Text
Caching Protocol (HTCP/0.0)</ulink>
</title>
<authorgroup>
<author>
<surname>Vixie</surname>
<firstname>Paul</firstname>
<affiliation>
<orgname>Internet Software Consortium</orgname>
</affiliation>
</author>
<author>
<surname>Wessels</surname>
<firstname>Duane</firstname>
<affiliation>
<orgname>National Laboratory for Applied Network Research</orgname>
</affiliation>
</author>
</authorgroup>
<date>January 2000</date>
<biblioset>
<title>IETF RFC</title>
<volumenum>2756</volumenum>
</biblioset>
<publisher>
<publishername>Internet Engineering Task Force</publishername>
</publisher>
</biblioentry>
<biblioentry id="RFC3507" xreflabel="[RFC3507]">
<abbrev>RFC3507</abbrev>
<title>
<ulink url="http://www.faqs.org/rfcs/rfc3507.html">Internet
Content Adaptation Protocol (ICAP)</ulink>
</title>
<authorgroup>
<author>
<surname>Elson</surname>
<firstname>Jeremy</firstname>
<affiliation>
<orgname>University of California Los Angeles</orgname>
</affiliation>
</author>
<author>
<surname>Cerpa</surname>
<firstname>Alberto</firstname>
<affiliation>
<orgname>University of California Los Angeles</orgname>
</affiliation>
</author>
</authorgroup>
<date>April 2003</date>
<biblioset>
<title>IETF RFC</title>
<volumenum>3507</volumenum>
</biblioset>
<publisher>
<publishername>Internet Engineering Task Force</publishername>
</publisher>
</biblioentry>
</bibliography>
/* $Id$ */
article, book {
background-color: white;
color: black;
font-family: sans-serif;
margin: 1in;
}
/*
* Titles
*/
title {
display: block;
color: maroon;
}
article > title,
article > articleinfo > title,
book > title,
book > bookinfo > title
{
font-weight: bold;
font-size: 200%;
}
/* level 0 */
article > section,
article > appendix,
article > bibliography,
book > chapter,
book > appendix,
book > bibliography
{
counter-increment: sect0;
counter-reset: sect1;
}
article > section > title:before,
article > appendix > title:before,
article > bibliography > title:before,
book > chapter > title:before,
book > appendix > title:before,
book > bibliography > title:before
{
content: counter(sect0) ". ";
}
article > section > title,
article > appendix > title,
article > bibliography > title,
book > chapter > title,
book > appendix > title,
book > bibliography > title
{
font-weight: bold;
font-size: xx-large;
}
/* level 1 */
article > section > section,
article > appendix > section,
article > bibliography > bibliodiv,
book > chapter > section,
book > appendix > section,
book > bibliography > bibliodiv
{
counter-increment: sect1;
counter-reset: sect2;
}
article > section > section > title:before,
article > appendix > section > title:before,
article > bibliography > bibliodiv > title:before,
book > chapter > section > title:before,
book > appendix > section > title:before,
book > bibliography > bibliodiv > title:before
{
content: counter(sect0) "." counter(sect1) ". ";
}
article > section > section > title,
article > appendix > section > title,
article > bibliography > bibliodiv > title,
book > chapter > section > title,
book > appendix > section > title,
book > bibliography > bibliodiv > title
{
font-weight: bold;
font-size: x-large;
}
/* level 2 */
article > section > section > section,
article > appendix > section > section,
book > chapter > section > section,
book > appendix > section > section
{
counter-increment: sect2;
counter-reset: sect3;
}
article > section > section > section > title:before,
article > appendix > section > section > title:before,
book > chapter > section > section > title:before,
book > appendix > section > section > title:before
{
content: counter(sect0) "." counter(sect1) "." counter(sect2) ". ";
}
article > section > section > section > title,
article > appendix > section > section > title,
book > chapter > section > section > title,
book > appendix > section > section > title
{
font-weight: bold;
font-size: large;
}
/*
* Sections and paragraphs
*/
chapter, appendix, bibliography {
display: block;
margin-top: 3em;
}
section {
display: block;
margin-top: 1em;
}
para {
display: block;
margin-top: 1ex;
}
/*
* Lists
*/
orderedlist, itemizedlist {
display: block;
}
orderedlist > listitem {
display: list-item;
list-style-type: roman inside;
margin-left: 4em;
}
itemizedlist > listitem {
display: list-item;
list-style-type: disc inside;
margin-left: 4em;
}
/*
* Links
*/
xref:before {
content: "[";
}
xref {
color: blue;
font-decoration: underline;
}
xref:after {
content: "]";
}
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 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$
bin_PROGRAMS = varnish
varnish_SOURCES = \
connection.c \
listener.c \
log.c \
request.c \
system-common.c \
system-@target_os@.c \
varnish.c
/*
* $Id$
*/
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <stdlib.h>
#include <unistd.h>
#include "varnish.h"
#include "log.h"
#include "connection.h"
struct connection {
int sd;
struct sockaddr_storage addr;
};
/*
* Accepts a connection from the provided listening descriptor. Does not
* loop to handle EINTR or other similar conditions.
*/
connection_t *
connection_accept(int ld)
{
connection_t *c;
socklen_t len;
if ((c = calloc(1, sizeof *c)) == NULL)
return (NULL);
len = sizeof c->addr;
if ((c->sd = accept(ld, (struct sockaddr *)&c->addr, &len)) == -1) {
free(c);
return (NULL);
}
switch (c->addr.ss_family) {
#if defined(AF_INET6)
case AF_INET6: {
struct sockaddr_in6 *addr =
(struct sockaddr_in6 *)&c->addr;
uint16_t *ip = (uint16_t *)&addr->sin6_addr;
log_info("%s(): [%04x:%04x:%04x:%04x:%04x:%04x:%04x:%04x]:%u",
__func__,
ntohs(ip[0]), ntohs(ip[1]),
ntohs(ip[2]), ntohs(ip[3]),
ntohs(ip[4]), ntohs(ip[5]),
ntohs(ip[6]), ntohs(ip[7]),
ntohs(addr->sin6_port));
break;
}
#endif
case AF_INET: {
struct sockaddr_in *addr =
(struct sockaddr_in *)&c->addr;
uint8_t *ip = (uint8_t *)&addr->sin_addr;
log_info("%s(): %u.%u.%u.%u:%u",
__func__,
ip[0], ip[1], ip[2], ip[3],
ntohs(addr->sin_port));
break;
}
default:
LOG_UNREACHABLE();
}
return (c);
}
void
connection_destroy(struct connection *c)
{
close(c->sd);
/* bzero(c, sizeof *c); */
free(c);
}
/*
* $Id$
*/
#ifndef CONNECTION_H_INCLUDED
#define CONNECTION_H_INCLUDED
typedef struct connection connection_t;
connection_t *connection_accept(int ld);
void connection_destroy(connection_t *c);
#endif
/*
* $Id$
*/
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <errno.h>
#include <stddef.h>
#include <stdlib.h>
#include <unistd.h>
#include "varnish.h"
#include "connection.h"
#include "listener.h"
#include "log.h"
struct listener {
int sd;
struct sockaddr_storage addr;
};
/*
* Create a socket that listens on the specified port. We use an IPv6 TCP
* socket and clear the IPV6_V6ONLY option to accept IPv4 connections on
* the same socket.
*/
struct listener *
listener_create(int port)
{
struct listener *l;
socklen_t addr_len;
int zero = 0;
l = calloc(1, sizeof *l);
if (l == NULL) {
log_syserr("calloc()");
return (NULL);
}
l->sd = -1;
#if defined(AF_INET6) && defined(IPV6_V6ONLY)
if ((l->sd = socket(AF_INET6, SOCK_STREAM, 0)) > 0) {
struct sockaddr_in6 *addr = (struct sockaddr_in6 *)&l->addr;
#ifdef HAVE_STRUCT_SOCKADDR_SA_LEN
addr->sin6_len =
#endif
addr_len = sizeof *addr;
addr->sin6_family = AF_INET6;
addr->sin6_port = htons(port);
if (setsockopt(l->sd, IPPROTO_IPV6, IPV6_V6ONLY, &zero, sizeof zero) != 0) {
log_syserr("setsockopt()");
return (NULL);
}
} else if (errno != EPROTONOSUPPORT) {
log_syserr("socket()");
return (NULL);
} else
#endif
if ((l->sd = socket(AF_INET, SOCK_STREAM, 0)) > 0) {
struct sockaddr_in *addr = (struct sockaddr_in *)&l->addr;
#ifdef HAVE_STRUCT_SOCKADDR_SA_LEN
addr->sin_len =
#endif
addr_len = sizeof *addr;
addr->sin_family = AF_INET;
addr->sin_port = htons(port);
} else {
log_syserr("socket()");
return (NULL);
}
if (bind(l->sd, (struct sockaddr *)&l->addr, addr_len) != 0) {
log_syserr("bind()");
return (NULL);
}
if (listen(l->sd, 16) != 0) {
log_syserr("listen()");
return (NULL);
}
return (l);
}
void
listener_destroy(struct listener *l)
{
close(l->sd);
/* bzero(l, sizeof *l); */
free(l);
}
connection_t *
listener_accept(struct listener *l)
{
connection_t *c;
for (;;) {
if ((c = connection_accept(l->sd)) != NULL)
return (c);
if (errno != EINTR) {
log_syserr("accept()");
free(c);
return (NULL);
}
}
}
/*
* $Id$
*/
#ifndef LISTENER_H_INCLUDED
#define LISTENER_H_INCLUDED
#include "connection.h"
typedef struct listener listener_t;
listener_t *listener_create(int port);
void listener_destroy(listener_t *l);
connection_t *listener_accept(listener_t *l);
#endif
/*
* $Id$
*/
#include <sys/types.h>
#include <sys/signal.h>
#include <sys/time.h>
#include <errno.h>
#include <signal.h>
#include <stdarg.h>
#include <stdio.h>
#include <string.h>
#ifdef TIME_WITH_SYS_TIME
#include <time.h>
#endif
#include <unistd.h>
#include "varnish.h"
#include "log.h"
#include "system.h"
static void
timestamp(void)
{
struct timeval now;
if (gettimeofday(&now, NULL) == -1)
now.tv_sec = now.tv_usec = 0;
fprintf(stderr, "%lu.%06lu [%lu] ",
(unsigned long)now.tv_sec,
(unsigned long)now.tv_usec,
(unsigned long)sys.pid);
}
static void
emit(const char *fmt, va_list ap)
{
timestamp();
vfprintf(stderr, fmt, ap);
fprintf(stderr, "\n");
}
static void
sysemit(const char *fmt, va_list ap)
{
char errstr[64];
#if defined(HAVE_STRERROR_R)
strerror_r(errno, errstr, sizeof errstr);
#else
snprintf(errstr, sizeof errstr, "%s", strerror(errno));
#endif
timestamp();
vfprintf(stderr, fmt, ap);
fprintf(stderr, ": %s\n", errstr);
}
static void
panic(void)
{
signal(SIGABRT, SIG_DFL);
kill(getpid(), SIGABRT);
}
void
log_info(const char *fmt, ...)
{
va_list ap;
va_start(ap, fmt);
emit(fmt, ap);
va_end(ap);
}
void
log_err(const char *fmt, ...)
{
va_list ap;
va_start(ap, fmt);
emit(fmt, ap);
va_end(ap);
}
void
log_syserr(const char *fmt, ...)
{
va_list ap;
va_start(ap, fmt);
sysemit(fmt, ap);
va_end(ap);
}
void
log_panic(const char *fmt, ...)
{
va_list ap;
va_start(ap, fmt);
emit(fmt, ap);
va_end(ap);
panic();
}
void
log_syspanic(const char *fmt, ...)
{
va_list ap;
va_start(ap, fmt);
sysemit(fmt, ap);
va_end(ap);
panic();
}
/*
* $Id$
*/
#ifndef LOG_H_INCLUDED
#define LOG_H_INCLUDED
void log_info(const char *fmt, ...);
void log_err(const char *fmt, ...);
void log_syserr(const char *fmt, ...);
void log_panic(const char *fmt, ...);
void log_syspanic(const char *fmt, ...);
#define LOG_UNREACHABLE() \
log_panic("%s(%d): %s(): unreachable code reached", \
__FILE__, __LINE__, __func__)
#endif
/*
* $Id$
*/
#include <stdlib.h>
#include "varnish.h"
#include "connection.h"
#include "log.h"
#include "request.h"
struct request {
connection_t *conn;
};
request_t *
request_wait(connection_t *c, unsigned int timeout)
{
request_t *r;
r = calloc(1, sizeof *r);
if (r == NULL) {
log_syserr("calloc()");
return (NULL);
}
/* ... */
return (r);
}
void
request_destroy(request_t *r)
{
/* bzero(r, sizeof *r); */
free(r);
}
/*
* $Id$
*/
#ifndef REQUEST_H_INCLUDED
#define REQUEST_H_INCLUDED
typedef struct request request_t;
request_t *request_wait(connection_t *c, unsigned int timeout);
void request_destroy(request_t *r);
#endif
/*
* $Id$
*/
#include <sys/types.h>
#include <unistd.h>
#include "varnish.h"
#include "system.h"
system_t sys;
/*
* gather system information at startup
*/
void
system_init(void)
{
sys.pid = getpid();
system_init_ncpu();
}
/*
* fork() wrapper, updates sys.pid
*/
pid_t
system_fork(void)
{
pid_t pid;
if ((pid = fork()) == 0)
sys.pid = getpid();
return (pid);
}
/*
* $Id$
*/
#include <sys/types.h>
#include <sys/sysctl.h>
#include "varnish.h"
#include "log.h"
#include "system.h"
void
system_init_ncpu(void)
{
size_t size;
size = sizeof sys.ncpu;
if (sysctlbyname("hw.ncpu", &sys.ncpu, &size, 0, 0) == -1)
sys.ncpu = 1;
log_info("%d cpu(s)", sys.ncpu);
}
system-freebsd.c
\ No newline at end of file
system-freebsd.c
\ No newline at end of file
system-freebsd.c
\ No newline at end of file
/*
* $Id$
*/
#include <sys/types.h>
#include <stdio.h>
#include "varnish.h"
#include "log.h"
#include "system.h"
void
system_init_ncpu(void)
{
FILE *cpuinfo;
char line[256];
int n;
sys.ncpu = 0;
if ((cpuinfo = fopen("/proc/cpuinfo", "r")) == NULL)
return;
while (fgets(line, sizeof line, cpuinfo) != NULL) {
if (sscanf(line, "processor : %d", &n) == 1)
sys.ncpu++;
}
fclose(cpuinfo);
if (sys.ncpu == 0)
sys.ncpu = 1;
log_info("%d cpu(s)", sys.ncpu);
}
/*
* $Id$
*/
#ifndef SYSTEM_H_INCLUDED
#define SYSTEM_H_INCLUDED
typedef struct system system_t;
struct system {
int ncpu;
pid_t pid;
};
extern system_t sys;
void system_init_ncpu(void);
void system_init(void);
pid_t system_fork(void);
#endif
/*
* $Id$
*/
#include <sys/wait.h>
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include "varnish.h"
#include "connection.h"
#include "listener.h"
#include "log.h"
#include "request.h"
#include "system.h"
static void
varnish_child(listener_t *l)
{
connection_t *c;
request_t *r;
while ((c = listener_accept(l)) != NULL) {
r = request_wait(c, 0);
/* ... */
request_destroy(r);
connection_destroy(c);
}
LOG_UNREACHABLE();
}
static void
varnish(void)
{
listener_t *l;
int i, status;
pid_t pid;
system_init();
log_info("starting Varnish");
l = listener_create(8080);
for (i = 0; i < sys.ncpu; ++i) {
switch ((pid = system_fork())) {
case -1:
log_panic("fork()");
break;
case 0:
varnish_child(l);
_exit(1);
break;
default:
log_info("forked child %lu", (unsigned long)pid);
break;
}
}
for (;;) {
if ((pid = wait(&status)) == -1) {
if (errno == ECHILD)
return;
} else {
log_info("child %lu exited", (unsigned long)pid);
}
}
}
static void
usage(void)
{
fprintf(stderr, "usage: varnish\n");
exit(1);
}
int
main(int argc, char *argv[])
{
int o;
while ((o = getopt(argc, argv, "")) != -1)
switch (o) {
default:
usage();
}
argc -= optind;
argv += optind;
if (argc != 0)
usage();
varnish();
exit(1);
}
/*
* $Id$
*/
#ifndef VARNISH_H_INCLUDED
#define VARNISH_H_INCLUDED
#include "config.h"
#endif
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment