Changes in uspace/lib/posix/source/fcntl.c [8fe46a0:6afc9d7] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/posix/source/fcntl.c
r8fe46a0 r6afc9d7 100 100 * 101 101 * @param pathname Path to the file. 102 * @param posix_flags Access mode flags.102 * @param flags Access mode flags. 103 103 */ 104 int posix_open(const char *pathname, int posix_flags, ...)104 int posix_open(const char *pathname, int flags, ...) 105 105 { 106 int rc; 107 posix_mode_t posix_mode = 0; 108 if (posix_flags & O_CREAT) { 106 mode_t mode = 0; 107 if ((flags & O_CREAT) > 0) { 109 108 va_list args; 110 va_start(args, posix_flags);111 posix_mode = va_arg(args, posix_mode_t);109 va_start(args, flags); 110 mode = va_arg(args, mode_t); 112 111 va_end(args); 113 (void) posix_mode;114 112 } 115 113 116 if (((posix_flags & (O_RDONLY | O_WRONLY | O_RDWR)) == 0) || 117 ((posix_flags & (O_RDONLY | O_WRONLY)) == (O_RDONLY | O_WRONLY)) || 118 ((posix_flags & (O_RDONLY | O_RDWR)) == (O_RDONLY | O_RDWR)) || 119 ((posix_flags & (O_WRONLY | O_RDWR)) == (O_WRONLY | O_RDWR))) { 120 errno = EINVAL; 121 return -1; 122 } 123 124 int flags = WALK_REGULAR; 125 if (posix_flags & O_CREAT) { 126 if (posix_flags & O_EXCL) 127 flags |= WALK_MUST_CREATE; 128 else 129 flags |= WALK_MAY_CREATE; 130 } 131 132 int mode = 133 ((posix_flags & O_RDWR) ? MODE_READ | MODE_WRITE : 0) | 134 ((posix_flags & O_RDONLY) ? MODE_READ : 0) | 135 ((posix_flags & O_WRONLY) ? MODE_WRITE : 0) | 136 ((posix_flags & O_APPEND) ? MODE_APPEND : 0); 137 138 int file = rcerrno(vfs_lookup, pathname, flags); 139 if (file < 0) 140 return -1; 141 142 rc = rcerrno(vfs_open, file, mode); 143 if (rc != EOK) { 144 vfs_put(file); 145 return -1; 146 } 147 148 if (posix_flags & O_TRUNC) { 149 if (posix_flags & (O_RDWR | O_WRONLY)) { 150 rc = rcerrno(vfs_resize, file, 0); 151 if (rc != EOK) { 152 vfs_put(file); 153 return -1; 154 } 155 } 156 } 157 158 return file; 114 return negerrno(open, pathname, flags, mode); 159 115 } 160 116 161 117 /** @} 162 118 */ 163
Note:
See TracChangeset
for help on using the changeset viewer.