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