Remove errno save/restore where not necessary.

This commit is contained in:
Simon Ruderich
2013-06-10 05:24:43 +02:00
parent fe3f7d4c63
commit dfd317650f
5 changed files with 48 additions and 22 deletions

View File

@@ -75,11 +75,15 @@ static int check_handle_fd(int fd) {
/* Never touch anything not going to a terminal - unless we are explicitly
* asked to do so. */
if (!force_write_to_non_tty && !isatty(fd)) {
return 0;
if (force_write_to_non_tty) {
return 1;
}
return 1;
int saved_errno = errno;
int result = isatty(fd);
errno = saved_errno;
return result;
}
static void dup_fd(int oldfd, int newfd) {
@@ -141,29 +145,45 @@ inline static void init_pre_post_string(void) {
}
static void handle_fd_pre(int fd) {
int saved_errno = errno;
if (!pre_string || !post_string) {
init_pre_post_string();
}
DLSYM_FUNCTION(real_write, "write");
real_write(fd, pre_string, pre_string_size);
errno = saved_errno;
}
static void handle_fd_post(int fd) {
int saved_errno = errno;
/* write() already loaded above in handle_fd_pre(). */
real_write(fd, post_string, post_string_size);
errno = saved_errno;
}
static void handle_file_pre(FILE *stream) {
int saved_errno = errno;
if (!pre_string || !post_string) {
init_pre_post_string();
}
DLSYM_FUNCTION(real_fwrite, "fwrite");
real_fwrite(pre_string, pre_string_size, 1, stream);
errno = saved_errno;
}
static void handle_file_post(FILE *stream) {
int saved_errno = errno;
/* fwrite() already loaded above in handle_file_pre(). */
real_fwrite(post_string, post_string_size, 1, stream);
errno = saved_errno;
}
@@ -303,9 +323,7 @@ int dup(int oldfd) {
newfd = real_dup(oldfd);
if (newfd != -1) {
int saved_errno = errno;
dup_fd(oldfd, newfd);
errno = saved_errno;
}
return newfd;
@@ -315,9 +333,7 @@ int dup2(int oldfd, int newfd) {
newfd = real_dup2(oldfd, newfd);
if (newfd != -1) {
int saved_errno = errno;
dup_fd(oldfd, newfd);
errno = saved_errno;
}
return newfd;
@@ -327,9 +343,7 @@ int dup3(int oldfd, int newfd, int flags) {
newfd = real_dup3(oldfd, newfd, flags);
if (newfd != -1) {
int saved_errno = errno;
dup_fd(oldfd, newfd);
errno = saved_errno;
}
return newfd;
@@ -361,9 +375,7 @@ int fcntl(int fd, int cmd, ...) {
/* We only care about duping fds. */
if (cmd == F_DUPFD && result != -1) {
int saved_errno = errno;
dup_fd(fd, result);
errno = saved_errno;
}
return result;

View File

@@ -44,10 +44,13 @@ static void debug_write(int fd, int first_call, char const *format, va_list ap)
static void debug(char const *format, ...) {
va_list ap;
int saved_errno = errno;
/* If the file doesn't exist, do nothing. Prevents writing log files in
* unexpected places. The user must create the file manually. */
int fd = open(DEBUG_FILE, O_WRONLY | O_APPEND);
if (fd == -1) {
errno = saved_errno;
return;
}
@@ -57,13 +60,18 @@ static void debug(char const *format, ...) {
va_start(ap, format);
debug_write(fd, call_count == 1, format, ap);
va_end(ap);
errno = saved_errno;
}
static void warning(char const *format, ...) {
va_list ap;
int saved_errno = errno;
char const *home = getenv("HOME");
if (!home) {
errno = saved_errno;
return;
}
@@ -75,6 +83,7 @@ static void warning(char const *format, ...) {
/* Create the warning file if it doesn't exist yet. */
int fd = open(path, O_WRONLY | O_APPEND | O_CREAT, S_IRUSR | S_IWUSR);
if (fd == -1) {
errno = saved_errno;
return;
}
@@ -84,6 +93,8 @@ static void warning(char const *format, ...) {
va_start(ap, format);
debug_write(fd, call_count == 1, format, ap);
va_end(ap);
errno = saved_errno;
}
#endif

View File

@@ -26,7 +26,6 @@
#define _HOOK_PRE(type, name) \
int handle; \
int saved_errno = errno; \
DLSYM_FUNCTION(real_ ## name, #name);
#define _HOOK_PRE_FD(type, name, fd) \
type result; \
@@ -36,32 +35,24 @@
handle = check_handle_fd(fd); \
if (handle) { \
handle_fd_pre(fd); \
} \
errno = saved_errno;
}
#define _HOOK_PRE_FILE(type, name, file) \
type result; \
_HOOK_PRE(type, name) \
handle = check_handle_fd(fileno(file)); \
if (handle) { \
handle_file_pre(file); \
} \
errno = saved_errno;
/* Save and restore the errno to make sure we return the errno of the original
* function call. */
}
#define _HOOK_POST_FD_(fd) \
if (handle) { \
saved_errno = errno; \
handle_fd_post(fd); \
errno = saved_errno; \
}
#define _HOOK_POST_FD(fd) \
_HOOK_POST_FD_(fd) \
return result;
#define _HOOK_POST_FILE(file) \
if (handle) { \
saved_errno = errno; \
handle_file_post(file); \
errno = saved_errno; \
} \
return result;

View File

@@ -34,6 +34,7 @@
* Terminate program on failure. */
#define DLSYM_FUNCTION(pointer, name) \
if (NULL == (pointer)) { \
int saved_errnox = errno; \
char *error; \
dlerror(); /* Clear possibly existing error. */ \
\
@@ -44,6 +45,7 @@
* failed to load too. */ \
abort(); \
} \
errno = saved_errnox; \
}
#endif

View File

@@ -78,6 +78,8 @@ static void init_from_environment(void) {
#endif
char const *env;
int saved_errno = errno;
initialized = 1;
tracked_fds_list_count = 0;
@@ -90,6 +92,7 @@ static void init_from_environment(void) {
env = getenv(ENV_NAME_FDS);
if (!env) {
errno = saved_errno;
return;
}
/* Environment is read-only. */
@@ -153,6 +156,8 @@ next:
#ifdef DEBUG
tracked_fds_debug();
#endif
errno = saved_errno;
}
static char *update_environment_buffer_entry(char *x, int fd) {
@@ -231,6 +236,8 @@ static void tracked_fds_add(int fd) {
}
if (tracked_fds_list_count >= tracked_fds_list_space) {
int saved_errno = errno;
size_t new_space = tracked_fds_list_space + TRACKFDS_REALLOC_STEP;
int *tmp = realloc(tracked_fds_list,
sizeof(*tracked_fds_list) * new_space);
@@ -242,8 +249,11 @@ static void tracked_fds_add(int fd) {
warning("realloc(tracked_fds_list, %zu) failed! [%d]\n",
sizeof(*tracked_fds_list) * new_space, getpid());
#endif
errno = saved_errno;
return;
}
errno = saved_errno;
tracked_fds_list = tmp;
tracked_fds_list_space = new_space;
}