mirror of https://github.com/xemu-project/xemu.git
[virtio-9p] Implement TLINK for 9P2000.L
Create a Hardlink. SYNOPSIS size[4] Tlink tag[2] dfid[4] oldfid[4] newpath[s] size[4] Rlink tag[2] DESCRIPTION Create a link 'newpath' in directory pointed by dfid linking to oldfid path. Signed-off-by: Venkateswararao Jujjuri <jvrao@linux.vnet.ibm.com>
This commit is contained in:
parent
c79ce73747
commit
b2c224be19
|
@ -497,6 +497,15 @@ void pprint_pdu(V9fsPDU *pdu)
|
||||||
case P9_RCLUNK:
|
case P9_RCLUNK:
|
||||||
fprintf(llogfile, "RCLUNK: (");
|
fprintf(llogfile, "RCLUNK: (");
|
||||||
break;
|
break;
|
||||||
|
case P9_TLINK:
|
||||||
|
fprintf(llogfile, "TLINK: (");
|
||||||
|
pprint_int32(pdu, 0, &offset, "fid");
|
||||||
|
pprint_str(pdu, 0, &offset, ", oldpath");
|
||||||
|
pprint_str(pdu, 0, &offset, ", newpath");
|
||||||
|
break;
|
||||||
|
case P9_RLINK:
|
||||||
|
fprintf(llogfile, "RLINK: (");
|
||||||
|
break;
|
||||||
case P9_TREMOVE:
|
case P9_TREMOVE:
|
||||||
fprintf(llogfile, "TREMOVE: (");
|
fprintf(llogfile, "TREMOVE: (");
|
||||||
pprint_int32(pdu, 0, &offset, "fid");
|
pprint_int32(pdu, 0, &offset, "fid");
|
||||||
|
|
|
@ -2307,6 +2307,43 @@ static void v9fs_flush(V9fsState *s, V9fsPDU *pdu)
|
||||||
complete_pdu(s, pdu, 7);
|
complete_pdu(s, pdu, 7);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void v9fs_link(V9fsState *s, V9fsPDU *pdu)
|
||||||
|
{
|
||||||
|
int32_t dfid, oldfid;
|
||||||
|
V9fsFidState *dfidp, *oldfidp;
|
||||||
|
V9fsString name, fullname;
|
||||||
|
size_t offset = 7;
|
||||||
|
int err = 0;
|
||||||
|
|
||||||
|
v9fs_string_init(&fullname);
|
||||||
|
|
||||||
|
pdu_unmarshal(pdu, offset, "dds", &dfid, &oldfid, &name);
|
||||||
|
|
||||||
|
dfidp = lookup_fid(s, dfid);
|
||||||
|
if (dfidp == NULL) {
|
||||||
|
err = -errno;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
oldfidp = lookup_fid(s, oldfid);
|
||||||
|
if (oldfidp == NULL) {
|
||||||
|
err = -errno;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
v9fs_string_sprintf(&fullname, "%s/%s", dfidp->path.data, name.data);
|
||||||
|
err = offset;
|
||||||
|
err = v9fs_do_link(s, &oldfidp->path, &fullname);
|
||||||
|
if (err) {
|
||||||
|
err = -errno;
|
||||||
|
}
|
||||||
|
v9fs_string_free(&fullname);
|
||||||
|
|
||||||
|
out:
|
||||||
|
v9fs_string_free(&name);
|
||||||
|
complete_pdu(s, pdu, err);
|
||||||
|
}
|
||||||
|
|
||||||
static void v9fs_remove_post_remove(V9fsState *s, V9fsRemoveState *vs,
|
static void v9fs_remove_post_remove(V9fsState *s, V9fsRemoveState *vs,
|
||||||
int err)
|
int err)
|
||||||
{
|
{
|
||||||
|
@ -2680,6 +2717,7 @@ static pdu_handler_t *pdu_handlers[] = {
|
||||||
[P9_TAUTH] = v9fs_auth,
|
[P9_TAUTH] = v9fs_auth,
|
||||||
#endif
|
#endif
|
||||||
[P9_TFLUSH] = v9fs_flush,
|
[P9_TFLUSH] = v9fs_flush,
|
||||||
|
[P9_TLINK] = v9fs_link,
|
||||||
[P9_TCREATE] = v9fs_create,
|
[P9_TCREATE] = v9fs_create,
|
||||||
[P9_TWRITE] = v9fs_write,
|
[P9_TWRITE] = v9fs_write,
|
||||||
[P9_TWSTAT] = v9fs_wstat,
|
[P9_TWSTAT] = v9fs_wstat,
|
||||||
|
|
|
@ -21,6 +21,8 @@ enum {
|
||||||
P9_RSETATTR,
|
P9_RSETATTR,
|
||||||
P9_TREADDIR = 40,
|
P9_TREADDIR = 40,
|
||||||
P9_RREADDIR,
|
P9_RREADDIR,
|
||||||
|
P9_TLINK = 70,
|
||||||
|
P9_RLINK,
|
||||||
P9_TVERSION = 100,
|
P9_TVERSION = 100,
|
||||||
P9_RVERSION,
|
P9_RVERSION,
|
||||||
P9_TAUTH = 102,
|
P9_TAUTH = 102,
|
||||||
|
|
Loading…
Reference in New Issue