* Copyright (C) 1995, 1996 Olaf Kirch <okir@monad.swb.de>
*/
-#include "config.h"
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
#include <sys/stat.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <errno.h>
+#include <unistd.h>
#include "misc.h"
#include "nfslib.h"
#include "exportfs.h"
static void auth_fixpath(char *path);
static char *export_file = NULL;
+static nfs_export my_exp;
+static nfs_client my_client;
extern int new_cache;
xtab_mount_write();
}
-int
+unsigned int
auth_reload()
{
struct stat stb;
- static time_t last_modified = 0;
-
- if (stat(_PATH_ETAB, &stb) < 0)
+ static ino_t last_inode;
+ static int last_fd;
+ static unsigned int counter;
+ int fd;
+
+ if ((fd = open(_PATH_ETAB, O_RDONLY)) < 0) {
+ xlog(L_FATAL, "couldn't open %s", _PATH_ETAB);
+ } else if (fstat(fd, &stb) < 0) {
xlog(L_FATAL, "couldn't stat %s", _PATH_ETAB);
- if (stb.st_mtime == last_modified)
- return 0;
- last_modified = stb.st_mtime;
+ } else if (stb.st_ino == last_inode) {
+ close(fd);
+ return counter;
+ } else {
+ close(last_fd);
+ last_fd = fd;
+ last_inode = stb.st_ino;
+ }
export_freeall();
- // export_read(export_file);
+ memset(&my_client, 0, sizeof(my_client));
xtab_export_read();
+ ++counter;
- return 1;
+ return counter;
}
static nfs_export *
nfs_export *exp;
if (new_cache) {
- static nfs_export my_exp;
- static nfs_client my_client;
int i;
/* return static nfs_export with details filled in */
- if (my_client.m_naddr != 1 ||
- my_client.m_addrlist[0].s_addr != caller->sin_addr.s_addr) {
- /* different client to last time, so do a lookup */
- char *n;
- my_client.m_naddr = 0;
- my_client.m_addrlist[0] = caller->sin_addr;
- n = client_compose(caller->sin_addr);
- if (!n)
- return NULL;
- strcpy(my_client.m_hostname, *n?n:"DEFAULT");
- free(n);
- my_client.m_naddr = 1;
- }
-
+ char *n;
+ my_client.m_addrlist[0] = caller->sin_addr;
+ n = client_compose(caller->sin_addr);
+ *error = unknown_host;
+ if (!n)
+ return NULL;
+ strcpy(my_client.m_hostname, *n?n:"DEFAULT");
+ free(n);
+ my_client.m_naddr = 1;
my_exp.m_client = &my_client;
exp = NULL;
*error = not_exported;
return NULL;
}
-
- if (!(exp->m_export.e_flags & NFSEXP_INSECURE_PORT) &&
+ }
+ if (!(exp->m_export.e_flags & NFSEXP_INSECURE_PORT) &&
(ntohs(caller->sin_port) < IPPORT_RESERVED/2 ||
ntohs(caller->sin_port) >= IPPORT_RESERVED)) {
- *error = illegal_port;
- return NULL;
- }
+ *error = illegal_port;
+ return NULL;
}
*error = success;
if (p == epath) p++;
*p = '\0';
}
- free(hp);
switch (error) {
case bad_path: