#include <nss.h>
#include <stdio.h>
#include <stdlib.h>
+#include <errno.h>
#include "nss_gns_query.h"
address_length = (af == AF_INET) ? sizeof(ipv4_address_t) : sizeof(ipv6_address_t);
if (buflen <
- sizeof(char*)+ /* alias names */
- strlen(name)+1)
+ sizeof(char*) + /* alias names */
+ strlen (name) + 1)
{ /* official name */
*errnop = ERANGE;
*h_errnop = NO_RECOVERY;
i = gns_resolve_name (af,
name,
&u);
- if (-3 == i)
+ if (-1 == i)
{
- status = NSS_STATUS_NOTFOUND;
+ *errnop = errno;
+ status = NSS_STATUS_UNAVAIL;
+ *h_errnop = NO_RECOVERY;
goto finish;
}
if (-2 == i)
{
+ *errnop = ENOENT;
+ *h_errnop = NO_RECOVERY;
status = NSS_STATUS_UNAVAIL;
goto finish;
}
- if ( (-1 == i) ||
- (u.count == 0) )
+ if (-3 == i)
{
*errnop = ETIMEDOUT;
*h_errnop = HOST_NOT_FOUND;
status = NSS_STATUS_NOTFOUND;
goto finish;
}
+ if (0 == u.count)
+ {
+ *errnop = 0; /* success */
+ *h_errnop = NO_DATA; /* success */
+ status = NSS_STATUS_NOTFOUND;
+ goto finish;
+ }
/* Alias names */
*((char**) buffer) = NULL;
result->h_aliases = (char**) buffer;
int *errnop,
int *h_errnop)
{
+ (void) addr;
+ (void) len;
+ (void) af;
+ (void) result;
+ (void) buffer;
+ (void) buflen;
*errnop = EINVAL;
*h_errnop = NO_RECOVERY;
- //NOTE we allow to leak this into DNS so no NOTFOUND
+ /* NOTE we allow to leak this into DNS so no NOTFOUND */
return NSS_STATUS_UNAVAIL;
}
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
+#include <errno.h>
/**
* @param af address family
* @param name the name to resolve
* @param u the userdata (result struct)
- * @return -1 on error else 0
+ * @return -1 on internal error,
+ * -2 if request is not for GNS,
+ * -3 on timeout,
+ * else 0
*/
int
gns_resolve_name (int af,
char *cmd;
char line[128];
int ret;
+ int es;
if (AF_INET6 == af)
{
}
if (NULL == (p = popen (cmd, "r")))
{
+ es = errno;
free (cmd);
+ errno = es;
return -1;
}
while (NULL != fgets (line,
}
else
{
- pclose (p);
+ (void) pclose (p);
free (cmd);
+ errno = EINVAL;
return -1;
}
}
}
else
{
- pclose (p);
+ (void) pclose (p);
free (cmd);
+ errno = EINVAL;
return -1;
}
}
}
ret = pclose (p);
free (cmd);
- if (4 == ret)
+ if (! WIFEXITED (ret))
+ return -1;
+ if (4 == WEXITSTATUS (ret))
return -2; /* not for GNS */
if (3 == ret)
return -3; /* timeout -> not found */
- if ( (2 == ret) || (1 == ret) )
+ if ( (2 == WEXITSTATUS (ret)) ||
+ (1 == WEXITSTATUS (ret)) )
return -2; /* launch failure -> service unavailable */
return 0;
}
* @param af address family
* @param name the name to resolve
* @param u the userdata (result struct)
- * @return -1 on error else 0
+ * @return -1 on internal error,
+ * -2 if request is not for GNS,
+ * -3 on timeout,
+ * else 0
*/
int
gns_resolve_name(int af,