Changeset 6dae798 in mainline for uspace/lib/c/generic/dirent.c
- Timestamp:
- 2026-03-18T12:47:36Z (18 hours ago)
- Parents:
- 222774a (diff), 34832c3 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the(diff)links above to see all the changes relative to each parent. - git-author:
- Vít Skalický <skalicky@…> (2026-03-18 12:47:36)
- git-committer:
- GitHub <noreply@…> (2026-03-18 12:47:36)
- File:
-
- 1 edited
-
uspace/lib/c/generic/dirent.c (modified) (3 diffs)
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/c/generic/dirent.c
r222774a r6dae798 1 1 /* 2 2 * Copyright (c) 2008 Jakub Jermar 3 * Copyright (c) 2026 Vít Skalický 3 4 * All rights reserved. 4 5 * … … 47 48 }; 48 49 49 /** Open directory. 50 /** Like opendir_handle, but takes ownership of the handle if successful. */ 51 static DIR *opendir_internal(int handle) 52 { 53 DIR *dirp = malloc(sizeof(DIR)); 54 if (!dirp) { 55 errno = ENOMEM; 56 return NULL; 57 } 58 59 errno_t rc = vfs_open(handle, MODE_READ); 60 if (rc != EOK) { 61 free(dirp); 62 errno = rc; 63 return NULL; 64 } 65 66 dirp->fd = handle; 67 dirp->pos = 0; 68 return dirp; 69 } 70 71 /** Open directory by its handle (a.k.a. file descriptor). 72 * 73 * @param handle Directory handle 74 * @return Non-NULL pointer on success. On error returns @c NULL and sets errno. 75 */ 76 DIR *opendir_handle(int handle) 77 { 78 int my_handle; 79 // Clone the file handle, otherwise closedir would put the 80 // handle that was passed to us here by the caller and that we don't own. 81 errno_t rc = vfs_clone(handle, -1, false, &my_handle); 82 if (rc != EOK) { 83 errno = rc; 84 return NULL; 85 } 86 87 DIR *dirp = opendir_internal(my_handle); 88 if (!dirp) { 89 rc = errno; 90 vfs_put(my_handle); 91 errno = rc; 92 return NULL; 93 } 94 return dirp; 95 } 96 97 /** Open directory by its pathname. 50 98 * 51 99 * @param dirname Directory pathname … … 55 103 DIR *opendir(const char *dirname) 56 104 { 57 DIR *dirp = malloc(sizeof(DIR));58 if (!dirp) {59 errno = ENOMEM;60 return NULL;61 }62 63 105 int fd; 64 106 errno_t rc = vfs_lookup(dirname, WALK_DIRECTORY, &fd); 65 107 if (rc != EOK) { 66 free(dirp);67 108 errno = rc; 68 109 return NULL; 69 110 } 70 111 71 rc = vfs_open(fd, MODE_READ);72 if ( rc != EOK) {73 free(dirp);112 DIR *dirp = opendir_internal(fd); 113 if (!dirp) { 114 rc = errno; 74 115 vfs_put(fd); 75 116 errno = rc; 76 117 return NULL; 77 118 } 78 79 dirp->fd = fd;80 dirp->pos = 0;81 119 return dirp; 82 120 } 83 121 84 /** Read directory entry.122 /** Read current directory entry and advance to the next one. 85 123 * 86 124 * @param dirp Open directory
Note:
See TracChangeset
for help on using the changeset viewer.
