am_ops * ops_match(am_opts *fo, char *key, char *g_key, char *path, char *keym, char *map) { am_ops **vp; am_ops *rop = 0; /* * First crack the global opts and the local opts */ if (!eval_fs_opts(fo, key, g_key, path, keym, map)) { rop = &efs_ops; } else if (fo->opt_type == 0) { plog(XLOG_USER, "No fs type specified (key = \"%s\", map = \"%s\")", keym, map); rop = &efs_ops; } else { /* * Next find the correct filesystem type */ for (vp = vops; (rop = *vp); vp++) if (strcmp(rop->fs_type, fo->opt_type) == 0) break; if (!rop) { plog(XLOG_USER, "fs type \"%s\" not recognised", fo->opt_type); rop = &efs_ops; } } /* * Make sure we have a default mount option. * Otherwise skip past any leading '-'. */ if (fo->opt_opts == 0) fo->opt_opts = "rw,defaults"; else if (*fo->opt_opts == '-') fo->opt_opts++; /* * Check the filesystem is happy */ if (fo->fs_mtab) free((void *)fo->fs_mtab); if ((fo->fs_mtab = (*rop->fs_match)(fo))) return rop; /* * Return error file system */ fo->fs_mtab = (*efs_ops.fs_match)(fo); return &efs_ops; }
am_ops * ops_match(am_opts *fo, char *key, char *g_key, char *path, char *keym, char *map) { am_ops *rop = NULL; char *link_dir; /* * First crack the global opts and the local opts */ if (!eval_fs_opts(fo, key, g_key, path, keym, map)) { rop = &amfs_error_ops; } else if (fo->opt_type == 0) { plog(XLOG_USER, "No fs type specified (key = \"%s\", map = \"%s\")", keym, map); rop = &amfs_error_ops; } else { /* * Next find the correct filesystem type */ rop = ops_search(fo->opt_type); if (!rop) { plog(XLOG_USER, "fs type \"%s\" not recognized", fo->opt_type); rop = &amfs_error_ops; } } /* * Make sure we have a default mount option. * Otherwise skip past any leading '-'. */ if (fo->opt_opts == 0) fo->opt_opts = strdup("rw,defaults"); else if (*fo->opt_opts == '-') { /* * We cannot simply do fo->opt_opts++ here since the opts * module will try to free the pointer fo->opt_opts later. * So just reallocate the thing -- stolcke 11/11/94 */ char *old = fo->opt_opts; fo->opt_opts = strdup(old + 1); XFREE(old); } /* * If addopts option was used, then append it to the * current options and remote mount options. */ if (fo->opt_addopts) { if (STREQ(fo->opt_opts, fo->opt_remopts)) { /* optimize things for the common case where opts==remopts */ char *mergedstr; mergedstr = merge_opts(fo->opt_opts, fo->opt_addopts); plog(XLOG_INFO, "merge rem/opts \"%s\" add \"%s\" => \"%s\"", fo->opt_opts, fo->opt_addopts, mergedstr); XFREE(fo->opt_opts); XFREE(fo->opt_remopts); fo->opt_opts = mergedstr; fo->opt_remopts = strdup(mergedstr); } else { char *mergedstr, *remmergedstr; mergedstr = merge_opts(fo->opt_opts, fo->opt_addopts); plog(XLOG_INFO, "merge opts \"%s\" add \"%s\" => \"%s\"", fo->opt_opts, fo->opt_addopts, mergedstr); XFREE(fo->opt_opts); fo->opt_opts = mergedstr; remmergedstr = merge_opts(fo->opt_remopts, fo->opt_addopts); plog(XLOG_INFO, "merge remopts \"%s\" add \"%s\" => \"%s\"", fo->opt_remopts, fo->opt_addopts, remmergedstr); XFREE(fo->opt_remopts); fo->opt_remopts = remmergedstr; } } /* * Initialize opt_mount_type to "nfs", if it's not initialized already */ if (!fo->opt_mount_type) fo->opt_mount_type = "nfs"; /* Normalize the sublink and make it absolute */ link_dir = fo->opt_sublink; if (link_dir && link_dir[0] && link_dir[0] != '/') { link_dir = str3cat((char *) NULL, fo->opt_fs, "/", link_dir); normalize_slash(link_dir); XFREE(fo->opt_sublink); fo->opt_sublink = link_dir; } /* * Check the filesystem is happy */ if (fo->fs_mtab) XFREE(fo->fs_mtab); fo->fs_mtab = rop->fs_match(fo); if (fo->fs_mtab) return rop; /* * Return error file system */ fo->fs_mtab = amfs_error_ops.fs_match(fo); return &amfs_error_ops; }