Statistics
| Branch: | Revision:

root / hw / 9pfs / codir.c @ bed4352c

History | View | Annotate | Download (2.4 kB)

1

    
2
/*
3
 * Virtio 9p backend
4
 *
5
 * Copyright IBM, Corp. 2011
6
 *
7
 * Authors:
8
 *  Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
9
 *
10
 * This work is licensed under the terms of the GNU GPL, version 2.  See
11
 * the COPYING file in the top-level directory.
12
 *
13
 */
14

    
15
#include "fsdev/qemu-fsdev.h"
16
#include "qemu-thread.h"
17
#include "qemu-coroutine.h"
18
#include "virtio-9p-coth.h"
19

    
20
int v9fs_co_readdir(V9fsState *s, V9fsFidState *fidp, struct dirent **dent)
21
{
22
    int err;
23

    
24
    v9fs_co_run_in_worker(
25
        {
26
            errno = 0;
27
            /*FIXME!! need to switch to readdir_r */
28
            *dent = s->ops->readdir(&s->ctx, fidp->fs.dir);
29
            if (!*dent && errno) {
30
                err = -errno;
31
            } else {
32
                err = 0;
33
            }
34
        });
35
    return err;
36
}
37

    
38
off_t v9fs_co_telldir(V9fsState *s, V9fsFidState *fidp)
39
{
40
    off_t err;
41

    
42
    v9fs_co_run_in_worker(
43
        {
44
            err = s->ops->telldir(&s->ctx, fidp->fs.dir);
45
            if (err < 0) {
46
                err = -errno;
47
            }
48
        });
49
    return err;
50
}
51

    
52
void v9fs_co_seekdir(V9fsState *s, V9fsFidState *fidp, off_t offset)
53
{
54
    v9fs_co_run_in_worker(
55
        {
56
            s->ops->seekdir(&s->ctx, fidp->fs.dir, offset);
57
        });
58
}
59

    
60
void v9fs_co_rewinddir(V9fsState *s, V9fsFidState *fidp)
61
{
62
    v9fs_co_run_in_worker(
63
        {
64
            s->ops->rewinddir(&s->ctx, fidp->fs.dir);
65
        });
66
}
67

    
68
int v9fs_co_mkdir(V9fsState *s, char *name, mode_t mode, uid_t uid, gid_t gid)
69
{
70
    int err;
71
    FsCred cred;
72

    
73
    cred_init(&cred);
74
    cred.fc_mode = mode;
75
    cred.fc_uid = uid;
76
    cred.fc_gid = gid;
77
    v9fs_co_run_in_worker(
78
        {
79
            err = s->ops->mkdir(&s->ctx, name, &cred);
80
            if (err < 0) {
81
                err = -errno;
82
            }
83
        });
84
    return err;
85
}
86

    
87
int v9fs_co_opendir(V9fsState *s, V9fsFidState *fidp)
88
{
89
    int err;
90

    
91
    v9fs_co_run_in_worker(
92
        {
93
            fidp->fs.dir = s->ops->opendir(&s->ctx, fidp->path.data);
94
            if (!fidp->fs.dir) {
95
                err = -errno;
96
            } else {
97
                err = 0;
98
            }
99
        });
100
    return err;
101
}
102

    
103
int v9fs_co_closedir(V9fsState *s, V9fsFidState *fidp)
104
{
105
    int err;
106
    DIR *dir;
107

    
108
    dir = fidp->fs.dir;
109
    v9fs_co_run_in_worker(
110
        {
111
            err = s->ops->closedir(&s->ctx, dir);
112
            if (err < 0) {
113
                err = -errno;
114
            }
115
        });
116
    return err;
117
}