488 | 488 |
return 0;
|
489 | 489 |
}
|
490 | 490 |
|
|
491 |
static void
|
|
492 |
virt_viewer_conn_event(virConnectPtr conn G_GNUC_UNUSED,
|
|
493 |
int reason,
|
|
494 |
void *opaque)
|
|
495 |
{
|
|
496 |
VirtViewer *self = opaque;
|
|
497 |
VirtViewerApp *app = VIRT_VIEWER_APP(self);
|
|
498 |
VirtViewerPrivate *priv = self->priv;
|
|
499 |
|
|
500 |
DEBUG_LOG("Got connection event %d", reason);
|
|
501 |
|
|
502 |
virConnectClose(priv->conn);
|
|
503 |
priv->conn = NULL;
|
|
504 |
|
|
505 |
virt_viewer_app_start_reconnect_poll(app);
|
|
506 |
}
|
|
507 |
|
|
508 |
static int virt_viewer_connect(VirtViewerApp *app);
|
|
509 |
|
491 | 510 |
static int
|
492 | 511 |
virt_viewer_initial_connect(VirtViewerApp *app)
|
493 | 512 |
{
|
|
496 | 515 |
int ret = -1;
|
497 | 516 |
VirtViewer *self = VIRT_VIEWER(app);
|
498 | 517 |
VirtViewerPrivate *priv = self->priv;
|
|
518 |
|
|
519 |
|
|
520 |
DEBUG_LOG("initial connect");
|
|
521 |
|
|
522 |
if (!priv->conn &&
|
|
523 |
virt_viewer_connect(app) < 0) {
|
|
524 |
virt_viewer_app_show_status(app, _("Waiting for libvirt to start"));
|
|
525 |
goto done;
|
|
526 |
}
|
499 | 527 |
|
500 | 528 |
virt_viewer_app_show_status(app, _("Finding guest domain"));
|
501 | 529 |
dom = virt_viewer_lookup_domain(self);
|
|
617 | 645 |
return ret;
|
618 | 646 |
}
|
619 | 647 |
|
620 | |
|
621 | |
static gboolean
|
622 | |
virt_viewer_start(VirtViewerApp *app)
|
|
648 |
static int
|
|
649 |
virt_viewer_connect(VirtViewerApp *app)
|
623 | 650 |
{
|
624 | 651 |
VirtViewer *self = VIRT_VIEWER(app);
|
625 | 652 |
VirtViewerPrivate *priv = self->priv;
|
|
636 | 663 |
if (!virt_viewer_app_get_attach(app))
|
637 | 664 |
oflags |= VIR_CONNECT_RO;
|
638 | 665 |
|
639 | |
virt_viewer_events_register();
|
640 | |
|
641 | |
virSetErrorFunc(NULL, virt_viewer_error_func);
|
|
666 |
DEBUG_LOG("connecting ...");
|
642 | 667 |
|
643 | 668 |
virt_viewer_app_trace(app, "Opening connection to libvirt with URI %s",
|
644 | 669 |
priv->uri ? priv->uri : "<null>");
|
|
649 | 674 |
if (!priv->conn) {
|
650 | 675 |
virt_viewer_app_simple_message_dialog(app, _("Unable to connect to libvirt with URI %s"),
|
651 | 676 |
priv->uri ? priv->uri : _("[none]"));
|
652 | |
return FALSE;
|
|
677 |
return -1;
|
653 | 678 |
}
|
654 | 679 |
|
655 | 680 |
if (virt_viewer_app_initial_connect(app) < 0)
|
656 | |
return FALSE;
|
|
681 |
return -1;
|
657 | 682 |
|
658 | 683 |
if (virConnectDomainEventRegister(priv->conn,
|
659 | 684 |
virt_viewer_domain_event,
|
|
668 | 693 |
DEBUG_LOG("No domain events, falling back to polling");
|
669 | 694 |
virt_viewer_app_start_reconnect_poll(app);
|
670 | 695 |
}
|
|
696 |
|
|
697 |
if (virConnectRegisterCloseCallback(priv->conn,
|
|
698 |
virt_viewer_conn_event,
|
|
699 |
self,
|
|
700 |
NULL) < 0) {
|
|
701 |
DEBUG_LOG("Unable to register close callback on libvirt connection");
|
|
702 |
}
|
|
703 |
|
|
704 |
return 0;
|
|
705 |
}
|
|
706 |
|
|
707 |
static gboolean
|
|
708 |
virt_viewer_start(VirtViewerApp *app)
|
|
709 |
{
|
|
710 |
virt_viewer_events_register();
|
|
711 |
|
|
712 |
virSetErrorFunc(NULL, virt_viewer_error_func);
|
|
713 |
|
|
714 |
if (virt_viewer_connect(app) < 0)
|
|
715 |
return FALSE;
|
671 | 716 |
|
672 | 717 |
return VIRT_VIEWER_APP_CLASS(virt_viewer_parent_class)->start(app);
|
673 | 718 |
}
|