static int do_mount_by_pattern(struct libmnt_context *cxt, const char *pattern) { int neg = pattern && strncmp(pattern, "no", 2) == 0; int rc = -EINVAL; char **filesystems, **fp; assert(cxt); assert((cxt->flags & MNT_FL_MOUNTFLAGS_MERGED)); if (!neg && pattern) { /* * try all types from the list */ char *p, *p0; DBG(CXT, mnt_debug_h(cxt, "trying to mount by FS pattern list")); p0 = p = strdup(pattern); if (!p) return -ENOMEM; do { char *end = strchr(p, ','); if (end) *end = '\0'; rc = do_mount(cxt, p); p = end ? end + 1 : NULL; } while (!mnt_context_get_status(cxt) && p); free(p0); if (mnt_context_get_status(cxt)) return rc; } /* * try /etc/filesystems and /proc/filesystems */ DBG(CXT, mnt_debug_h(cxt, "trying to mount by filesystems lists")); rc = mnt_get_filesystems(&filesystems, neg ? pattern : NULL); if (rc) return rc; for (fp = filesystems; *fp; fp++) { rc = do_mount(cxt, *fp); if (mnt_context_get_status(cxt)) break; if (mnt_context_get_syscall_errno(cxt) != EINVAL) break; } mnt_free_filesystems(filesystems); return rc; }
int test_filesystems(struct libmnt_test *ts, int argc, char *argv[]) { char **filesystems = NULL; int rc; rc = mnt_get_filesystems(&filesystems, argc ? argv[1] : NULL); if (!rc) { char **p; for (p = filesystems; *p; p++) printf("%s\n", *p); mnt_free_filesystems(filesystems); } return rc; }