X-Git-Url: https://git.decadent.org.uk/gitweb/?a=blobdiff_plain;f=utils%2Fmountd%2Fcache.c;h=1d6e95325c489e35b6b4f05490327a84a2dd5364;hb=d6c1b35c6b40243bfd6fba2591c9f8f2653078c0;hp=2909ad331fc417a487c4b844455f11bcfddbb28e;hpb=7b331fb9d24a71242a6c0a45a06c49174b552c64;p=nfs-utils.git diff --git a/utils/mountd/cache.c b/utils/mountd/cache.c index 2909ad3..1d6e953 100644 --- a/utils/mountd/cache.c +++ b/utils/mountd/cache.c @@ -37,6 +37,11 @@ #include "blkid/blkid.h" #endif +/* + * Invoked by RPC service loop + */ +void cache_set_fds(fd_set *fdset); +int cache_process_req(fd_set *readfds); enum nfsd_fsid { FSID_DEV = 0, @@ -57,14 +62,14 @@ enum nfsd_fsid { * Record is terminated with newline. * */ -int cache_export_ent(char *domain, struct exportent *exp, char *p); +static int cache_export_ent(char *domain, struct exportent *exp, char *p); char *lbuf = NULL; int lbuflen = 0; extern int use_ipaddr; -void auth_unix_ip(FILE *f) +static void auth_unix_ip(FILE *f) { /* requests are * class IP-ADDR @@ -75,7 +80,7 @@ void auth_unix_ip(FILE *f) */ char *cp; char class[20]; - char ipaddr[20]; + char ipaddr[INET6_ADDRSTRLEN]; char *client = NULL; struct addrinfo *tmp = NULL; struct addrinfo *ai = NULL; @@ -90,7 +95,7 @@ void auth_unix_ip(FILE *f) strcmp(class, "nfsd") != 0) return; - if (qword_get(&cp, ipaddr, 20) <= 0) + if (qword_get(&cp, ipaddr, sizeof(ipaddr)) <= 0) return; tmp = host_pton(ipaddr); @@ -109,7 +114,7 @@ void auth_unix_ip(FILE *f) qword_print(f, "nfsd"); qword_print(f, ipaddr); - qword_printint(f, time(0)+30*60); + qword_printuint(f, time(0) + DEFAULT_TTL); if (use_ipaddr) qword_print(f, ipaddr); else if (client) @@ -120,7 +125,7 @@ void auth_unix_ip(FILE *f) free(client); } -void auth_unix_gid(FILE *f) +static void auth_unix_gid(FILE *f) { /* Request are * uid @@ -156,7 +161,7 @@ void auth_unix_gid(FILE *f) } } qword_printuint(f, uid); - qword_printuint(f, time(0)+30*60); + qword_printuint(f, time(0) + DEFAULT_TTL); if (rv >= 0) { qword_printuint(f, ngroups); for (i=0; imnt_dir; } -void nfsd_fh(FILE *f) +static void nfsd_fh(FILE *f) { /* request are: * domain fsidtype fsid @@ -639,11 +644,11 @@ static int dump_to_cache(FILE *f, char *domain, char *path, struct exportent *ex { qword_print(f, domain); qword_print(f, path); - qword_printint(f, time(0)+30*60); if (exp) { int different_fs = strcmp(path, exp->e_path) != 0; int flag_mask = different_fs ? ~NFSEXP_FSID : ~0; + qword_printuint(f, time(0) + exp->e_ttl); qword_printint(f, exp->e_flags & flag_mask); qword_printint(f, exp->e_anonuid); qword_printint(f, exp->e_anongid); @@ -662,7 +667,8 @@ static int dump_to_cache(FILE *f, char *domain, char *path, struct exportent *ex qword_print(f, "uuid"); qword_printhex(f, u, 16); } - } + } else + qword_printuint(f, time(0) + DEFAULT_TTL); return qword_eol(f); } @@ -742,7 +748,7 @@ lookup_export(char *dom, char *path, struct addrinfo *ai) return found; } -void nfsd_export(FILE *f) +static void nfsd_export(FILE *f) { /* requests are: * domain path @@ -817,6 +823,11 @@ struct { }; extern int manage_gids; + +/** + * cache_open - prepare communications channels with kernel RPC caches + * + */ void cache_open(void) { int i; @@ -829,6 +840,10 @@ void cache_open(void) } } +/** + * cache_set_fds - prepare cache file descriptors for one iteration of the service loop + * @fdset: pointer to fd_set to prepare + */ void cache_set_fds(fd_set *fdset) { int i; @@ -838,6 +853,10 @@ void cache_set_fds(fd_set *fdset) } } +/** + * cache_process_req - process any active cache file descriptors during service loop iteration + * @fdset: pointer to fd_set to examine for activity + */ int cache_process_req(fd_set *readfds) { int i; @@ -856,11 +875,11 @@ int cache_process_req(fd_set *readfds) /* * Give IP->domain and domain+path->options to kernel - * % echo nfsd $IP $[now+30*60] $domain > /proc/net/rpc/auth.unix.ip/channel - * % echo $domain $path $[now+30*60] $options $anonuid $anongid $fsid > /proc/net/rpc/nfsd.export/channel + * % echo nfsd $IP $[now+DEFAULT_TTL] $domain > /proc/net/rpc/auth.unix.ip/channel + * % echo $domain $path $[now+DEFAULT_TTL] $options $anonuid $anongid $fsid > /proc/net/rpc/nfsd.export/channel */ -int cache_export_ent(char *domain, struct exportent *exp, char *path) +static int cache_export_ent(char *domain, struct exportent *exp, char *path) { int err; FILE *f = fopen("/proc/net/rpc/nfsd.export/channel", "w"); @@ -918,9 +937,14 @@ int cache_export_ent(char *domain, struct exportent *exp, char *path) return err; } +/** + * cache_export - Inform kernel of a new nfs_export + * @exp: target nfs_export + * @path: NUL-terminated C string containing export path + */ int cache_export(nfs_export *exp, char *path) { - char buf[INET_ADDRSTRLEN]; + char buf[INET6_ADDRSTRLEN]; int err; FILE *f; @@ -930,9 +954,9 @@ int cache_export(nfs_export *exp, char *path) qword_print(f, "nfsd"); - qword_print(f, + qword_print(f, host_ntop(get_addrlist(exp->m_client, 0), buf, sizeof(buf))); - qword_printint(f, time(0)+30*60); + qword_printuint(f, time(0) + exp->m_export.e_ttl); qword_print(f, exp->m_client->m_hostname); err = qword_eol(f); @@ -943,7 +967,14 @@ int cache_export(nfs_export *exp, char *path) return err; } -/* Get a filehandle. +/** + * cache_get_filehandle - given an nfs_export, get its root filehandle + * @exp: target nfs_export + * @len: length of requested file handle + * @p: NUL-terminated C string containing export path + * + * Returns pointer to NFS file handle of root directory of export + * * { * echo $domain $path $length * read filehandle <&0 @@ -977,4 +1008,3 @@ cache_get_filehandle(nfs_export *exp, int len, char *p) fh.fh_size = qword_get(&bp, (char *)fh.fh_handle, NFS3_FHSIZE); return &fh; } -