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",
|
||||
.params = "getfd name",
|
||||
.help = "receive a file descriptor via SCM rights and assign it a name",
|
||||
.user_print = monitor_user_noop,
|
||||
.mhandler.cmd_new = do_getfd,
|
||||
.mhandler.cmd = hmp_getfd,
|
||||
},
|
||||
|
||||
STEXI
|
||||
@ -1253,8 +1252,7 @@ ETEXI
|
||||
.args_type = "fdname:s",
|
||||
.params = "closefd name",
|
||||
.help = "close a file descriptor previously passed via SCM rights",
|
||||
.user_print = monitor_user_noop,
|
||||
.mhandler.cmd_new = do_closefd,
|
||||
.mhandler.cmd = hmp_closefd,
|
||||
},
|
||||
|
||||
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);
|
||||
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_netdev_add(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
|
||||
|
32
monitor.c
32
monitor.c
@ -2328,48 +2328,45 @@ static void do_inject_mce(Monitor *mon, const QDict *qdict)
|
||||
}
|
||||
#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;
|
||||
int fd;
|
||||
|
||||
fd = qemu_chr_fe_get_msgfd(mon->chr);
|
||||
fd = qemu_chr_fe_get_msgfd(cur_mon->chr);
|
||||
if (fd == -1) {
|
||||
qerror_report(QERR_FD_NOT_SUPPLIED);
|
||||
return -1;
|
||||
error_set(errp, QERR_FD_NOT_SUPPLIED);
|
||||
return;
|
||||
}
|
||||
|
||||
if (qemu_isdigit(fdname[0])) {
|
||||
qerror_report(QERR_INVALID_PARAMETER_VALUE, "fdname",
|
||||
"a name not starting with a digit");
|
||||
return -1;
|
||||
error_set(errp, QERR_INVALID_PARAMETER_VALUE, "fdname",
|
||||
"a name not starting with a digit");
|
||||
return;
|
||||
}
|
||||
|
||||
QLIST_FOREACH(monfd, &mon->fds, next) {
|
||||
QLIST_FOREACH(monfd, &cur_mon->fds, next) {
|
||||
if (strcmp(monfd->name, fdname) != 0) {
|
||||
continue;
|
||||
}
|
||||
|
||||
close(monfd->fd);
|
||||
monfd->fd = fd;
|
||||
return 0;
|
||||
return;
|
||||
}
|
||||
|
||||
monfd = g_malloc0(sizeof(mon_fd_t));
|
||||
monfd->name = g_strdup(fdname);
|
||||
monfd->fd = fd;
|
||||
|
||||
QLIST_INSERT_HEAD(&mon->fds, monfd, next);
|
||||
return 0;
|
||||
QLIST_INSERT_HEAD(&cur_mon->fds, monfd, next);
|
||||
}
|
||||
|
||||
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;
|
||||
|
||||
QLIST_FOREACH(monfd, &mon->fds, next) {
|
||||
QLIST_FOREACH(monfd, &cur_mon->fds, next) {
|
||||
if (strcmp(monfd->name, fdname) != 0) {
|
||||
continue;
|
||||
}
|
||||
@ -2378,11 +2375,10 @@ static int do_closefd(Monitor *mon, const QDict *qdict, QObject **ret_data)
|
||||
close(monfd->fd);
|
||||
g_free(monfd->name);
|
||||
g_free(monfd);
|
||||
return 0;
|
||||
return;
|
||||
}
|
||||
|
||||
qerror_report(QERR_FD_NOT_FOUND, fdname);
|
||||
return -1;
|
||||
error_set(errp, QERR_FD_NOT_FOUND, fdname);
|
||||
}
|
||||
|
||||
static void do_loadvm(Monitor *mon, const QDict *qdict)
|
||||
|
@ -1870,3 +1870,38 @@
|
||||
# Since: 0.14.0
|
||||
##
|
||||
{ '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",
|
||||
.params = "getfd name",
|
||||
.help = "receive a file descriptor via SCM rights and assign it a name",
|
||||
.user_print = monitor_user_noop,
|
||||
.mhandler.cmd_new = do_getfd,
|
||||
.mhandler.cmd_new = qmp_marshal_input_getfd,
|
||||
},
|
||||
|
||||
SQMP
|
||||
@ -892,6 +891,14 @@ Example:
|
||||
-> { "execute": "getfd", "arguments": { "fdname": "fd1" } }
|
||||
<- { "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
|
||||
|
||||
{
|
||||
@ -899,8 +906,7 @@ EQMP
|
||||
.args_type = "fdname:s",
|
||||
.params = "closefd name",
|
||||
.help = "close a file descriptor previously passed via SCM rights",
|
||||
.user_print = monitor_user_noop,
|
||||
.mhandler.cmd_new = do_closefd,
|
||||
.mhandler.cmd_new = qmp_marshal_input_closefd,
|
||||
},
|
||||
|
||||
SQMP
|
||||
|
Loading…
Reference in New Issue
Block a user