qga: throw an Error in ga_channel_open()
Allow for a single point of error reporting, and further refactoring. Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com> Reviewed-by: Markus Armbruster <armbru@redhat.com> Message-Id: <20220525144140.591926-8-marcandre.lureau@redhat.com>
This commit is contained in:
parent
1a89a17b76
commit
87ed8b2c2c
@ -119,7 +119,7 @@ static int ga_channel_client_add(GAChannel *c, int fd)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static gboolean ga_channel_open(GAChannel *c, const gchar *path,
|
static gboolean ga_channel_open(GAChannel *c, const gchar *path,
|
||||||
GAChannelMethod method, int fd)
|
GAChannelMethod method, int fd, Error **errp)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
c->method = method;
|
c->method = method;
|
||||||
@ -133,21 +133,20 @@ static gboolean ga_channel_open(GAChannel *c, const gchar *path,
|
|||||||
#endif
|
#endif
|
||||||
);
|
);
|
||||||
if (fd == -1) {
|
if (fd == -1) {
|
||||||
g_critical("error opening channel: %s", strerror(errno));
|
error_setg_errno(errp, errno, "error opening channel");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
#ifdef CONFIG_SOLARIS
|
#ifdef CONFIG_SOLARIS
|
||||||
ret = ioctl(fd, I_SETSIG, S_OUTPUT | S_INPUT | S_HIPRI);
|
ret = ioctl(fd, I_SETSIG, S_OUTPUT | S_INPUT | S_HIPRI);
|
||||||
if (ret == -1) {
|
if (ret == -1) {
|
||||||
g_critical("error setting event mask for channel: %s",
|
error_setg_errno(errp, errno, "error setting event mask for channel");
|
||||||
strerror(errno));
|
|
||||||
close(fd);
|
close(fd);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
ret = ga_channel_client_add(c, fd);
|
ret = ga_channel_client_add(c, fd);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
g_critical("error adding channel to main loop");
|
error_setg(errp, "error adding channel to main loop");
|
||||||
close(fd);
|
close(fd);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -159,7 +158,7 @@ static gboolean ga_channel_open(GAChannel *c, const gchar *path,
|
|||||||
assert(fd < 0);
|
assert(fd < 0);
|
||||||
fd = qemu_open_old(path, O_RDWR | O_NOCTTY | O_NONBLOCK);
|
fd = qemu_open_old(path, O_RDWR | O_NOCTTY | O_NONBLOCK);
|
||||||
if (fd == -1) {
|
if (fd == -1) {
|
||||||
g_critical("error opening channel: %s", strerror(errno));
|
error_setg_errno(errp, errno, "error opening channel");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
tcgetattr(fd, &tio);
|
tcgetattr(fd, &tio);
|
||||||
@ -180,7 +179,7 @@ static gboolean ga_channel_open(GAChannel *c, const gchar *path,
|
|||||||
tcsetattr(fd, TCSANOW, &tio);
|
tcsetattr(fd, TCSANOW, &tio);
|
||||||
ret = ga_channel_client_add(c, fd);
|
ret = ga_channel_client_add(c, fd);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
g_critical("error adding channel to main loop");
|
error_setg(errp, "error adding channel to main loop");
|
||||||
close(fd);
|
close(fd);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -188,12 +187,8 @@ static gboolean ga_channel_open(GAChannel *c, const gchar *path,
|
|||||||
}
|
}
|
||||||
case GA_CHANNEL_UNIX_LISTEN: {
|
case GA_CHANNEL_UNIX_LISTEN: {
|
||||||
if (fd < 0) {
|
if (fd < 0) {
|
||||||
Error *local_err = NULL;
|
fd = unix_listen(path, errp);
|
||||||
|
if (fd < 0) {
|
||||||
fd = unix_listen(path, &local_err);
|
|
||||||
if (local_err != NULL) {
|
|
||||||
g_critical("%s", error_get_pretty(local_err));
|
|
||||||
error_free(local_err);
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -202,24 +197,19 @@ static gboolean ga_channel_open(GAChannel *c, const gchar *path,
|
|||||||
}
|
}
|
||||||
case GA_CHANNEL_VSOCK_LISTEN: {
|
case GA_CHANNEL_VSOCK_LISTEN: {
|
||||||
if (fd < 0) {
|
if (fd < 0) {
|
||||||
Error *local_err = NULL;
|
|
||||||
SocketAddress *addr;
|
SocketAddress *addr;
|
||||||
char *addr_str;
|
char *addr_str;
|
||||||
|
|
||||||
addr_str = g_strdup_printf("vsock:%s", path);
|
addr_str = g_strdup_printf("vsock:%s", path);
|
||||||
addr = socket_parse(addr_str, &local_err);
|
addr = socket_parse(addr_str, errp);
|
||||||
g_free(addr_str);
|
g_free(addr_str);
|
||||||
if (local_err != NULL) {
|
if (!addr) {
|
||||||
g_critical("%s", error_get_pretty(local_err));
|
|
||||||
error_free(local_err);
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
fd = socket_listen(addr, 1, &local_err);
|
fd = socket_listen(addr, 1, errp);
|
||||||
qapi_free_SocketAddress(addr);
|
qapi_free_SocketAddress(addr);
|
||||||
if (local_err != NULL) {
|
if (fd < 0) {
|
||||||
g_critical("%s", error_get_pretty(local_err));
|
|
||||||
error_free(local_err);
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -227,7 +217,7 @@ static gboolean ga_channel_open(GAChannel *c, const gchar *path,
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
g_critical("error binding/listening to specified socket");
|
error_setg(errp, "error binding/listening to specified socket");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -272,12 +262,14 @@ GIOStatus ga_channel_read(GAChannel *c, gchar *buf, gsize size, gsize *count)
|
|||||||
GAChannel *ga_channel_new(GAChannelMethod method, const gchar *path,
|
GAChannel *ga_channel_new(GAChannelMethod method, const gchar *path,
|
||||||
int listen_fd, GAChannelCallback cb, gpointer opaque)
|
int listen_fd, GAChannelCallback cb, gpointer opaque)
|
||||||
{
|
{
|
||||||
|
Error *err = NULL;
|
||||||
GAChannel *c = g_new0(GAChannel, 1);
|
GAChannel *c = g_new0(GAChannel, 1);
|
||||||
c->event_cb = cb;
|
c->event_cb = cb;
|
||||||
c->user_data = opaque;
|
c->user_data = opaque;
|
||||||
|
|
||||||
if (!ga_channel_open(c, path, method, listen_fd)) {
|
if (!ga_channel_open(c, path, method, listen_fd, &err)) {
|
||||||
g_critical("error opening channel");
|
g_critical("%s", error_get_pretty(err));
|
||||||
|
error_free(err);
|
||||||
ga_channel_free(c);
|
ga_channel_free(c);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user