Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/lib/posix/source/unistd.c

    r6afc9d7 r5759642f  
    105105char *posix_getcwd(char *buf, size_t size)
    106106{
    107         char *p = getcwd(buf, size);
    108 
    109         if (p == NULL) {
    110                 errno = -errno;
     107        /* Native getcwd() does not set any errno despite the fact that general
     108         * usage pattern of this function depends on it (caller is repeatedly
     109         * guessing the required size of the buffer by checking for ERANGE on
     110         * failure). */
     111        if (size == 0) {
     112                errno = EINVAL;
    111113                return NULL;
    112114        }
    113 
    114         return p;
     115       
     116        /* Save the original value to comply with the "no modification on
     117         * success" semantics.
     118         */
     119        int orig_errno = errno;
     120        errno = EOK;
     121       
     122        char *ret = getcwd(buf, size);
     123        if (ret == NULL) {
     124                /* Check errno to avoid shadowing other possible errors. */
     125                if (errno == EOK) {
     126                        errno = ERANGE;
     127                }
     128        } else {
     129                /* Success, restore previous errno value. */
     130                errno = orig_errno;
     131        }
     132       
     133        return ret;
    115134}
    116135
     
    122141int posix_chdir(const char *path)
    123142{
    124         return negerrno(chdir, path);
     143        return errnify(chdir, path);
    125144}
    126145
     
    175194int posix_close(int fildes)
    176195{
    177         return negerrno(close, fildes);
     196        return errnify(close, fildes);
    178197}
    179198
     
    188207ssize_t posix_read(int fildes, void *buf, size_t nbyte)
    189208{
    190         return negerrno(read, fildes, buf, nbyte);
     209        return errnify(read, fildes, buf, nbyte);
    191210}
    192211
     
    201220ssize_t posix_write(int fildes, const void *buf, size_t nbyte)
    202221{
    203         return negerrno(write, fildes, buf, nbyte);
    204 }
    205 
    206 /**
    207  * Reposition read/write file offset
    208  *
    209  * @param fildes File descriptor of the opened file.
    210  * @param offset New offset in the file.
    211  * @param whence The position from which the offset argument is specified.
    212  * @return Upon successful completion, returns the resulting offset
    213  *         as measured in bytes from the beginning of the file, -1 otherwise.
    214  */
    215 posix_off_t posix_lseek(int fildes, posix_off_t offset, int whence)
    216 {
    217         return negerrno(lseek, fildes, offset, whence);
     222        return errnify(write, fildes, buf, nbyte);
    218223}
    219224
     
    226231int posix_fsync(int fildes)
    227232{
    228         return negerrno(fsync, fildes);
     233        return errnify(fsync, fildes);
    229234}
    230235
     
    238243int posix_ftruncate(int fildes, posix_off_t length)
    239244{
    240         return negerrno(ftruncate, fildes, (aoff64_t) length);
     245        return errnify(ftruncate, fildes, (aoff64_t) length);
    241246}
    242247
     
    249254int posix_rmdir(const char *path)
    250255{
    251         return negerrno(rmdir, path);
     256        return errnify(rmdir, path);
    252257}
    253258
     
    260265int posix_unlink(const char *path)
    261266{
    262         return negerrno(unlink, path);
     267        return errnify(unlink, path);
    263268}
    264269
     
    284289int posix_dup2(int fildes, int fildes2)
    285290{
    286         return negerrno(dup2, fildes, fildes2);
     291        return errnify(dup2, fildes, fildes2);
    287292}
    288293
     
    302307                 * Check file existence by attempting to open it.
    303308                 */
    304                 int fd = negerrno(open, path, O_RDONLY);
     309                int fd = open(path, O_RDONLY);
    305310                if (fd < 0) {
    306                         /* errno was set by open() */
     311                        errno = -fd;
    307312                        return -1;
    308313                }
     
    370375        // TODO: low priority, just a compile-time dependency of binutils
    371376        not_implemented();
    372         return -1;
    373377}
    374378
     
    381385        // TODO: low priority, just a compile-time dependency of binutils
    382386        not_implemented();
    383         return -1;
    384387}
    385388
     
    394397        // TODO: low priority, just a compile-time dependency of binutils
    395398        not_implemented();
    396         return -1;
    397399}
    398400
     
    407409        // TODO: low priority, just a compile-time dependency of binutils
    408410        not_implemented();
    409         return -1;
    410411}
    411412
     
    419420        // TODO: low priority, just a compile-time dependency of binutils
    420421        not_implemented();
    421         return -1;
    422422}
    423423
Note: See TracChangeset for help on using the changeset viewer.