From: Ronnie Sahlberg Date: Sun, 26 Jun 2011 08:42:53 +0000 (+1000) Subject: add function to set the target for UDP rpc calls. X-Git-Tag: upstream/1.9.6^2~372 X-Git-Url: https://git.piment-noir.org/?a=commitdiff_plain;h=5bf60dc601c70730e4280cdf9c7807f458e1a73b;p=deb_libnfs.git add function to set the target for UDP rpc calls. including doing broadcast calls --- diff --git a/include/libnfs-private.h b/include/libnfs-private.h index 883745b..1d59faf 100644 --- a/include/libnfs-private.h +++ b/include/libnfs-private.h @@ -78,4 +78,5 @@ struct rpc_context *nfs_get_rpc_context(struct nfs_context *nfs); /* we dont want to expose UDP to normal applications/users this is private to libnfs to use exclusively for broadcast RPC */ int rpc_bind_udp(struct rpc_context *rpc, char *addr, int port); +int rpc_set_udp_destination(struct rpc_context *rpc, char *addr, int port, int is_broadcast); struct rpc_context *rpc_init_udp_context(void); diff --git a/lib/socket.c b/lib/socket.c index 3e4ad05..a26afe1 100644 --- a/lib/socket.c +++ b/lib/socket.c @@ -388,3 +388,37 @@ int rpc_bind_udp(struct rpc_context *rpc, char *addr, int port) return 0; } +int rpc_set_udp_destination(struct rpc_context *rpc, char *addr, int port, int is_broadcast) +{ + struct addrinfo *ai = NULL; + char service[6]; + + if (rpc->is_udp == 0) { + rpc_set_error(rpc, "Can not set destination sockaddr. Not UDP context"); + return -1; + } + + snprintf(service, 6, "%d", port); + if (getaddrinfo(addr, service, NULL, &ai) != 0) { + rpc_set_error(rpc, "Invalid address:%s. " + "Can not resolv into IPv4/v6 structure."); + return -1; + } + + if (rpc->udp_dest) { + free(rpc->udp_dest); + rpc->udp_dest = NULL; + } + rpc->udp_dest = malloc(ai->ai_addrlen); + if (rpc->udp_dest == NULL) { + rpc_set_error(rpc, "Out of memory. Failed to allocate sockaddr structure"); + return -1; + } + memcpy(rpc->udp_dest, ai->ai_addr, ai->ai_addrlen); + freeaddrinfo(ai); + + rpc->is_broadcast = is_broadcast; + setsockopt(rpc->fd, SOL_SOCKET, SO_BROADCAST, &is_broadcast, sizeof(is_broadcast)); + + return 0; +}