getdomainname stores machine's domain name

need this for acls
This commit is contained in:
Olga Kornievskaia 2011-04-08 17:42:30 -04:00 committed by unknown
parent e09a179f66
commit d059ee1eae
2 changed files with 120 additions and 0 deletions

View file

@ -148,6 +148,8 @@ typedef struct __nfs41_client {
/* for state recovery on server reboot */ /* for state recovery on server reboot */
struct client_state state; struct client_state state;
/* for ACLs default domain name */
char domain_name[NFS41_HOSTNAME_LEN];
} nfs41_client; } nfs41_client;
#define NFS41_MAX_NUM_SLOTS NFS41_MAX_RPC_REQS #define NFS41_MAX_NUM_SLOTS NFS41_MAX_RPC_REQS

View file

@ -27,6 +27,7 @@
#include <winsock2.h> #include <winsock2.h>
#include <iphlpapi.h> /* for GetAdaptersAddresses() */ #include <iphlpapi.h> /* for GetAdaptersAddresses() */
#include <wincrypt.h> /* for Crypt*() functions */ #include <wincrypt.h> /* for Crypt*() functions */
#include <winsock2.h> /* for hostent struct */
#include "tree.h" #include "tree.h"
#include "daemon_debug.h" #include "daemon_debug.h"
@ -105,6 +106,117 @@ static int update_exchangeid_res(
&exchangeid->server_owner); &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( int nfs41_client_create(
IN nfs41_rpc_clnt *rpc, IN nfs41_rpc_clnt *rpc,
IN const client_owner4 *owner, IN const client_owner4 *owner,
@ -121,6 +233,12 @@ int nfs41_client_create(
goto out_err_rpc; goto out_err_rpc;
} }
status = getdomainname(client->domain_name);
if (status) {
free(client);
goto out_err_rpc;
}
memcpy(&client->owner, owner, sizeof(client_owner4)); memcpy(&client->owner, owner, sizeof(client_owner4));
client->rpc = rpc; client->rpc = rpc;
client->is_data = is_data; client->is_data = is_data;