diff options
| author | Ralf Habacker <ralf.habacker@freenet.de> | 2007-06-19 20:04:34 +0000 | 
|---|---|---|
| committer | Ralf Habacker <ralf.habacker@freenet.de> | 2007-06-19 20:04:34 +0000 | 
| commit | a1a285b10d92708515977d8e9e5f07cb920e92c6 (patch) | |
| tree | 92a811fa0831eeb75742bcdfdd652ba66373f909 | |
| parent | ebb99420e577a0760e36ed38556aa833ace24996 (diff) | |
* dbus/dbus-sysdeps-win.c, dbus/dbus-sysdeps-spawn-win.c, dbus/dbus-sysdeps-win.h: disabled DBusSocket implementation Patch by Peter Kuemmel
| -rw-r--r-- | ChangeLog | 6 | ||||
| -rw-r--r-- | dbus/dbus-spawn-win.c | 8 | ||||
| -rw-r--r-- | dbus/dbus-sysdeps-win.c | 486 | ||||
| -rw-r--r-- | dbus/dbus-sysdeps-win.h | 11 | 
4 files changed, 509 insertions, 2 deletions
@@ -1,3 +1,9 @@ +2007-06-19  Ralf Habacker  <ralf.habacker@freenet.de> + +	* dbus/dbus-sysdeps-win.c, dbus/dbus-sysdeps-spawn-win.c,  +	dbus/dbus-sysdeps-win.h: disabled DBusSocket implementation +	Patch by Peter Kuemmel  +  2007-06-18  Ralf Habacker  <ralf.habacker@freenet.de>  	* dbus-win.patch: removed obsolate patches diff --git a/dbus/dbus-spawn-win.c b/dbus/dbus-spawn-win.c index 4e2365a2..138db6c7 100644 --- a/dbus/dbus-spawn-win.c +++ b/dbus/dbus-spawn-win.c @@ -444,7 +444,11 @@ static unsigned __stdcall  babysitter (void *parameter)  {    DBusBabysitter *sitter = (DBusBabysitter *) parameter; +#ifdef ENABLE_DBUSSOCKET    DBusSocket *sock; +#else +  int fd; +#endif    PING();    _dbus_babysitter_ref (sitter); @@ -499,8 +503,12 @@ babysitter (void *parameter)  #endif    PING(); +#ifdef ENABLE_DBUSSOCKET    _dbus_handle_to_socket (sitter->socket_to_main, &sock);    send (sock->fd, " ", 1, 0); +#else +  send (sitter->socket_to_main, " ", 1, 0); +#endif    _dbus_babysitter_unref (sitter); diff --git a/dbus/dbus-sysdeps-win.c b/dbus/dbus-sysdeps-win.c index 80a17938..166e4321 100644 --- a/dbus/dbus-sysdeps-win.c +++ b/dbus/dbus-sysdeps-win.c @@ -69,7 +69,10 @@ struct DBusCredentials{  #define socklen_t int  #endif +#ifdef ENABLE_DBUSSOCKET  _DBUS_DEFINE_GLOBAL_LOCK (win_fds); +#endif +  _DBUS_DEFINE_GLOBAL_LOCK (sid_atom_cache);  #ifdef ENABLE_DBUSUSERINFO @@ -83,6 +86,7 @@ typedef struct {  } DBusUserInfo;  #endif +#ifdef ENABLE_DBUSSOCKET  static  void   _dbus_lock_sockets() @@ -98,6 +102,7 @@ _dbus_unlock_sockets()  	_dbus_assert (win_fds!=0);   	_DBUS_UNLOCK (win_fds);  } +#endif  #ifdef _DBUS_WIN_USE_RANDOMIZER  static int  win_encap_randomizer; @@ -346,9 +351,11 @@ _dbus_pipe_close  (DBusPipe         *pipe,   *   */ +#ifdef ENABLE_DBUSSOCKET  static DBusSocket *win_fds = NULL;  static int win_n_fds = 0; // is this the size? rename to win_fds_size? # +  #if 0  #define TO_HANDLE(n)   ((n)^win32_encap_randomizer)  #define FROM_HANDLE(n) ((n)^win32_encap_randomizer) @@ -535,6 +542,7 @@ _dbus_handle_to_socket (int          handle,    _dbus_unlock_sockets();  } +  #undef TO_HANDLE  #undef IS_HANDLE  #undef FROM_HANDLE @@ -542,7 +550,7 @@ _dbus_handle_to_socket (int          handle,  #define win_fds 1==DBUS_WIN_DONT_USE_win_fds_DIRECTLY - +#endif  /**   * Thin wrapper around the read() system call that appends @@ -562,7 +570,9 @@ _dbus_read_socket (int               handle,                     DBusString       *buffer,                     int               count)  { +#ifdef ENABLE_DBUSSOCKET    DBusSocket *s; +#endif    int bytes_read;    int start;    char *data; @@ -579,12 +589,19 @@ _dbus_read_socket (int               handle,    data = _dbus_string_get_data_len (buffer, start, count); +#ifdef ENABLE_DBUSSOCKET    _dbus_handle_to_socket(handle, &s);    if(s->is_used)      {        _dbus_verbose ("recv: count=%d socket=%d\n", count, s->fd);        bytes_read = recv (s->fd, data, count, 0); +#else +	if(1) +    { +      _dbus_verbose ("recv: count=%d socket=%d\n", count, handle); +      bytes_read = recv (handle, data, count, 0); +#endif        if (bytes_read == SOCKET_ERROR)          {            DBUS_SOCKET_SET_ERRNO(); @@ -636,19 +653,28 @@ _dbus_write_socket (int               handle,                      int               start,                      int               len)  { +#ifdef ENABLE_DBUSSOCKET    DBusSocket *s; +#endif    int is_used;    const char *data;    int bytes_written;    data = _dbus_string_get_const_data_len (buffer, start, len); +#ifdef ENABLE_DBUSSOCKET    _dbus_handle_to_socket(handle, &s);    if (s->is_used)      {        _dbus_verbose ("send: len=%d socket=%d\n", len, s->fd);        bytes_written = send (s->fd, data, len, 0); +#else +  if (1) +    { +      _dbus_verbose ("send: len=%d socket=%d\n", len, handle); +	  bytes_written = send (handle, data, len, 0); +#endif        if (bytes_written == SOCKET_ERROR)          {            DBUS_SOCKET_SET_ERRNO(); @@ -683,6 +709,7 @@ dbus_bool_t  _dbus_close_socket (int        handle,                      DBusError *error)  { +#ifdef ENABLE_DBUSSOCKET    DBusSocket *s;    _DBUS_ASSERT_ERROR_IS_CLEAR (error); @@ -726,6 +753,32 @@ _dbus_close_socket (int        handle,    return TRUE; +#else + +  _DBUS_ASSERT_ERROR_IS_CLEAR (error); + + +  if (1) +    { +      if (closesocket (handle) == SOCKET_ERROR) +        { +          DBUS_SOCKET_SET_ERRNO (); +          dbus_set_error (error, _dbus_error_from_errno (errno), +              "Could not close socket: socket=%d, , %s", +                          handle, _dbus_strerror (errno)); +          return FALSE; +        } +      _dbus_verbose ("_dbus_close_socket: socket=%d, \n", +                     handle); +    } +  else +    { +      _dbus_assert_not_reached ("unhandled fd type"); +    } + +  return TRUE; +#endif +  }  /** @@ -738,6 +791,7 @@ _dbus_close_socket (int        handle,  void  _dbus_fd_set_close_on_exec (int handle)  { +#ifdef ENABLE_DBUSSOCKET    DBusSocket *s;    if (handle < 0)      return; @@ -748,6 +802,20 @@ _dbus_fd_set_close_on_exec (int handle)    s->close_on_exec = TRUE;    _dbus_unlock_sockets(); +#else +  /* TODO unic code. +  int val; +   +  val = fcntl (fd, F_GETFD, 0); +   +  if (val < 0) +    return; + +  val |= FD_CLOEXEC; +   +  fcntl (fd, F_SETFD, val); +  */ +#endif  }  /** @@ -761,6 +829,7 @@ dbus_bool_t  _dbus_set_fd_nonblocking (int             handle,                            DBusError      *error)  { +#ifdef ENABLE_DBUSSOCKET    DBusSocket *s;    u_long one = 1; @@ -789,6 +858,27 @@ _dbus_set_fd_nonblocking (int             handle,    _dbus_unlock_sockets();    return TRUE; +#else +  u_long one = 1; + +  _DBUS_ASSERT_ERROR_IS_CLEAR (error); + +  if (1) +    { +      if (ioctlsocket (handle, FIONBIO, &one) == SOCKET_ERROR) +        { +          dbus_set_error (error, _dbus_error_from_errno (WSAGetLastError ()), +                          "Failed to set socket %d:%d to nonblocking: %s", handle, +                          _dbus_strerror (WSAGetLastError ())); +          return FALSE; +        } +    } +  else +    { +      _dbus_assert_not_reached ("unhandled fd type"); +    } +  return TRUE; +#endif  } @@ -821,6 +911,7 @@ _dbus_write_socket_two (int               handle,                          int               start2,                          int               len2)  { +#ifdef ENABLE_DBUSSOCKET    DBusSocket *s;    WSABUF vectors[2];    const char *data1; @@ -873,6 +964,58 @@ _dbus_write_socket_two (int               handle,        _dbus_assert_not_reached ("unhandled fd type");      }    return 0; +#else +  WSABUF vectors[2]; +  const char *data1; +  const char *data2; +  int rc; +  DWORD bytes_written; +  int ret1; + +  _dbus_assert (buffer1 != NULL); +  _dbus_assert (start1 >= 0); +  _dbus_assert (start2 >= 0); +  _dbus_assert (len1 >= 0); +  _dbus_assert (len2 >= 0); + + +  data1 = _dbus_string_get_const_data_len (buffer1, start1, len1); + +  if (buffer2 != NULL) +    data2 = _dbus_string_get_const_data_len (buffer2, start2, len2); +  else +    { +      data2 = NULL; +      start2 = 0; +      len2 = 0; +    } + +  if (1) +    { +      vectors[0].buf = (char*) data1; +      vectors[0].len = len1; +      vectors[1].buf = (char*) data2; +      vectors[1].len = len2; + +      _dbus_verbose ("WSASend: len1+2=%d+%d socket=%d\n", len1, len2, handle); +      rc = WSASend (handle, vectors, data2 ? 2 : 1, &bytes_written, +                    0, NULL, NULL); +      if (rc < 0) +        { +          DBUS_SOCKET_SET_ERRNO (); +          _dbus_verbose ("WSASend: failed: %s\n", _dbus_strerror (errno)); +          bytes_written = -1; +        } +      else +        _dbus_verbose ("WSASend: = %ld\n", bytes_written); +      return bytes_written; +    } +  else +    { +      _dbus_assert_not_reached ("unhandled fd type"); +    } +  return 0; +#endif  }  #if 0 @@ -1810,7 +1953,9 @@ _dbus_full_duplex_pipe (int        *fd1,    u_long arg;    fd_set read_set, write_set;    struct timeval tv; +#ifdef ENABLE_DBUSSOCKET    DBusSocket sock; +#endif    _dbus_win_startup_winsock (); @@ -1935,10 +2080,15 @@ _dbus_full_duplex_pipe (int        *fd1,          }      } +#ifdef ENABLE_DBUSSOCKET    sock.fd = socket1;    *fd1 = _dbus_socket_to_handle (&sock);    sock.fd = socket2;    *fd2 = _dbus_socket_to_handle (&sock); +#else +  *fd1 = socket1; +  *fd2 = socket2; +#endif    _dbus_verbose ("full-duplex pipe %d:%d <-> %d:%d\n",                   *fd1, socket1, *fd2, socket2); @@ -2139,6 +2289,8 @@ _dbus_poll (DBusPollFD *fds,  #else   // USE_CHRIS_IMPL +#ifdef ENABLE_DBUSSOCKET +  int  _dbus_poll (DBusPollFD *fds,              int         n_fds, @@ -2282,6 +2434,139 @@ _dbus_poll (DBusPollFD *fds,        }    return ready;  } +#else // ENABLE_DBUSSOCKET + +int +_dbus_poll (DBusPollFD *fds, +            int         n_fds, +            int         timeout_milliseconds) +{ +#define DBUS_POLL_CHAR_BUFFER_SIZE 2000 +  char msg[DBUS_POLL_CHAR_BUFFER_SIZE]; +  char *msgp; + +  fd_set read_set, write_set, err_set; +  int max_fd = 0; +  int i; +  struct timeval tv; +  int ready; + +  FD_ZERO (&read_set); +  FD_ZERO (&write_set); +  FD_ZERO (&err_set); + + +#ifdef DBUS_ENABLE_VERBOSE_MODE +  msgp = msg; +  msgp += sprintf (msgp, "select: to=%d\n\t", timeout_milliseconds); +  for (i = 0; i < n_fds; i++) +    { +      static dbus_bool_t warned = FALSE; +      int fd; +      DBusPollFD *fdp = &fds[i]; +      fd = fdp->fd;   + + +      if (fdp->events & _DBUS_POLLIN) +        msgp += sprintf (msgp, "R:%d ", fd); + +      if (fdp->events & _DBUS_POLLOUT) +        msgp += sprintf (msgp, "W:%d ", fd); + +      msgp += sprintf (msgp, "E:%d\n\t", fd); + +      // FIXME: more robust code for long  msg +      //        create on heap when msg[] becomes too small +      if (msgp >= msg + DBUS_POLL_CHAR_BUFFER_SIZE) +        { +          _dbus_assert_not_reached ("buffer overflow in _dbus_poll"); +        } +    } + +  msgp += sprintf (msgp, "\n"); +  _dbus_verbose ("%s",msg); +#endif +  for (i = 0; i < n_fds; i++) +    { +        int fd; +      DBusPollFD *fdp = &fds[i]; +      fd = fdp->fd;   + +      if (fdp->events & _DBUS_POLLIN) +        FD_SET (fd, &read_set); + +      if (fdp->events & _DBUS_POLLOUT) +        FD_SET (fd, &write_set); + +      FD_SET (fd, &err_set); + +      max_fd = MAX (max_fd, fd); +    } + + +  tv.tv_sec = timeout_milliseconds / 1000; +  tv.tv_usec = (timeout_milliseconds % 1000) * 1000; + +  ready = select (max_fd + 1, &read_set, &write_set, &err_set, +                  timeout_milliseconds < 0 ? NULL : &tv); + +  if (DBUS_SOCKET_API_RETURNS_ERROR (ready)) +    { +      DBUS_SOCKET_SET_ERRNO (); +      if (errno != EWOULDBLOCK) +        _dbus_verbose ("select: failed: %s\n", _dbus_strerror (errno)); +    } +  else if (ready == 0) +    _dbus_verbose ("select: = 0\n"); +  else +    if (ready > 0) +      { +#ifdef DBUS_ENABLE_VERBOSE_MODE +        msgp = msg; +        msgp += sprintf (msgp, "select: = %d:\n\t", ready); + +        for (i = 0; i < n_fds; i++) +          { +            int fd; +            DBusPollFD *fdp = &fds[i]; +            fd = fdp->fd;   + +            if (FD_ISSET (fd, &read_set)) +              msgp += sprintf (msgp, "R:%d ", fd); + +            if (FD_ISSET (fd, &write_set)) +              msgp += sprintf (msgp, "W:%d ", fd); + +            if (FD_ISSET (fd, &err_set)) +              msgp += sprintf (msgp, "E:%d\n\t", fd); +          } +        msgp += sprintf (msgp, "\n"); +        _dbus_verbose ("%s",msg); +#endif + +        for (i = 0; i < n_fds; i++) +          { +            int fd; +            DBusPollFD *fdp = &fds[i]; +            fd = fdp->fd;   + +            fdp->revents = 0; + +            if (FD_ISSET (fd, &read_set)) +              fdp->revents |= _DBUS_POLLIN; + +            if (FD_ISSET (fd, &write_set)) +              fdp->revents |= _DBUS_POLLOUT; + +            if (FD_ISSET (fd, &err_set)) +              fdp->revents |= _DBUS_POLLERR; +          } +      } +  return ready; +} + +#endif  //ENABLE_DBUSSOCKET +  #endif  // USE_CHRIS_IMPL @@ -3199,6 +3484,7 @@ _dbus_connect_tcp_socket (const char     *host,                            dbus_uint32_t   port,                            DBusError      *error)  { +#ifdef ENABLE_DBUSSOCKET    DBusSocket s;    int handle;    struct sockaddr_in addr; @@ -3275,6 +3561,81 @@ _dbus_connect_tcp_socket (const char     *host,      }    return handle; +#else +  int fd; +  struct sockaddr_in addr; +  struct hostent *he; +  struct in_addr *haddr; +  struct in_addr ina; + +  _DBUS_ASSERT_ERROR_IS_CLEAR (error); + +  _dbus_win_startup_winsock (); + +  fd = socket (AF_INET, SOCK_STREAM, 0); + +  if (DBUS_SOCKET_IS_INVALID (fd)) +    { +      DBUS_SOCKET_SET_ERRNO (); +      dbus_set_error (error, +                      _dbus_error_from_errno (errno), +                      "Failed to create socket: %s", +                      _dbus_strerror (errno)); + +      return -1; +    } + +  if (host == NULL) +    { +      host = "localhost"; +      ina.s_addr = htonl (INADDR_LOOPBACK); +      haddr = &ina; +    } + +  he = gethostbyname (host); +  if (he == NULL) +    { +      DBUS_SOCKET_SET_ERRNO (); +      dbus_set_error (error, +                      _dbus_error_from_errno (errno), +                      "Failed to lookup hostname: %s", +                      host); +      DBUS_CLOSE_SOCKET (fd); +      return -1; +    } + +  haddr = ((struct in_addr *) (he->h_addr_list)[0]); + +  _DBUS_ZERO (addr); +  memcpy (&addr.sin_addr, haddr, sizeof(struct in_addr)); +  addr.sin_family = AF_INET; +  addr.sin_port = htons (port); + +  if (DBUS_SOCKET_API_RETURNS_ERROR +      (connect (fd, (struct sockaddr*) &addr, sizeof (addr)) < 0)) +    { +      DBUS_SOCKET_SET_ERRNO (); +      dbus_set_error (error, +                      _dbus_error_from_errno (errno), +                      "Failed to connect to socket %s:%d %s", +                      host, port, _dbus_strerror (errno)); + +      DBUS_CLOSE_SOCKET (fd); +      fd = -1; + +      return -1; +    } + +  if (!_dbus_set_fd_nonblocking (fd, error)) +    { +      _dbus_close_socket (fd, NULL); +      fd = -1; + +      return -1; +    } + +  return fd; +#endif  }  void @@ -3298,6 +3659,7 @@ _dbus_listen_tcp_socket (const char     *host,                           dbus_bool_t     inaddr_any,                           DBusError      *error)  { +#ifdef ENABLE_DBUSSOCKET    DBusSocket slisten;    int handle;    struct sockaddr_in addr; @@ -3388,8 +3750,98 @@ _dbus_listen_tcp_socket (const char     *host,      }    return handle; +#else +  int fd; +  struct sockaddr_in addr; +  struct hostent *he; +  struct in_addr *haddr; +  socklen_t len = (socklen_t) sizeof (struct sockaddr); +  struct in_addr ina; + + +  _DBUS_ASSERT_ERROR_IS_CLEAR (error); + +  _dbus_win_startup_winsock (); + +  fd = socket (AF_INET, SOCK_STREAM, 0); + +  if (DBUS_SOCKET_IS_INVALID (fd)) +    { +      DBUS_SOCKET_SET_ERRNO (); +      dbus_set_error (error, _dbus_error_from_errno (errno), +                      "Failed to create socket \"%s:%d\": %s", +                      host, port, _dbus_strerror (errno)); +      return -1; +    } +  if (host == NULL) +    { +      host = "localhost"; +      ina.s_addr = htonl (INADDR_LOOPBACK); +      haddr = &ina; +    } +  else if (!host[0]) +    { +      ina.s_addr = htonl (INADDR_ANY); +      haddr = &ina; +    } +  else +    { +      he = gethostbyname (host); +      if (he == NULL) +        { +          DBUS_SOCKET_SET_ERRNO (); +          dbus_set_error (error, +                          _dbus_error_from_errno (errno), +                          "Failed to lookup hostname: %s", +                          host); +          DBUS_CLOSE_SOCKET (fd); +          return -1; +        } + +      haddr = ((struct in_addr *) (he->h_addr_list)[0]); +    } + +  _DBUS_ZERO (addr); +  memcpy (&addr.sin_addr, haddr, sizeof (struct in_addr)); +  addr.sin_family = AF_INET; +  addr.sin_port = htons (*port); + +  if (bind (fd, (struct sockaddr*) &addr, sizeof (struct sockaddr))) +    { +      DBUS_SOCKET_SET_ERRNO (); +      dbus_set_error (error, _dbus_error_from_errno (errno), +                      "Failed to bind socket \"%s:%d\": %s", +                      host, *port, _dbus_strerror (errno)); +      DBUS_CLOSE_SOCKET (fd); +      return -1; +    } + +  if (DBUS_SOCKET_API_RETURNS_ERROR (listen (fd, 30 /* backlog */))) +    { +      DBUS_SOCKET_SET_ERRNO (); +      dbus_set_error (error, _dbus_error_from_errno (errno), +                      "Failed to listen on socket \"%s:%d\": %s", +                      host, *port, _dbus_strerror (errno)); +      DBUS_CLOSE_SOCKET (fd); +      return -1; +    } + +  getsockname(fd, (struct sockaddr*) &addr, &len); +  *port = (dbus_uint32_t) ntohs(addr.sin_port); +   +  _dbus_daemon_init(host, ntohs(addr.sin_port)); + +  if (!_dbus_set_fd_nonblocking (fd, error)) +    { +      _dbus_close_socket (fd, NULL); +      return -1; +    } + +  return fd; +#endif  } +  /**   * Accepts a connection on a listening socket.   * Handles EINTR for you. @@ -3400,6 +3852,7 @@ _dbus_listen_tcp_socket (const char     *host,  int  _dbus_accept  (int listen_handle)  { +#ifdef ENABLE_DBUSSOCKET    DBusSocket *slisten;    DBusSocket sclient;    struct sockaddr addr; @@ -3428,10 +3881,41 @@ retry:      }    return _dbus_socket_to_handle (&sclient); +#else +  int fd; +  int sclient; +  struct sockaddr addr; +  socklen_t addrlen; + +  fd = listen_handle; + +  addrlen = sizeof (addr); + +  //FIXME:  why do we not try it again on Windows? +#if !defined(DBUS_WIN) && !defined(DBUS_WINCE) +retry: +#endif + +  sclient = accept (fd, &addr, &addrlen); + +  if (DBUS_SOCKET_IS_INVALID (sclient)) +    { +      DBUS_SOCKET_SET_ERRNO (); +#if !defined(DBUS_WIN) && !defined(DBUS_WINCE) +      if (errno == EINTR) +        goto retry; +#else +      return -1; +#endif +    } + +  return sclient; +#endif  } +  dbus_bool_t  _dbus_send_credentials_socket (int            handle,                          DBusError      *error) diff --git a/dbus/dbus-sysdeps-win.h b/dbus/dbus-sysdeps-win.h index 4c4d0e84..16dc5abe 100644 --- a/dbus/dbus-sysdeps-win.h +++ b/dbus/dbus-sysdeps-win.h @@ -56,6 +56,10 @@ extern BOOL WINAPI ConvertSidToStringSidA (PSID Sid, LPSTR *StringSid);  #define DBUS_CONSOLE_DIR "/var/run/console/" + +//#define ENABLE_DBUSSOCKET + +#ifdef ENABLE_DBUSSOCKET  typedef struct    {      int fd;               /* File descriptor, SOCKET or file HANDLE */ @@ -71,6 +75,7 @@ DBusSocket;  extern DBusSocket *win_fds;  extern int win32_n_fds; +#endif  void _dbus_win_startup_winsock (void); @@ -157,14 +162,18 @@ struct DBusFile      int FDATA;    }; - +#ifdef ENABLE_DBUSSOCKET  void _dbus_handle_to_socket (int          handle,                               DBusSocket **socket);  int  _dbus_socket_to_handle (DBusSocket  *socket); +#endif +  dbus_bool_t _dbus_get_config_file_name(DBusString *config_file,                                          char *s); + +  #endif  /** @} end of sysdeps-win.h */  | 
