static int add_filesystem(char ***filesystems, char *name) { int n = 0; assert(filesystems); assert(name); if (*filesystems) { char **p; for (n = 0, p = *filesystems; *p; p++, n++) { if (strcmp(*p, name) == 0) return 0; } } #define MYCHUNK 16 if (n == 0 || !((n + 1) % MYCHUNK)) { size_t items = ((n + 1 + MYCHUNK) / MYCHUNK) * MYCHUNK; char **x = realloc(*filesystems, items * sizeof(char *)); if (!x) goto err; *filesystems = x; } name = strdup(name); if (!name) goto err; (*filesystems)[n] = name; (*filesystems)[n + 1] = NULL; return 0; err: mnt_free_filesystems(*filesystems); return -ENOMEM; }
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; }