void uio_releaseStdioAccess(uio_StdioAccessHandle *handle) { if (handle->tempDir != NULL) { if (uio_unlink(handle->tempDir, handle->fileName) == -1) { #ifdef DEBUG fprintf(stderr, "Error: Could not remove temporary file: " "%s\n", strerror(errno)); #endif } // Need to free this handle in advance. There should be no handles // to a dir left when removing it. uio_DirHandle_unref(handle->tempDir); handle->tempDir = NULL; if (uio_rmdir(handle->tempRoot, handle->tempDirName) == -1) { #ifdef DEBUG fprintf(stderr, "Error: Could not remove temporary directory: " "%s\n", strerror(errno)); #endif } } uio_StdioAccessHandle_delete(handle); }
static int debugCmdRmDir(DebugContext *debugContext, int argc, char *argv[]) { int retVal; if (argc != 2) { fprintf(debugContext->err, "Invalid number of arguments.\n"); return 1; } retVal = uio_rmdir(debugContext->cwd, argv[1]); if (retVal == -1) { fprintf(debugContext->err, "Could not remove directory: %s\n", strerror(errno)); return 1; } return 0; }
uio_StdioAccessHandle * uio_getStdioAccess(uio_DirHandle *dir, const char *path, int flags, uio_DirHandle *tempDir) { int res; uio_MountHandle *mountHandle; const char *name; char *newPath; char *tempDirName; uio_DirHandle *newDir; uio_FileSystemID fsID; res = uio_getFileLocation(dir, path, flags, &mountHandle, &newPath); if (res == -1) { // errno is set return NULL; } fsID = uio_getMountFileSystemType(mountHandle); if (fsID == uio_FSTYPE_STDIO) { // Current location is usable. return uio_StdioAccessHandle_new(NULL, NULL, NULL, NULL, newPath); } uio_free(newPath); { uio_uint32 dirNum; int i; // Current location is not usable. Create a directory with a // generated name, as a temporary location to store a copy of // the file. dirNum = (uio_uint32) time(NULL); tempDirName = uio_malloc(sizeof "01234567"); for (i = 0; ; i++) { #ifdef NUM_TEMP_RETRIES if (i >= NUM_TEMP_RETRIES) { // Using ENOSPC to report that we couldn't create a // temporary dir, getting EEXIST. uio_free(tempDirName); errno = ENOSPC; return NULL; } #endif sprintf(tempDirName, "%08lx", (unsigned long) dirNum + i); res = uio_mkdir(tempDir, tempDirName, 0700); if (res == -1) { int savedErrno; if (errno == EEXIST) continue; savedErrno = errno; #ifdef DEBUG fprintf(stderr, "Error: Could not create temporary dir: %s\n", strerror(errno)); #endif uio_free(tempDirName); errno = savedErrno; return NULL; } break; } newDir = uio_openDirRelative(tempDir, tempDirName, 0); if (newDir == NULL) { #ifdef DEBUG fprintf(stderr, "Error: Could not open temporary dir: %s\n", strerror(errno)); #endif res = uio_rmdir(tempDir, tempDirName); #ifdef DEBUG if (res == -1) fprintf(stderr, "Warning: Could not remove temporary dir: " "%s.\n", strerror(errno)); #endif uio_free(tempDirName); errno = EIO; return NULL; } // Get the last component of path. This should be the file to // access. name = strrchr(path, '/'); if (name == NULL) name = path; // Copy the file res = uio_copyFile(dir, path, newDir, name); if (res == -1) { int savedErrno = errno; #ifdef DEBUG fprintf(stderr, "Error: Could not copy file to temporary dir: " "%s\n", strerror(errno)); #endif uio_closeDir(newDir); uio_free(tempDirName); errno = savedErrno; return NULL; } } res = uio_getFileLocation(newDir, name, flags, &mountHandle, &newPath); if (res == -1) { int savedErrno = errno; fprintf(stderr, "Error: uio_getStdioAccess: Could not get location " "of temporary dir: %s.\n", strerror(errno)); uio_closeDir(newDir); uio_free(tempDirName); errno = savedErrno; return NULL; } fsID = uio_getMountFileSystemType(mountHandle); if (fsID != uio_FSTYPE_STDIO) { // Temp dir isn't on a stdio fs either. fprintf(stderr, "Error: uio_getStdioAccess: Temporary file location " "isn't on a stdio filesystem.\n"); uio_closeDir(newDir); uio_free(tempDirName); uio_free(newPath); // errno = EXDEV; errno = EINVAL; return NULL; } uio_DirHandle_ref(tempDir); return uio_StdioAccessHandle_new(tempDir, tempDirName, newDir, uio_strdup(name), newPath); }