/* We expect one arg in the input: return NULL otherwise.
* The payload must contain exactly one nul, at the end.
*/
-static const char *onearg(struct buffered_data *in)
+const char *onearg(struct buffered_data *in)
{
if (!in->used || get_string(in, 0) != in->used)
return NULL;
return true;
}
-static void send_directory(struct connection *conn, const char *name)
+static void send_directory(struct connection *conn, struct buffered_data *in)
{
struct node *node;
+ const char *name = onearg(in);
name = canonicalize(conn, name);
node = get_node(conn, name, XS_PERM_READ);
send_reply(conn, XS_DIRECTORY, node->children, node->childlen);
}
-static void do_read(struct connection *conn, const char *name)
+static void do_read(struct connection *conn, struct buffered_data *in)
{
struct node *node;
+ const char *name = onearg(in);
name = canonicalize(conn, name);
node = get_node(conn, name, XS_PERM_READ);
send_ack(conn, XS_WRITE);
}
-static void do_mkdir(struct connection *conn, const char *name)
+static void do_mkdir(struct connection *conn, struct buffered_data *in)
{
struct node *node;
+ const char *name = onearg(in);
name = canonicalize(conn, name);
node = get_node(conn, name, XS_PERM_WRITE);
}
-static void do_rm(struct connection *conn, const char *name)
+static void do_rm(struct connection *conn, struct buffered_data *in)
{
struct node *node;
+ const char *name = onearg(in);
name = canonicalize(conn, name);
node = get_node(conn, name, XS_PERM_WRITE);
}
-static void do_get_perms(struct connection *conn, const char *name)
+static void do_get_perms(struct connection *conn, struct buffered_data *in)
{
struct node *node;
+ const char *name = onearg(in);
char *strings;
unsigned int len;
switch (in->hdr.msg.type) {
case XS_DIRECTORY:
- send_directory(conn, onearg(in));
+ send_directory(conn, in);
break;
case XS_READ:
- do_read(conn, onearg(in));
+ do_read(conn, in);
break;
case XS_WRITE:
break;
case XS_MKDIR:
- do_mkdir(conn, onearg(in));
+ do_mkdir(conn, in);
break;
case XS_RM:
- do_rm(conn, onearg(in));
+ do_rm(conn, in);
break;
case XS_GET_PERMS:
- do_get_perms(conn, onearg(in));
+ do_get_perms(conn, in);
break;
case XS_SET_PERMS:
break;
case XS_TRANSACTION_END:
- do_transaction_end(conn, onearg(in));
+ do_transaction_end(conn, in);
break;
case XS_INTRODUCE:
break;
case XS_IS_DOMAIN_INTRODUCED:
- do_is_domain_introduced(conn, onearg(in));
+ do_is_domain_introduced(conn, in);
break;
case XS_RELEASE:
- do_release(conn, onearg(in));
+ do_release(conn, in);
break;
case XS_GET_DOMAIN_PATH:
- do_get_domain_path(conn, onearg(in));
+ do_get_domain_path(conn, in);
break;
case XS_RESUME:
- do_resume(conn, onearg(in));
+ do_resume(conn, in);
break;
case XS_SET_TARGET:
break;
case XS_RESET_WATCHES:
- do_reset_watches(conn);
+ do_reset_watches(conn, in);
break;
default:
}
/* domid */
-void do_release(struct connection *conn, const char *domid_str)
+void do_release(struct connection *conn, struct buffered_data *in)
{
+ const char *domid_str = onearg(in);
struct domain *domain;
unsigned int domid;
send_ack(conn, XS_RELEASE);
}
-void do_resume(struct connection *conn, const char *domid_str)
+void do_resume(struct connection *conn, struct buffered_data *in)
{
struct domain *domain;
unsigned int domid;
+ const char *domid_str = onearg(in);
if (!domid_str) {
send_error(conn, EINVAL);
send_ack(conn, XS_RESUME);
}
-void do_get_domain_path(struct connection *conn, const char *domid_str)
+void do_get_domain_path(struct connection *conn, struct buffered_data *in)
{
char *path;
+ const char *domid_str = onearg(in);
if (!domid_str) {
send_error(conn, EINVAL);
talloc_free(path);
}
-void do_is_domain_introduced(struct connection *conn, const char *domid_str)
+void do_is_domain_introduced(struct connection *conn, struct buffered_data *in)
{
int result;
unsigned int domid;
+ const char *domid_str = onearg(in);
if (!domid_str) {
send_error(conn, EINVAL);
}
/* Allow guest to reset all watches */
-void do_reset_watches(struct connection *conn)
+void do_reset_watches(struct connection *conn, struct buffered_data *in)
{
conn_delete_all_watches(conn);
conn_delete_all_transactions(conn);
void do_introduce(struct connection *conn, struct buffered_data *in);
/* domid */
-void do_is_domain_introduced(struct connection *conn, const char *domid_str);
+void do_is_domain_introduced(struct connection *conn, struct buffered_data *in);
/* domid */
-void do_release(struct connection *conn, const char *domid_str);
+void do_release(struct connection *conn, struct buffered_data *in);
/* domid */
-void do_resume(struct connection *conn, const char *domid_str);
+void do_resume(struct connection *conn, struct buffered_data *in);
/* domid, target */
void do_set_target(struct connection *conn, struct buffered_data *in);
/* domid */
-void do_get_domain_path(struct connection *conn, const char *domid_str);
+void do_get_domain_path(struct connection *conn, struct buffered_data *in);
/* Allow guest to reset all watches */
-void do_reset_watches(struct connection *conn);
+void do_reset_watches(struct connection *conn, struct buffered_data *in);
void domain_init(void);