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,
|