diff options
| -rw-r--r-- | ChangeLog | 10 | ||||
| -rw-r--r-- | bus/bus.c | 20 | ||||
| -rw-r--r-- | bus/bus.h | 4 | ||||
| -rw-r--r-- | bus/main.c | 16 | ||||
| -rw-r--r-- | bus/test.c | 5 | ||||
| -rw-r--r-- | dbus/dbus-sysdeps-unix.c | 65 | ||||
| -rw-r--r-- | dbus/dbus-sysdeps-util-unix.c | 4 | ||||
| -rw-r--r-- | dbus/dbus-sysdeps-util-win.c | 2 | ||||
| -rw-r--r-- | dbus/dbus-sysdeps-win.c | 78 | ||||
| -rw-r--r-- | dbus/dbus-sysdeps.h | 17 | 
10 files changed, 187 insertions, 34 deletions
@@ -1,4 +1,12 @@ -2007-03-09  Ralf Habacker  <ralf.habacker@freenet.de> +2007-03-10  Ralf Habacker  <ralf.habacker@freenet.de> + +	* bus/bus.c, bus/bus.h, bus/main.c, bus/test.c, +	dbus/dbus-sysdeps-unix.c, dbus/dbus-sysdeps-util-unix.c, +	dbus/dbus-sysdeps-util-win.c, dbus/dbus-sysdeps-win.c, +	dbus/dbus-sysdeps.h: renamed _dbus_xxx_pipe to _dbus_pipe_xxx, +	completed _dbus_pipe support.  + +2007-03-10  Ralf Habacker  <ralf.habacker@freenet.de>  	* dbus/dbus-sysdeps.h (_dbus_listen_tcp_socket):  	changed type or port to pointer, because the port is given back. @@ -527,8 +527,8 @@ process_config_postinit (BusContext      *context,  BusContext*  bus_context_new (const DBusString *config_file,                   ForceForkSetting  force_fork, -                 int               print_addr_fd, -                 int               print_pid_fd, +                 DBusPipe          print_addr_fd, +                 DBusPipe          print_pid_fd,                   DBusError        *error)  {    BusContext *context; @@ -603,7 +603,7 @@ bus_context_new (const DBusString *config_file,     * other random thing. But I think the answer is "don't do     * that then"     */ -  if (print_addr_fd >= 0) +  if (_dbus_pipe_is_valid(print_addr_fd))      {        DBusString addr;        const char *a = bus_context_get_address (context); @@ -625,7 +625,7 @@ bus_context_new (const DBusString *config_file,          }        bytes = _dbus_string_get_length (&addr); -      if (_dbus_write_pipe (print_addr_fd, &addr, 0, bytes) != bytes) +      if (_dbus_pipe_write(print_addr_fd, &addr, 0, bytes) != bytes)          {            dbus_set_error (error, DBUS_ERROR_FAILED,                            "Printing message bus address: %s\n", @@ -634,8 +634,8 @@ bus_context_new (const DBusString *config_file,            goto failed;          } -      if (print_addr_fd > 2) -        _dbus_close_socket (print_addr_fd, NULL); +      if (_dbus_pipe_is_special(print_addr_fd)) +        _dbus_pipe_close(print_addr_fd, NULL);        _dbus_string_free (&addr);      } @@ -706,7 +706,7 @@ bus_context_new (const DBusString *config_file,      }    /* Write PID if requested */ -  if (print_pid_fd >= 0) +  if (_dbus_pipe_is_valid(print_pid_fd))      {        DBusString pid;        int bytes; @@ -726,7 +726,7 @@ bus_context_new (const DBusString *config_file,          }        bytes = _dbus_string_get_length (&pid); -      if (_dbus_write_pipe (print_pid_fd, &pid, 0, bytes) != bytes) +      if (_dbus_pipe_write (print_pid_fd, &pid, 0, bytes) != bytes)          {            dbus_set_error (error, DBUS_ERROR_FAILED,                            "Printing message bus PID: %s\n", @@ -735,8 +735,8 @@ bus_context_new (const DBusString *config_file,            goto failed;          } -      if (print_pid_fd > 2) -        _dbus_close_socket (print_pid_fd, NULL); +      if (_dbus_pipe_is_special (print_pid_fd)) +        _dbus_pipe_close (print_pid_fd, NULL);        _dbus_string_free (&pid);      } @@ -70,8 +70,8 @@ typedef enum  BusContext*       bus_context_new                                (const DBusString *config_file,                                                                    ForceForkSetting  force_fork, -                                                                  int               print_addr_fd, -                                                                  int               print_pid_fd, +                                                                  DBusPipe         print_addr_fd, +                                                                  DBusPipe         print_pid_fd,                                                                    DBusError        *error);  dbus_bool_t       bus_context_reload_config                      (BusContext       *context,  								  DBusError        *error); @@ -247,8 +247,8 @@ main (int argc, char **argv)    DBusString addr_fd;    DBusString pid_fd;    const char *prev_arg; -  int print_addr_fd; -  int print_pid_fd; +  DBusPipe print_addr_fd; +  DBusPipe print_pid_fd;    int i;    dbus_bool_t print_address;    dbus_bool_t print_pid; @@ -387,10 +387,10 @@ main (int argc, char **argv)        usage ();      } -  print_addr_fd = -1; +  print_addr_fd = _dbus_pipe_init(-1);    if (print_address)      { -      print_addr_fd = 1; /* stdout */ +      print_addr_fd = _dbus_pipe_init(1); /* stdout */        if (_dbus_string_get_length (&addr_fd) > 0)          {            long val; @@ -404,15 +404,15 @@ main (int argc, char **argv)                exit (1);              } -          print_addr_fd = val; +          print_addr_fd = _dbus_pipe_init(val);          }      }    _dbus_string_free (&addr_fd); -  print_pid_fd = -1; +  print_pid_fd = _dbus_pipe_init(-1);    if (print_pid)      { -      print_pid_fd = 1; /* stdout */ +      print_pid_fd = _dbus_pipe_init(1); /* stdout */        if (_dbus_string_get_length (&pid_fd) > 0)          {            long val; @@ -426,7 +426,7 @@ main (int argc, char **argv)                exit (1);              } -          print_pid_fd = val; +          print_pid_fd = _dbus_pipe_init(val);          }      }    _dbus_string_free (&pid_fd); @@ -27,6 +27,7 @@  #include "test.h"  #include <dbus/dbus-internals.h>  #include <dbus/dbus-list.h> +#include <dbus/dbus-sysdeps.h>  /* The "debug client" watch/timeout handlers don't dispatch messages,   * as we manually pull them in order to verify them. This is why they @@ -297,6 +298,7 @@ bus_context_new_test (const DBusString *test_data_dir,    DBusString config_file;    DBusString relative;    BusContext *context; +  DBusPipe pipe;    if (!_dbus_string_init (&config_file))      { @@ -322,7 +324,8 @@ bus_context_new_test (const DBusString *test_data_dir,      }    dbus_error_init (&error); -  context = bus_context_new (&config_file, FALSE, -1, -1, &error); +  pipe = _dbus_pipe_init(-1); +  context = bus_context_new (&config_file, FALSE, pipe, pipe, &error);    if (context == NULL)      {        _DBUS_ASSERT_ERROR_IS_SET (&error); diff --git a/dbus/dbus-sysdeps-unix.c b/dbus/dbus-sysdeps-unix.c index 13375fe8..edd4025d 100644 --- a/dbus/dbus-sysdeps-unix.c +++ b/dbus/dbus-sysdeps-unix.c @@ -169,16 +169,77 @@ _dbus_write_socket (int               fd,    return _dbus_write (fd, buffer, start, len);  } +/** + * init a pipe instance. + * + * @param fd the file descriptor to init from  + * @returns a DBusPipe instance + */ +DBusPipe _dbus_pipe_init(int         fd) +{ +  DBusPipe pipe; +  pipe.fd = fd; +  return pipe; +} + +/** + * write data to a pipe. + * + * @param pipe the pipe instance + * @param buffer the buffer to write data from + * @param start the first byte in the buffer to write + * @param len the number of bytes to try to write + * @returns the number of bytes written or -1 on error + */  int -_dbus_write_pipe (DBusPipe         pipe, +_dbus_pipe_write (DBusPipe         pipe,                    const DBusString *buffer,                    int               start,                    int               len)  { -	return _dbus_write (pipe, buffer, start, len); +  return _dbus_write (pipe.fd, buffer, start, len); +} + +/** + * close a pipe. + * + * @param pipe the pipe instance + * @param error return location for an error + * @returns #FALSE if error is set + */ +int +_dbus_pipe_close  (DBusPipe         pipe, +                   DBusError        *error) +{ +  return _dbus_close (pipe.fd, error); +} + +/** + * check if a pipe is valid, which means is constructed + * by a valid file descriptor + * + * @param pipe the pipe instance + * @returns #FALSE if pipe is not valid + */ +dbus_bool_t _dbus_pipe_is_valid(DBusPipe pipe) +{ +  return pipe.fd >= 0;  }  /** + * check if a pipe is a special pipe, which means using  + * a non default file descriptor (>2) + * + * @param pipe the pipe instance + * @returns #FALSE if pipe is not a special pipe + */ +dbus_bool_t _dbus_pipe_is_special(DBusPipe pipe) +{ +  return pipe.fd > 2; +} + + +/**   * Like _dbus_write_two() but only works on sockets and is thus   * available on Windows.   *  diff --git a/dbus/dbus-sysdeps-util-unix.c b/dbus/dbus-sysdeps-util-unix.c index f57b7807..f1ed1056 100644 --- a/dbus/dbus-sysdeps-util-unix.c +++ b/dbus/dbus-sysdeps-util-unix.c @@ -67,7 +67,7 @@   */  dbus_bool_t  _dbus_become_daemon (const DBusString *pidfile, -		     int               print_pid_fd, +                     DBusPipe         print_pid_fd,                       DBusError        *error)  {    const char *s; @@ -157,7 +157,7 @@ _dbus_become_daemon (const DBusString *pidfile,  	    }  	  bytes = _dbus_string_get_length (&pid); -	  if (_dbus_write_socket (print_pid_fd, &pid, 0, bytes) != bytes) +	  if (_dbus_pipe_write (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-util-win.c b/dbus/dbus-sysdeps-util-win.c index 331c9446..3b7a9cc4 100644 --- a/dbus/dbus-sysdeps-util-win.c +++ b/dbus/dbus-sysdeps-util-win.c @@ -52,7 +52,7 @@   */  dbus_bool_t  _dbus_become_daemon (const DBusString *pidfile, -                     int               print_pid_fd, +                     DBusPipe         print_pid_fd,                       DBusError        *error)  {    return TRUE; diff --git a/dbus/dbus-sysdeps-win.c b/dbus/dbus-sysdeps-win.c index 9f62e5ba..fe80d100 100644 --- a/dbus/dbus-sysdeps-win.c +++ b/dbus/dbus-sysdeps-win.c @@ -266,27 +266,97 @@ dbus_bool_t _dbus_fstat (DBusFile    *file,    return fstat(file->FDATA, sb) >= 0;  } +/** + * init a pipe instance. + * + * @param fd the file descriptor to init from  + * @returns a DBusPipe instance + */ +DBusPipe _dbus_pipe_init(int         fd) +{ +	DBusPipe pipe; +	pipe.fd = fd; +	return pipe; +} + +/** + * write data to a pipe. + * + * @param pipe the pipe instance + * @param buffer the buffer to write data from + * @param start the first byte in the buffer to write + * @param len the number of bytes to try to write + * @returns the number of bytes written or -1 on error + */  int -_dbus_write_pipe (DBusPipe          pipe, +_dbus_pipe_write (DBusPipe          pipe,                    const DBusString *buffer,                    int               start,                    int               len)  {  	DBusFile file; -	file.FDATA = pipe; +	file.FDATA = pipe.fd;  	return _dbus_write_file(&file, buffer, start, len);  } +/** + * read data from a pipe. + * + * @param pipe the pipe instance + * @param buffer the buffer to read data in + * @param count the number of bytes to try to read + * @returns the number of bytes read or -1 on error + */  int -_dbus_read_pipe(DBusPipe    pipe, +_dbus_pipe_read(DBusPipe    pipe,                  DBusString *buffer,                  int         count)  {  	DBusFile file; -	file.FDATA = pipe; +	file.FDATA = pipe.fd;  	return _dbus_read_file(&file, buffer, count);  } +/** + * close a pipe. + * + * @param pipe the pipe instance + * @param error return location for an error + * @returns #FALSE if error is set + */ + int +_dbus_pipe_close(DBusPipe    pipe, +                 DBusError    *error) +{ +	DBusFile file; +	file.FDATA = pipe.fd; +	return _dbus_close_file(&file, error); +} + +/** + * check if a pipe is valid, which means is constructed + * by a valid file descriptor + * + * @param pipe the pipe instance + * @returns #FALSE if pipe is not valid + */ +dbus_bool_t _dbus_pipe_is_valid(DBusPipe pipe) +{ +	return pipe.fd >= 0; +} + +/** + * check if a pipe is a special pipe, which means using  + * a non default file descriptor (>2) + * + * @param pipe the pipe instance + * @returns #FALSE if pipe is not a special pipe + */ +dbus_bool_t _dbus_pipe_is_special(DBusPipe pipe) +{ +	return pipe.fd > 2; +} +  #undef FDATA  /** diff --git a/dbus/dbus-sysdeps.h b/dbus/dbus-sysdeps.h index 9c1bec98..879a47bc 100644 --- a/dbus/dbus-sysdeps.h +++ b/dbus/dbus-sysdeps.h @@ -302,12 +302,23 @@ dbus_bool_t _dbus_path_is_absolute    (const DBusString *filename);  dbus_bool_t _dbus_get_standard_session_servicedirs (DBusList **dirs); -typedef int DBusPipe; -int _dbus_write_pipe (DBusPipe          pipe, +typedef struct { +	int fd;  +} DBusPipe; + +DBusPipe _dbus_pipe_init(int         fd); + +int _dbus_pipe_write (DBusPipe          pipe,                        const DBusString *buffer,                        int               start,                        int               len); +int _dbus_pipe_close  (DBusPipe          pipe, +					   DBusError        *error); + +dbus_bool_t _dbus_pipe_is_valid(DBusPipe pipe); +dbus_bool_t _dbus_pipe_is_special(DBusPipe pipe); +  /** Opaque type for reading a directory listing */  typedef struct DBusDirIter DBusDirIter; @@ -374,7 +385,7 @@ dbus_bool_t _dbus_full_duplex_pipe (int              *fd1,  void        _dbus_print_backtrace  (void);  dbus_bool_t _dbus_become_daemon   (const DBusString *pidfile, -				   int               print_pid_fd, +                                   DBusPipe         print_pid_fd,                                     DBusError        *error);  dbus_bool_t _dbus_write_pid_file  (const DBusString *filename,                                     unsigned long     pid,  | 
