|  | /* | 
|  | * migration yank functions | 
|  | * | 
|  | * Copyright (c) Lukas Straub <lukasstraub2@web.de> | 
|  | * | 
|  | * This work is licensed under the terms of the GNU GPL, version 2 or later. | 
|  | * See the COPYING file in the top-level directory. | 
|  | */ | 
|  |  | 
|  | #include "qemu/osdep.h" | 
|  | #include "io/channel.h" | 
|  | #include "yank_functions.h" | 
|  | #include "qemu/yank.h" | 
|  | #include "qemu-file.h" | 
|  |  | 
|  | void migration_yank_iochannel(void *opaque) | 
|  | { | 
|  | QIOChannel *ioc = QIO_CHANNEL(opaque); | 
|  |  | 
|  | qio_channel_shutdown(ioc, QIO_CHANNEL_SHUTDOWN_BOTH, NULL); | 
|  | } | 
|  |  | 
|  | /* Return whether yank is supported on this ioc */ | 
|  | static bool migration_ioc_yank_supported(QIOChannel *ioc) | 
|  | { | 
|  | return qio_channel_has_feature(ioc, QIO_CHANNEL_FEATURE_SHUTDOWN); | 
|  | } | 
|  |  | 
|  | void migration_ioc_register_yank(QIOChannel *ioc) | 
|  | { | 
|  | if (migration_ioc_yank_supported(ioc)) { | 
|  | yank_register_function(MIGRATION_YANK_INSTANCE, | 
|  | migration_yank_iochannel, | 
|  | ioc); | 
|  | } | 
|  | } | 
|  |  | 
|  | void migration_ioc_unregister_yank(QIOChannel *ioc) | 
|  | { | 
|  | if (migration_ioc_yank_supported(ioc)) { | 
|  | yank_unregister_function(MIGRATION_YANK_INSTANCE, | 
|  | migration_yank_iochannel, | 
|  | ioc); | 
|  | } | 
|  | } | 
|  |  | 
|  | void migration_ioc_unregister_yank_from_file(QEMUFile *file) | 
|  | { | 
|  | QIOChannel *ioc = qemu_file_get_ioc(file); | 
|  |  | 
|  | if (ioc) { | 
|  | /* | 
|  | * For migration qemufiles, we'll always reach here.  Though we'll skip | 
|  | * calls from e.g. savevm/loadvm as they don't use yank. | 
|  | */ | 
|  | migration_ioc_unregister_yank(ioc); | 
|  | } | 
|  | } |