From 8d863e719b3670e3e9db3001da875d085f4d93f1 Mon Sep 17 00:00:00 2001 From: Frank Lahm Date: Mon, 30 May 2011 14:05:29 +0200 Subject: [PATCH] Convert to getaddrinfo --- etc/afpd/fce_api.c | 93 +++++++++++++++++++++---------------- etc/afpd/fce_api_internal.h | 7 ++- include/atalk/fce_api.h | 2 +- 3 files changed, 56 insertions(+), 46 deletions(-) diff --git a/etc/afpd/fce_api.c b/etc/afpd/fce_api.c index 601f02e2..8df502b6 100755 --- a/etc/afpd/fce_api.c +++ b/etc/afpd/fce_api.c @@ -81,48 +81,50 @@ static const char *skip_files[] = * */ void fce_init_udp() { + int rv; + struct addrinfo hints, *servinfo, *p; + if (udp_initialized == FCE_TRUE) return; + memset(&hints, 0, sizeof hints); + hints.ai_family = AF_UNSPEC; + hints.ai_socktype = SOCK_DGRAM; - for (int i = 0; i < udp_sockets; i++) - { + for (int i = 0; i < udp_sockets; i++) { struct udp_entry *udp_entry = udp_socket_list + i; /* Close any pending sockets */ if (udp_entry->sock != -1) - { - close( udp_entry->sock ); + close(udp_entry->sock); + + if ((rv = getaddrinfo(udp_entry->addr, udp_entry->port, &hints, &servinfo)) != 0) { + LOG(log_error, logtype_afpd, "fce_init_udp: getaddrinfo(%s:%s): %s", + udp_entry->addr, udp_entry->port, gai_strerror(rv)); + continue; } - /* resolve IP to network address */ - if (inet_aton( udp_entry->ip, &udp_entry->addr.sin_addr ) ==0 ) - { - /* Hmm, failed try to resolve host */ - struct hostent *hp = gethostbyname( udp_entry->ip ); - if (hp == NULL) - { - LOG(log_error, logtype_afpd, "Cannot resolve host name for fce UDP connection: %s (errno %d)", udp_entry->ip, errno ); + /* loop through all the results and make a socket */ + for (p = servinfo; p != NULL; p = p->ai_next) { + if ((udp_entry->sock = socket(p->ai_family, p->ai_socktype, p->ai_protocol)) == -1) { + LOG(log_error, logtype_afpd, "fce_init_udp: socket(%s:%s): %s", + udp_entry->addr, udp_entry->port, strerror(errno)); continue; } - memcpy( &udp_entry->addr.sin_addr, &hp->h_addr, sizeof(udp_entry->addr.sin_addr) ); + break; } - /* Create UDP socket */ - udp_entry->sock = socket( AF_INET, SOCK_DGRAM, 0 ); - if (udp_entry->sock == -1) - { - LOG(log_error, logtype_afpd, "Cannot create socket for fce UDP connection: errno %d", errno ); - continue; + if (p == NULL) { + LOG(log_error, logtype_afpd, "fce_init_udp: no socket for %s:%s", + udp_entry->addr, udp_entry->port); } - - /* Set socket address params */ - udp_entry->addr.sin_family = AF_INET; - udp_entry->addr.sin_port = htons(udp_entry->port); + memcpy(&udp_entry->addrinfo, p, sizeof(struct addrinfo)); + freeaddrinfo(servinfo); } - udp_initialized = FCE_TRUE; + udp_initialized = FCE_TRUE; } + void fce_cleanup() { if (udp_initialized == FCE_FALSE ) @@ -218,13 +220,23 @@ static void send_fce_event( char *path, int mode ) /* Okay, we have a running socket again, send server that we had a problem on our side*/ data_len = build_fce_packet( &packet, "", FCE_CONN_BROKEN, 0 ); - sendto( udp_entry->sock, data, data_len, 0, &udp_entry->addr, sizeof(udp_entry->addr) ); + sendto(udp_entry->sock, + data, + data_len, + 0, + udp_entry->addrinfo.ai_addr, + udp_entry->addrinfo.ai_addrlen); /* Rebuild our original data packet */ data_len = build_fce_packet( &packet, path, mode, event_id ); } - sent_data = sendto( udp_entry->sock, data, data_len, 0, &udp_entry->addr, sizeof(udp_entry->addr) ); + sent_data = sendto(udp_entry->sock, + data, + data_len, + 0, + udp_entry->addrinfo.ai_addr, + udp_entry->addrinfo.ai_addrlen); /* Problems ? */ if (sent_data != data_len) @@ -240,21 +252,20 @@ static void send_fce_event( char *path, int mode ) } } -static int add_udp_socket( char *target_ip, int target_port ) +static int add_udp_socket(const char *target_ip, const char *target_port ) { - if (target_port == 0) - target_port = FCE_DEFAULT_PORT; + if (target_port == NULL) + target_port = FCE_DEFAULT_PORT_STRING; - if (udp_sockets >= FCE_MAX_UDP_SOCKS) - { + if (udp_sockets >= FCE_MAX_UDP_SOCKS) { LOG(log_error, logtype_afpd, "Too many file change api UDP connections (max %d allowed)", FCE_MAX_UDP_SOCKS ); return AFPERR_PARAM; } - strncpy( udp_socket_list[udp_sockets].ip, target_ip, FCE_MAX_IP_LEN - 1); - udp_socket_list[udp_sockets].port = target_port; + udp_socket_list[udp_sockets].addr = strdup(target_ip); + udp_socket_list[udp_sockets].port = strdup(target_port); udp_socket_list[udp_sockets].sock = -1; - memset( &udp_socket_list[udp_sockets].addr, 0, sizeof(struct sockaddr_in) ); + memset( &udp_socket_list[udp_sockets].addrinfo, 0, sizeof(struct sockaddr_in) ); udp_socket_list[udp_sockets].next_try_on_error = 0; udp_sockets++; @@ -431,19 +442,19 @@ int fce_register_file_modification( struct ofork *ofork ) * Extern connect to afpd parameter, can be called multiple times for multiple listeners (up to MAX_UDP_SOCKS times) * * */ -int fce_add_udp_socket( char *target ) +int fce_add_udp_socket(const char *target) { - int port = FCE_DEFAULT_PORT; + const char *port = FCE_DEFAULT_PORT_STRING; char target_ip[256] = {""}; - strncpy( target_ip, target, sizeof(target_ip) -1); + strncpy(target_ip, target, sizeof(target_ip) -1); + char *port_delim = strchr( target_ip, ':' ); - if (port_delim) - { + if (port_delim) { *port_delim = 0; - port = atoi( port_delim + 1); + port = port_delim + 1; } - return add_udp_socket( target_ip, port ); + return add_udp_socket(target_ip, port); } diff --git a/etc/afpd/fce_api_internal.h b/etc/afpd/fce_api_internal.h index bf6cea3e..9f2049fd 100755 --- a/etc/afpd/fce_api_internal.h +++ b/etc/afpd/fce_api_internal.h @@ -22,7 +22,6 @@ #define FCE_MAX_PATH_LEN 1024 #define FCE_MAX_UDP_SOCKS 5 /* Allow a maximum of udp listeners for file change events */ -#define FCE_MAX_IP_LEN 255 /* Man len of listener name */ #define FCE_SOCKET_RETRY_DELAY_S 600 /* Pause this time in s after socket was broken */ #define FCE_PACKET_VERSION 1 #define FCE_HISTORY_LEN 10 /* This is used to coalesce events */ @@ -31,9 +30,9 @@ struct udp_entry { int sock; - char ip[FCE_MAX_IP_LEN]; - int port; - struct sockaddr_in addr; + char *addr; + char *port; + struct addrinfo addrinfo; time_t next_try_on_error; /* In case of error set next timestamp to retry */ }; diff --git a/include/atalk/fce_api.h b/include/atalk/fce_api.h index a4609332..0e2f572d 100755 --- a/include/atalk/fce_api.h +++ b/include/atalk/fce_api.h @@ -18,7 +18,7 @@ int fce_register_new_dir( struct path *path ); int fce_register_new_file( struct path *path ); int fce_register_file_modification( struct ofork *ofork ); -int fce_add_udp_socket( char *target ); // IP or IP:Port +int fce_add_udp_socket(const char *target ); // IP or IP:Port int fce_set_coalesce( char *coalesce_opt ); // all|delete|create #define FCE_DEFAULT_PORT 12250 -- 2.39.2