return -1;
else
{
+ again:
ret = close (*fd);
+ if (ret == -1 && errno == EINTR)
+ goto again;
*fd = -1;
}
NULL, NULL,
NULL /* no timeout */);
- if (ret < 0 && errno != EINTR)
+ if (ret < 0)
{
int errsv = errno;
+ if (errno == EINTR)
+ continue;
+
failed = TRUE;
g_set_error (error,
return ret;
}
+static gint
+sane_open (const char *path, gint mode)
+{
+ gint ret;
+
+ retry:
+ ret = open (path, mode);
+ if (ret < 0 && errno == EINTR)
+ goto retry;
+
+ return ret;
+}
+
enum
{
CHILD_CHDIR_FAILED,
}
else if (stdout_to_null)
{
- gint write_null = open ("/dev/null", O_WRONLY);
+ gint write_null = sane_open ("/dev/null", O_WRONLY);
sane_dup2 (write_null, 1);
close_and_invalidate (&write_null);
}
}
else if (stderr_to_null)
{
- gint write_null = open ("/dev/null", O_WRONLY);
+ gint write_null = sane_open ("/dev/null", O_WRONLY);
sane_dup2 (write_null, 2);
close_and_invalidate (&write_null);
}