Revision df0973a4 hw/virtio-9p.c

b/hw/virtio-9p.c
3520 3520
    qemu_free(vs);
3521 3521
}
3522 3522

  
3523
static void v9fs_readlink_post_readlink(V9fsState *s, V9fsReadLinkState *vs,
3524
                                                    int err)
3525
{
3526
    if (err < 0) {
3527
        err = -errno;
3528
        goto out;
3529
    }
3530
    vs->offset += pdu_marshal(vs->pdu, vs->offset, "s", &vs->target);
3531
    err = vs->offset;
3532
out:
3533
    complete_pdu(s, vs->pdu, err);
3534
    v9fs_string_free(&vs->target);
3535
    qemu_free(vs);
3536
}
3537

  
3538
static void v9fs_readlink(V9fsState *s, V9fsPDU *pdu)
3539
{
3540
    int32_t fid;
3541
    V9fsReadLinkState *vs;
3542
    int err = 0;
3543
    V9fsFidState *fidp;
3544

  
3545
    vs = qemu_malloc(sizeof(*vs));
3546
    vs->pdu = pdu;
3547
    vs->offset = 7;
3548

  
3549
    pdu_unmarshal(vs->pdu, vs->offset, "d", &fid);
3550

  
3551
    fidp = lookup_fid(s, fid);
3552
    if (fidp == NULL) {
3553
        err = -ENOENT;
3554
        goto out;
3555
    }
3556

  
3557
    v9fs_string_init(&vs->target);
3558
    err = v9fs_do_readlink(s, &fidp->path, &vs->target);
3559
    v9fs_readlink_post_readlink(s, vs, err);
3560
    return;
3561
out:
3562
    complete_pdu(s, vs->pdu, err);
3563
    qemu_free(vs);
3564
}
3565

  
3523 3566
typedef void (pdu_handler_t)(V9fsState *s, V9fsPDU *pdu);
3524 3567

  
3525 3568
static pdu_handler_t *pdu_handlers[] = {
......
3533 3576
    [P9_TRENAME] = v9fs_rename,
3534 3577
    [P9_TLOCK] = v9fs_lock,
3535 3578
    [P9_TGETLOCK] = v9fs_getlock,
3579
    [P9_TREADLINK] = v9fs_readlink,
3536 3580
    [P9_TMKDIR] = v9fs_mkdir,
3537 3581
    [P9_TVERSION] = v9fs_version,
3538 3582
    [P9_TLOPEN] = v9fs_open,

Also available in: Unified diff