static char * CodeSetGetModulePath(uint32 priv) { char path[PATH_MAX]; Bool ret = FALSE; #if defined(__APPLE__) uint32_t size; #else ssize_t size; uid_t uid = -1; #endif if ((priv != HGMP_PRIVILEGE) && (priv != HGMP_NO_PRIVILEGE)) { return NULL; } #if defined(__APPLE__) size = sizeof path; if (_NSGetExecutablePath(path, &size)) { goto exit; } #else #if defined(VMX86_SERVER) if (HostType_OSIsPureVMK()) { goto exit; } #endif if (priv == HGMP_PRIVILEGE) { uid = Id_BeginSuperUser(); } size = readlink("/proc/self/exe", path, sizeof path); if (-1 == size) { if (priv == HGMP_PRIVILEGE) { Id_EndSuperUser(uid); } goto exit; } path[size] = '\0'; if (priv == HGMP_PRIVILEGE) { Id_EndSuperUser(uid); } #endif ret = TRUE; exit: if (ret) { return strdup(path); } else { return NULL; } }
Bool DnD_InitializeBlocking(DnDBlockControl *blkCtrl) // OUT { uid_t uid; int blockFd; /* Root access is needed for opening the vmblock device. */ uid = Id_BeginSuperUser(); /* Fitrst try FUSE and see if it is available. */ blockFd = DnD_TryInitVmblock(VMBLOCK_FUSE_FS_NAME, VMBLOCK_FUSE_MOUNT_POINT, VMBLOCK_FUSE_DEVICE, VMBLOCK_FUSE_DEVICE_MODE, DnD_CheckBlockFuse); if (blockFd != -1) { blkCtrl->fd = blockFd; /* Setup FUSE methods. */ blkCtrl->blockRoot = VMBLOCK_FUSE_FS_ROOT; blkCtrl->AddBlock = DnD_AddBlockFuse; blkCtrl->RemoveBlock = DnD_RemoveBlockFuse; goto out; } /* Now try OS-specific VMBlock driver. */ blockFd = DnD_TryInitVmblock(VMBLOCK_FS_NAME, VMBLOCK_MOUNT_POINT, VMBLOCK_DEVICE, VMBLOCK_DEVICE_MODE, NULL); if (blockFd != -1) { blkCtrl->fd = blockFd; /* Setup legacy in-kernel methods. */ blkCtrl->blockRoot = VMBLOCK_FS_ROOT; blkCtrl->AddBlock = DnD_AddBlockLegacy; blkCtrl->RemoveBlock = DnD_RemoveBlockLegacy; goto out; } LOG(4, ("%s: could not find vmblock mounted\n", __func__)); out: Id_EndSuperUser(uid); return blockFd != -1; }