if (inet_aton(ipaddr, &addr)==0)
return;
+ auth_reload();
+
/* addr is a valid, interesting address, find the domain name... */
client = client_compose(addr);
qword_print(f, *client?client:"DEFAULT");
qword_eol(f);
+ if (client && strcmp(ipaddr, client))
+ mountlist_add(ipaddr, *client?client:"DEFAULT");
+
if (client) free(client);
}
break;
}
+ auth_reload();
+
/* Now determine export point for this fsid/domain */
for (i=0 ; i < MCL_MAXTYPES; i++) {
for (exp = exportlist[i]; exp; exp = exp->m_next) {
goto out;
}
- cache_export_ent(dom, found);
+ if (found)
+ cache_export_ent(dom, found);
qword_print(f, dom);
qword_printint(f, fsidtype);
if (qword_get(&cp, path, strlen(lbuf)) <= 0)
goto out;
+ auth_reload();
+
/* now find flags for this export point in this domain */
for (i=0 ; i < MCL_MAXTYPES; i++) {
for (exp = exportlist[i]; exp; exp = exp->m_next) {
qword_printint(f, found->m_export.e_anonuid);
qword_printint(f, found->m_export.e_anongid);
qword_printint(f, found->m_export.e_fsid);
+ mountlist_add(dom, path);
}
qword_eol(f);
out:
FD_ISSET(fileno(cachelist[i].f), readfds)) {
cnt++;
cachelist[i].cache_handle(cachelist[i].f);
+ FD_CLR(fileno(cachelist[i].f), readfds);
}
}
return cnt;
void cache_export_ent(char *domain, struct exportent *exp)
{
- FILE *f = fopen("/proc/net/rpc/nfsd.export/channel", "r+");
+ FILE *f = fopen("/proc/net/rpc/nfsd.export/channel", "w");
if (!f)
return;
qword_eol(f);
fclose(f);
+
+ mountlist_add(domain, exp->e_path);
}
void cache_export(nfs_export *exp)
{
FILE *f;
- f = fopen("/proc/net/rpc/auth.unix.ip/channel", "r+");
+ f = fopen("/proc/net/rpc/auth.unix.ip/channel", "w");
if (!f)
return;
fclose(f);
+ if (strcmp(inet_ntoa(exp->m_client->m_addrlist[0]), exp->m_client->m_hostname))
+ mountlist_add(inet_ntoa(exp->m_client->m_addrlist[0]), exp->m_client->m_hostname);
+
cache_export_ent(exp->m_client->m_hostname, &exp->m_export);
}
* {
* echo $domain $path $length
* read filehandle <&0
- * } <> /proc/fs/nfs/filehandle
+ * } <> /proc/fs/nfsd/filehandle
*/
struct nfs_fh_len *
cache_get_filehandle(nfs_export *exp, int len, char *p)
{
- FILE *f = fopen("/proc/fs/nfs/filehandle", "r+");
+ FILE *f = fopen("/proc/fs/nfsd/filehandle", "r+");
char buf[200];
char *bp = buf;
+ int failed;
static struct nfs_fh_len fh;
+
+ if (!f)
+ f = fopen("/proc/fs/nfs/filehandle", "r+");
if (!f)
return NULL;
qword_printint(f, len);
qword_eol(f);
- if (fgets(buf, sizeof(buf), f) == NULL)
+ failed = (fgets(buf, sizeof(buf), f) == NULL);
+ fclose(f);
+ if (failed)
return NULL;
memset(fh.fh_handle, 0, sizeof(fh.fh_handle));
fh.fh_size = qword_get(&bp, fh.fh_handle, NFS3_FHSIZE);