qapi: Convert getfd and closefd
Signed-off-by: Corey Bryant <coreyb@linux.vnet.ibm.com> Signed-off-by: Luiz Capitulino <lcapitulino@redhat.com>
This commit is contained in:
parent
94c3db85b4
commit
208c9d1b7c
@ -1236,8 +1236,7 @@ ETEXI
|
|||||||
.args_type = "fdname:s",
|
.args_type = "fdname:s",
|
||||||
.params = "getfd name",
|
.params = "getfd name",
|
||||||
.help = "receive a file descriptor via SCM rights and assign it a name",
|
.help = "receive a file descriptor via SCM rights and assign it a name",
|
||||||
.user_print = monitor_user_noop,
|
.mhandler.cmd = hmp_getfd,
|
||||||
.mhandler.cmd_new = do_getfd,
|
|
||||||
},
|
},
|
||||||
|
|
||||||
STEXI
|
STEXI
|
||||||
@ -1253,8 +1252,7 @@ ETEXI
|
|||||||
.args_type = "fdname:s",
|
.args_type = "fdname:s",
|
||||||
.params = "closefd name",
|
.params = "closefd name",
|
||||||
.help = "close a file descriptor previously passed via SCM rights",
|
.help = "close a file descriptor previously passed via SCM rights",
|
||||||
.user_print = monitor_user_noop,
|
.mhandler.cmd = hmp_closefd,
|
||||||
.mhandler.cmd_new = do_closefd,
|
|
||||||
},
|
},
|
||||||
|
|
||||||
STEXI
|
STEXI
|
||||||
|
18
hmp.c
18
hmp.c
@ -1002,3 +1002,21 @@ void hmp_netdev_del(Monitor *mon, const QDict *qdict)
|
|||||||
qmp_netdev_del(id, &err);
|
qmp_netdev_del(id, &err);
|
||||||
hmp_handle_error(mon, &err);
|
hmp_handle_error(mon, &err);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void hmp_getfd(Monitor *mon, const QDict *qdict)
|
||||||
|
{
|
||||||
|
const char *fdname = qdict_get_str(qdict, "fdname");
|
||||||
|
Error *errp = NULL;
|
||||||
|
|
||||||
|
qmp_getfd(fdname, &errp);
|
||||||
|
hmp_handle_error(mon, &errp);
|
||||||
|
}
|
||||||
|
|
||||||
|
void hmp_closefd(Monitor *mon, const QDict *qdict)
|
||||||
|
{
|
||||||
|
const char *fdname = qdict_get_str(qdict, "fdname");
|
||||||
|
Error *errp = NULL;
|
||||||
|
|
||||||
|
qmp_closefd(fdname, &errp);
|
||||||
|
hmp_handle_error(mon, &errp);
|
||||||
|
}
|
||||||
|
2
hmp.h
2
hmp.h
@ -64,5 +64,7 @@ void hmp_device_del(Monitor *mon, const QDict *qdict);
|
|||||||
void hmp_dump_guest_memory(Monitor *mon, const QDict *qdict);
|
void hmp_dump_guest_memory(Monitor *mon, const QDict *qdict);
|
||||||
void hmp_netdev_add(Monitor *mon, const QDict *qdict);
|
void hmp_netdev_add(Monitor *mon, const QDict *qdict);
|
||||||
void hmp_netdev_del(Monitor *mon, const QDict *qdict);
|
void hmp_netdev_del(Monitor *mon, const QDict *qdict);
|
||||||
|
void hmp_getfd(Monitor *mon, const QDict *qdict);
|
||||||
|
void hmp_closefd(Monitor *mon, const QDict *qdict);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
32
monitor.c
32
monitor.c
@ -2328,48 +2328,45 @@ static void do_inject_mce(Monitor *mon, const QDict *qdict)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static int do_getfd(Monitor *mon, const QDict *qdict, QObject **ret_data)
|
void qmp_getfd(const char *fdname, Error **errp)
|
||||||
{
|
{
|
||||||
const char *fdname = qdict_get_str(qdict, "fdname");
|
|
||||||
mon_fd_t *monfd;
|
mon_fd_t *monfd;
|
||||||
int fd;
|
int fd;
|
||||||
|
|
||||||
fd = qemu_chr_fe_get_msgfd(mon->chr);
|
fd = qemu_chr_fe_get_msgfd(cur_mon->chr);
|
||||||
if (fd == -1) {
|
if (fd == -1) {
|
||||||
qerror_report(QERR_FD_NOT_SUPPLIED);
|
error_set(errp, QERR_FD_NOT_SUPPLIED);
|
||||||
return -1;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (qemu_isdigit(fdname[0])) {
|
if (qemu_isdigit(fdname[0])) {
|
||||||
qerror_report(QERR_INVALID_PARAMETER_VALUE, "fdname",
|
error_set(errp, QERR_INVALID_PARAMETER_VALUE, "fdname",
|
||||||
"a name not starting with a digit");
|
"a name not starting with a digit");
|
||||||
return -1;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
QLIST_FOREACH(monfd, &mon->fds, next) {
|
QLIST_FOREACH(monfd, &cur_mon->fds, next) {
|
||||||
if (strcmp(monfd->name, fdname) != 0) {
|
if (strcmp(monfd->name, fdname) != 0) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
close(monfd->fd);
|
close(monfd->fd);
|
||||||
monfd->fd = fd;
|
monfd->fd = fd;
|
||||||
return 0;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
monfd = g_malloc0(sizeof(mon_fd_t));
|
monfd = g_malloc0(sizeof(mon_fd_t));
|
||||||
monfd->name = g_strdup(fdname);
|
monfd->name = g_strdup(fdname);
|
||||||
monfd->fd = fd;
|
monfd->fd = fd;
|
||||||
|
|
||||||
QLIST_INSERT_HEAD(&mon->fds, monfd, next);
|
QLIST_INSERT_HEAD(&cur_mon->fds, monfd, next);
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int do_closefd(Monitor *mon, const QDict *qdict, QObject **ret_data)
|
void qmp_closefd(const char *fdname, Error **errp)
|
||||||
{
|
{
|
||||||
const char *fdname = qdict_get_str(qdict, "fdname");
|
|
||||||
mon_fd_t *monfd;
|
mon_fd_t *monfd;
|
||||||
|
|
||||||
QLIST_FOREACH(monfd, &mon->fds, next) {
|
QLIST_FOREACH(monfd, &cur_mon->fds, next) {
|
||||||
if (strcmp(monfd->name, fdname) != 0) {
|
if (strcmp(monfd->name, fdname) != 0) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@ -2378,11 +2375,10 @@ static int do_closefd(Monitor *mon, const QDict *qdict, QObject **ret_data)
|
|||||||
close(monfd->fd);
|
close(monfd->fd);
|
||||||
g_free(monfd->name);
|
g_free(monfd->name);
|
||||||
g_free(monfd);
|
g_free(monfd);
|
||||||
return 0;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
qerror_report(QERR_FD_NOT_FOUND, fdname);
|
error_set(errp, QERR_FD_NOT_FOUND, fdname);
|
||||||
return -1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void do_loadvm(Monitor *mon, const QDict *qdict)
|
static void do_loadvm(Monitor *mon, const QDict *qdict)
|
||||||
|
@ -1870,3 +1870,38 @@
|
|||||||
# Since: 0.14.0
|
# Since: 0.14.0
|
||||||
##
|
##
|
||||||
{ 'command': 'netdev_del', 'data': {'id': 'str'} }
|
{ 'command': 'netdev_del', 'data': {'id': 'str'} }
|
||||||
|
|
||||||
|
##
|
||||||
|
# @getfd:
|
||||||
|
#
|
||||||
|
# Receive a file descriptor via SCM rights and assign it a name
|
||||||
|
#
|
||||||
|
# @fdname: file descriptor name
|
||||||
|
#
|
||||||
|
# Returns: Nothing on success
|
||||||
|
# If file descriptor was not received, FdNotSupplied
|
||||||
|
# If @fdname is not valid, InvalidParameterType
|
||||||
|
#
|
||||||
|
# Since: 0.14.0
|
||||||
|
#
|
||||||
|
# Notes: If @fdname already exists, the file descriptor assigned to
|
||||||
|
# it will be closed and replaced by the received file
|
||||||
|
# descriptor.
|
||||||
|
# The 'closefd' command can be used to explicitly close the
|
||||||
|
# file descriptor when it is no longer needed.
|
||||||
|
##
|
||||||
|
{ 'command': 'getfd', 'data': {'fdname': 'str'} }
|
||||||
|
|
||||||
|
##
|
||||||
|
# @closefd:
|
||||||
|
#
|
||||||
|
# Close a file descriptor previously passed via SCM rights
|
||||||
|
#
|
||||||
|
# @fdname: file descriptor name
|
||||||
|
#
|
||||||
|
# Returns: Nothing on success
|
||||||
|
# If @fdname is not found, FdNotFound
|
||||||
|
#
|
||||||
|
# Since: 0.14.0
|
||||||
|
##
|
||||||
|
{ 'command': 'closefd', 'data': {'fdname': 'str'} }
|
||||||
|
@ -873,8 +873,7 @@ EQMP
|
|||||||
.args_type = "fdname:s",
|
.args_type = "fdname:s",
|
||||||
.params = "getfd name",
|
.params = "getfd name",
|
||||||
.help = "receive a file descriptor via SCM rights and assign it a name",
|
.help = "receive a file descriptor via SCM rights and assign it a name",
|
||||||
.user_print = monitor_user_noop,
|
.mhandler.cmd_new = qmp_marshal_input_getfd,
|
||||||
.mhandler.cmd_new = do_getfd,
|
|
||||||
},
|
},
|
||||||
|
|
||||||
SQMP
|
SQMP
|
||||||
@ -892,6 +891,14 @@ Example:
|
|||||||
-> { "execute": "getfd", "arguments": { "fdname": "fd1" } }
|
-> { "execute": "getfd", "arguments": { "fdname": "fd1" } }
|
||||||
<- { "return": {} }
|
<- { "return": {} }
|
||||||
|
|
||||||
|
Notes:
|
||||||
|
|
||||||
|
(1) If the name specified by the "fdname" argument already exists,
|
||||||
|
the file descriptor assigned to it will be closed and replaced
|
||||||
|
by the received file descriptor.
|
||||||
|
(2) The 'closefd' command can be used to explicitly close the file
|
||||||
|
descriptor when it is no longer needed.
|
||||||
|
|
||||||
EQMP
|
EQMP
|
||||||
|
|
||||||
{
|
{
|
||||||
@ -899,8 +906,7 @@ EQMP
|
|||||||
.args_type = "fdname:s",
|
.args_type = "fdname:s",
|
||||||
.params = "closefd name",
|
.params = "closefd name",
|
||||||
.help = "close a file descriptor previously passed via SCM rights",
|
.help = "close a file descriptor previously passed via SCM rights",
|
||||||
.user_print = monitor_user_noop,
|
.mhandler.cmd_new = qmp_marshal_input_closefd,
|
||||||
.mhandler.cmd_new = do_closefd,
|
|
||||||
},
|
},
|
||||||
|
|
||||||
SQMP
|
SQMP
|
||||||
|
Loading…
Reference in New Issue
Block a user