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");
}