#include "nfslib.h"
#include "exportfs.h"
#include "mountd.h"
+#include "xmalloc.h"
enum auth_error
{
}
auth_fixpath(path);
- if (!(*hpp = gethostbyaddr((const char *)&addr, sizeof(addr), AF_INET)))
- *hpp = get_hostent((const char *)&addr, sizeof(addr),
- AF_INET);
- else {
+ /* First try it w/o doing a hostname lookup... */
+ *hpp = get_hostent((const char *)&addr, sizeof(addr), AF_INET);
+ exp = export_find(*hpp, path);
+
+ if (!exp) {
+ /* Ok, that didn't fly. Try it with a reverse lookup. */
+ free (*hpp);
+ *hpp = gethostbyaddr((const char *)&addr, sizeof(addr),
+ AF_INET);
+ if (!(*hpp)) {
+ *error = no_entry;
+ *hpp = get_hostent((const char *)&addr, sizeof(addr), AF_INET);
+ return NULL;
+ } else {
/* must make sure the hostent is authorative. */
char **sp;
- struct hostent *forward;
-
- forward = gethostbyname((*hpp)->h_name);
+ struct hostent *forward = NULL;
+ char *tmpname;
+
+ *hpp = hostent_dup (*hpp);
+ tmpname = xstrdup((*hpp)->h_name);
+ if (tmpname) {
+ forward = gethostbyname(tmpname);
+ free(tmpname);
+ }
if (forward) {
/* now make sure the "addr" is in the list */
for (sp = forward->h_addr_list ; *sp ; sp++) {
if (!*sp) {
/* it was a FAKE */
*error = faked_hostent;
- *hpp = hostent_dup (*hpp);
return NULL;
}
+ free (*hpp);
*hpp = hostent_dup (forward);
}
else {
/* never heard of it. misconfigured DNS? */
*error = no_forward_dns;
- *hpp = hostent_dup (*hpp);
return NULL;
}
- }
+ }
- if (!(exp = export_find(*hpp, path))) {
+ if (!(exp = export_find(*hpp, path))) {
*error = no_entry;
return NULL;
+ }
}
+
if (!exp->m_mayexport) {
*error = not_exported;
return NULL;