moved getdomainname into start of nfsd

acquire machine's domain name at the start of nfsd and store
in global memory, make is accessible for acl operations.
This commit is contained in:
Olga Kornievskaia 2011-12-19 19:37:35 -05:00
parent 8e64984183
commit 4be25baaee
4 changed files with 126 additions and 126 deletions

View file

@ -110,117 +110,6 @@ 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 = { 0 };
char hostname[NI_MAXHOST], servInfo[NI_MAXSERV];
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 {
size_t i, 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. "
"Set this machine's domain name:\n"
"System > ComputerName > Change > More > mydomain\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,
@ -237,12 +126,6 @@ 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;