/* * Copyright 2011-2012 Haiku, Inc. All rights reserved. * Distributed under the terms of the MIT License. * * Authors: * Hamish Morrison, hamish@lavabit.com * Alexander von Gluck IV, kallisti5@unixzen.com */ #include "VMUtils.h" #include #include status_t get_mount_point(KPartition* partition, KPath* mountPoint) { if (!mountPoint || !partition->ContainsFileSystem()) return B_BAD_VALUE; int nameLength = 0; const char* volumeName = partition->ContentName(); if (volumeName != NULL) nameLength = strlen(volumeName); if (nameLength == 0) { volumeName = partition->Name(); if (volumeName != NULL) nameLength = strlen(volumeName); if (nameLength == 0) { volumeName = "unnamed volume"; nameLength = strlen(volumeName); } } BStackOrHeapArray basePath(nameLength + 2); if (!basePath.IsValid()) return B_NO_MEMORY; int32 len = snprintf(basePath, nameLength + 2, "/%s", volumeName); for (int32 i = 1; i < len; i++) if (basePath[i] == '/') basePath[i] = '-'; char* path = mountPoint->LockBuffer(); int32 pathLen = mountPoint->BufferSize(); strncpy(path, basePath, pathLen); struct stat dummy; for (int i = 1; ; i++) { if (stat(path, &dummy) != 0) break; snprintf(path, pathLen, "%s%d", (char*)basePath, i); } mountPoint->UnlockBuffer(); return B_OK; }