From 08079a5bdedd6ec91cda413983e4bd3b6ee0252d Mon Sep 17 00:00:00 2001 From: Havoc Pennington Date: Sat, 16 Sep 2006 15:34:34 +0000 Subject: 2006-09-16 Havoc Pennington MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * 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. --- ChangeLog | 10 ++++++ bus/bus.c | 8 ++--- bus/main.c | 4 +-- dbus/Makefile.am | 3 +- dbus/dbus-server-debug-pipe.c | 6 ++-- dbus/dbus-server-unix.c | 8 ++--- dbus/dbus-spawn.c | 10 +++--- dbus/dbus-sysdeps-unix.c | 64 +++++++++++++++++++++++++++++------ dbus/dbus-sysdeps-util-unix.c | 3 +- dbus/dbus-sysdeps.h | 79 ++++++++++++++++++++++++++++--------------- dbus/dbus-transport-unix.c | 56 +++++++++++++++--------------- 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 + + * 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 * 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; } -- cgit