# HG changeset patch
# User cl349@xxxxxxxxxxxxxxxxxxxx
# Node ID 71271a3f41a932f44a3b7cee8e2b46a760d8cfe2
# Parent 932fc8a1b38d0c93d0445843ff5bebd090b129ee
Start of code to persistent store connections when xenstored restarts
Signed-off-by: Rusty Russel <rusty@xxxxxxxxxxxxxxx>
Signed-off-by: Christian Limpach <Christian.Limpach@xxxxxxxxxxxx>
diff -r 932fc8a1b38d -r 71271a3f41a9 tools/xenstore/xenstored_core.c
--- a/tools/xenstore/xenstored_core.c Tue Jul 26 13:11:01 2005
+++ b/tools/xenstore/xenstored_core.c Tue Jul 26 14:02:33 2005
@@ -1386,6 +1386,45 @@
}
#endif
+static void setup_structure(void)
+{
+ struct xs_permissions perms = { .id = 0, .perms = XS_PERM_READ };
+ char *root, *dir, *permfile;
+
+ /* Create root directory, with permissions. */
+ if (mkdir(xs_daemon_store(), 0750) != 0) {
+ if (errno != EEXIST)
+ barf_perror("Could not create root %s",
+ xs_daemon_store());
+ return;
+ }
+ root = talloc_strdup(talloc_autofree_context(), "/");
+ if (!set_perms(NULL, root, &perms, 1))
+ barf_perror("Could not create permissions in root");
+
+ /* Create tool directory, with xenstored subdir. */
+ dir = talloc_asprintf(root, "%s/%s", xs_daemon_store(), "tool");
+ if (mkdir(dir, 0750) != 0)
+ barf_perror("Making dir %s", dir);
+
+ permfile = talloc_strdup(root, "/tool");
+ if (!set_perms(NULL, permfile, &perms, 1))
+ barf_perror("Could not create permissions on %s", permfile);
+
+ dir = talloc_asprintf(root, "%s/%s", dir, "xenstored");
+ if (mkdir(dir, 0750) != 0)
+ barf_perror("Making dir %s", dir);
+
+ permfile = talloc_strdup(root, "/tool/xenstored");
+ if (!set_perms(NULL, permfile, &perms, 1))
+ barf_perror("Could not create permissions on %s", permfile);
+
+ talloc_free(root);
+ if (mkdir(xs_daemon_transactions(), 0750) != 0)
+ barf_perror("Could not create transaction dir %s",
+ xs_daemon_transactions());
+}
+
static struct option options[] = { { "no-fork", 0, NULL, 'N' },
{ "verbose", 0, NULL, 'V' },
{ "output-pid", 0, NULL, 'P' },
@@ -1461,21 +1500,13 @@
barf_perror("Could not listen on sockets");
/* If we're the first, create .perms file for root. */
- if (mkdir(xs_daemon_store(), 0750) == 0) {
- struct xs_permissions perms;
- char *root = talloc_strdup(talloc_autofree_context(), "/");
-
- perms.id = 0;
- perms.perms = XS_PERM_READ;
- if (!set_perms(NULL, root, &perms, 1))
- barf_perror("Could not create permissions in root");
- talloc_free(root);
- mkdir(xs_daemon_transactions(), 0750);
- } else if (errno != EEXIST)
- barf_perror("Could not create root %s", xs_daemon_store());
+ setup_structure();
/* Listen to hypervisor. */
event_fd = domain_init();
+
+ /* Restore existing connections. */
+ restore_existing_connections();
/* Debugging: daemonize() closes standard fds, so dup here. */
tmpout = dup(STDOUT_FILENO);
diff -r 932fc8a1b38d -r 71271a3f41a9 tools/xenstore/xenstored_domain.c
--- a/tools/xenstore/xenstored_domain.c Tue Jul 26 13:11:01 2005
+++ b/tools/xenstore/xenstored_domain.c Tue Jul 26 14:02:33 2005
@@ -254,34 +254,21 @@
#endif
}
-/* domid, mfn, evtchn, path */
-bool do_introduce(struct connection *conn, struct buffered_data *in)
+static struct domain *new_domain(void *context, domid_t domid,
+ unsigned long mfn, int port,
+ const char *path)
{
struct domain *domain;
- char *vec[4];
-
- if (get_strings(in, vec, ARRAY_SIZE(vec)) < ARRAY_SIZE(vec))
- return send_error(conn, EINVAL);
-
- if (conn->id != 0)
- return send_error(conn, EACCES);
-
- if (!conn->can_write)
- return send_error(conn, EROFS);
-
- /* Hang domain off "in" until we're finished. */
- domain = talloc(in, struct domain);
- domain->domid = atoi(vec[0]);
- domain->port = atoi(vec[2]);
- if ((domain->port <= 0) || !is_valid_nodename(vec[3]))
- return send_error(conn, EINVAL);
- domain->path = talloc_strdup(domain, vec[3]);
+ domain = talloc(context, struct domain);
+ domain->domid = domid;
+ domain->port = port;
+ domain->path = talloc_strdup(domain, path);
domain->page = xc_map_foreign_range(*xc_handle, domain->domid,
getpagesize(),
PROT_READ|PROT_WRITE,
- atol(vec[1]));
+ mfn);
if (!domain->page)
- return send_error(conn, errno);
+ return NULL;
list_add(&domain->list, &domains);
talloc_set_destructor(domain, destroy_domain);
@@ -292,11 +279,38 @@
/* Tell kernel we're interested in this event. */
if (ioctl(eventchn_fd, EVENTCHN_BIND, domain->port) != 0)
- return send_error(conn, errno);
+ return NULL;
domain->conn = new_connection(writechn, readchn);
domain->conn->domain = domain;
-
+ return domain;
+}
+
+/* domid, mfn, evtchn, path */
+bool do_introduce(struct connection *conn, struct buffered_data *in)
+{
+ struct domain *domain;
+ char *vec[4];
+
+ if (get_strings(in, vec, ARRAY_SIZE(vec)) < ARRAY_SIZE(vec))
+ return send_error(conn, EINVAL);
+
+ if (conn->id != 0)
+ return send_error(conn, EACCES);
+
+ if (!conn->can_write)
+ return send_error(conn, EROFS);
+
+ /* Sanity check args. */
+ if ((atoi(vec[2]) <= 0) || !is_valid_nodename(vec[3]))
+ return send_error(conn, EINVAL);
+ /* Hang domain off "in" until we're finished. */
+ domain = new_domain(in, atoi(vec[0]), atol(vec[1]), atol(vec[2]),
+ vec[3]);
+ if (!domain)
+ return send_error(conn, errno);
+
+ /* Now domain belongs to its connection. */
talloc_steal(domain->conn, domain);
return send_ack(conn, XS_INTRODUCE);
@@ -373,6 +387,11 @@
if (!conn->domain)
return NULL;
return conn->domain->path;
+}
+
+/* Restore existing connections. */
+void restore_existing_connections(void)
+{
}
/* Returns the event channel handle. */
diff -r 932fc8a1b38d -r 71271a3f41a9 tools/xenstore/xenstored_domain.h
--- a/tools/xenstore/xenstored_domain.h Tue Jul 26 13:11:01 2005
+++ b/tools/xenstore/xenstored_domain.h Tue Jul 26 14:02:33 2005
@@ -37,4 +37,7 @@
/* Returns the implicit path of a connection (only domains have this) */
const char *get_implicit_path(const struct connection *conn);
+/* Read existing connection information from store. */
+void restore_existing_connections(void);
+
#endif /* _XENSTORED_DOMAIN_H */
_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog
|