* @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);
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);
{
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);
#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
{
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;
* @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;
_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)
path, _dbus_strerror (errno));
close (fds[0]);
close (fds[1]);
- return -1;
+ _dbus_assert (!_dbus_socket_is_valid (s));
+ return s;
}
if (pid == 0)
_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;
}
/**
* @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;
if (!_dbus_open_unix_socket (&listen_fd, error))
{
_DBUS_ASSERT_ERROR_IS_SET(error);
- return -1;
+ return s;
}
_DBUS_ASSERT_ERROR_IS_CLEAR(error);
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);
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
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);
}
"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)
"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
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;
}
/**