Changes in uspace/lib/posix/unistd.c [9350bfdd:d542aad] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/posix/unistd.c
r9350bfdd rd542aad 110 110 return NULL; 111 111 } 112 113 /* Save the original value to comply with the "no modification on114 * success" semantics.115 */116 int orig_errno = errno;117 errno = EOK;118 119 112 char *ret = getcwd(buf, size); 120 if (ret == NULL) { 121 /* Check errno to avoid shadowing other possible errors. */ 122 if (errno == EOK) { 123 errno = ERANGE; 124 } 125 } else { 126 /* Success, restore previous errno value. */ 127 errno = orig_errno; 128 } 129 113 if (ret == NULL && errno == EOK) { 114 errno = ERANGE; 115 } 130 116 return ret; 131 }132 133 /**134 * Change the current working directory.135 *136 * @param path New working directory.137 */138 int posix_chdir(const char *path)139 {140 return errnify(chdir, path);141 117 } 142 118 … … 181 157 /* There is currently no support for user accounts in HelenOS. */ 182 158 return 0; 183 }184 185 /**186 * Close a file.187 *188 * @param fildes189 * @return 0 on success, -1 on error.190 */191 int posix_close(int fildes)192 {193 return errnify(close, fildes);194 159 } 195 160 … … 204 169 ssize_t posix_read(int fildes, void *buf, size_t nbyte) 205 170 { 206 return errnify(read, fildes, buf, nbyte); 207 } 208 209 /** 210 * Write to a file. 211 * 212 * @param fildes File descriptor of the opened file. 213 * @param buf Buffer to write. 214 * @param nbyte Size of the buffer. 215 * @return Number of written bytes on success, -1 otherwise. 216 */ 217 ssize_t posix_write(int fildes, const void *buf, size_t nbyte) 218 { 219 return errnify(write, fildes, buf, nbyte); 220 } 221 222 /** 223 * Requests outstanding data to be written to the underlying storage device. 224 * 225 * @param fildes 226 */ 227 int posix_fsync(int fildes) 228 { 229 return errnify(fsync, fildes); 230 } 231 232 int posix_ftruncate(int fildes, posix_off_t length) 233 { 234 return errnify(ftruncate, fildes, (aoff64_t) length); 235 } 236 237 /** 238 * Remove a directory. 239 * 240 * @param path Directory pathname. 241 * @return Zero on success, -1 otherwise. 242 */ 243 int posix_rmdir(const char *path) 244 { 245 return errnify(rmdir, path); 171 int rc = read(fildes, buf, nbyte); 172 if (rc < 0) { 173 errno = -rc; 174 return -1; 175 } else { 176 return rc; 177 } 246 178 } 247 179 … … 254 186 int posix_unlink(const char *path) 255 187 { 256 return errnify(unlink, path); 257 } 258 259 int posix_dup(int fildes) 260 { 261 return posix_fcntl(fildes, F_DUPFD, 0); 262 } 263 264 int posix_dup2(int fildes, int fildes2) 265 { 266 return errnify(dup2, fildes, fildes2); 188 int rc = unlink(path); 189 if (rc < 0) { 190 errno = -rc; 191 return -1; 192 } else { 193 return rc; 194 } 267 195 } 268 196 … … 276 204 int posix_access(const char *path, int amode) 277 205 { 278 if (amode == F_OK || (amode & (X_OK | W_OK | R_OK))) { 279 /* HelenOS doesn't support permissions, permission checks 280 * are equal to existence check. 281 * 282 * Check file existence by attempting to open it. 283 */ 206 if (amode == F_OK) { 207 /* Check file existence by attempt to open it. */ 284 208 int fd = open(path, O_RDONLY); 285 if (fd < 0) { 286 errno = -fd; 287 return -1; 209 if (fd != -1) { 210 close(fd); 288 211 } 289 close(fd); 212 return fd; 213 } else if (amode & (X_OK | W_OK | R_OK)) { 214 /* HelenOS doesn't support permissions, return success. */ 290 215 return 0; 291 216 } else {
Note:
See TracChangeset
for help on using the changeset viewer.