From d059ee1eae54c31eba7089543cac78953f25e303 Mon Sep 17 00:00:00 2001 From: Olga Kornievskaia Date: Fri, 8 Apr 2011 17:42:30 -0400 Subject: [PATCH] getdomainname stores machine's domain name need this for acls --- daemon/nfs41.h | 2 + daemon/nfs41_client.c | 118 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 120 insertions(+) diff --git a/daemon/nfs41.h b/daemon/nfs41.h index 2c2dc46..f8dd555 100644 --- a/daemon/nfs41.h +++ b/daemon/nfs41.h @@ -148,6 +148,8 @@ typedef struct __nfs41_client { /* for state recovery on server reboot */ struct client_state state; + /* for ACLs default domain name */ + char domain_name[NFS41_HOSTNAME_LEN]; } nfs41_client; #define NFS41_MAX_NUM_SLOTS NFS41_MAX_RPC_REQS diff --git a/daemon/nfs41_client.c b/daemon/nfs41_client.c index 8756ca5..ecd51df 100644 --- a/daemon/nfs41_client.c +++ b/daemon/nfs41_client.c @@ -27,6 +27,7 @@ #include #include /* for GetAdaptersAddresses() */ #include /* for Crypt*() functions */ +#include /* for hostent struct */ #include "tree.h" #include "daemon_debug.h" @@ -105,6 +106,117 @@ static int update_exchangeid_res( &exchangeid->server_owner); } +static void print_getaddrinfo(struct addrinfo *ptr) +{ + char ipstringbuffer[46]; + DWORD ipbufferlength = 46; + + dprintf(1, "getaddrinfo response flags: 0x%x\n", ptr->ai_flags); + switch (ptr->ai_family) { + case AF_UNSPEC: dprintf(1, "Family: Unspecified\n"); break; + case AF_INET: + dprintf(1, "Family: AF_INET IPv4 address %s\n", + inet_ntoa(((struct sockaddr_in *)ptr->ai_addr)->sin_addr)); + break; + case AF_INET6: + if (WSAAddressToString((LPSOCKADDR)ptr->ai_addr, (DWORD)ptr->ai_addrlen, + NULL, ipstringbuffer, &ipbufferlength)) + dprintf(1, "WSAAddressToString failed with %u\n", WSAGetLastError()); + else + dprintf(1, "Family: AF_INET6 IPv6 address %s\n", ipstringbuffer); + break; + case AF_NETBIOS: dprintf(1, "AF_NETBIOS (NetBIOS)\n"); break; + default: dprintf(1, "Other %ld\n", ptr->ai_family); break; + } + dprintf(1, "Canonical name: %s\n", ptr->ai_canonname); +} + +static int getdomainname(char *domain) +{ + int status = 0; + PFIXED_INFO net_info = NULL; + DWORD size = 0; + BOOLEAN flag = FALSE; + + status = GetNetworkParams(net_info, &size); + if (status != ERROR_BUFFER_OVERFLOW) { + eprintf("getdomainname: GetNetworkParams returned %d\n", status); + goto out; + } + net_info = calloc(1, size); + if (net_info == NULL) { + status = GetLastError(); + goto out; + } + status = GetNetworkParams(net_info, &size); + if (status) { + eprintf("getdomainname: GetNetworkParams returned %d\n", status); + goto out_free; + } + + if (net_info->DomainName[0] == '\0') { + struct addrinfo *result = NULL, *ptr = NULL, hints; + char hostname[NI_MAXHOST], servInfo[NI_MAXSERV]; + + ZeroMemory(&hints, sizeof(hints)); + hints.ai_socktype = SOCK_STREAM; + hints.ai_protocol = IPPROTO_TCP; + + status = getaddrinfo(net_info->HostName, NULL, &hints, &result); + if (status) { + status = WSAGetLastError(); + eprintf("getdomainname: getaddrinfo failed with %d\n", status); + goto out_free; + } + + for (ptr=result; ptr != NULL ;ptr=ptr->ai_next) { + print_getaddrinfo(ptr); + + switch (ptr->ai_family) { + case AF_INET6: + case AF_INET: + status = getnameinfo((struct sockaddr *)ptr->ai_addr, + (socklen_t)ptr->ai_addrlen, hostname, NI_MAXHOST, + servInfo, NI_MAXSERV, NI_NAMEREQD); + if (status) + dprintf(1, "getnameinfo failed %d\n", WSAGetLastError()); + else { + int i = 0; + size_t len = strlen(hostname); + char *p = hostname; + dprintf(1, "getdomainname: hostname %s %d\n", hostname, len); + for(i = 0; i < len; i++) + if (p[i] == '.') + break; + if (i == len) + break; + flag = TRUE; + memcpy(domain, &hostname[i+1], len-i); + dprintf(1, "getdomainname: domainname %s %d\n", domain, strlen(domain)); + goto out_loop; + } + break; + default: + break; + } + } +out_loop: + if (!flag) { + status = ERROR_INTERNAL_ERROR; + eprintf("getdomainname: unable to get a domain name\n"); + } + freeaddrinfo(result); + } else { + dprintf(1, "domain name is %s\n", net_info->DomainName); + memcpy(domain, net_info->DomainName, strlen(net_info->DomainName)); + domain[strlen(net_info->DomainName)] = '\0'; + } +out_free: + free(net_info); +out: + return status; +} + int nfs41_client_create( IN nfs41_rpc_clnt *rpc, IN const client_owner4 *owner, @@ -121,6 +233,12 @@ int nfs41_client_create( goto out_err_rpc; } + status = getdomainname(client->domain_name); + if (status) { + free(client); + goto out_err_rpc; + } + memcpy(&client->owner, owner, sizeof(client_owner4)); client->rpc = rpc; client->is_data = is_data;