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