Revision 5268cecc hw/virtio-9p.c
b/hw/virtio-9p.c | ||
---|---|---|
160 | 160 |
return s->ops->chmod(&s->ctx, path->data, &cred); |
161 | 161 |
} |
162 | 162 |
|
163 |
static int v9fs_do_mknod(V9fsState *s, V9fsCreateState *vs, mode_t mode,
|
|
164 |
dev_t dev)
|
|
163 |
static int v9fs_do_mknod(V9fsState *s, char *name,
|
|
164 |
mode_t mode, dev_t dev, uid_t uid, gid_t gid)
|
|
165 | 165 |
{ |
166 | 166 |
FsCred cred; |
167 | 167 |
cred_init(&cred); |
168 |
cred.fc_uid = vs->fidp->uid; |
|
168 |
cred.fc_uid = uid; |
|
169 |
cred.fc_gid = gid; |
|
169 | 170 |
cred.fc_mode = mode; |
170 | 171 |
cred.fc_rdev = dev; |
171 |
return s->ops->mknod(&s->ctx, vs->fullname.data, &cred);
|
|
172 |
return s->ops->mknod(&s->ctx, name, &cred);
|
|
172 | 173 |
} |
173 | 174 |
|
174 | 175 |
static int v9fs_do_mkdir(V9fsState *s, V9fsCreateState *vs) |
... | ... | |
2332 | 2333 |
} |
2333 | 2334 |
|
2334 | 2335 |
nmode |= vs->perm & 0777; |
2335 |
err = v9fs_do_mknod(s, vs, nmode, makedev(major, minor)); |
|
2336 |
err = v9fs_do_mknod(s, vs->fullname.data, nmode, |
|
2337 |
makedev(major, minor), vs->fidp->uid, -1); |
|
2336 | 2338 |
v9fs_create_post_perms(s, vs, err); |
2337 | 2339 |
} else if (vs->perm & P9_STAT_MODE_NAMED_PIPE) { |
2338 |
err = v9fs_do_mknod(s, vs, S_IFIFO | (vs->perm & 0777), 0); |
|
2340 |
err = v9fs_do_mknod(s, vs->fullname.data, S_IFIFO | (vs->perm & 0777), |
|
2341 |
0, vs->fidp->uid, -1); |
|
2339 | 2342 |
v9fs_post_create(s, vs, err); |
2340 | 2343 |
} else if (vs->perm & P9_STAT_MODE_SOCKET) { |
2341 |
err = v9fs_do_mknod(s, vs, S_IFSOCK | (vs->perm & 0777), 0); |
|
2344 |
err = v9fs_do_mknod(s, vs->fullname.data, S_IFSOCK | (vs->perm & 0777), |
|
2345 |
0, vs->fidp->uid, -1); |
|
2342 | 2346 |
v9fs_post_create(s, vs, err); |
2343 | 2347 |
} else { |
2344 | 2348 |
vs->fidp->fd = v9fs_do_open2(s, vs->fullname.data, vs->fidp->uid, |
... | ... | |
2849 | 2853 |
qemu_free(vs); |
2850 | 2854 |
} |
2851 | 2855 |
|
2856 |
static void v9fs_mknod_post_lstat(V9fsState *s, V9fsMkState *vs, int err) |
|
2857 |
{ |
|
2858 |
if (err == -1) { |
|
2859 |
err = -errno; |
|
2860 |
goto out; |
|
2861 |
} |
|
2862 |
|
|
2863 |
stat_to_qid(&vs->stbuf, &vs->qid); |
|
2864 |
vs->offset += pdu_marshal(vs->pdu, vs->offset, "Q", &vs->qid); |
|
2865 |
err = vs->offset; |
|
2866 |
out: |
|
2867 |
complete_pdu(s, vs->pdu, err); |
|
2868 |
v9fs_string_free(&vs->fullname); |
|
2869 |
v9fs_string_free(&vs->name); |
|
2870 |
qemu_free(vs); |
|
2871 |
} |
|
2872 |
|
|
2873 |
static void v9fs_mknod_post_mknod(V9fsState *s, V9fsMkState *vs, int err) |
|
2874 |
{ |
|
2875 |
if (err == -1) { |
|
2876 |
err = -errno; |
|
2877 |
goto out; |
|
2878 |
} |
|
2879 |
|
|
2880 |
err = v9fs_do_lstat(s, &vs->fullname, &vs->stbuf); |
|
2881 |
v9fs_mknod_post_lstat(s, vs, err); |
|
2882 |
return; |
|
2883 |
out: |
|
2884 |
complete_pdu(s, vs->pdu, err); |
|
2885 |
v9fs_string_free(&vs->fullname); |
|
2886 |
v9fs_string_free(&vs->name); |
|
2887 |
qemu_free(vs); |
|
2888 |
} |
|
2889 |
|
|
2890 |
static void v9fs_mknod(V9fsState *s, V9fsPDU *pdu) |
|
2891 |
{ |
|
2892 |
int32_t fid; |
|
2893 |
V9fsMkState *vs; |
|
2894 |
int err = 0; |
|
2895 |
V9fsFidState *fidp; |
|
2896 |
gid_t gid; |
|
2897 |
int mode; |
|
2898 |
int major, minor; |
|
2899 |
|
|
2900 |
vs = qemu_malloc(sizeof(*vs)); |
|
2901 |
vs->pdu = pdu; |
|
2902 |
vs->offset = 7; |
|
2903 |
|
|
2904 |
v9fs_string_init(&vs->fullname); |
|
2905 |
pdu_unmarshal(vs->pdu, vs->offset, "dsdddd", &fid, &vs->name, &mode, |
|
2906 |
&major, &minor, &gid); |
|
2907 |
|
|
2908 |
fidp = lookup_fid(s, fid); |
|
2909 |
if (fidp == NULL) { |
|
2910 |
err = -ENOENT; |
|
2911 |
goto out; |
|
2912 |
} |
|
2913 |
|
|
2914 |
v9fs_string_sprintf(&vs->fullname, "%s/%s", fidp->path.data, vs->name.data); |
|
2915 |
err = v9fs_do_mknod(s, vs->fullname.data, mode, makedev(major, minor), |
|
2916 |
fidp->uid, gid); |
|
2917 |
v9fs_mknod_post_mknod(s, vs, err); |
|
2918 |
return; |
|
2919 |
|
|
2920 |
out: |
|
2921 |
complete_pdu(s, vs->pdu, err); |
|
2922 |
v9fs_string_free(&vs->fullname); |
|
2923 |
v9fs_string_free(&vs->name); |
|
2924 |
qemu_free(vs); |
|
2925 |
} |
|
2926 |
|
|
2852 | 2927 |
typedef void (pdu_handler_t)(V9fsState *s, V9fsPDU *pdu); |
2853 | 2928 |
|
2854 | 2929 |
static pdu_handler_t *pdu_handlers[] = { |
... | ... | |
2856 | 2931 |
[P9_TSTATFS] = v9fs_statfs, |
2857 | 2932 |
[P9_TGETATTR] = v9fs_getattr, |
2858 | 2933 |
[P9_TSETATTR] = v9fs_setattr, |
2934 |
[P9_TMKNOD] = v9fs_mknod, |
|
2859 | 2935 |
[P9_TVERSION] = v9fs_version, |
2860 | 2936 |
[P9_TATTACH] = v9fs_attach, |
2861 | 2937 |
[P9_TSTAT] = v9fs_stat, |
Also available in: Unified diff