aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorkraxel <kraxel>2006-01-31 14:05:09 +0000
committerkraxel <kraxel>2006-01-31 14:05:09 +0000
commit204520ac1d70a7d6c6084c2ec98560d580f38fa2 (patch)
tree5fef0b342a450412e74c32de62e45423f987402d
parentc28bc1bc12c466c58a71eeed8f2d38e46008ee2f (diff)
downloadxenwatch-204520ac1d70a7d6c6084c2ec98560d580f38fa2.tar.gz
- lots of mdns updates.
-rw-r--r--INSTALL2
-rw-r--r--mdns-browser.c19
-rw-r--r--mdns-publish-xendom.c66
-rw-r--r--mdns.c234
-rw-r--r--mdns.h2
-rw-r--r--mk/Autoconf.mk2
-rw-r--r--mk/Compile.mk2
-rw-r--r--mk/Variables.mk8
-rw-r--r--xd_view.c6
-rw-r--r--xenlog.c34
10 files changed, 311 insertions, 64 deletions
diff --git a/INSTALL b/INSTALL
index 0d1ba36..8f99186 100644
--- a/INSTALL
+++ b/INSTALL
@@ -56,4 +56,4 @@ Have fun,
Gerd
--
-Gerd Knorr <kraxel@bytesex.org>
+Gerd Hoffmann <kraxel@suse.de>
diff --git a/mdns-browser.c b/mdns-browser.c
index 2368890..340e587 100644
--- a/mdns-browser.c
+++ b/mdns-browser.c
@@ -18,8 +18,10 @@
static Display *dpy;
static struct mdns_window *mdns;
-static char *service = "_xendom._tcp";
+static char *service = "_ssh._tcp";
static char *domain = NULL;
+static int urlmode = 0;
+static int xenmode = 0;
/* ------------------------------------------------------------------ */
@@ -33,6 +35,10 @@ static void usage(FILE *fp)
" -h print this text\n"
" -s <service> specify service [%s]\n"
" -d <domain> specify domain\n"
+ " -u url mode, displays a different set of default\n"
+ " columns, useful for _http._tcp & friends.\n"
+ " -x xen mode, yet another sefault column set, this\n"
+ " also sets service to _xendom._tcp\n"
"\n"
"-- \n"
"(c) 2006 Gerd Hoffmann <kraxel@suse.de>\n",
@@ -46,7 +52,7 @@ main(int argc, char *argv[])
gtk_init(&argc, &argv);
for (;;) {
- if (-1 == (c = getopt(argc, argv, "hs:d:")))
+ if (-1 == (c = getopt(argc, argv, "huxs:d:")))
break;
switch (c) {
case 's':
@@ -55,6 +61,13 @@ main(int argc, char *argv[])
case 'd':
domain = optarg;
break;
+ case 'u':
+ urlmode = 1;
+ break;
+ case 'x':
+ service = "_xendom._tcp";
+ xenmode = 1;
+ break;
case 'h':
usage(stdout);
exit(0);
@@ -67,7 +80,7 @@ main(int argc, char *argv[])
dpy = gdk_x11_display_get_xdisplay(gdk_display_get_default());
fcntl(ConnectionNumber(dpy),F_SETFD,FD_CLOEXEC);
- mdns = mdns_create_window(1);
+ mdns = mdns_create_window(1, urlmode, xenmode);
if (NULL == mdns) {
fprintf(stderr,"Oops: mDNS did't initialize ok\n");
exit(1);
diff --git a/mdns-publish-xendom.c b/mdns-publish-xendom.c
index 69eccb4..3cc8119 100644
--- a/mdns-publish-xendom.c
+++ b/mdns-publish-xendom.c
@@ -5,7 +5,9 @@
#include <fcntl.h>
#include <syslog.h>
#include <string.h>
+#include <sys/types.h>
#include <sys/utsname.h>
+#include <sys/stat.h>
#include <xs.h>
@@ -17,12 +19,15 @@
#include <avahi-common/malloc.h>
#include <avahi-common/error.h>
+/* --------------------------------------------------------------------- */
+
static AvahiEntryGroup *group = NULL;
static AvahiSimplePoll *simple_poll = NULL;
static int debug = 0;
static int have_tty = 1;
static int have_syslog = 0;
+static char *appname = "mdns-publish-xendom";
static char *name;
static char *service = "_xendom._tcp";
@@ -44,7 +49,7 @@ log_printf(int priority, char *fmt, ...)
va_end(args);
if (have_tty)
- fprintf(stderr, "%s", msgbuf);
+ fprintf(stderr, "%s: %s", appname, msgbuf);
if (have_syslog)
syslog(priority, "%s", msgbuf);
return rc;
@@ -62,17 +67,17 @@ static void entry_group_callback(AvahiEntryGroup *g,
switch (state) {
case AVAHI_ENTRY_GROUP_ESTABLISHED:
- log_printf(LOG_INFO, "Service '%s' successfully established.\n", name);
+ log_printf(LOG_INFO, "service '%s' successfully established\n", name);
break;
case AVAHI_ENTRY_GROUP_COLLISION:
n = avahi_alternative_service_name(name);
- log_printf(LOG_NOTICE, "Service name collision, renaming '%s' to '%s'\n",
+ log_printf(LOG_NOTICE, "service name collision, renaming '%s' to '%s'\n",
name, n);
avahi_free(name);
name = n;
create_services(avahi_entry_group_get_client(g));
break;
- case AVAHI_ENTRY_GROUP_FAILURE :
+ case AVAHI_ENTRY_GROUP_FAILURE:
avahi_simple_poll_quit(simple_poll);
break;
default:
@@ -98,13 +103,13 @@ static void create_services(AvahiClient *c)
name, service, NULL, NULL, port,
vm_uuid, dom_id, NULL);
if (ret < 0) {
- log_printf(LOG_ERR, "Failed to add '%s' service: %s\n", service, avahi_strerror(ret));
+ log_printf(LOG_ERR, "failed to add '%s' service: %s\n", service, avahi_strerror(ret));
goto fail;
}
/* Tell the server to register the service */
if ((ret = avahi_entry_group_commit(group)) < 0) {
- log_printf(LOG_ERR, "Failed to commit entry_group: %s\n", avahi_strerror(ret));
+ log_printf(LOG_ERR, "failed to commit entry_group: %s\n", avahi_strerror(ret));
goto fail;
}
return;
@@ -121,7 +126,7 @@ static void client_callback(AvahiClient *c,
switch (state) {
case AVAHI_CLIENT_CONNECTING:
- log_printf(LOG_NOTICE, "avahi not running (yet), I'll keep trying ...\n");
+ log_printf(LOG_NOTICE, "avahi daemon not running (yet), I'll keep trying ...\n");
break;
case AVAHI_CLIENT_S_RUNNING:
if (!group)
@@ -138,18 +143,18 @@ static void client_callback(AvahiClient *c,
avahi_client_free(c);
group = NULL;
- log_printf(LOG_NOTICE, "disconnected from avahi, reconnecting ...\n");
+ log_printf(LOG_NOTICE, "disconnected from avahi daemon, reconnecting ...\n");
c = avahi_client_new(avahi_simple_poll_get(simple_poll),
AVAHI_CLIENT_NO_FAIL,
client_callback, NULL, &error);
if (!c) {
- log_printf(LOG_ERR, "Failed to create client: %s\n",
+ log_printf(LOG_ERR, "failed to create client: %s\n",
avahi_strerror(error));
goto fail;
}
break;
default:
- log_printf(LOG_ERR, "Client failure: %s\n",
+ log_printf(LOG_ERR, "client failure: %s\n",
avahi_strerror(avahi_client_errno(c)));
goto fail;
break;
@@ -169,34 +174,39 @@ static int update_xendom_info(void)
struct xs_handle *xenstore;
xs_transaction_t xst;
char *xs_value;
+ struct stat st;
+
+ if (-1 == stat("/proc/xen", &st)) {
+ log_printf(LOG_ERR, "/proc/xen not found, running on bare metal?\n");
+ return -1;
+ }
xenstore = xs_domain_open();
if (NULL == xenstore) {
- log_printf(LOG_ERR, "%s: can't connect to %s\n", __FUNCTION__,
- xs_domain_dev());
+ log_printf(LOG_ERR, "can't connect to xenstore (%s)\n", xs_domain_dev());
return -1;
}
if (!(xst = xs_transaction_start(xenstore))) {
- log_printf(LOG_ERR, "%s: can't start transaction\n", __FUNCTION__);
+ log_printf(LOG_ERR, "can't start xenstore transaction\n");
goto out;
}
xs_value = xs_read(xenstore, xst, "vm", NULL);
xs_transaction_end(xenstore, xst, 0);
if (!xs_value) {
- log_printf(LOG_ERR, "%s: can't read \"vm\" value\n", __FUNCTION__);
+ log_printf(LOG_ERR, "can't read 'vm' value from xenstore\n");
goto out;
}
snprintf(vm_uuid, sizeof(vm_uuid), "vm-uuid=%s", xs_value+4);
if (!(xst = xs_transaction_start(xenstore))) {
- log_printf(LOG_ERR, "%s: can't start transaction\n", __FUNCTION__);
+ log_printf(LOG_ERR, "can't start xenstore transaction\n");
goto out;
}
xs_value = xs_read(xenstore, xst, "domid", NULL);
xs_transaction_end(xenstore, xst, 0);
if (!xs_value) {
- log_printf(LOG_ERR, "%s: can't read \"domid\" value\n", __FUNCTION__);
+ log_printf(LOG_ERR, "can't read 'domid' value from xenstore\n");
goto out;
}
snprintf(dom_id, sizeof(dom_id), "dom-id=%s", xs_value);
@@ -210,15 +220,17 @@ static int update_xendom_info(void)
static void usage(FILE *fp)
{
fprintf(fp,
- "This little daemon publishes xen domain info via mDNS.\n"
+ "This little daemon publishes xen domain info,\n"
+ "via mDNS (using avahi), as service '_xendom._tcp'.\n"
"\n"
- "usage: mdns-publish-xendom [options]\n"
+ "usage: %s [options]\n"
"options:\n"
" -h print this text\n"
" -d enable debug mode\n"
"\n"
"-- \n"
- "(c) 2006 Gerd Hoffmann <kraxel@suse.de>\n");
+ "(c) 2006 Gerd Hoffmann <kraxel@suse.de>\n",
+ appname);
}
int main(int argc, char*argv[])
@@ -247,22 +259,22 @@ int main(int argc, char*argv[])
}
/* open syslog */
- openlog("mdns-publish-xendom", 0, LOG_LOCAL0);
+ openlog(appname, 0, LOG_LOCAL0);
have_syslog = 1;
/* figure name */
uname(&uts);
- snprintf(buf, sizeof(buf), "Xen domain %s", uts.nodename);
+ snprintf(buf, sizeof(buf), "xendom %s", uts.nodename);
name = avahi_strdup(buf);
/* figure domain info */
if (0 != update_xendom_info())
- exit(1);
+ goto fail;
/* prepare nDNS bits */
simple_poll = avahi_simple_poll_new();
if (!simple_poll) {
- log_printf(LOG_ERR, "Failed to create simple poll object.\n");
+ log_printf(LOG_ERR, "failed to create simple poll object\n");
goto fail;
}
@@ -270,7 +282,7 @@ int main(int argc, char*argv[])
AVAHI_CLIENT_NO_FAIL,
client_callback, NULL, &error);
if (!client) {
- log_printf(LOG_ERR, "Failed to create client: %s\n", avahi_strerror(error));
+ log_printf(LOG_ERR, "failed to create client: %s\n", avahi_strerror(error));
goto fail;
}
@@ -279,14 +291,16 @@ int main(int argc, char*argv[])
switch (fork()) {
case -1:
log_printf(LOG_ERR, "fork: %s", strerror(errno));
- exit(1);
+ goto fail;
case 0:
+ /* child */
close(0); close(1); close(2);
setsid();
open("/dev/null", O_RDWR); dup(0); dup(0);
have_tty = 0;
break;
default:
+ /* parent */
exit(0);
}
}
@@ -296,6 +310,8 @@ int main(int argc, char*argv[])
ret = 0;
fail:
+ log_printf(ret ? LOG_ERR : LOG_INFO, "exiting (%d)\n", ret);
+
/* Cleanup things */
if (client)
avahi_client_free(client);
diff --git a/mdns.c b/mdns.c
index c7375b9..fac5752 100644
--- a/mdns.c
+++ b/mdns.c
@@ -51,9 +51,19 @@ enum {
ST_NUM_COLS
};
+static int str_sort[] = {
+ ST_COL_NAME,
+ ST_COL_TYPE,
+ ST_COL_DOMAIN,
+ ST_COL_INTERFACE,
+ ST_COL_PROTOCOL,
+ ST_COL_HOSTNAME,
+};
+
struct mdns_window {
GtkListStore *store;
GtkWidget *toplevel, *view, *status;
+ GtkActionGroup *ag;
int standalone;
const AvahiPoll *poll_api;
@@ -495,7 +505,73 @@ int mdns_browse(struct mdns_window *mdns,
/* ---------------------------------------------------------------------- */
-static void menu_cb_close(GtkWidget *whatever, gpointer userdata)
+static void menu_cb_view_col(GtkToggleAction *action, gpointer userdata, int id)
+{
+ struct mdns_window *mdns = userdata;
+ GtkTreeViewColumn *col;
+ gboolean active;
+
+ active = gtk_toggle_action_get_active(action);
+ col = gtk_tree_view_get_column(GTK_TREE_VIEW(mdns->view), id);
+ gtk_tree_view_column_set_visible(col, active);
+}
+
+static void menu_cb_view_col_type(GtkToggleAction *action, gpointer userdata)
+{
+ menu_cb_view_col(action, userdata, ST_COL_TYPE);
+}
+
+static void menu_cb_view_col_domain(GtkToggleAction *action, gpointer userdata)
+{
+ menu_cb_view_col(action, userdata, ST_COL_DOMAIN);
+}
+
+static void menu_cb_view_col_interface(GtkToggleAction *action, gpointer userdata)
+{
+ menu_cb_view_col(action, userdata, ST_COL_INTERFACE);
+}
+
+static void menu_cb_view_col_protocol(GtkToggleAction *action, gpointer userdata)
+{
+ menu_cb_view_col(action, userdata, ST_COL_PROTOCOL);
+}
+
+static void menu_cb_view_col_hostname(GtkToggleAction *action, gpointer userdata)
+{
+ menu_cb_view_col(action, userdata, ST_COL_HOSTNAME);
+}
+
+static void menu_cb_view_col_addr(GtkToggleAction *action, gpointer userdata)
+{
+ menu_cb_view_col(action, userdata, ST_COL_ADDR);
+}
+
+static void menu_cb_view_col_port(GtkToggleAction *action, gpointer userdata)
+{
+ menu_cb_view_col(action, userdata, ST_COL_PORT);
+}
+
+static void menu_cb_view_col_path(GtkToggleAction *action, gpointer userdata)
+{
+ menu_cb_view_col(action, userdata, ST_COL_PATH);
+}
+
+static void menu_cb_view_col_url(GtkToggleAction *action, gpointer userdata)
+{
+ menu_cb_view_col(action, userdata, ST_COL_URL);
+}
+
+static void menu_cb_view_col_xen_dom_id(GtkToggleAction *action, gpointer userdata)
+{
+ menu_cb_view_col(action, userdata, ST_COL_XEN_DOM_ID);
+}
+
+static void menu_cb_view_col_xen_vm_uuid(GtkToggleAction *action, gpointer userdata)
+{
+ menu_cb_view_col(action, userdata, ST_COL_XEN_VM_UUID);
+}
+
+static void menu_cb_close(GtkAction *action, gpointer userdata)
{
struct mdns_window *mdns = userdata;
@@ -521,6 +597,9 @@ static const GtkActionEntry entries[] = {
.name = "FileMenu",
.label = "_File",
},{
+ .name = "ViewMenu",
+ .label = "_View",
+ },{
.name = "Close",
.stock_id = GTK_STOCK_CLOSE,
.label = "_Close",
@@ -529,12 +608,84 @@ static const GtkActionEntry entries[] = {
},
};
+static const GtkToggleActionEntry tentries[] = {
+ {
+ .name = "ColType",
+ .label = "Type",
+ .callback = G_CALLBACK(menu_cb_view_col_type),
+ .is_active = 1,
+ },{
+ .name = "ColDomain",
+ .label = "Domain",
+ .callback = G_CALLBACK(menu_cb_view_col_domain),
+ .is_active = 1,
+ },{
+ .name = "ColInterface",
+ .label = "Interface",
+ .callback = G_CALLBACK(menu_cb_view_col_interface),
+ .is_active = 1,
+ },{
+ .name = "ColProtocol",
+ .label = "Protocol",
+ .callback = G_CALLBACK(menu_cb_view_col_protocol),
+ .is_active = 1,
+ },{
+ .name = "ColHostname",
+ .label = "Hostname",
+ .callback = G_CALLBACK(menu_cb_view_col_hostname),
+ .is_active = 1,
+ },{
+ .name = "ColAddress",
+ .label = "Address",
+ .callback = G_CALLBACK(menu_cb_view_col_addr),
+ .is_active = 1,
+ },{
+ .name = "ColPort",
+ .label = "Port",
+ .callback = G_CALLBACK(menu_cb_view_col_port),
+ .is_active = 1,
+ },{
+ .name = "ColPath",
+ .label = "Path",
+ .callback = G_CALLBACK(menu_cb_view_col_path),
+ .is_active = 1,
+ },{
+ .name = "ColURL",
+ .label = "URL",
+ .callback = G_CALLBACK(menu_cb_view_col_url),
+ .is_active = 1,
+ },{
+ .name = "ColXenDomID",
+ .label = "Xen dom-id",
+ .callback = G_CALLBACK(menu_cb_view_col_xen_dom_id),
+ .is_active = 1,
+ },{
+ .name = "ColXenVmUUID",
+ .label = "Xen vm-uuid",
+ .callback = G_CALLBACK(menu_cb_view_col_xen_vm_uuid),
+ .is_active = 1,
+ }
+};
+
static char ui_xml[] =
"<ui>"
" <menubar name='MainMenu'>"
" <menu action='FileMenu'>"
" <menuitem action='Close'/>"
" </menu>"
+" <menu action='ViewMenu'>"
+" <menuitem action='ColType'/>"
+" <menuitem action='ColDomain'/>"
+" <menuitem action='ColInterface'/>"
+" <menuitem action='ColProtocol'/>"
+" <menuitem action='ColHostname'/>"
+" <menuitem action='ColAddress'/>"
+" <menuitem action='ColPort'/>"
+" <menuitem action='ColPath'/>"
+" <menuitem action='ColURL'/>"
+" <menuitem action='ColXenDomID'/>"
+" <menuitem action='ColXenVmUUID'/>"
+" </menu>"
" </menubar>"
" <toolbar action='ToolBar'>"
" <toolitem action='Close'/>"
@@ -567,6 +718,8 @@ static GtkWidget *mdns_create_view(struct mdns_window *mdns)
GtkCellRenderer *renderer;
GtkTreeSortable *sortable;
GtkWidget *view;
+ GtkTreeViewColumn *col;
+ int i;
view = gtk_tree_view_new();
gtk_tree_view_set_model(GTK_TREE_VIEW(view),
@@ -576,37 +729,37 @@ static GtkWidget *mdns_create_view(struct mdns_window *mdns)
renderer = gtk_cell_renderer_text_new();
gtk_tree_view_insert_column_with_attributes
- (GTK_TREE_VIEW(view), -1, "name", renderer,
+ (GTK_TREE_VIEW(view), -1, "Name", renderer,
"text", ST_COL_NAME,
NULL);
renderer = gtk_cell_renderer_text_new();
gtk_tree_view_insert_column_with_attributes
- (GTK_TREE_VIEW(view), -1, "type", renderer,
+ (GTK_TREE_VIEW(view), -1, "Type", renderer,
"text", ST_COL_TYPE,
NULL);
renderer = gtk_cell_renderer_text_new();
gtk_tree_view_insert_column_with_attributes
- (GTK_TREE_VIEW(view), -1, "domain", renderer,
+ (GTK_TREE_VIEW(view), -1, "Domain", renderer,
"text", ST_COL_DOMAIN,
NULL);
renderer = gtk_cell_renderer_text_new();
gtk_tree_view_insert_column_with_attributes
- (GTK_TREE_VIEW(view), -1, "if", renderer,
+ (GTK_TREE_VIEW(view), -1, "If", renderer,
"text", ST_COL_INTERFACE,
NULL);
renderer = gtk_cell_renderer_text_new();
gtk_tree_view_insert_column_with_attributes
- (GTK_TREE_VIEW(view), -1, "proto", renderer,
+ (GTK_TREE_VIEW(view), -1, "Proto", renderer,
"text", ST_COL_PROTOCOL,
NULL);
renderer = gtk_cell_renderer_text_new();
gtk_tree_view_insert_column_with_attributes
- (GTK_TREE_VIEW(view), -1, "hostname", renderer,
+ (GTK_TREE_VIEW(view), -1, "Hostname", renderer,
"text", ST_COL_HOSTNAME,
NULL);
@@ -615,37 +768,37 @@ static GtkWidget *mdns_create_view(struct mdns_window *mdns)
"xalign", 1.0,
NULL);
gtk_tree_view_insert_column_with_attributes
- (GTK_TREE_VIEW(view), -1, "address", renderer,
+ (GTK_TREE_VIEW(view), -1, "Address", renderer,
"text", ST_COL_ADDR,
NULL);
renderer = gtk_cell_renderer_text_new();
gtk_tree_view_insert_column_with_attributes
- (GTK_TREE_VIEW(view), -1, "port", renderer,
+ (GTK_TREE_VIEW(view), -1, "Port", renderer,
"text", ST_COL_PORT,
NULL);
renderer = gtk_cell_renderer_text_new();
gtk_tree_view_insert_column_with_attributes
- (GTK_TREE_VIEW(view), -1, "path", renderer,
+ (GTK_TREE_VIEW(view), -1, "Path", renderer,
"text", ST_COL_PATH,
NULL);
renderer = gtk_cell_renderer_text_new();
gtk_tree_view_insert_column_with_attributes
- (GTK_TREE_VIEW(view), -1, "url", renderer,
+ (GTK_TREE_VIEW(view), -1, "URL", renderer,
"text", ST_COL_URL,
NULL);
renderer = gtk_cell_renderer_text_new();
gtk_tree_view_insert_column_with_attributes
- (GTK_TREE_VIEW(view), -1, "id", renderer,
+ (GTK_TREE_VIEW(view), -1, "ID", renderer,
"text", ST_COL_XEN_DOM_ID,
NULL);
renderer = gtk_cell_renderer_text_new();
gtk_tree_view_insert_column_with_attributes
- (GTK_TREE_VIEW(view), -1, "vm", renderer,
+ (GTK_TREE_VIEW(view), -1, "VM", renderer,
"text", ST_COL_XEN_VM_UUID,
NULL);
@@ -655,22 +808,58 @@ static GtkWidget *mdns_create_view(struct mdns_window *mdns)
(GTK_TREE_VIEW(view), -1, "", renderer,
NULL);
+ /* sort bits */
sortable = GTK_TREE_SORTABLE(mdns->store);
- gtk_tree_sortable_set_sort_func(sortable, ST_COL_NAME,
- gtk_sort_iter_compare_str,
- GINT_TO_POINTER(ST_COL_NAME), NULL);
+ for (i = 0; i < sizeof(str_sort)/sizeof(str_sort[0]); i++) {
+ gtk_tree_sortable_set_sort_func(sortable, str_sort[i],
+ gtk_sort_iter_compare_str,
+ GINT_TO_POINTER(str_sort[i]), NULL);
+ col = gtk_tree_view_get_column(GTK_TREE_VIEW(view), str_sort[i]);
+ gtk_tree_view_column_set_sort_column_id(col, str_sort[i]);
+ }
gtk_tree_sortable_set_sort_column_id(sortable, ST_COL_NAME,
GTK_SORT_ASCENDING);
return view;
}
-struct mdns_window *mdns_create_window(int standalone)
+static void set_default_visible_cols(struct mdns_window *mdns, int url, int xen)
+{
+ GtkToggleAction *ta;
+
+ ta = GTK_TOGGLE_ACTION(gtk_action_group_get_action(mdns->ag, "ColType"));
+ gtk_toggle_action_set_active(ta, FALSE);
+ ta = GTK_TOGGLE_ACTION(gtk_action_group_get_action(mdns->ag, "ColDomain"));
+ gtk_toggle_action_set_active(ta, FALSE);
+
+ ta = GTK_TOGGLE_ACTION(gtk_action_group_get_action(mdns->ag, "ColInterface"));
+ gtk_toggle_action_set_active(ta, TRUE);
+ ta = GTK_TOGGLE_ACTION(gtk_action_group_get_action(mdns->ag, "ColProtocol"));
+ gtk_toggle_action_set_active(ta, TRUE);
+ ta = GTK_TOGGLE_ACTION(gtk_action_group_get_action(mdns->ag, "ColHostname"));
+ gtk_toggle_action_set_active(ta, TRUE);
+
+ ta = GTK_TOGGLE_ACTION(gtk_action_group_get_action(mdns->ag, "ColAddress"));
+ gtk_toggle_action_set_active(ta, !xen && !url);
+ ta = GTK_TOGGLE_ACTION(gtk_action_group_get_action(mdns->ag, "ColPort"));
+ gtk_toggle_action_set_active(ta, !xen && !url);
+ ta = GTK_TOGGLE_ACTION(gtk_action_group_get_action(mdns->ag, "ColPath"));
+ gtk_toggle_action_set_active(ta, !xen && !url);
+
+ ta = GTK_TOGGLE_ACTION(gtk_action_group_get_action(mdns->ag, "ColURL"));
+ gtk_toggle_action_set_active(ta, url);
+
+ ta = GTK_TOGGLE_ACTION(gtk_action_group_get_action(mdns->ag, "ColXenDomID"));
+ gtk_toggle_action_set_active(ta, xen);
+ ta = GTK_TOGGLE_ACTION(gtk_action_group_get_action(mdns->ag, "ColXenVmUUID"));
+ gtk_toggle_action_set_active(ta, xen);
+}
+
+struct mdns_window *mdns_create_window(int standalone, int url, int xen)
{
struct mdns_window *mdns;
GtkWidget *vbox, *menubar, *toolbar, *scroll;
GtkAccelGroup *accel;
- GtkActionGroup *ag;
GtkUIManager *ui;
GError *err;
@@ -690,9 +879,11 @@ struct mdns_window *mdns_create_window(int standalone)
/* menu + toolbar */
ui = gtk_ui_manager_new();
- ag = gtk_action_group_new("MenuActions");
- gtk_action_group_add_actions(ag, entries, G_N_ELEMENTS(entries), mdns);
- gtk_ui_manager_insert_action_group(ui, ag, 0);
+ mdns->ag = gtk_action_group_new("MenuActions");
+ gtk_action_group_add_actions(mdns->ag, entries, G_N_ELEMENTS(entries), mdns);
+ gtk_action_group_add_toggle_actions(mdns->ag, tentries,
+ G_N_ELEMENTS(tentries), mdns);
+ gtk_ui_manager_insert_action_group(ui, mdns->ag, 0);
accel = gtk_ui_manager_get_accel_group(ui);
gtk_window_add_accel_group(GTK_WINDOW(mdns->toplevel), accel);
@@ -747,6 +938,7 @@ struct mdns_window *mdns_create_window(int standalone)
gtk_container_add(GTK_CONTAINER(scroll), mdns->view);
gtk_box_pack_end(GTK_BOX(vbox), mdns->status, FALSE, TRUE, 0);
+ set_default_visible_cols(mdns, url, xen);
return mdns;
}
diff --git a/mdns.h b/mdns.h
index 0d41d39..cc0b33b 100644
--- a/mdns.h
+++ b/mdns.h
@@ -1,6 +1,6 @@
struct mdns_window;
-struct mdns_window *mdns_create_window(int standalone);
+struct mdns_window *mdns_create_window(int standalone, int url, int xen);
void mdns_show_window(struct mdns_window *mdns);
void mdns_destroy_window(struct mdns_window *mdns);
diff --git a/mk/Autoconf.mk b/mk/Autoconf.mk
index 51053c9..aea4900 100644
--- a/mk/Autoconf.mk
+++ b/mk/Autoconf.mk
@@ -1,7 +1,7 @@
#
# simple autoconf system for GNU make
#
-# (c) 2002-2004 Gerd Knorr <kraxel@bytesex.org>
+# (c) 2002-2006 Gerd Hoffmann <kraxel@suse.de>
#
# credits for creating this one go to the autotools people because
# they managed it to annoy lots of developers and users (including
diff --git a/mk/Compile.mk b/mk/Compile.mk
index 49dddbf..da14d58 100644
--- a/mk/Compile.mk
+++ b/mk/Compile.mk
@@ -1,7 +1,7 @@
#
# some rules to compile stuff ...
#
-# (c) 2002-2004 Gerd Knorr <kraxel@bytesex.org>
+# (c) 2002-2006 Gerd Hoffmann <kraxel@suse.de>
#
# main features:
# * autodependencies via "cpp -MD"
diff --git a/mk/Variables.mk b/mk/Variables.mk
index 930f824..69486f3 100644
--- a/mk/Variables.mk
+++ b/mk/Variables.mk
@@ -29,9 +29,11 @@ INSTALL_DATA := $(INSTALL) -m 644
INSTALL_DIR := $(INSTALL) -d
# cflags
-CFLAGS ?= -g -O2
-CFLAGS += -Wall -Wmissing-prototypes -Wstrict-prototypes \
- -Wpointer-arith -Wunused
+CFLAGS ?= -g -O2
+CXXFLAGS ?= $(CFLAGS)
+CFLAGS += -Wall -Wmissing-prototypes -Wstrict-prototypes \
+ -Wpointer-arith -Wunused
+CXXFLAGS += -Wall -Wpointer-arith -Wunused
# add /usr/local to the search path if something is in there ...
ifneq ($(wildcard /usr/local/include/*.h),)
diff --git a/xd_view.c b/xd_view.c
index 7789c67..280b456 100644
--- a/xd_view.c
+++ b/xd_view.c
@@ -426,7 +426,7 @@ static void menu_cb_mdns(void)
#ifdef HAVE_AVAHI
struct mdns_window *mdns;
- mdns = mdns_create_window(0);
+ mdns = mdns_create_window(0,0,1);
if (NULL == mdns) {
gtk_message(GTK_MESSAGE_ERROR, "Can't setup mDNS browser, sorry.\n");
return;
@@ -507,8 +507,8 @@ static void menu_cb_domain_destroy(void)
static void menu_cb_about(void)
{
static char *comments = "xen domain monitor";
- static char *copyright = "(c) 2005 Gerd Knorr";
- static char *authors[] = { "Gerd Knorr <kraxel@suse.de>", NULL };
+ static char *copyright = "(c) 2005-2006 Gerd Hoffmann";
+ static char *authors[] = { "Gerd Hoffmann <kraxel@suse.de>", NULL };
gtk_show_about_dialog(GTK_WINDOW(xd_toplevel),
"authors", authors,
diff --git a/xenlog.c b/xenlog.c
index af3bef5..d7e951c 100644
--- a/xenlog.c
+++ b/xenlog.c
@@ -7,19 +7,42 @@
int main(int argc, char *argv[])
{
- struct xs_handle *xenstore;
+ struct xs_handle *xenstore = NULL;
xs_transaction_t xst;
char *xs_value = NULL, **vec;
char *value;
unsigned int count;
- xenstore = xs_daemon_open_readonly();
if (NULL == xenstore) {
- fprintf(stderr,"can't connect to %s\n",xs_daemon_socket_ro());
+ xenstore = xs_daemon_open_readonly();
+ if (NULL == xenstore)
+ fprintf(stderr,"can't connect to %s\n",xs_daemon_socket_ro());
+ else
+ printf("connected to %s\n", xs_daemon_socket_ro());
+ }
+
+ if (NULL == xenstore) {
+ xenstore = xs_daemon_open();
+ if (NULL == xenstore)
+ fprintf(stderr,"can't connect to %s\n",xs_daemon_socket());
+ else
+ printf("connected to %s\n", xs_daemon_socket());
+ }
+
+ if (NULL == xenstore) {
+ xenstore = xs_domain_open();
+ if (NULL == xenstore)
+ fprintf(stderr, "can't connect to %s\n", xs_domain_dev());
+ else
+ printf("connected to %s\n", xs_domain_dev());
+ }
+
+ if (NULL == xenstore) {
+ fprintf(stderr, "can't access xenstore, exiting\n");
exit(1);
}
- xs_watch(xenstore, "/", "token");
+ xs_watch(xenstore, "/", "token");
for (;;) {
vec = xs_read_watch(xenstore, &count);
if (NULL == vec) {
@@ -44,7 +67,8 @@ int main(int argc, char *argv[])
value = "<null>";
break;
}
- fprintf(stderr,"%-64s : \"%s\"\n", vec[XS_WATCH_PATH], value);
+ printf("%-64s : \"%s\"\n", vec[XS_WATCH_PATH], value);
+ fflush(stdout);
if (xs_value) {
free(xs_value);