Blob Blame History Raw
From 07bf3074ccdd9debe844fe1bae0244799d01fe58 Mon Sep 17 00:00:00 2001
From: Chris Leech <cleech@redhat.com>
Date: Wed, 2 Jan 2013 14:46:14 -0800
Subject: iscsiuio: iscsid IPC newroot command

---
 include/uip_mgmt_ipc.h | 4 ++++
 src/unix/iscsid_ipc.c  | 9 +++++++++
 2 files changed, 13 insertions(+)

diff --git a/include/uip_mgmt_ipc.h b/include/uip_mgmt_ipc.h
index 7054df5..db87b2b 100644
--- a/include/uip_mgmt_ipc.h
+++ b/include/uip_mgmt_ipc.h
@@ -26,6 +26,7 @@
 typedef enum iscsid_uip_cmd {
 	ISCSID_UIP_IPC_UNKNOWN                  = 0,
 	ISCSID_UIP_IPC_GET_IFACE                = 1,
+	ISCSID_UIP_NEWROOT			= 2,
 
 	__ISCSID_UIP_IPC_MAX_COMMAND
 } iscsid_uip_cmd_e;
@@ -45,6 +46,9 @@ typedef struct iscsid_uip_broadcast {
 		struct ipc_broadcast_iface_rec {
 			struct iface_rec rec;
 		} iface_rec;
+		struct ipc_broadcast_newroot {
+			char path[PATH_MAX + 1];
+		} newroot;
 	} u;
 } iscsid_uip_broadcast_t;
 
diff --git a/src/unix/iscsid_ipc.c b/src/unix/iscsid_ipc.c
index 1c28822..dcbeb4c 100644
--- a/src/unix/iscsid_ipc.c
+++ b/src/unix/iscsid_ipc.c
@@ -801,6 +801,7 @@ int process_iscsid_broadcast(int s2)
 	size_t size;
 	iscsid_uip_cmd_e cmd;
 	uint32_t payload_len;
+	char *newroot;
 
 	fd = fdopen(s2, "r+");
 	if (fd == NULL) {
@@ -857,6 +858,14 @@ int process_iscsid_broadcast(int s2)
 		}
 
 		break;
+	case ISCSID_UIP_NEWROOT:
+		rsp.command = cmd;
+		newroot = data->u.newroot.path;
+		if (chdir(newroot) || chroot(".") || chdir("/"))
+			rsp.err = ISCSID_UIP_MGMT_IPC_ERR;
+		else
+			rsp.err = ISCSID_UIP_MGMT_IPC_OK;
+		break;
 	default:
 		LOG_WARN(PFX "Unknown iscsid broadcast command: %x",
 			 data->header.command);
-- 
1.7.11.7