Skip to content

Commit

Permalink
qapi: Convert getfd and closefd
Browse files Browse the repository at this point in the history
Signed-off-by: Corey Bryant <coreyb@linux.vnet.ibm.com>
Signed-off-by: Luiz Capitulino <lcapitulino@redhat.com>
  • Loading branch information
Corey Bryant authored and Luiz Capitulino committed Jul 13, 2012
1 parent 94c3db8 commit 208c9d1
Show file tree
Hide file tree
Showing 6 changed files with 81 additions and 26 deletions.
6 changes: 2 additions & 4 deletions hmp-commands.hx
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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
Expand Down
18 changes: 18 additions & 0 deletions hmp.c
Original file line number Diff line number Diff line change
Expand Up @@ -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 changes: 2 additions & 0 deletions hmp.h
Original file line number Diff line number Diff line change
Expand Up @@ -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 changes: 14 additions & 18 deletions monitor.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
Expand All @@ -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)
Expand Down
35 changes: 35 additions & 0 deletions qapi-schema.json
Original file line number Diff line number Diff line change
Expand Up @@ -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'} }
14 changes: 10 additions & 4 deletions qmp-commands.hx
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -892,15 +891,22 @@ 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

{
.name = "closefd",
.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
Expand Down

0 comments on commit 208c9d1

Please sign in to comment.