[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[GNUnet-SVN] [gnunet] branch master updated: fix gns plugin action on NO
From: |
gnunet |
Subject: |
[GNUnet-SVN] [gnunet] branch master updated: fix gns plugin action on NOTFOUND |
Date: |
Wed, 05 Sep 2018 15:02:16 +0200 |
This is an automated email from the git hooks/post-receive script.
grothoff pushed a commit to branch master
in repository gnunet.
The following commit(s) were added to refs/heads/master by this push:
new 727f0d8a8 fix gns plugin action on NOTFOUND
727f0d8a8 is described below
commit 727f0d8a8735dd638ff2f714f19c8c23852b99ba
Author: Christian Grothoff <address@hidden>
AuthorDate: Wed Sep 5 15:02:06 2018 +0200
fix gns plugin action on NOTFOUND
---
src/gns/nss/nss_gns.c | 31 ++++++++++++++++++++++++-------
src/gns/nss/nss_gns_query.c | 22 +++++++++++++++++-----
src/gns/nss/nss_gns_query.h | 5 ++++-
3 files changed, 45 insertions(+), 13 deletions(-)
diff --git a/src/gns/nss/nss_gns.c b/src/gns/nss/nss_gns.c
index 58aab47fd..d76eac845 100644
--- a/src/gns/nss/nss_gns.c
+++ b/src/gns/nss/nss_gns.c
@@ -29,6 +29,7 @@
#include <nss.h>
#include <stdio.h>
#include <stdlib.h>
+#include <errno.h>
#include "nss_gns_query.h"
@@ -94,8 +95,8 @@ _nss_gns_gethostbyname2_r(const char *name,
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;
@@ -108,24 +109,34 @@ _nss_gns_gethostbyname2_r(const char *name,
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;
@@ -227,8 +238,14 @@ _nss_gns_gethostbyaddr_r (const void* addr,
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;
}
diff --git a/src/gns/nss/nss_gns_query.c b/src/gns/nss/nss_gns_query.c
index 867ead624..032b2c93b 100644
--- a/src/gns/nss/nss_gns_query.c
+++ b/src/gns/nss/nss_gns_query.c
@@ -23,6 +23,7 @@
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
+#include <errno.h>
/**
@@ -32,7 +33,10 @@
* @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,
@@ -43,6 +47,7 @@ gns_resolve_name (int af,
char *cmd;
char line[128];
int ret;
+ int es;
if (AF_INET6 == af)
{
@@ -62,7 +67,9 @@ gns_resolve_name (int af,
}
if (NULL == (p = popen (cmd, "r")))
{
+ es = errno;
free (cmd);
+ errno = es;
return -1;
}
while (NULL != fgets (line,
@@ -85,8 +92,9 @@ gns_resolve_name (int af,
}
else
{
- pclose (p);
+ (void) pclose (p);
free (cmd);
+ errno = EINVAL;
return -1;
}
}
@@ -101,8 +109,9 @@ gns_resolve_name (int af,
}
else
{
- pclose (p);
+ (void) pclose (p);
free (cmd);
+ errno = EINVAL;
return -1;
}
}
@@ -110,11 +119,14 @@ gns_resolve_name (int af,
}
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;
}
diff --git a/src/gns/nss/nss_gns_query.h b/src/gns/nss/nss_gns_query.h
index 48cab4b22..bc732b3aa 100644
--- a/src/gns/nss/nss_gns_query.h
+++ b/src/gns/nss/nss_gns_query.h
@@ -57,7 +57,10 @@ struct userdata
* @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,
--
To stop receiving notification emails like this one, please contact
address@hidden
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [GNUnet-SVN] [gnunet] branch master updated: fix gns plugin action on NOTFOUND,
gnunet <=