Simple tux module won't working

"Andrew Kirilenko" <[email protected]> Thu, 26 Aug 2004 04:55:05 +0200 (MEST)
Newsgroups gmane.network.tux
Message-ID <[email protected]>
Hello!

Can somebody explain me what I'm doing wrong...

Best regards,
Andrew.

-- 
Supergünstige DSL-Tarife + WLAN-Router für 0,- EUR*
Jetzt zu GMX wechseln und sparen http://www.gmx.net/de/go/dsl

_______________________________________________
tux-list mailing list
[email protected]
https://www.redhat.com/mailman/listinfo/tux-list
tuxcache.c (application/octet-stream, 2.6 KB)
#include <unistd.h>
#include <tuxmodule.h>

#ifdef TUXAPI_declare
TUXAPI_declare;
#endif

#define MASTER_SERVER "iced"
#define MASTER_PORT 80
#define CACHE_DIR "/tmp/tuxcache"
#define LOG_FILE "/tmp/tuxcache.log"

#define LOG_MSG(fmt, args...) { \
	FILE *logf = fopen(LOG_FILE, "at"); \
	fprintf(logf, fmt, ##args); \
	fclose(logf); \
}

struct sockaddr_in proxy_sock;

int connect_to_master()
{
	int proxy_fd;

	proxy_fd = socket(AF_INET, SOCK_STREAM, 0);
	if (connect(proxy_fd, (struct sockaddr *)&proxy_sock, sizeof(proxy_sock)) < 0)
	{
		LOG_MSG("can't connect to master server (%s:%d)\n", MASTER_SERVER, MASTER_PORT);
		return -1;
	}
	return proxy_fd;
}

int start_retrive_file(user_req_t *req)
{
	int *proxy_fd;
	int ret;

	proxy_fd = (int *)malloc(sizeof(int));
	*proxy_fd = connect_to_master(); 

	req->event = 1;
	req->object_addr = (void *)proxy_fd;
	ret = tux(TUX_ACTION_WATCH_PROXY_SOCKET, req);

	write(*proxy_fd, req->query, strlen(req->query));
	
	req->event = 1;
	req->object_addr = (void *)proxy_fd;
	ret = tux(TUX_ACTION_WAIT_PROXY_SOCKET, req);

	return ret;
}

int continue_retrive_file(user_req_t *req)
{
	int len;
	int ret;
	char buf[1024];

	len = recv(*((int *)req->object_addr), buf, 1024, MSG_DONTWAIT);
	if (len == -EAGAIN)
	{
		req->event = 1;
		ret = tux(TUX_ACTION_WAIT_PROXY_SOCKET, req);
	}
	else if (len > 0)
	{
		req->event = 1;
		ret = tux(TUX_ACTION_WAIT_PROXY_SOCKET, req);
		write(req->sock, buf, len);
	}
	else
	{
		ret = -1;
	}
	return ret;
}

int finish_retrive_file(user_req_t *req)
{
	int ret;
	
	ret = tux(TUX_ACTION_FINISH_CLOSE_REQ, req);
	close(*((int *)req->object_addr));
	free((int *)req->object_addr);
	return ret;
}

int TUXAPI_handle_events(user_req_t *req)
{
	int ret;

	LOG_MSG("received request\n");
	
	ret = TUX_RETURN_USERSPACE_REQUEST;
	switch (req->event)
	{
		case 0:
		{
			LOG_MSG("query is %s\n", req->query);
			ret = start_retrive_file(req);
			break;
		}
		case 1:
		{
			ret = continue_retrive_file(req);
			if (ret == -1)
				ret = finish_retrive_file(req);
			break;
		}
			
	}

	return ret;
}

void TUXAPI_init(void)
{
	unsigned char addr[4];

	LOG_MSG("starting\n");
	
	proxy_sock.sin_family = AF_INET;
	proxy_sock.sin_port = htons(MASTER_PORT);
	
	if (sscanf(MASTER_SERVER, "%d.%d.%d.%d", &addr[0], &addr[1], &addr[2], &addr[3]))
	{
		/* TODO: smth wrong here */
		proxy_sock.sin_addr.s_addr = inet_addr(MASTER_SERVER);
	}
	else
	{
		struct hostent *proxy_he;
		proxy_he = gethostbyname(MASTER_SERVER);
		if (!proxy_he)
		{
			LOG_MSG("can't find master server (%s)\n", MASTER_SERVER);
			exit(-1);
		}
		proxy_sock.sin_addr.s_addr = ((unsigned long *)(proxy_he->h_addr_list[0]))[0];
	}

	LOG_MSG("done\n");
}