1748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat/*
2748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    This file is part of libmicrospdy
3748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    Copyright Copyright (C) 2013 Andrey Uzunov
4748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
5748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    This program is free software: you can redistribute it and/or modify
6748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    it under the terms of the GNU General Public License as published by
7748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    the Free Software Foundation, either version 3 of the License, or
8748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    (at your option) any later version.
9748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
10748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    This program is distributed in the hope that it will be useful,
11748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    but WITHOUT ANY WARRANTY; without even the implied warranty of
12748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    GNU General Public License for more details.
14748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
15748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    You should have received a copy of the GNU General Public License
16748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    along with this program.  If not, see <http://www.gnu.org/licenses/>.
17748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat*/
18748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
19748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat/**
20748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat * @file misc.c
21748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat * @brief  tests a lot of small calls and callbacks. TODO mention what
22748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat * @author Andrey Uzunov
23748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat */
24748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
25748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#include "platform.h"
26748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#include "microspdy.h"
27748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#include "stdio.h"
28748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#include <sys/wait.h>
29748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#include "common.h"
30748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
31748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Eratint port;
32748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
33748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#define HTML "<html><head>\
34748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat<link href=\"main.css\" rel=\"stylesheet\" type=\"text/css\" />\
35748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat</head><body>This is libmicrospdy</body></html>"
36748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
37748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#define CSS "body{font-size:15px}"
38748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
39748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#define SESSION_CLS "1234567890"
40748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
41748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#define REQUEST_CLS "1234567890REQ"
42748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
43748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Eratpid_t parent;
44748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Eratpid_t child;
45748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
46748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Eratstruct SPDY_Session *session1;
47748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Eratstruct SPDY_Session *session2;
48748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
49748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Eratvoid
50748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Eratkillchild()
51748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat{
52748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat	kill(child, SIGKILL);
53748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat	exit(1);
54748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat}
55748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
56748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Eratvoid
57748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Eratkillparent()
58748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat{
59748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat	kill(parent, SIGKILL);
60748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat	_exit(1);
61748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat}
62748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
63748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
64748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Eratvoid
65748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Eratcreate_child()
66748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat{
67748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat	parent = getpid();
68748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
69748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat	child = fork();
70748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat	if (-1 == child)
71748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat	{
72748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat		fprintf(stderr, "can't fork, error %d\n", errno);
73748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat		exit(EXIT_FAILURE);
74748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat	}
75748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
76748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat	if (child == 0)
77748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat	{
78748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat		int devnull;
79748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat		char *uri;
80748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat		fflush(stdout);
81748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat		devnull = open("/dev/null", O_WRONLY);
82748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat                if (-1 == devnull)
83748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat                  abort ();
84748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat		if (1 != devnull)
85748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat		{
86748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat			dup2(devnull, 1);
87748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat			close(devnull);
88748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat		}
89748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat		asprintf(&uri,"https://127.0.0.1:%i/",port);
90748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat		execlp("spdycat", "spdycat","-anv",uri,NULL );
91748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat		printf("execlp failed\n");
92748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat		killparent();
93748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat	}
94748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat}
95748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
96748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Eratvoid
97748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Eratresponse_done_callback(void *cls,
98748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat								struct SPDY_Response * response,
99748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat								struct SPDY_Request * request,
100748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat								enum SPDY_RESPONSE_RESULT status,
101748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat						bool streamopened)
102748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat{
103748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  (void)status;
104748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  (void)streamopened;
105748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
106748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat	if(strcmp(cls,"/main.css"))
107748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat	{
108748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat		session1 = SPDY_get_session_for_request(request);
109748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat		if(NULL == session1)
110748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat		{
111748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat			printf("SPDY_get_session_for_request failed\n");
112748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat			killchild();
113748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat		}
114748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
115748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat		char *session_cls = strdup(SESSION_CLS);
116748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat		SPDY_set_cls_to_session(session1,session_cls);
117748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat	}
118748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat	else
119748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat	{
120748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat		session2 = SPDY_get_session_for_request(request);
121748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat		if(session1 != session2)
122748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat		{
123748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat			printf("SPDY_get_session_for_request failed the second time\n");
124748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat			killchild();
125748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat		}
126748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat		printf("SPDY_get_session_for_request tested...\n");
127748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
128748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat		void *session_cls = SPDY_get_cls_from_session(session2);
129748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat		if(NULL == session_cls || strcmp(session_cls, SESSION_CLS))
130748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat		{
131748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat			printf("SPDY_get_cls_from_session failed\n");
132748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat			killchild();
133748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat		}
134748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat		printf("SPDY_set_cls_to_session tested...\n");
135748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat		printf("SPDY_get_cls_from_session tested...\n");
136748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
137748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat		void *request_cls = SPDY_get_cls_from_request(request);
138748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat		if(NULL == request_cls || strcmp(request_cls, REQUEST_CLS))
139748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat		{
140748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat			printf("SPDY_get_cls_from_request failed\n");
141748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat			killchild();
142748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat		}
143748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat		printf("SPDY_set_cls_to_request tested...\n");
144748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat		printf("SPDY_get_cls_from_request tested...\n");
145748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat	}
146748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
147748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat	SPDY_destroy_request(request);
148748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat	SPDY_destroy_response(response);
149748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat	free(cls);
150748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat}
151748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
152748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Eratvoid
153748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Eratstandard_request_handler(void *cls,
154748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat						struct SPDY_Request * request,
155748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat						uint8_t priority,
156748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat                        const char *method,
157748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat                        const char *path,
158748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat                        const char *version,
159748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat                        const char *host,
160748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat                        const char *scheme,
161748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat						struct SPDY_NameValue * headers,
162748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat            bool more)
163748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat{
164748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat	(void)cls;
165748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat	(void)request;
166748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat	(void)priority;
167748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat	(void)host;
168748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat	(void)scheme;
169748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat	(void)headers;
170748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat	(void)method;
171748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat	(void)version;
172748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat	(void)more;
173748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
174748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat	struct SPDY_Response *response=NULL;
175748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat	char *cls_path = strdup(path);
176748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
177748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat	if(strcmp(path,"/main.css")==0)
178748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat	{
179748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat		char *request_cls = strdup(REQUEST_CLS);
180748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat		SPDY_set_cls_to_request(request,request_cls);
181748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat		response = SPDY_build_response(200,NULL,SPDY_HTTP_VERSION_1_1,NULL,CSS,strlen(CSS));
182748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat	}
183748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat	else
184748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat	{
185748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat		response = SPDY_build_response(200,NULL,SPDY_HTTP_VERSION_1_1,NULL,HTML,strlen(HTML));
186748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat	}
187748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
188748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat	if(NULL==response){
189748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat		fprintf(stdout,"no response obj\n");
190748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat		killchild();
191748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat	}
192748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
193748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat	if(SPDY_queue_response(request,response,true,false,&response_done_callback,cls_path)!=SPDY_YES)
194748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat	{
195748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat		fprintf(stdout,"queue\n");
196748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat		killchild();
197748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat	}
198748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat}
199748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
200748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Eratint
201748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Eratparentproc()
202748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat{
203748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat	int childstatus;
204748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat	unsigned long long timeoutlong=0;
205748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat	struct timeval timeout;
206748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat	int ret;
207748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat	fd_set read_fd_set;
208748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat	fd_set write_fd_set;
209748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat	fd_set except_fd_set;
210748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat	int maxfd = -1;
211748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat	struct SPDY_Daemon *daemon;
212748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
213748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat	daemon = SPDY_start_daemon(port,
214748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat								DATA_DIR "cert-and-key.pem",
215748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat								DATA_DIR "cert-and-key.pem",
216748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat								NULL,
217748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat								NULL,
218748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat								&standard_request_handler,
219748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat								NULL,
220748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat								NULL,
221748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat								SPDY_DAEMON_OPTION_SESSION_TIMEOUT,
222748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat								1800,
223748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat								SPDY_DAEMON_OPTION_END);
224748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
225748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat	if(NULL==daemon){
226748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat		printf("no daemon\n");
227748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat		return 1;
228748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat	}
229748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
230748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat	create_child();
231748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
232748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat	do
233748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat	{
234748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat		FD_ZERO(&read_fd_set);
235748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat		FD_ZERO(&write_fd_set);
236748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat		FD_ZERO(&except_fd_set);
237748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
238748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat		ret = SPDY_get_timeout(daemon, &timeoutlong);
239748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat		if(SPDY_NO == ret || timeoutlong > 1000)
240748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat		{
241748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat			timeout.tv_sec = 1;
242748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat      timeout.tv_usec = 0;
243748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat		}
244748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat		else
245748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat		{
246748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat			timeout.tv_sec = timeoutlong / 1000;
247748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat			timeout.tv_usec = (timeoutlong % 1000) * 1000;
248748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat		}
249748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
250748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat		maxfd = SPDY_get_fdset (daemon,
251748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat								&read_fd_set,
252748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat								&write_fd_set,
253748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat								&except_fd_set);
254748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
255748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat		ret = select(maxfd+1, &read_fd_set, &write_fd_set, &except_fd_set, &timeout);
256748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
257748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat		switch(ret) {
258748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat			case -1:
259748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat				printf("select error: %i\n", errno);
260748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat				break;
261748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat			case 0:
262748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
263748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat				break;
264748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat			default:
265748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat				SPDY_run(daemon);
266748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
267748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat			break;
268748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat		}
269748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat	}
270748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat	while(waitpid(child,&childstatus,WNOHANG) != child);
271748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
272748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat	SPDY_stop_daemon(daemon);
273748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
274748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat	return WEXITSTATUS(childstatus);
275748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat}
276748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
277748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
278748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Eratint
279748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Eratmain()
280748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat{
281748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat	port = get_port(13123);
282748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat	SPDY_init();
283748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
284748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat	int ret = parentproc();
285748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
286748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat	SPDY_deinit();
287748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
288748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat	return ret;
289748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat}
290