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