migration-exec.c 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. /*
  2. * QEMU live migration
  3. *
  4. * Copyright IBM, Corp. 2008
  5. * Copyright Dell MessageOne 2008
  6. *
  7. * Authors:
  8. * Anthony Liguori <aliguori@us.ibm.com>
  9. * Charles Duffy <charles_duffy@messageone.com>
  10. *
  11. * This work is licensed under the terms of the GNU GPL, version 2. See
  12. * the COPYING file in the top-level directory.
  13. *
  14. * Contributions after 2012-01-13 are licensed under the terms of the
  15. * GNU GPL, version 2 or (at your option) any later version.
  16. */
  17. #include "qemu-common.h"
  18. #include "qemu/sockets.h"
  19. #include "qemu/main-loop.h"
  20. #include "migration/migration.h"
  21. #include "migration/qemu-file.h"
  22. #include "block/block.h"
  23. #include <sys/types.h>
  24. #include <sys/wait.h>
  25. //#define DEBUG_MIGRATION_EXEC
  26. #ifdef DEBUG_MIGRATION_EXEC
  27. #define DPRINTF(fmt, ...) \
  28. do { printf("migration-exec: " fmt, ## __VA_ARGS__); } while (0)
  29. #else
  30. #define DPRINTF(fmt, ...) \
  31. do { } while (0)
  32. #endif
  33. void exec_start_outgoing_migration(MigrationState *s, const char *command, Error **errp)
  34. {
  35. s->file = qemu_popen_cmd(command, "w");
  36. if (s->file == NULL) {
  37. error_setg_errno(errp, errno, "failed to popen the migration target");
  38. return;
  39. }
  40. migrate_fd_connect(s);
  41. }
  42. static void exec_accept_incoming_migration(void *opaque)
  43. {
  44. QEMUFile *f = opaque;
  45. qemu_set_fd_handler2(qemu_get_fd(f), NULL, NULL, NULL, NULL);
  46. process_incoming_migration(f);
  47. }
  48. void exec_start_incoming_migration(const char *command, Error **errp)
  49. {
  50. QEMUFile *f;
  51. DPRINTF("Attempting to start an incoming migration\n");
  52. f = qemu_popen_cmd(command, "r");
  53. if(f == NULL) {
  54. error_setg_errno(errp, errno, "failed to popen the migration source");
  55. return;
  56. }
  57. qemu_set_fd_handler2(qemu_get_fd(f), NULL,
  58. exec_accept_incoming_migration, NULL, f);
  59. }