changeset 1282:0c94a9835dfd

client: handle LINK Signed-off-by: Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
author Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
date Sat, 17 Dec 2022 16:38:59 -0500
parents fe84110a0b10
children 6934276850f2
files src/client/cmd_dir.c src/client/cmds.c src/client/cmds.h
diffstat 3 files changed, 52 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/src/client/cmd_dir.c	Sat Dec 17 16:32:57 2022 -0500
+++ b/src/client/cmd_dir.c	Sat Dec 17 16:38:59 2022 -0500
@@ -70,6 +70,48 @@
 	return ret;
 }
 
+static int __cmd_symlink(struct fsconn *conn, struct ohandle *diroh,
+			 struct rpc_link_req *req, struct rpc_link_res *res)
+{
+	if (req->target_handle)
+		return -EINVAL; /* target handle is only for hardlinks */
+
+	return objstore_symlink(diroh->cookie, req->name, req->owner,
+				req->group, req->mode, req->target_name,
+				&res->oid);
+}
+
+static int __cmd_link(struct fsconn *conn, struct ohandle *diroh,
+		      struct rpc_link_req *req)
+{
+	struct ohandle *tgtoh;
+
+	if (req->target_name || req->owner || req->group || req->mode)
+		return -EINVAL; /* these fields are only for symlinks */
+
+	tgtoh = ohandle_find(conn, req->target_handle);
+	if (!tgtoh)
+		return -EINVAL;
+
+	return objstore_link(diroh->cookie, req->name, tgtoh->cookie);
+}
+
+int cmd_link(struct fsconn *conn, union cmd *cmd)
+{
+	struct rpc_link_req *req = &cmd->link.req;
+	struct rpc_link_res *res = &cmd->link.res;
+	struct ohandle *oh;
+
+	oh = ohandle_find(conn, req->parent);
+	if (!oh)
+		return -EINVAL;
+
+	if (req->symlink)
+		return __cmd_symlink(conn, oh, req, res);
+	else
+		return __cmd_link(conn, oh, req);
+}
+
 int cmd_unlink(struct fsconn *conn, union cmd *cmd)
 {
 	struct rpc_unlink_req *req = &cmd->unlink.req;
--- a/src/client/cmds.c	Sat Dec 17 16:32:57 2022 -0500
+++ b/src/client/cmds.c	Sat Dec 17 16:38:59 2022 -0500
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015-2019,2022 Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
+ * Copyright (c) 2015-2020,2022 Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
  * Copyright (c) 2015 Holly Sipek
  * Copyright (c) 2016 Steve Dougherty
  *
@@ -97,6 +97,7 @@
 	CMD_ARG_RET(NRPC_OPEN,          open,          cmd_open,        true),
 	CMD_ARG_RET(NRPC_READ,          read,          cmd_read,        true),
 	CMD_ARG_RET(NRPC_SETATTR,       setattr,       cmd_setattr,     true),
+	CMD_ARG_RET(NRPC_LINK,          link,          cmd_link,        true),
 	CMD_ARG    (NRPC_UNLINK,        unlink,        cmd_unlink,      true),
 	CMD_ARG_RET(NRPC_VDEV_IMPORT,	vdev_import,   cmd_vdev_import,	false),
 	CMD_RET    (NRPC_VDEV_LIST,     vdev_list,     cmd_vdev_list,   false),
--- a/src/client/cmds.h	Sat Dec 17 16:32:57 2022 -0500
+++ b/src/client/cmds.h	Sat Dec 17 16:38:59 2022 -0500
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015-2019,2022 Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
+ * Copyright (c) 2015-2020,2022 Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
  * Copyright (c) 2015 Holly Sipek
  * Copyright (c) 2016 Steve Dougherty
  *
@@ -56,6 +56,12 @@
 		struct rpc_getdent_res res;
 	} getdent;
 
+	/* link */
+	struct {
+		struct rpc_link_req req;
+		struct rpc_link_res res;
+	} link;
+
 	/* login */
 	struct {
 		struct rpc_login_req req;
@@ -165,6 +171,7 @@
 extern int cmd_open(struct fsconn *conn, union cmd *cmd);
 extern int cmd_read(struct fsconn *conn, union cmd *cmd);
 extern int cmd_setattr(struct fsconn *conn, union cmd *cmd);
+extern int cmd_link(struct fsconn *conn, union cmd *cmd);
 extern int cmd_unlink(struct fsconn *conn, union cmd *cmd);
 extern int cmd_write(struct fsconn *conn, union cmd *cmd);
 extern int cmd_vdev_import(struct fsconn *conn, union cmd *cmd);