X-Git-Url: https://git.decadent.org.uk/gitweb/?p=nfs-utils.git;a=blobdiff_plain;f=utils%2Fmountd%2Fcache.c;h=8de2eac383acfe3c74566b6608761506adc1b46c;hp=7d804322a2dfce0a45256dcb44d05297dce7ed5e;hb=a8dcaa282122b5db8f4ffb7e5d99b2c4b62cbb78;hpb=bf6a4febaa78bf188896b7b5b02c46562dd08b70 diff --git a/utils/mountd/cache.c b/utils/mountd/cache.c index 7d80432..8de2eac 100644 --- a/utils/mountd/cache.c +++ b/utils/mountd/cache.c @@ -917,14 +917,15 @@ out_false: * * Returned exportent points to static memory. */ -static struct exportent *do_locations_to_export(struct jp_ops *ops, - nfs_fsloc_set_t locations, const char *junction, - char *options, size_t options_len) +static struct exportent *locations_to_export(struct jp_ops *ops, + nfs_fsloc_set_t locations, const char *junction) { + static char options[BUFSIZ]; struct exportent *exp; int ttl; - if (!locations_to_options(ops, locations, options, options_len, &ttl)) + options[0] = '\0'; + if (!locations_to_options(ops, locations, options, sizeof(options), &ttl)) return NULL; exp = mkexportent("*", (char *)junction, options); @@ -938,33 +939,6 @@ static struct exportent *do_locations_to_export(struct jp_ops *ops, return exp; } -/* - * Convert set of FS locations to an exportent. Returns pointer to - * an exportent if "junction" refers to a junction. - * - * Returned exportent points to static memory. - */ -static struct exportent *locations_to_export(struct jp_ops *ops, - nfs_fsloc_set_t locations, const char *junction) -{ - struct exportent *exp; - char *options; - - options = malloc(BUFSIZ); - if (options == NULL) { - xlog(D_GENERAL, "%s: failed to allocate options buffer", - __func__); - return NULL; - } - options[0] = '\0'; - - exp = do_locations_to_export(ops, locations, junction, - options, BUFSIZ); - - free(options); - return exp; -} - /* * Retrieve locations information in "junction" and dump it to the * kernel. Returns pointer to an exportent if "junction" refers @@ -975,8 +949,8 @@ static struct exportent *locations_to_export(struct jp_ops *ops, static struct exportent *invoke_junction_ops(void *handle, const char *junction) { + struct exportent *exp = NULL; nfs_fsloc_set_t locations; - struct exportent *exp; enum jp_status status; struct jp_ops *ops; char *error; @@ -1002,15 +976,24 @@ static struct exportent *invoke_junction_ops(void *handle, } status = ops->jp_get_locations(junction, &locations); - if (status != JP_OK) { - xlog(D_GENERAL, "%s: failed to resolve %s: %s", - __func__, junction, ops->jp_error(status)); - return NULL; + switch (status) { + case JP_OK: + break; + case JP_NOTJUNCTION: + xlog(D_GENERAL, "%s: %s is not a junction", + __func__, junction); + goto out; + default: + xlog(L_WARNING, "Dangling junction %s: %s", + junction, ops->jp_error(status)); + goto out; } exp = locations_to_export(ops, locations, junction); ops->jp_put_locations(locations); + +out: ops->jp_done(); return exp; }