Changeset b7ee0369 in mainline for uspace/lib/posix/unistd.c


Ignore:
Timestamp:
2011-07-31T05:08:44Z (13 years ago)
Author:
Petr Koupy <petr.koupy@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
d3e241a
Parents:
051e6ac (diff), 27a8d1d (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.
Message:

Merge libposix changes.

File:
1 edited

Legend:

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

    r051e6ac rb7ee0369  
    110110                return NULL;
    111111        }
     112       
     113        /* Save the original value to comply with the "no modification on
     114         * success" semantics.
     115         */
     116        int orig_errno = errno;
     117        errno = EOK;
     118       
    112119        char *ret = getcwd(buf, size);
    113         if (ret == NULL && errno == EOK) {
    114                 errno = ERANGE;
    115         }
     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       
    116130        return ret;
     131}
     132
     133/**
     134 * Change the current working directory.
     135 *
     136 * @param path New working directory.
     137 */
     138int posix_chdir(const char *path)
     139{
     140        return errnify(chdir, path);
    117141}
    118142
     
    157181        /* There is currently no support for user accounts in HelenOS. */
    158182        return 0;
     183}
     184
     185/**
     186 * Close a file.
     187 *
     188 * @param fildes File descriptor of the opened file.
     189 * @return 0 on success, -1 on error.
     190 */
     191int posix_close(int fildes)
     192{
     193        return errnify(close, fildes);
    159194}
    160195
     
    169204ssize_t posix_read(int fildes, void *buf, size_t nbyte)
    170205{
    171         int rc = read(fildes, buf, nbyte);
    172         if (rc < 0) {
    173                 errno = -rc;
    174                 return -1;
    175         } else {
    176                 return rc;
    177         }
     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 */
     217ssize_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 File descriptor of the opened file.
     226 * @return Zero on success, -1 otherwise.
     227 */
     228int posix_fsync(int fildes)
     229{
     230        return errnify(fsync, fildes);
     231}
     232
     233/**
     234 * Truncate a file to a specified length.
     235 *
     236 * @param fildes File descriptor of the opened file.
     237 * @param length New length of the file.
     238 * @return Zero on success, -1 otherwise.
     239 */
     240int posix_ftruncate(int fildes, posix_off_t length)
     241{
     242        return errnify(ftruncate, fildes, (aoff64_t) length);
     243}
     244
     245/**
     246 * Remove a directory.
     247 *
     248 * @param path Directory pathname.
     249 * @return Zero on success, -1 otherwise.
     250 */
     251int posix_rmdir(const char *path)
     252{
     253        return errnify(rmdir, path);
    178254}
    179255
     
    186262int posix_unlink(const char *path)
    187263{
    188         int rc = unlink(path);
    189         if (rc < 0) {
    190                 errno = -rc;
    191                 return -1;
    192         } else {
    193                 return rc;
    194         }
     264        return errnify(unlink, path);
     265}
     266
     267/**
     268 * Duplicate an open file descriptor.
     269 *
     270 * @param fildes File descriptor to be duplicated.
     271 * @return On success, new file descriptor for the same file, otherwise -1.
     272 */
     273int posix_dup(int fildes)
     274{
     275        return posix_fcntl(fildes, F_DUPFD, 0);
     276}
     277
     278/**
     279 * Duplicate an open file descriptor.
     280 *
     281 * @param fildes File descriptor to be duplicated.
     282 * @param fildes2 File descriptor to be paired with the same file description
     283 *     as is paired fildes.
     284 * @return fildes2 on success, -1 otherwise.
     285 */
     286int posix_dup2(int fildes, int fildes2)
     287{
     288        return errnify(dup2, fildes, fildes2);
    195289}
    196290
     
    204298int posix_access(const char *path, int amode)
    205299{
    206         if (amode == F_OK) {
    207                 /* Check file existence by attempt to open it. */
     300        if (amode == F_OK || (amode & (X_OK | W_OK | R_OK))) {
     301                /* HelenOS doesn't support permissions, permission checks
     302                 * are equal to existence check.
     303                 *
     304                 * Check file existence by attempting to open it.
     305                 */
    208306                int fd = open(path, O_RDONLY);
    209                 if (fd != -1) {
    210                         close(fd);
     307                if (fd < 0) {
     308                        errno = -fd;
     309                        return -1;
    211310                }
    212                 return fd;
    213         } else if (amode & (X_OK | W_OK | R_OK)) {
    214                 /* HelenOS doesn't support permissions, return success. */
     311                close(fd);
    215312                return 0;
    216313        } else {
Note: See TracChangeset for help on using the changeset viewer.