X-Git-Url: https://git.m6w6.name/?a=blobdiff_plain;f=example%2Fmemcached_light.c;h=c064e5199efff18a16635bbc07f477d6e9e78743;hb=9c5fa1db34c5fb1ffed88742caeffa5a9afd0a9e;hp=e2689e03a43ca515ae24346db7d94d0e8c9f964c;hpb=3430cb015fb0add207ff733f484dbb4a9fed3655;p=awesomized%2Flibmemcached diff --git a/example/memcached_light.c b/example/memcached_light.c index e2689e03..c064e519 100644 --- a/example/memcached_light.c +++ b/example/memcached_light.c @@ -26,9 +26,6 @@ #include "config.h" #include #include -#include -#include -#include #include #include #include @@ -37,15 +34,16 @@ #include #include -#include -#include -#include "storage.h" -#include "memcached_light.h" +#include +#include +#include +#include "example/storage.h" +#include "example/memcached_light.h" extern memcached_binary_protocol_callback_st interface_v0_impl; extern memcached_binary_protocol_callback_st interface_v1_impl; -static int server_sockets[1024]; +static memcached_socket_t server_sockets[1024]; static int num_server_sockets= 0; struct connection @@ -75,7 +73,7 @@ typedef struct options_st options_st; * @param which identifying the event that occurred (not used) * @param arg the connection structure for the client */ -static void drive_client(int fd, short which, void *arg) +static void drive_client(memcached_socket_t fd, short which, void *arg) { (void)which; struct connection *client= arg; @@ -86,7 +84,7 @@ static void drive_client(int fd, short which, void *arg) if (events & MEMCACHED_PROTOCOL_ERROR_EVENT) { memcached_protocol_client_destroy(c); - (void)close(fd); + closesocket(fd); } else { short flags = 0; if (events & MEMCACHED_PROTOCOL_WRITE_EVENT) @@ -99,14 +97,14 @@ static void drive_client(int fd, short which, void *arg) flags|= EV_READ; } - event_set(&client->event, fd, flags, drive_client, client); + event_set(&client->event, (intptr_t)fd, flags, drive_client, client); event_base_set(event_base, &client->event); if (event_add(&client->event, 0) == -1) { (void)fprintf(stderr, "Failed to add event for %d\n", fd); memcached_protocol_client_destroy(c); - (void)close(fd); + closesocket(fd); } } } @@ -117,47 +115,49 @@ static void drive_client(int fd, short which, void *arg) * @param which identifying the event that occurred (not used) * @param arg the connection structure for the server */ -static void accept_handler(int fd, short which, void *arg) +static void accept_handler(memcached_socket_t fd, short which, void *arg) { (void)which; struct connection *server= arg; /* accept new client */ struct sockaddr_storage addr; socklen_t addrlen= sizeof(addr); - int sock= accept(fd, (struct sockaddr *)&addr, &addrlen); + memcached_socket_t sock= accept(fd, (struct sockaddr *)&addr, &addrlen); - if (sock == -1) + if (sock == INVALID_SOCKET) { perror("Failed to accept client"); return ; } +#ifndef WIN32 if (sock >= maxconns) { (void)fprintf(stderr, "Client outside socket range (specified with -c)\n"); - (void)close(sock); + closesocket(sock); return ; } +#endif struct memcached_protocol_client_st* c; c= memcached_protocol_create_client(server->userdata, sock); if (c == NULL) { (void)fprintf(stderr, "Failed to create client\n"); - (void)close(sock); + closesocket(sock); } else { struct connection *client = &socket_userdata_map[sock]; client->userdata= c; - event_set(&client->event, sock, EV_READ, drive_client, client); + event_set(&client->event, (intptr_t)sock, EV_READ, drive_client, client); event_base_set(event_base, &client->event); if (event_add(&client->event, 0) == -1) { (void)fprintf(stderr, "Failed to add event for %d\n", sock); memcached_protocol_client_destroy(c); - (void)close(sock); + closesocket(sock); } } } @@ -181,25 +181,35 @@ static int server_socket(const char *port) else perror("getaddrinfo()"); - return 1; + return 0; } struct linger ling= {0, 0}; for (struct addrinfo *next= ai; next; next= next->ai_next) { - int sock= socket(ai->ai_family, ai->ai_socktype, ai->ai_protocol); - if (sock == -1) + memcached_socket_t sock= socket(ai->ai_family, ai->ai_socktype, ai->ai_protocol); + if (sock == INVALID_SOCKET) { perror("Failed to create socket"); continue; } - int flags= fcntl(sock, F_GETFL, 0); + int flags; +#ifdef WIN32 + u_long arg = 1; + if (ioctlsocket(sock, FIONBIO, &arg) == SOCKET_ERROR) + { + perror("Failed to set nonblocking io"); + closesocket(sock); + continue; + } +#else + flags= fcntl(sock, F_GETFL, 0); if (flags == -1) { perror("Failed to get socket flags"); - close(sock); + closesocket(sock); continue; } @@ -208,10 +218,11 @@ static int server_socket(const char *port) if (fcntl(sock, F_SETFL, flags | O_NONBLOCK) == -1) { perror("Failed to set socket to nonblocking mode"); - close(sock); + closesocket(sock); continue; } } +#endif flags= 1; if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (void *)&flags, sizeof(flags)) != 0) @@ -226,21 +237,21 @@ static int server_socket(const char *port) if (setsockopt(sock, IPPROTO_TCP, TCP_NODELAY, (void *)&flags, sizeof(flags)) != 0) perror("Failed to set TCP_NODELAY"); - if (bind(sock, next->ai_addr, next->ai_addrlen) == -1) + if (bind(sock, next->ai_addr, next->ai_addrlen) == SOCKET_ERROR) { - if (errno != EADDRINUSE) + if (get_socket_errno() != EADDRINUSE) { perror("bind()"); freeaddrinfo(ai); } - close(sock); + closesocket(sock); continue; } - if (listen(sock, 1024) == -1) + if (listen(sock, 1024) == SOCKET_ERROR) { perror("listen()"); - close(sock); + closesocket(sock); continue; } @@ -277,8 +288,8 @@ static const char* comcode2str(uint8_t cmd) /** * Print out the command we are about to execute */ -static void pre_execute(const void *cookie __attribute__((unused)), - protocol_binary_request_header *header __attribute__((unused))) +static void pre_execute(const void *cookie, + protocol_binary_request_header *header) { if (verbose) { @@ -293,8 +304,8 @@ static void pre_execute(const void *cookie __attribute__((unused)), /** * Print out the command we just executed */ -static void post_execute(const void *cookie __attribute__((unused)), - protocol_binary_request_header *header __attribute__((unused))) +static void post_execute(const void *cookie, + protocol_binary_request_header *header) { if (verbose) { @@ -333,7 +344,7 @@ static protocol_binary_response_status unknown(const void *cookie, * * @param argc number of items in the argument vector * @param argv argument vector - * @return 0 on success, 1 otherwise + * @return EXIT_SUCCESS on success, 1 otherwise */ int main(int argc, char **argv) { @@ -346,7 +357,7 @@ int main(int argc, char **argv) if (event_base == NULL) { fprintf(stderr, "Failed to create an instance of libevent\n"); - return 1; + return EXIT_FAILURE; } /* @@ -379,14 +390,14 @@ int main(int argc, char **argv) default: (void)fprintf(stderr, "Usage: %s [-p port] [-v] [-1] [-c #clients] [-P pidfile]\n", argv[0]); - return 1; + return EXIT_FAILURE; } } if (! initialize_storage()) { /* Error message already printed */ - return 1; + return EXIT_FAILURE; } if (! global_options.has_port) @@ -401,7 +412,7 @@ int main(int argc, char **argv) if (pid_file == NULL) { - perror(strerror(errno)); + perror(strerror(get_socket_errno())); abort(); } @@ -413,7 +424,7 @@ int main(int argc, char **argv) if (num_server_sockets == 0) { fprintf(stderr, "I don't have any server sockets\n"); - return 1; + return EXIT_FAILURE; } /* @@ -429,14 +440,14 @@ int main(int argc, char **argv) if ((protocol_handle= memcached_protocol_create_instance()) == NULL) { fprintf(stderr, "Failed to allocate protocol handle\n"); - return 1; + return EXIT_FAILURE; } socket_userdata_map= calloc((size_t)(maxconns), sizeof(struct connection)); if (socket_userdata_map == NULL) { fprintf(stderr, "Failed to allocate room for connections\n"); - return 1; + return EXIT_FAILURE; } memcached_binary_protocol_set_callbacks(protocol_handle, interface); @@ -446,13 +457,13 @@ int main(int argc, char **argv) { struct connection *conn= &socket_userdata_map[server_sockets[xx]]; conn->userdata= protocol_handle; - event_set(&conn->event, server_sockets[xx], EV_READ | EV_PERSIST, + event_set(&conn->event, (intptr_t)server_sockets[xx], EV_READ | EV_PERSIST, accept_handler, conn); event_base_set(event_base, &conn->event); if (event_add(&conn->event, 0) == -1) { fprintf(stderr, "Failed to add event for %d\n", server_sockets[xx]); - close(server_sockets[xx]); + closesocket(server_sockets[xx]); } } @@ -460,5 +471,5 @@ int main(int argc, char **argv) event_base_loop(event_base, 0); /* NOTREACHED */ - return 0; + return EXIT_SUCCESS; }