summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHavoc Pennington <hp@redhat.com>2006-09-16 15:34:34 +0000
committerHavoc Pennington <hp@redhat.com>2006-09-16 15:34:34 +0000
commit08079a5bdedd6ec91cda413983e4bd3b6ee0252d (patch)
treecbb7fe4a86f449c2595825c720557c955076a874
parente24dec0a89a5853cb448fb3037f2658f2b682650 (diff)
2006-09-16 Havoc Pennington <hp@redhat.com>
* dbus/dbus-sysdeps-unix.h: small change to Peter's patch to make dbus-sysdeps-unix-util.c build, add unix-specific sysdeps header. * dbus/dbus-sysdeps.h, dbus-sysdeps-unix.c: patch from Peter Kümmel bug #8249 to make the sysdeps.h read/write/open/close functions specifically for sockets only, and move generic read/write/open/close into unix-specific code.
-rw-r--r--ChangeLog10
-rw-r--r--bus/bus.c8
-rw-r--r--bus/main.c4
-rw-r--r--dbus/Makefile.am3
-rw-r--r--dbus/dbus-server-debug-pipe.c6
-rw-r--r--dbus/dbus-server-unix.c8
-rw-r--r--dbus/dbus-spawn.c10
-rw-r--r--dbus/dbus-sysdeps-unix.c64
-rw-r--r--dbus/dbus-sysdeps-util-unix.c3
-rw-r--r--dbus/dbus-sysdeps.h79
-rw-r--r--dbus/dbus-transport-unix.c56
11 files changed, 166 insertions, 85 deletions
diff --git a/ChangeLog b/ChangeLog
index 589e434e..a194a650 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,13 @@
+2006-09-16 Havoc Pennington <hp@redhat.com>
+
+ * dbus/dbus-sysdeps-unix.h: small change to Peter's patch to make
+ dbus-sysdeps-unix-util.c build, add unix-specific sysdeps header.
+
+ * dbus/dbus-sysdeps.h, dbus-sysdeps-unix.c: patch from Peter
+ Kümmel bug #8249 to make the sysdeps.h read/write/open/close
+ functions specifically for sockets only, and move generic
+ read/write/open/close into unix-specific code.
+
2006-09-14 Havoc Pennington <hp@redhat.com>
* dbus/dbus-transport-unix.c (unix_do_iteration): fix a valgrind
diff --git a/bus/bus.c b/bus/bus.c
index e6f36b14..658271f7 100644
--- a/bus/bus.c
+++ b/bus/bus.c
@@ -630,7 +630,7 @@ bus_context_new (const DBusString *config_file,
}
bytes = _dbus_string_get_length (&addr);
- if (_dbus_write (print_addr_fd, &addr, 0, bytes) != bytes)
+ if (_dbus_write_socket (print_addr_fd, &addr, 0, bytes) != bytes)
{
dbus_set_error (error, DBUS_ERROR_FAILED,
"Printing message bus address: %s\n",
@@ -640,7 +640,7 @@ bus_context_new (const DBusString *config_file,
}
if (print_addr_fd > 2)
- _dbus_close (print_addr_fd, NULL);
+ _dbus_close_socket (print_addr_fd, NULL);
_dbus_string_free (&addr);
}
@@ -731,7 +731,7 @@ bus_context_new (const DBusString *config_file,
}
bytes = _dbus_string_get_length (&pid);
- if (_dbus_write (print_pid_fd, &pid, 0, bytes) != bytes)
+ if (_dbus_write_socket (print_pid_fd, &pid, 0, bytes) != bytes)
{
dbus_set_error (error, DBUS_ERROR_FAILED,
"Printing message bus PID: %s\n",
@@ -741,7 +741,7 @@ bus_context_new (const DBusString *config_file,
}
if (print_pid_fd > 2)
- _dbus_close (print_pid_fd, NULL);
+ _dbus_close_socket (print_pid_fd, NULL);
_dbus_string_free (&pid);
}
diff --git a/bus/main.c b/bus/main.c
index adf49470..39bc24f8 100644
--- a/bus/main.c
+++ b/bus/main.c
@@ -51,7 +51,7 @@ signal_handler (int sig)
#endif /* DBUS_BUS_ENABLE_DNOTIFY_ON_LINUX */
case SIGHUP:
_dbus_string_init_const (&str, "foo");
- if (!_dbus_write (reload_pipe[RELOAD_WRITE_END], &str, 0, 1))
+ if (!_dbus_write_socket (reload_pipe[RELOAD_WRITE_END], &str, 0, 1))
{
_dbus_warn ("Unable to write to reload pipe.\n");
exit (1);
@@ -150,7 +150,7 @@ handle_reload_watch (DBusWatch *watch,
DBusError error;
DBusString str;
_dbus_string_init (&str);
- if (_dbus_read (reload_pipe[RELOAD_READ_END], &str, 1) != 1)
+ if (_dbus_read_socket (reload_pipe[RELOAD_READ_END], &str, 1) != 1)
{
_dbus_warn ("Couldn't read from reload pipe.\n");
exit (1);
diff --git a/dbus/Makefile.am b/dbus/Makefile.am
index 77ce2a9d..996abe8c 100644
--- a/dbus/Makefile.am
+++ b/dbus/Makefile.am
@@ -104,8 +104,9 @@ DBUS_SHARED_SOURCES= \
dbus-string.h \
dbus-string-private.h \
dbus-sysdeps.c \
- dbus-sysdeps-unix.c \
dbus-sysdeps.h \
+ dbus-sysdeps-unix.c \
+ dbus-sysdeps-unix.h \
dbus-userdb.c \
dbus-userdb.h
diff --git a/dbus/dbus-server-debug-pipe.c b/dbus/dbus-server-debug-pipe.c
index 0917c1e0..20c68a8c 100644
--- a/dbus/dbus-server-debug-pipe.c
+++ b/dbus/dbus-server-debug-pipe.c
@@ -260,8 +260,8 @@ _dbus_transport_debug_pipe_new (const char *server_name,
NULL, &address);
if (client_transport == NULL)
{
- _dbus_close (client_fd, NULL);
- _dbus_close (server_fd, NULL);
+ _dbus_close_socket (client_fd, NULL);
+ _dbus_close_socket (server_fd, NULL);
dbus_set_error (error, DBUS_ERROR_NO_MEMORY, NULL);
_dbus_string_free (&address);
return NULL;
@@ -276,7 +276,7 @@ _dbus_transport_debug_pipe_new (const char *server_name,
if (server_transport == NULL)
{
_dbus_transport_unref (client_transport);
- _dbus_close (server_fd, NULL);
+ _dbus_close_socket (server_fd, NULL);
dbus_set_error (error, DBUS_ERROR_NO_MEMORY, NULL);
return NULL;
}
diff --git a/dbus/dbus-server-unix.c b/dbus/dbus-server-unix.c
index 64b4598a..377dfb03 100644
--- a/dbus/dbus-server-unix.c
+++ b/dbus/dbus-server-unix.c
@@ -102,7 +102,7 @@ handle_new_client_fd_and_unlock (DBusServer *server,
transport = _dbus_transport_new_for_fd (client_fd, &server->guid_hex, NULL);
if (transport == NULL)
{
- _dbus_close (client_fd, NULL);
+ _dbus_close_socket (client_fd, NULL);
SERVER_UNLOCK (server);
return FALSE;
}
@@ -219,7 +219,7 @@ unix_disconnect (DBusServer *server)
unix_server->watch = NULL;
}
- _dbus_close (unix_server->fd, NULL);
+ _dbus_close_socket (unix_server->fd, NULL);
unix_server->fd = -1;
if (unix_server->socket_name != NULL)
@@ -373,7 +373,7 @@ _dbus_server_new_for_domain_socket (const char *path,
return server;
failed_2:
- _dbus_close (listen_fd, NULL);
+ _dbus_close_socket (listen_fd, NULL);
failed_1:
dbus_free (path_copy);
failed_0:
@@ -436,7 +436,7 @@ _dbus_server_new_for_tcp_socket (const char *host,
if (server == NULL)
{
dbus_set_error (error, DBUS_ERROR_NO_MEMORY, NULL);
- _dbus_close (listen_fd, NULL);
+ _dbus_close_socket (listen_fd, NULL);
_dbus_string_free (&address);
return NULL;
}
diff --git a/dbus/dbus-spawn.c b/dbus/dbus-spawn.c
index f01ada27..b0a4fa2b 100644
--- a/dbus/dbus-spawn.c
+++ b/dbus/dbus-spawn.c
@@ -276,13 +276,13 @@ _dbus_babysitter_unref (DBusBabysitter *sitter)
* a hangup and then the babysitter will
* quit itself.
*/
- _dbus_close (sitter->socket_to_babysitter, NULL);
+ _dbus_close_socket (sitter->socket_to_babysitter, NULL);
sitter->socket_to_babysitter = -1;
}
if (sitter->error_pipe_from_child >= 0)
{
- _dbus_close (sitter->error_pipe_from_child, NULL);
+ _dbus_close_socket (sitter->error_pipe_from_child, NULL);
sitter->error_pipe_from_child = -1;
}
@@ -470,7 +470,7 @@ static void
close_socket_to_babysitter (DBusBabysitter *sitter)
{
_dbus_verbose ("Closing babysitter\n");
- _dbus_close (sitter->socket_to_babysitter, NULL);
+ _dbus_close_socket (sitter->socket_to_babysitter, NULL);
sitter->socket_to_babysitter = -1;
}
@@ -478,7 +478,7 @@ static void
close_error_pipe_from_child (DBusBabysitter *sitter)
{
_dbus_verbose ("Closing child error\n");
- _dbus_close (sitter->error_pipe_from_child, NULL);
+ _dbus_close_socket (sitter->error_pipe_from_child, NULL);
sitter->error_pipe_from_child = -1;
}
@@ -753,7 +753,7 @@ close_and_invalidate (int *fd)
return -1;
else
{
- ret = _dbus_close (*fd, NULL);
+ ret = _dbus_close_socket (*fd, NULL);
*fd = -1;
}
diff --git a/dbus/dbus-sysdeps-unix.c b/dbus/dbus-sysdeps-unix.c
index 51898443..1ce928af 100644
--- a/dbus/dbus-sysdeps-unix.c
+++ b/dbus/dbus-sysdeps-unix.c
@@ -24,6 +24,7 @@
#include "dbus-internals.h"
#include "dbus-sysdeps.h"
+#include "dbus-sysdeps-unix.h"
#include "dbus-threads.h"
#include "dbus-protocol.h"
#include "dbus-string.h"
@@ -76,6 +77,54 @@
* @{
*/
+dbus_bool_t
+_dbus_open_socket (int *fd,
+ int domain,
+ int type,
+ int protocol)
+{
+ *fd = socket (domain, type, protocol);
+ return fd >= 0;
+}
+
+dbus_bool_t
+_dbus_close_socket (int fd,
+ DBusError *error)
+{
+ return _dbus_close (fd, error);
+}
+
+int
+_dbus_read_socket (int fd,
+ DBusString *buffer,
+ int count)
+{
+ return _dbus_read (fd, buffer, count);
+}
+
+int
+_dbus_write_socket (int fd,
+ const DBusString *buffer,
+ int start,
+ int len)
+{
+ return _dbus_write (fd, buffer, start, len);
+}
+
+int
+_dbus_write_socket_two (int fd,
+ const DBusString *buffer1,
+ int start1,
+ int len1,
+ const DBusString *buffer2,
+ int start2,
+ int len2)
+{
+ return _dbus_write_two (fd, buffer1, start1, len1,
+ buffer2, start2, len2);
+}
+
+
/**
* Thin wrapper around the read() system call that appends
* the data it reads to the DBusString buffer. It appends
@@ -306,9 +355,8 @@ _dbus_connect_unix_socket (const char *path,
_dbus_verbose ("connecting to unix socket %s abstract=%d\n",
path, abstract);
- fd = socket (PF_UNIX, SOCK_STREAM, 0);
- if (fd < 0)
+ if (!_dbus_open_socket (&fd, PF_UNIX, SOCK_STREAM, 0))
{
dbus_set_error (error,
_dbus_error_from_errno (errno),
@@ -442,9 +490,7 @@ _dbus_listen_unix_socket (const char *path,
_dbus_verbose ("listening on unix socket %s abstract=%d\n",
path, abstract);
- listen_fd = socket (PF_UNIX, SOCK_STREAM, 0);
-
- if (listen_fd < 0)
+ if (!_dbus_open_socket (&listen_fd, PF_UNIX, SOCK_STREAM, 0))
{
dbus_set_error (error, _dbus_error_from_errno (errno),
"Failed to create socket \"%s\": %s",
@@ -578,10 +624,9 @@ _dbus_connect_tcp_socket (const char *host,
struct in_addr *haddr;
_DBUS_ASSERT_ERROR_IS_CLEAR (error);
+
- fd = socket (AF_INET, SOCK_STREAM, 0);
-
- if (fd < 0)
+ if (!_dbus_open_socket (&fd, AF_INET, SOCK_STREAM, 0))
{
dbus_set_error (error,
_dbus_error_from_errno (errno),
@@ -658,9 +703,8 @@ _dbus_listen_tcp_socket (const char *host,
_DBUS_ASSERT_ERROR_IS_CLEAR (error);
- listen_fd = socket (AF_INET, SOCK_STREAM, 0);
- if (listen_fd < 0)
+ if (!_dbus_open_socket (&listen_fd, AF_INET, SOCK_STREAM, 0))
{
dbus_set_error (error, _dbus_error_from_errno (errno),
"Failed to create socket \"%s:%d\": %s",
diff --git a/dbus/dbus-sysdeps-util-unix.c b/dbus/dbus-sysdeps-util-unix.c
index a99d338e..aa2f4ad2 100644
--- a/dbus/dbus-sysdeps-util-unix.c
+++ b/dbus/dbus-sysdeps-util-unix.c
@@ -22,6 +22,7 @@
*
*/
#include "dbus-sysdeps.h"
+#include "dbus-sysdeps-unix.h"
#include "dbus-internals.h"
#include "dbus-protocol.h"
#include "dbus-string.h"
@@ -152,7 +153,7 @@ _dbus_become_daemon (const DBusString *pidfile,
}
bytes = _dbus_string_get_length (&pid);
- if (_dbus_write (print_pid_fd, &pid, 0, bytes) != bytes)
+ if (_dbus_write_socket (print_pid_fd, &pid, 0, bytes) != bytes)
{
dbus_set_error (error, DBUS_ERROR_FAILED,
"Printing message bus PID: %s\n",
diff --git a/dbus/dbus-sysdeps.h b/dbus/dbus-sysdeps.h
index 3df40c78..729f14d2 100644
--- a/dbus/dbus-sysdeps.h
+++ b/dbus/dbus-sysdeps.h
@@ -74,20 +74,6 @@ const char* _dbus_getenv (const char *varname);
dbus_bool_t _dbus_setenv (const char *varname,
const char *value);
-int _dbus_read (int fd,
- DBusString *buffer,
- int count);
-int _dbus_write (int fd,
- const DBusString *buffer,
- int start,
- int len);
-int _dbus_write_two (int fd,
- const DBusString *buffer1,
- int start1,
- int len1,
- const DBusString *buffer2,
- int start2,
- int len2);
typedef unsigned long dbus_pid_t;
typedef unsigned long dbus_uid_t;
@@ -101,15 +87,39 @@ typedef unsigned long dbus_gid_t;
#define DBUS_UID_FORMAT "%lu"
#define DBUS_GID_FORMAT "%lu"
+
/**
- * Struct representing socket credentials
+ * Socket interface
+ *
+ * @todo Use for the file descriptors a struct
+ * - struct DBusSocket{ int d; }; -
+ * instead of int to get type-safety which
+ * will be checked by the compiler.
+ *
*/
-typedef struct
-{
- dbus_pid_t pid; /**< process ID or DBUS_PID_UNSET */
- dbus_uid_t uid; /**< user ID or DBUS_UID_UNSET */
- dbus_gid_t gid; /**< group ID or DBUS_GID_UNSET */
-} DBusCredentials;
+
+dbus_bool_t _dbus_open_socket (int *fd,
+ int domain,
+ int type,
+ int protocol);
+dbus_bool_t _dbus_close_socket (int fd,
+ DBusError *error);
+int _dbus_read_socket (int fd,
+ DBusString *buffer,
+ int count);
+int _dbus_write_socket (int fd,
+ const DBusString *buffer,
+ int start,
+ int len);
+int _dbus_write_socket_two (int fd,
+ const DBusString *buffer1,
+ int start1,
+ int len1,
+ const DBusString *buffer2,
+ int start2,
+ int len2);
+
+
int _dbus_connect_unix_socket (const char *path,
dbus_bool_t abstract,
@@ -125,6 +135,16 @@ int _dbus_listen_tcp_socket (const char *host,
DBusError *error);
int _dbus_accept (int listen_fd);
+/**
+ * Struct representing socket credentials
+ */
+typedef struct
+{
+ dbus_pid_t pid; /**< process ID or DBUS_PID_UNSET */
+ dbus_uid_t uid; /**< user ID or DBUS_UID_UNSET */
+ dbus_gid_t gid; /**< group ID or DBUS_GID_UNSET */
+} DBusCredentials;
+
dbus_bool_t _dbus_read_credentials_unix_socket (int client_fd,
DBusCredentials *credentials,
DBusError *error);
@@ -223,7 +243,10 @@ void _dbus_sleep_milliseconds (int milliseconds);
void _dbus_get_current_time (long *tv_sec,
long *tv_usec);
-
+/**
+ * File/directory interface
+ */
+dbus_bool_t _dbus_file_exists (const char *file);
dbus_bool_t _dbus_file_get_contents (DBusString *str,
const DBusString *filename,
DBusError *error);
@@ -258,6 +281,13 @@ void _dbus_directory_close (DBusDirIter *iter);
dbus_bool_t _dbus_check_dir_is_private_to_user (DBusString *dir,
DBusError *error);
+void _dbus_fd_set_close_on_exec (int fd);
+
+const char* _dbus_get_tmpdir (void);
+
+/**
+ * Random numbers
+ */
void _dbus_generate_pseudorandom_bytes_buffer (char *buffer,
int n_bytes);
void _dbus_generate_random_bytes_buffer (char *buffer,
@@ -272,7 +302,6 @@ const char* _dbus_error_from_errno (int error_number);
void _dbus_disable_sigpipe (void);
-void _dbus_fd_set_close_on_exec (int fd);
void _dbus_exit (int code) _DBUS_GNUC_NORETURN;
@@ -302,8 +331,6 @@ dbus_bool_t _dbus_full_duplex_pipe (int *fd1,
int *fd2,
dbus_bool_t blocking,
DBusError *error);
-dbus_bool_t _dbus_close (int fd,
- DBusError *error);
void _dbus_print_backtrace (void);
@@ -322,10 +349,8 @@ typedef void (* DBusSignalHandler) (int sig);
void _dbus_set_signal_handler (int sig,
DBusSignalHandler handler);
-dbus_bool_t _dbus_file_exists (const char *file);
dbus_bool_t _dbus_user_at_console (const char *username,
DBusError *error);
-const char* _dbus_get_tmpdir (void);
/* Define DBUS_VA_COPY() to do the right thing for copying va_list variables.
* config.h may have already defined DBUS_VA_COPY as va_copy or __va_copy.
diff --git a/dbus/dbus-transport-unix.c b/dbus/dbus-transport-unix.c
index 5536e923..55a89a5f 100644
--- a/dbus/dbus-transport-unix.c
+++ b/dbus/dbus-transport-unix.c
@@ -250,8 +250,8 @@ read_data_into_auth (DBusTransport *transport,
_dbus_auth_get_buffer (transport->auth, &buffer);
- bytes_read = _dbus_read (unix_transport->fd,
- buffer, unix_transport->max_bytes_read_per_iteration);
+ bytes_read = _dbus_read_socket (unix_transport->fd,
+ buffer, unix_transport->max_bytes_read_per_iteration);
_dbus_auth_return_buffer (transport->auth, buffer,
bytes_read > 0 ? bytes_read : 0);
@@ -305,9 +305,9 @@ write_data_from_auth (DBusTransport *transport)
&buffer))
return FALSE;
- bytes_written = _dbus_write (unix_transport->fd,
- buffer,
- 0, _dbus_string_get_length (buffer));
+ bytes_written = _dbus_write_socket (unix_transport->fd,
+ buffer,
+ 0, _dbus_string_get_length (buffer));
if (bytes_written > 0)
{
@@ -556,10 +556,10 @@ do_writing (DBusTransport *transport)
#endif
bytes_written =
- _dbus_write (unix_transport->fd,
- &unix_transport->encoded_outgoing,
- unix_transport->message_bytes_written,
- total_bytes_to_write - unix_transport->message_bytes_written);
+ _dbus_write_socket (unix_transport->fd,
+ &unix_transport->encoded_outgoing,
+ unix_transport->message_bytes_written,
+ total_bytes_to_write - unix_transport->message_bytes_written);
}
else
{
@@ -573,21 +573,21 @@ do_writing (DBusTransport *transport)
if (unix_transport->message_bytes_written < header_len)
{
bytes_written =
- _dbus_write_two (unix_transport->fd,
- header,
- unix_transport->message_bytes_written,
- header_len - unix_transport->message_bytes_written,
- body,
- 0, body_len);
+ _dbus_write_socket_two (unix_transport->fd,
+ header,
+ unix_transport->message_bytes_written,
+ header_len - unix_transport->message_bytes_written,
+ body,
+ 0, body_len);
}
else
{
bytes_written =
- _dbus_write (unix_transport->fd,
- body,
- (unix_transport->message_bytes_written - header_len),
- body_len -
- (unix_transport->message_bytes_written - header_len));
+ _dbus_write_socket (unix_transport->fd,
+ body,
+ (unix_transport->message_bytes_written - header_len),
+ body_len -
+ (unix_transport->message_bytes_written - header_len));
}
}
@@ -682,9 +682,9 @@ do_reading (DBusTransport *transport)
if (_dbus_string_get_length (&unix_transport->encoded_incoming) > 0)
bytes_read = _dbus_string_get_length (&unix_transport->encoded_incoming);
else
- bytes_read = _dbus_read (unix_transport->fd,
- &unix_transport->encoded_incoming,
- unix_transport->max_bytes_read_per_iteration);
+ bytes_read = _dbus_read_socket (unix_transport->fd,
+ &unix_transport->encoded_incoming,
+ unix_transport->max_bytes_read_per_iteration);
_dbus_assert (_dbus_string_get_length (&unix_transport->encoded_incoming) ==
bytes_read);
@@ -719,8 +719,8 @@ do_reading (DBusTransport *transport)
_dbus_message_loader_get_buffer (transport->loader,
&buffer);
- bytes_read = _dbus_read (unix_transport->fd,
- buffer, unix_transport->max_bytes_read_per_iteration);
+ bytes_read = _dbus_read_socket (unix_transport->fd,
+ buffer, unix_transport->max_bytes_read_per_iteration);
_dbus_message_loader_return_buffer (transport->loader,
buffer,
@@ -882,7 +882,7 @@ unix_disconnect (DBusTransport *transport)
free_watches (transport);
- _dbus_close (unix_transport->fd, NULL);
+ _dbus_close_socket (unix_transport->fd, NULL);
unix_transport->fd = -1;
}
@@ -1247,7 +1247,7 @@ _dbus_transport_new_for_domain_socket (const char *path,
return transport;
failed_1:
- _dbus_close (fd, NULL);
+ _dbus_close_socket (fd, NULL);
failed_0:
_dbus_string_free (&address);
return NULL;
@@ -1307,7 +1307,7 @@ _dbus_transport_new_for_tcp_socket (const char *host,
if (transport == NULL)
{
dbus_set_error (error, DBUS_ERROR_NO_MEMORY, NULL);
- _dbus_close (fd, NULL);
+ _dbus_close_socket (fd, NULL);
_dbus_string_free (&address);
fd = -1;
}