+/*
+ * Setup per-session delta save directory. If the passed "sid" blob attribute
+ * pointer is NULL then the precedure was not invoked through the ubus-rpc so
+ * we do not perform session isolation and use the default save directory.
+ */
+static void
+rpc_uci_set_savedir(struct blob_attr *sid)
+{
+ char path[PATH_MAX];
+
+ if (!sid)
+ {
+ uci_set_savedir(cursor, "/tmp/.uci");
+ return;
+ }
+
+ snprintf(path, sizeof(path) - 1,
+ "/tmp/.uci-rpc-%s", (char *)blobmsg_data(sid));
+
+ uci_set_savedir(cursor, path);
+}
+
+/*
+ * Test read access to given config. If the passed "sid" blob attribute pointer
+ * is NULL then the precedure was not invoked through the ubus-rpc so we do not
+ * perform access control and always assume true.
+ */
+static bool
+rpc_uci_read_access(struct blob_attr *sid, struct blob_attr *config)
+{
+ rpc_uci_set_savedir(sid);
+
+ if (!sid)
+ return true;
+
+ return rpc_session_access(blobmsg_data(sid), "uci",
+ blobmsg_data(config), "read");
+}
+
+/*
+ * Test write access to given config. If the passed "sid" blob attribute pointer
+ * is NULL then the precedure was not invoked through the ubus-rpc so we do not
+ * perform access control and always assume true.
+ */
+static bool
+rpc_uci_write_access(struct blob_attr *sid, struct blob_attr *config)
+{
+ rpc_uci_set_savedir(sid);
+
+ if (!sid)
+ return true;
+
+ return rpc_session_access(blobmsg_data(sid), "uci",
+ blobmsg_data(config), "write");
+}
+