Sophie

Sophie

distrib > Mandriva > 8.2 > i586 > media > contrib > by-pkgid > 0c3b27e96d9e34935eb8f552af26d2e9 > files > 8

libtux-devel-2.1.1-2mdk.i586.rpm

/*
 * demo3.c: sample event-driven module showing how to
 *          handle postponed requests.
 */

#include <unistd.h>

#include "tuxmodule.h"

#define REPLY_HEADER "HTTP/1.0 200 OK\r\nContent-Type: text/html\r\n\r\n"
#define REPLY_HEADER_LEN (sizeof(REPLY_HEADER)-1)

int TUXAPI_handle_events (user_req_t *req)
{
	int ret = TUX_RETURN_USERSPACE_REQUEST;

	switch (req->event) {
		/*
		 * A new request starts with event code 0.
		 */
		case 0:
			if (!req->query[0])
				goto abort;
        		write (req->sock, REPLY_HEADER, REPLY_HEADER_LEN);
			req->http_status = 200;

			/*
			 * set req->objectname is to the requested object
			 * in the query string. This simulates
			 * simple static GETs.
			 */
			strcpy(req->objectname, req->query);

			req->event = 1;
			ret = tux(TUX_ACTION_GET_OBJECT, req);
			break;

		case 1:
		{
			int pid;

			req->event = 2;
			ret = tux(TUX_ACTION_POSTPONE_REQ, req);
			pid = fork();
			if (!pid) {
				sleep(3);
				ret = tux(TUX_ACTION_CONTINUE_REQ,
					(user_req_t *)req->sock);
				exit(0);
			}
			ret = tux(TUX_ACTION_EVENTLOOP, req);
			break;
		}
		case 2:
			req->event = 3;
			ret = tux(TUX_ACTION_SEND_OBJECT, req);
			break;

		case 3:
abort:
			ret = tux(TUX_ACTION_FINISH_CLOSE_REQ, req);
			break;
	}
	return ret;
}