aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGerd Hoffmann <kraxel@redhat.com>2012-10-09 10:19:49 +0200
committerGerd Hoffmann <kraxel@redhat.com>2012-10-09 10:19:49 +0200
commit99aca14f3aa05f8012e039413f9f6388087b6ecc (patch)
tree8ea4e9eb70f53f6aea2417e5e413b21dbf39f4f2
parent9afddca3c27aa8aa2519ebc610d1dd59316a79ef (diff)
downloadvconsole-99aca14f3aa05f8012e039413f9f6388087b6ecc.tar.gz
error reporting
-rw-r--r--GNUmakefile3
-rw-r--r--connect.c23
-rw-r--r--domain.c6
-rw-r--r--vconsole.c33
-rw-r--r--vconsole.h4
5 files changed, 66 insertions, 3 deletions
diff --git a/GNUmakefile b/GNUmakefile
index 06fa9dc..2996ee9 100644
--- a/GNUmakefile
+++ b/GNUmakefile
@@ -35,6 +35,9 @@ CFLAGS += -Wno-deprecated-declarations
wanted := $(HAVE_GLIB)-$(HAVE_GTHREAD)-$(HAVE_GTK3)-$(HAVE_VTE3)-$(HAVE_LIBVIRT)
pkglst := glib-2.0 gthread-2.0 gtk+-3.0 vte-2.90 libvirt
else
+CFLAGS += -DGTK_DISABLE_SINGLE_INCLUDES
+CFLAGS += -DGTK_DISABLE_DEPRECATED
+CFLAGS += -DGSEAL_ENABLE
wanted := $(HAVE_GLIB)-$(HAVE_GTHREAD)-$(HAVE_GTK2)-$(HAVE_VTE2)-$(HAVE_LIBVIRT)
pkglst := glib-2.0 gthread-2.0 gtk+-2.0 vte libvirt
endif
diff --git a/connect.c b/connect.c
index 40d4dfc..dbee8f4 100644
--- a/connect.c
+++ b/connect.c
@@ -14,6 +14,25 @@ static int connect_domain_event(virConnectPtr c, virDomainPtr d,
return 0;
}
+static void connect_error(void *opaque, virErrorPtr err)
+{
+ struct vconsole_connect *conn = opaque;
+ GtkMessageType type;
+
+ switch (err->level) {
+ case VIR_ERR_WARNING:
+ type = GTK_MESSAGE_WARNING;
+ break;
+ case VIR_ERR_ERROR:
+ type = GTK_MESSAGE_ERROR;
+ break;
+ default:
+ type = GTK_MESSAGE_INFO;
+ break;
+ }
+ gtk_message(conn->win->toplevel, type, "%s", err->message);
+}
+
void connect_close(virConnectPtr c, int reason, void *opaque)
{
struct vconsole_connect *conn = opaque;
@@ -91,7 +110,8 @@ struct vconsole_connect *connect_init(struct vconsole_window *win,
conn = g_new0(struct vconsole_connect, 1);
conn->ptr = virConnectOpen(uri);
if (conn->ptr == NULL) {
- fprintf(stderr, "Failed to open connection to %s\n", uri);
+ gtk_message(win->toplevel, GTK_MESSAGE_ERROR,
+ "Failed to open connection to %s\n", uri);
g_free(conn);
return NULL;
}
@@ -99,6 +119,7 @@ struct vconsole_connect *connect_init(struct vconsole_window *win,
name = virConnectGetHostname(conn->ptr);
virConnectDomainEventRegister(conn->ptr, connect_domain_event,
conn, NULL);
+ virConnSetErrorFunc(conn->ptr, conn, connect_error);
#if LIBVIR_VERSION_NUMBER >= 10000 /* 0.10.0 */
virConnectRegisterCloseCallback(conn->ptr, connect_close,
conn, NULL);
diff --git a/domain.c b/domain.c
index 8534531..60282fb 100644
--- a/domain.c
+++ b/domain.c
@@ -647,10 +647,12 @@ void domain_activate(struct vconsole_domain *dom)
gtk_widget_show_all(dom->vbox);
gtk_notebook_set_current_page(GTK_NOTEBOOK(win->notebook), page);
domain_configure_vte(dom);
- domain_update_status(dom);
+
+ domain_update_info(dom, d);
+ if (dom->info.state == VIR_DOMAIN_RUNNING)
+ domain_connect(dom, d);
}
- domain_connect(dom, d);
virDomainFree(d);
}
diff --git a/vconsole.c b/vconsole.c
index 95fb458..c3578eb 100644
--- a/vconsole.c
+++ b/vconsole.c
@@ -44,6 +44,37 @@ void config_write(void)
/* ------------------------------------------------------------------ */
+static char *gtk_msg_type_name[] = {
+ [ GTK_MESSAGE_INFO ] = "INFO",
+ [ GTK_MESSAGE_WARNING ] = "WARNING",
+ [ GTK_MESSAGE_QUESTION ] = "QUESTION",
+ [ GTK_MESSAGE_ERROR ] = "ERROR",
+};
+
+int gtk_message(GtkWidget *window, GtkMessageType type, char *fmt, ...)
+{
+ va_list args;
+ GtkWidget *dialog;
+ char msgbuf[1024];
+ int rc;
+
+ va_start(args, fmt);
+ rc = vsnprintf(msgbuf, sizeof(msgbuf), fmt, args);
+ va_end(args);
+
+ if (debug)
+ fprintf(stderr, "%s: %s", gtk_msg_type_name[type], msgbuf);
+ dialog = gtk_message_dialog_new(GTK_WINDOW(window),
+ GTK_DIALOG_DESTROY_WITH_PARENT,
+ type, GTK_BUTTONS_CLOSE,
+ "%s", msgbuf);
+ g_signal_connect_swapped(dialog, "response",
+ G_CALLBACK (gtk_widget_destroy),
+ dialog);
+ gtk_widget_show_all(dialog);
+ return rc;
+}
+
static int gtk_getstring(GtkWidget *window, char *title, char *message,
char *dest, int dlen)
{
@@ -90,6 +121,8 @@ static int gtk_getstring(GtkWidget *window, char *title, char *message,
return retval;
}
+/* ------------------------------------------------------------------ */
+
static void menu_cb_connect_ask(GtkAction *action, gpointer userdata)
{
struct vconsole_window *win = userdata;
diff --git a/vconsole.h b/vconsole.h
index e1ceb67..e31c531 100644
--- a/vconsole.h
+++ b/vconsole.h
@@ -14,6 +14,7 @@
#include <vte/vte.h>
#include <libvirt/libvirt.h>
+#include <libvirt/virterror.h>
/* ------------------------------------------------------------------ */
@@ -72,6 +73,9 @@ struct vconsole_window {
extern int debug;
extern GKeyFile *config;
+int gtk_message(GtkWidget *window, GtkMessageType type, char *fmt, ...)
+ __attribute__ ((format (printf, 3, 0)));
+
void config_write(void);
/* ------------------------------------------------------------------ */