getdomainname stores machine's domain name
need this for acls
This commit is contained in:
parent
e09a179f66
commit
d059ee1eae
2 changed files with 120 additions and 0 deletions
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -27,6 +27,7 @@
|
|||
#include <winsock2.h>
|
||||
#include <iphlpapi.h> /* for GetAdaptersAddresses() */
|
||||
#include <wincrypt.h> /* for Crypt*() functions */
|
||||
#include <winsock2.h> /* 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;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue