}
/**
- * See if errno is set
- * @returns #TRUE if errno is not 0
- */
-dbus_bool_t
-_dbus_get_is_errno_nonzero (void)
-{
- return errno != 0;
-}
-
-/**
* See if errno is ENOMEM
- * @returns #TRUE if errno == ENOMEM
+ * @returns #TRUE if e == ENOMEM
*/
dbus_bool_t
-_dbus_get_is_errno_enomem (void)
+_dbus_get_is_errno_enomem (int e)
{
- return errno == ENOMEM;
+ return e == ENOMEM;
}
/**
* See if errno is EINTR
- * @returns #TRUE if errno == EINTR
+ * @returns #TRUE if e == EINTR
*/
dbus_bool_t
-_dbus_get_is_errno_eintr (void)
+_dbus_get_is_errno_eintr (int e)
{
- return errno == EINTR;
+ return e == EINTR;
}
/**
* @returns #TRUE if errno == EPIPE
*/
dbus_bool_t
-_dbus_get_is_errno_epipe (void)
+_dbus_get_is_errno_epipe (int e)
{
- return errno == EPIPE;
+ return e == EPIPE;
}
/**
* @returns #TRUE if errno == ETOOMANYREFS
*/
dbus_bool_t
-_dbus_get_is_errno_etoomanyrefs (void)
+_dbus_get_is_errno_etoomanyrefs (int e)
{
#ifdef ETOOMANYREFS
- return errno == ETOOMANYREFS;
+ return e == ETOOMANYREFS;
#else
return FALSE;
#endif
const char* _dbus_error_from_errno (int error_number);
const char* _dbus_error_from_system_errno (void);
+int _dbus_save_socket_errno (void);
+void _dbus_restore_socket_errno (int saved_errno);
void _dbus_set_errno_to_zero (void);
-dbus_bool_t _dbus_get_is_errno_nonzero (void);
-dbus_bool_t _dbus_get_is_errno_eagain_or_ewouldblock (void);
-dbus_bool_t _dbus_get_is_errno_enomem (void);
-dbus_bool_t _dbus_get_is_errno_eintr (void);
-dbus_bool_t _dbus_get_is_errno_epipe (void);
-dbus_bool_t _dbus_get_is_errno_etoomanyrefs (void);
+dbus_bool_t _dbus_get_is_errno_eagain_or_ewouldblock (int e);
+dbus_bool_t _dbus_get_is_errno_enomem (int e);
+dbus_bool_t _dbus_get_is_errno_eintr (int e);
+dbus_bool_t _dbus_get_is_errno_epipe (int e);
+dbus_bool_t _dbus_get_is_errno_etoomanyrefs (int e);
const char* _dbus_strerror_from_errno (void);
void _dbus_disable_sigpipe (void);
DBusTransportSocket *socket_transport = (DBusTransportSocket*) transport;
DBusString *buffer;
int bytes_read;
-
+ int saved_errno;
+
*oom = FALSE;
_dbus_auth_get_buffer (transport->auth, &buffer);
bytes_read = _dbus_read_socket (socket_transport->fd,
buffer, socket_transport->max_bytes_read_per_iteration);
+ saved_errno = _dbus_save_socket_errno ();
_dbus_auth_return_buffer (transport->auth, buffer);
{
/* EINTR already handled for us */
- if (_dbus_get_is_errno_enomem ())
+ if (_dbus_get_is_errno_enomem (saved_errno))
{
*oom = TRUE;
}
- else if (_dbus_get_is_errno_eagain_or_ewouldblock ())
+ else if (_dbus_get_is_errno_eagain_or_ewouldblock (saved_errno))
; /* do nothing, just return FALSE below */
else
{
_dbus_verbose ("Error reading from remote app: %s\n",
- _dbus_strerror_from_errno ());
+ _dbus_strerror (saved_errno));
do_io_error (transport);
}
{
DBusTransportSocket *socket_transport = (DBusTransportSocket*) transport;
int bytes_written;
+ int saved_errno;
const DBusString *buffer;
if (!_dbus_auth_get_bytes_to_send (transport->auth,
bytes_written = _dbus_write_socket (socket_transport->fd,
buffer,
0, _dbus_string_get_length (buffer));
+ saved_errno = _dbus_save_socket_errno ();
if (bytes_written > 0)
{
{
/* EINTR already handled for us */
- if (_dbus_get_is_errno_eagain_or_ewouldblock ())
+ if (_dbus_get_is_errno_eagain_or_ewouldblock (saved_errno))
;
else
{
_dbus_verbose ("Error writing to remote app: %s\n",
- _dbus_strerror_from_errno ());
+ _dbus_strerror (saved_errno));
do_io_error (transport);
}
}
const DBusString *body;
int header_len, body_len;
int total_bytes_to_write;
+ int saved_errno;
if (total > socket_transport->max_bytes_written_per_iteration)
{
&socket_transport->encoded_outgoing,
socket_transport->message_bytes_written,
total_bytes_to_write - socket_transport->message_bytes_written);
+ saved_errno = _dbus_save_socket_errno ();
}
else
{
0, body_len,
unix_fds,
n);
+ saved_errno = _dbus_save_socket_errno ();
if (bytes_written > 0 && n > 0)
_dbus_verbose("Wrote %i unix fds\n", n);
body_len -
(socket_transport->message_bytes_written - header_len));
}
+
+ saved_errno = _dbus_save_socket_errno ();
}
}
* http://lists.freedesktop.org/archives/dbus/2008-March/009526.html
*/
- if (_dbus_get_is_errno_eagain_or_ewouldblock () || _dbus_get_is_errno_epipe ())
+ if (_dbus_get_is_errno_eagain_or_ewouldblock (saved_errno) || _dbus_get_is_errno_epipe (saved_errno))
goto out;
/* Since Linux commit 25888e (from 2.6.37-rc4, Nov 2010), sendmsg()
* https://bugs.freedesktop.org/show_bug.cgi?id=80163
*/
- else if (_dbus_get_is_errno_etoomanyrefs ())
+ else if (_dbus_get_is_errno_etoomanyrefs (saved_errno))
{
/* We only send fds in the first byte of the message.
* ETOOMANYREFS cannot happen after.
else
{
_dbus_verbose ("Error writing to remote app: %s\n",
- _dbus_strerror_from_errno ());
+ _dbus_strerror (saved_errno));
do_io_error (transport);
goto out;
}
int bytes_read;
int total;
dbus_bool_t oom;
+ int saved_errno;
_dbus_verbose ("fd = %d\n",socket_transport->fd);
&socket_transport->encoded_incoming,
socket_transport->max_bytes_read_per_iteration);
+ saved_errno = _dbus_save_socket_errno ();
+
_dbus_assert (_dbus_string_get_length (&socket_transport->encoded_incoming) ==
bytes_read);
buffer,
socket_transport->max_bytes_read_per_iteration,
fds, &n_fds);
+ saved_errno = _dbus_save_socket_errno ();
if (bytes_read >= 0 && n_fds > 0)
_dbus_verbose("Read %i unix fds\n", n_fds);
{
bytes_read = _dbus_read_socket (socket_transport->fd,
buffer, socket_transport->max_bytes_read_per_iteration);
+ saved_errno = _dbus_save_socket_errno ();
}
_dbus_message_loader_return_buffer (transport->loader,
buffer);
}
-
+
if (bytes_read < 0)
{
/* EINTR already handled for us */
- if (_dbus_get_is_errno_enomem ())
+ if (_dbus_get_is_errno_enomem (saved_errno))
{
_dbus_verbose ("Out of memory in read()/do_reading()\n");
oom = TRUE;
goto out;
}
- else if (_dbus_get_is_errno_eagain_or_ewouldblock ())
+ else if (_dbus_get_is_errno_eagain_or_ewouldblock (saved_errno))
goto out;
else
{
_dbus_verbose ("Error reading from remote app: %s\n",
- _dbus_strerror_from_errno ());
+ _dbus_strerror (saved_errno));
do_io_error (transport);
goto out;
}
if (poll_fd.events)
{
+ int saved_errno;
+
if (flags & DBUS_ITERATION_BLOCK)
poll_timeout = timeout_milliseconds;
else
again:
poll_res = _dbus_poll (&poll_fd, 1, poll_timeout);
+ saved_errno = _dbus_save_socket_errno ();
- if (poll_res < 0 && _dbus_get_is_errno_eintr ())
+ if (poll_res < 0 && _dbus_get_is_errno_eintr (saved_errno))
goto again;
if (flags & DBUS_ITERATION_BLOCK)
else
{
_dbus_verbose ("Error from _dbus_poll(): %s\n",
- _dbus_strerror_from_errno ());
+ _dbus_strerror (saved_errno));
}
}