Changeset 368ee04 in mainline for uspace/lib/c/generic/dirent.c
- Timestamp:
- 2017-04-05T18:10:39Z (8 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 93ad8166
- Parents:
- 39f892a9 (diff), 2166728 (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. - File:
-
- 1 moved
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/c/generic/dirent.c
r39f892a9 r368ee04 33 33 */ 34 34 35 #ifndef LIBC_SYS_STAT_H_ 36 #define LIBC_SYS_STAT_H_ 35 #include <vfs/vfs.h> 36 #include <stdlib.h> 37 #include <dirent.h> 38 #include <sys/types.h> 39 #include <errno.h> 40 #include <assert.h> 37 41 38 #include <sys/types.h> 39 #include <stdbool.h> 40 #include <ipc/vfs.h> 41 #include <ipc/loc.h> 42 /** Open directory. 43 * 44 * @param dirname Directory pathname 45 * 46 * @return Non-NULL pointer on success. On error returns @c NULL and sets errno. 47 */ 48 DIR *opendir(const char *dirname) 49 { 50 DIR *dirp = malloc(sizeof(DIR)); 51 if (!dirp) { 52 errno = ENOMEM; 53 return NULL; 54 } 55 56 int fd = vfs_lookup(dirname, WALK_DIRECTORY); 57 if (fd < 0) { 58 free(dirp); 59 errno = fd; 60 return NULL; 61 } 62 63 int rc = vfs_open(fd, MODE_READ); 64 if (rc < 0) { 65 free(dirp); 66 vfs_put(fd); 67 errno = rc; 68 return NULL; 69 } 70 71 dirp->fd = fd; 72 dirp->pos = 0; 73 return dirp; 74 } 42 75 43 struct stat { 44 fs_handle_t fs_handle; 45 service_id_t service_id; 46 fs_index_t index; 47 unsigned int lnkcnt; 48 bool is_file; 49 bool is_directory; 50 aoff64_t size; 51 service_id_t service; 52 }; 76 /** Read directory entry. 77 * 78 * @param dirp Open directory 79 * @return Non-NULL pointer to directory entry on success. On error returns 80 * @c NULL and sets errno. 81 */ 82 struct dirent *readdir(DIR *dirp) 83 { 84 int rc; 85 ssize_t len = 0; 86 87 rc = vfs_read_short(dirp->fd, dirp->pos, &dirp->res.d_name[0], 88 NAME_MAX + 1, &len); 89 if (rc != EOK) { 90 errno = rc; 91 return NULL; 92 } 93 94 dirp->pos += len; 95 96 return &dirp->res; 97 } 53 98 54 extern int fstat(int, struct stat *); 55 extern int stat(const char *, struct stat *); 56 extern int mkdir(const char *, mode_t); 99 /** Rewind directory position to the beginning. 100 * 101 * @param dirp Open directory 102 */ 103 void rewinddir(DIR *dirp) 104 { 105 dirp->pos = 0; 106 } 57 107 58 #endif 108 /** Close directory. 109 * 110 * @param dirp Open directory 111 * @return 0 on success. On error returns -1 and sets errno. 112 */ 113 int closedir(DIR *dirp) 114 { 115 int rc; 116 117 rc = vfs_put(dirp->fd); 118 free(dirp); 119 120 /* On error errno was set by close() */ 121 return rc; 122 } 59 123 60 124 /** @}
Note:
See TracChangeset
for help on using the changeset viewer.