summaryrefslogtreecommitdiff
path: root/dbus/dbus-sysdeps-unix.c
diff options
context:
space:
mode:
authorMarc-André Lureau <marcandre.lureau@redhat.com>2022-02-08 15:19:32 +0400
committerSimon McVittie <smcv@collabora.com>2022-07-15 16:26:18 +0100
commitf8343fa397b396062c1ebb67b8f7a4ecc133c2b8 (patch)
tree5ce902dd980c9fa6d421a859d562ec3541c17c86 /dbus/dbus-sysdeps-unix.c
parent81b49af8a2b6634a4b22045312e15cd14c1c9883 (diff)
downloaddbus-f8343fa397b396062c1ebb67b8f7a4ecc133c2b8.tar.gz
dbus: change unix socket functions to return DBusSocket
This will allow to abstract away for Windows Unix socket support. Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Diffstat (limited to 'dbus/dbus-sysdeps-unix.c')
-rw-r--r--dbus/dbus-sysdeps-unix.c75
1 files changed, 41 insertions, 34 deletions
diff --git a/dbus/dbus-sysdeps-unix.c b/dbus/dbus-sysdeps-unix.c
index 09d5744a..fc0a4777 100644
--- a/dbus/dbus-sysdeps-unix.c
+++ b/dbus/dbus-sysdeps-unix.c
@@ -964,14 +964,14 @@ _dbus_write_two (int fd,
* @param path the path to UNIX domain socket
* @param abstract #TRUE to use abstract namespace
* @param error return location for error code
- * @returns connection file descriptor or -1 on error
+ * @returns a valid socket on success or an invalid socket on error
*/
-int
+DBusSocket
_dbus_connect_unix_socket (const char *path,
dbus_bool_t abstract,
DBusError *error)
{
- int fd;
+ DBusSocket fd = DBUS_SOCKET_INIT;
size_t path_len;
struct sockaddr_un addr;
_DBUS_STATIC_ASSERT (sizeof (addr.sun_path) > _DBUS_MAX_SUN_PATH_LENGTH);
@@ -982,10 +982,10 @@ _dbus_connect_unix_socket (const char *path,
path, abstract);
- if (!_dbus_open_unix_socket (&fd, error))
+ if (!_dbus_open_unix_socket (&fd.fd, error))
{
_DBUS_ASSERT_ERROR_IS_SET(error);
- return -1;
+ return fd;
}
_DBUS_ASSERT_ERROR_IS_CLEAR(error);
@@ -1003,8 +1003,8 @@ _dbus_connect_unix_socket (const char *path,
{
dbus_set_error (error, DBUS_ERROR_BAD_ADDRESS,
"Abstract socket name too long\n");
- _dbus_close (fd, NULL);
- return -1;
+ _dbus_close_socket (&fd, NULL);
+ return fd;
}
strncpy (&addr.sun_path[1], path, sizeof (addr.sun_path) - 2);
@@ -1012,8 +1012,8 @@ _dbus_connect_unix_socket (const char *path,
#else /* !__linux__ */
dbus_set_error (error, DBUS_ERROR_NOT_SUPPORTED,
"Operating system does not support abstract socket namespace\n");
- _dbus_close (fd, NULL);
- return -1;
+ _dbus_close_socket (&fd, NULL);
+ return fd;
#endif /* !__linux__ */
}
else
@@ -1022,30 +1022,30 @@ _dbus_connect_unix_socket (const char *path,
{
dbus_set_error (error, DBUS_ERROR_BAD_ADDRESS,
"Socket name too long\n");
- _dbus_close (fd, NULL);
- return -1;
+ _dbus_close_socket (&fd, NULL);
+ return fd;
}
strncpy (addr.sun_path, path, sizeof (addr.sun_path) - 1);
}
- if (connect (fd, (struct sockaddr*) &addr, _DBUS_STRUCT_OFFSET (struct sockaddr_un, sun_path) + path_len) < 0)
+ if (connect (fd.fd, (struct sockaddr*) &addr, _DBUS_STRUCT_OFFSET (struct sockaddr_un, sun_path) + path_len) < 0)
{
dbus_set_error (error,
_dbus_error_from_errno (errno),
"Failed to connect to socket %s: %s",
path, _dbus_strerror (errno));
- _dbus_close (fd, NULL);
- return -1;
+ _dbus_close_socket (&fd, NULL);
+ return fd;
}
- if (!_dbus_set_fd_nonblocking (fd, error))
+ if (!_dbus_set_fd_nonblocking (fd.fd, error))
{
_DBUS_ASSERT_ERROR_IS_SET (error);
- _dbus_close (fd, NULL);
- return -1;
+ _dbus_close_socket (&fd, NULL);
+ return fd;
}
return fd;
@@ -1061,13 +1061,14 @@ _dbus_connect_unix_socket (const char *path,
* @param argv the argument list for the process to execute.
* argv[0] typically is identical to the path of the executable
* @param error return location for error code
- * @returns connection file descriptor or -1 on error
+ * @returns a valid socket on success or an invalid socket on error
*/
-int
+DBusSocket
_dbus_connect_exec (const char *path,
char *const argv[],
DBusError *error)
{
+ DBusSocket s = DBUS_SOCKET_INIT;
int fds[2];
pid_t pid;
int retval;
@@ -1093,7 +1094,8 @@ _dbus_connect_exec (const char *path,
_dbus_error_from_errno (errno),
"Failed to create socket pair: %s",
_dbus_strerror (errno));
- return -1;
+ _dbus_assert (!_dbus_socket_is_valid (s));
+ return s;
}
if (!cloexec_done)
@@ -1116,7 +1118,8 @@ _dbus_connect_exec (const char *path,
path, _dbus_strerror (errno));
close (fds[0]);
close (fds[1]);
- return -1;
+ _dbus_assert (!_dbus_socket_is_valid (s));
+ return s;
}
if (pid == 0)
@@ -1151,10 +1154,12 @@ _dbus_connect_exec (const char *path,
_DBUS_ASSERT_ERROR_IS_SET (error);
close (fds[0]);
- return -1;
+ _dbus_assert (!_dbus_socket_is_valid (s));
+ return s;
}
- return fds[0];
+ s.fd = fds[0];
+ return s;
}
/**
@@ -1172,13 +1177,14 @@ _dbus_connect_exec (const char *path,
* @param path the socket name
* @param abstract #TRUE to use abstract namespace
* @param error return location for errors
- * @returns the listening file descriptor or -1 on error
+ * @returns a valid socket on success or an invalid socket on error
*/
-int
+DBusSocket
_dbus_listen_unix_socket (const char *path,
dbus_bool_t abstract,
DBusError *error)
{
+ DBusSocket s = DBUS_SOCKET_INIT;
int listen_fd;
struct sockaddr_un addr;
size_t path_len;
@@ -1192,7 +1198,7 @@ _dbus_listen_unix_socket (const char *path,
if (!_dbus_open_unix_socket (&listen_fd, error))
{
_DBUS_ASSERT_ERROR_IS_SET(error);
- return -1;
+ return s;
}
_DBUS_ASSERT_ERROR_IS_CLEAR(error);
@@ -1214,7 +1220,7 @@ _dbus_listen_unix_socket (const char *path,
dbus_set_error (error, DBUS_ERROR_BAD_ADDRESS,
"Abstract socket name too long\n");
_dbus_close (listen_fd, NULL);
- return -1;
+ return s;
}
strncpy (&addr.sun_path[1], path, sizeof (addr.sun_path) - 2);
@@ -1223,7 +1229,7 @@ _dbus_listen_unix_socket (const char *path,
dbus_set_error (error, DBUS_ERROR_NOT_SUPPORTED,
"Operating system does not support abstract socket namespace\n");
_dbus_close (listen_fd, NULL);
- return -1;
+ return s;
#endif /* !__linux__ */
}
else
@@ -1251,8 +1257,8 @@ _dbus_listen_unix_socket (const char *path,
dbus_set_error (error, DBUS_ERROR_BAD_ADDRESS,
"Socket name too long\n");
_dbus_close (listen_fd, NULL);
- return -1;
- }
+ return s;
+ }
strncpy (addr.sun_path, path, sizeof (addr.sun_path) - 1);
}
@@ -1263,7 +1269,7 @@ _dbus_listen_unix_socket (const char *path,
"Failed to bind socket \"%s\": %s",
path, _dbus_strerror (errno));
_dbus_close (listen_fd, NULL);
- return -1;
+ return s;
}
if (listen (listen_fd, SOMAXCONN /* backlog */) < 0)
@@ -1272,14 +1278,14 @@ _dbus_listen_unix_socket (const char *path,
"Failed to listen on socket \"%s\": %s",
path, _dbus_strerror (errno));
_dbus_close (listen_fd, NULL);
- return -1;
+ return s;
}
if (!_dbus_set_fd_nonblocking (listen_fd, error))
{
_DBUS_ASSERT_ERROR_IS_SET (error);
_dbus_close (listen_fd, NULL);
- return -1;
+ return s;
}
/* Try opening up the permissions, but if we can't, just go ahead
@@ -1288,7 +1294,8 @@ _dbus_listen_unix_socket (const char *path,
if (!abstract && chmod (path, 0777) < 0)
_dbus_warn ("Could not set mode 0777 on socket %s", path);
- return listen_fd;
+ s.fd = listen_fd;
+ return s;
}
/**