Changeset 368ee04 in mainline for uspace/lib/c/generic/dirent.c


Ignore:
Timestamp:
2017-04-05T18:10:39Z (8 years ago)
Author:
Jakub Jermar <jakub@…>
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.
Message:

Merge from lp:~jakub/helenos/vfs-2.5-cherrypick

This merge cherry-picks some of the changesets from Jiri Zarevucky's:

lp:~zarevucky-jiri/helenos/vfs-2.5

and then continues independently, yet sometime in a similar vein.

Roughly speaking, Jiri's branch is merged entirely up to its revision
1926 and then cherry-picked on and off until its revision 1965. Among
these changes are:

  • relativization of the API,
  • client-side roots,
  • server-side mounts,
  • inbox for passing arbitrary files from parent to child,
  • some streamlining and cleanup.

Additional changes include:

  • addressing issues introduced by the above changes,
  • client-side I/O cursors (file positions),
  • all HelenOS file system APIs begin with the vfs_ prefix and can be used after including vfs/vfs.h,
  • removal of some POSIX-ish headers and definitions,
  • additional cleanup.
File:
1 moved

Legend:

Unmodified
Added
Removed
  • uspace/lib/c/generic/dirent.c

    r39f892a9 r368ee04  
    3333 */
    3434
    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>
    3741
    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 */
     48DIR *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}
    4275
    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 */
     82struct 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}
    5398
    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 */
     103void rewinddir(DIR *dirp)
     104{
     105        dirp->pos = 0;
     106}
    57107
    58 #endif
     108/** Close directory.
     109 *
     110 * @param dirp Open directory
     111 * @return 0 on success. On error returns -1 and sets errno.
     112 */
     113int 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}
    59123
    60124/** @}
Note: See TracChangeset for help on using the changeset viewer.