static char * SyncDriverListMounts(void) { char *paths = NULL; DynBuf buf; MNTHANDLE mounts; DECLARE_MNTINFO(mntinfo); if ((mounts = OPEN_MNTFILE("r")) == NULL) { return NULL; } DynBuf_Init(&buf); while (GETNEXT_MNTINFO(mounts, mntinfo)) { /* * Skip remote mounts because they are not freezable and opening them * could lead to hangs. See PR 1196785. */ if (SyncDriverIsRemoteFSType(MNTINFO_FSTYPE(mntinfo))) { Debug(LGPFX "Skipping remote filesystem, name=%s, mntpt=%s.\n", MNTINFO_NAME(mntinfo), MNTINFO_MNTPT(mntinfo)); continue; } /* * Add a separator if it's not the first path, and add the path to the * tail of the list. */ if ((DynBuf_GetSize(&buf) != 0 && !DynBuf_Append(&buf, ":", 1)) || !DynBuf_Append(&buf, MNTINFO_MNTPT(mntinfo), strlen(MNTINFO_MNTPT(mntinfo)))) { goto exit; } } if (!DynBuf_Append(&buf, "\0", 1)) { goto exit; } paths = DynBuf_AllocGet(&buf); if (paths == NULL) { Debug(LGPFX "Failed to allocate path list.\n"); } exit: DynBuf_Destroy(&buf); (void) CLOSE_MNTFILE(mounts); return paths; }
static char * SyncDriverListMounts(void) { char *paths = NULL; DynBuf buf; MNTHANDLE mounts; DECLARE_MNTINFO(mntinfo); if ((mounts = OPEN_MNTFILE("r")) == NULL) { return NULL; } DynBuf_Init(&buf); while (GETNEXT_MNTINFO(mounts, mntinfo)) { /* * Add a separator if it's not the first path, and add the path to the * tail of the list. */ if ((DynBuf_GetSize(&buf) != 0 && !DynBuf_Append(&buf, ":", 1)) || !DynBuf_Append(&buf, MNTINFO_MNTPT(mntinfo), strlen(MNTINFO_MNTPT(mntinfo)))) { goto exit; } } if (!DynBuf_Append(&buf, "\0", 1)) { goto exit; } paths = DynBuf_AllocGet(&buf); if (paths == NULL) { Debug(LGPFX "Failed to allocate path list.\n"); } exit: DynBuf_Destroy(&buf); (void) CLOSE_MNTFILE(mounts); return paths; }
static int DnD_TryInitVmblock(const char *vmbFsName, // IN const char *vmbMntPoint, // IN const char *vmbDevice, // IN mode_t vmbDeviceMode, // IN Bool (*verifyBlock)(int fd)) // IN { #if defined NO_SETMNTENT || defined NO_ENDMNTENT NOT_IMPLEMENTED(); errno = ENOSYS; return -1; #else Bool found = FALSE; int blockFd = -1; char *realMntPoint; MNTHANDLE fp; DECLARE_MNTINFO(mnt); ASSERT(vmbFsName); ASSERT(vmbMntPoint); ASSERT(vmbDevice); /* Resolve desired mount point in case it is symlinked somewhere */ realMntPoint = Posix_RealPath(vmbMntPoint); if (!realMntPoint) { /* * If resolve failed for some reason try to fall back to * original mount point specification. */ realMntPoint = Util_SafeStrdup(vmbMntPoint); } /* Make sure the vmblock file system is mounted. */ fp = OPEN_MNTFILE("r"); if (fp == NULL) { LOG(1, ("%s: could not open mount file\n", __func__)); goto out; } while (GETNEXT_MNTINFO(fp, mnt)) { /* * In the future we can publish the mount point in VMDB so that the UI * can use it rather than enforcing the VMBLOCK_MOUNT_POINT check here. */ if (strcmp(MNTINFO_FSTYPE(mnt), vmbFsName) == 0 && strcmp(MNTINFO_MNTPT(mnt), realMntPoint) == 0) { found = TRUE; break; } } (void) CLOSE_MNTFILE(fp); if (found) { /* Open device node for communication with vmblock. */ blockFd = Posix_Open(vmbDevice, vmbDeviceMode); if (blockFd < 0) { LOG(1, ("%s: Can not open blocker device (%s)\n", __func__, strerror(errno))); } else { LOG(4, ("%s: Opened blocker device at %s\n", __func__, VMBLOCK_DEVICE)); if (verifyBlock && !verifyBlock(blockFd)) { LOG(4, ("%s: Blocker device at %s did not pass checks, closing.\n", __func__, VMBLOCK_DEVICE)); close(blockFd); blockFd = -1; } } } out: free(realMntPoint); return blockFd; #endif }