Changeset 700
- Timestamp:
- 02/18/08 09:22:42 (9 months ago)
- Files:
-
- trunk/server/memcached.c (modified) (11 diffs)
- trunk/server/memcached.h (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
trunk/server/memcached.c
r699 r700 64 64 */ 65 65 static void drive_machine(conn *c); 66 static int new_socket( const bool is_udp);66 static int new_socket(struct addrinfo *ai); 67 67 static int server_socket(const int port, const bool is_udp); 68 68 static int try_read_command(conn *c); … … 168 168 settings.port = 11211; 169 169 settings.udpport = 0; 170 settings.interf.s_addr = htonl(INADDR_ANY); 170 /* By default this string should be NULL for getaddrinfo() */ 171 settings.inter = NULL; 171 172 settings.maxbytes = 64 * 1024 * 1024; /* default is 64MB */ 172 173 settings.maxconns = 1024; /* to limit connections-related memory to about 5MB */ … … 2052 2053 int sfd, flags = 1; 2053 2054 socklen_t addrlen; 2054 struct sockaddr addr;2055 struct sockaddr_storage addr; 2055 2056 int res; 2056 2057 … … 2062 2063 case conn_listening: 2063 2064 addrlen = sizeof(addr); 2064 if ((sfd = accept(c->sfd, &addr, &addrlen)) == -1) {2065 if ((sfd = accept(c->sfd, (struct sockaddr *)&addr, &addrlen)) == -1) { 2065 2066 if (errno == EAGAIN || errno == EWOULDBLOCK) { 2066 2067 /* these are transient, so don't log anything */ … … 2293 2294 } 2294 2295 2295 static int new_socket( const bool is_udp) {2296 static int new_socket(struct addrinfo *ai) { 2296 2297 int sfd; 2297 2298 int flags; 2298 2299 2299 if ((sfd = socket( AF_INET, is_udp ? SOCK_DGRAM : SOCK_STREAM, 0)) == -1) {2300 if ((sfd = socket(ai->ai_family, ai->ai_socktype, ai->ai_protocol)) == -1) { 2300 2301 perror("socket()"); 2301 2302 return -1; … … 2350 2351 int sfd; 2351 2352 struct linger ling = {0, 0}; 2352 struct sockaddr_in addr; 2353 struct addrinfo *ai; 2354 struct addrinfo hints; 2355 char port_buf[NI_MAXSERV]; 2356 int error; 2357 2353 2358 int flags =1; 2354 2359 2355 if ((sfd = new_socket(is_udp)) == -1) { 2360 /* 2361 * the memset call clears nonstandard fields in some impementations 2362 * that otherwise mess things up. 2363 */ 2364 memset(&hints, 0, sizeof (hints)); 2365 hints.ai_flags = AI_PASSIVE|AI_ADDRCONFIG; 2366 if (is_udp) 2367 { 2368 hints.ai_protocol = IPPROTO_UDP; 2369 hints.ai_socktype = SOCK_DGRAM; 2370 hints.ai_family = AF_INET; /* This left here because of issues with OSX 10.5 */ 2371 } else { 2372 hints.ai_family = AF_UNSPEC; 2373 hints.ai_protocol = IPPROTO_TCP; 2374 hints.ai_socktype = SOCK_STREAM; 2375 } 2376 2377 snprintf(port_buf, NI_MAXSERV, "%d", port); 2378 error= getaddrinfo(settings.inter, port_buf, &hints, &ai); 2379 if (error != 0) { 2380 if (error != EAI_SYSTEM) 2381 fprintf(stderr, "getaddrinfo(): %s\n", gai_strerror(error)); 2382 else 2383 perror("getaddrinfo()"); 2384 2385 return -1; 2386 } 2387 2388 if ((sfd = new_socket(ai)) == -1) { 2389 freeaddrinfo(ai); 2356 2390 return -1; 2357 2391 } … … 2366 2400 } 2367 2401 2368 /* 2369 * the memset call clears nonstandard fields in some impementations 2370 * that otherwise mess things up. 2371 */ 2372 memset(&addr, 0, sizeof(addr)); 2373 2374 addr.sin_family = AF_INET; 2375 addr.sin_port = htons(port); 2376 addr.sin_addr = settings.interf; 2377 if (bind(sfd, (struct sockaddr *)&addr, sizeof(addr)) == -1) { 2402 if (bind(sfd, ai->ai_addr, ai->ai_addrlen) == -1) { 2378 2403 perror("bind()"); 2379 2404 close(sfd); 2405 freeaddrinfo(ai); 2380 2406 return -1; 2381 2407 } … … 2383 2409 perror("listen()"); 2384 2410 close(sfd); 2411 freeaddrinfo(ai); 2385 2412 return -1; 2386 2413 } 2414 2415 freeaddrinfo(ai); 2416 2387 2417 return sfd; 2388 2418 } … … 2685 2715 int main (int argc, char **argv) { 2686 2716 int c; 2687 struct in_addr addr;2688 2717 bool lock_memory = false; 2689 2718 bool daemonize = false; … … 2746 2775 break; 2747 2776 case 'l': 2748 if (inet_pton(AF_INET, optarg, &addr) <= 0) { 2749 fprintf(stderr, "Illegal address: %s\n", optarg); 2750 return 1; 2751 } else { 2752 settings.interf = addr; 2753 } 2777 settings.inter= strdup(optarg); 2754 2778 break; 2755 2779 case 'd': … … 2989 3013 if (daemonize) 2990 3014 remove_pidfile(pid_file); 3015 /* Clean up strdup() call for bind() address */ 3016 if (settings.inter) 3017 free(settings.inter); 3018 2991 3019 return 0; 2992 3020 } trunk/server/memcached.h
r651 r700 11 11 #include <netinet/in.h> 12 12 #include <event.h> 13 #include <netdb.h> 13 14 14 15 #define DATA_BUFFER_SIZE 2048 … … 84 85 int port; 85 86 int udpport; 86 struct in_addr interf;87 char *inter; 87 88 int verbose; 88 89 rel_time_t oldest_live; /* ignore existing items older than this */
