From 06f10b2a0ebb26f2460cd445f8040e9205de7500 Mon Sep 17 00:00:00 2001 From: Jakub Hrozek Date: Nov 05 2014 18:55:09 +0000 Subject: UTIL: Remove code duplication of struct io We had struct io and the associated destructor copied twice in the code already and need it again in the SELinux provider. Instead of adding another copy, move the code to a shared subtree under util/ Reviewed-by: Michal Židek --- diff --git a/src/providers/ad/ad_gpo.c b/src/providers/ad/ad_gpo.c index 4dfbd4b..80b0d45 100644 --- a/src/providers/ad/ad_gpo.c +++ b/src/providers/ad/ad_gpo.c @@ -3756,46 +3756,9 @@ struct ad_gpo_process_cse_state { pid_t child_pid; uint8_t *buf; ssize_t len; - struct io *io; + struct child_io_fds *io; }; -struct io { - int read_from_child_fd; - int write_to_child_fd; -}; - -static errno_t -gpo_child_io_destructor(void *ptr) -{ - int ret; - struct io *io; - - io = talloc_get_type(ptr, struct io); - if (io == NULL) return EOK; - - if (io->write_to_child_fd != -1) { - ret = close(io->write_to_child_fd); - io->write_to_child_fd = -1; - if (ret != EOK) { - ret = errno; - DEBUG(SSSDBG_CRIT_FAILURE, - "close failed [%d][%s].\n", ret, strerror(ret)); - } - } - - if (io->read_from_child_fd != -1) { - ret = close(io->read_from_child_fd); - io->read_from_child_fd = -1; - if (ret != EOK) { - ret = errno; - DEBUG(SSSDBG_CRIT_FAILURE, - "close failed [%d][%s].\n", ret, strerror(ret)); - } - } - - return EOK; -} - static errno_t gpo_fork_child(struct tevent_req *req); static void gpo_cse_step(struct tevent_req *subreq); static void gpo_cse_done(struct tevent_req *subreq); @@ -3849,7 +3812,7 @@ ad_gpo_process_cse_send(TALLOC_CTX *mem_ctx, state->gpo_guid = gpo_guid; state->smb_path = smb_path; state->smb_cse_suffix = smb_cse_suffix; - state->io = talloc(state, struct io); + state->io = talloc(state, struct child_io_fds); if (state->io == NULL) { DEBUG(SSSDBG_CRIT_FAILURE, "talloc failed.\n"); ret = ENOMEM; @@ -3858,7 +3821,7 @@ ad_gpo_process_cse_send(TALLOC_CTX *mem_ctx, state->io->write_to_child_fd = -1; state->io->read_from_child_fd = -1; - talloc_set_destructor((void *) state->io, gpo_child_io_destructor); + talloc_set_destructor((void *) state->io, child_io_destructor); /* prepare the data to pass to child */ ret = create_cse_send_buffer(state, smb_server, smb_share, smb_path, diff --git a/src/providers/krb5/krb5_child_handler.c b/src/providers/krb5/krb5_child_handler.c index 114e72a..4ba939d 100644 --- a/src/providers/krb5/krb5_child_handler.c +++ b/src/providers/krb5/krb5_child_handler.c @@ -41,11 +41,6 @@ #define TIME_T_MAX LONG_MAX #define int64_to_time_t(val) ((time_t)((val) < TIME_T_MAX ? val : TIME_T_MAX)) -struct io { - int read_from_child_fd; - int write_to_child_fd; -}; - struct handle_child_state { struct tevent_context *ev; struct krb5child_req *kr; @@ -55,38 +50,9 @@ struct handle_child_state { struct tevent_timer *timeout_handler; pid_t child_pid; - struct io *io; + struct child_io_fds *io; }; -static int child_io_destructor(void *ptr) -{ - int ret; - struct io *io = talloc_get_type(ptr, struct io); - if (io == NULL) return EOK; - - if (io->write_to_child_fd != -1) { - ret = close(io->write_to_child_fd); - io->write_to_child_fd = -1; - if (ret != EOK) { - ret = errno; - DEBUG(SSSDBG_CRIT_FAILURE, - "close failed [%d][%s].\n", ret, strerror(ret)); - } - } - - if (io->read_from_child_fd != -1) { - ret = close(io->read_from_child_fd); - io->read_from_child_fd = -1; - if (ret != EOK) { - ret = errno; - DEBUG(SSSDBG_CRIT_FAILURE, - "close failed [%d][%s].\n", ret, strerror(ret)); - } - } - - return EOK; -} - static errno_t pack_authtok(struct io_buffer *buf, size_t *rp, struct sss_auth_token *tok) { @@ -391,7 +357,7 @@ struct tevent_req *handle_child_send(TALLOC_CTX *mem_ctx, state->child_pid = -1; state->timeout_handler = NULL; - state->io = talloc(state, struct io); + state->io = talloc(state, struct child_io_fds); if (state->io == NULL) { DEBUG(SSSDBG_CRIT_FAILURE, "talloc failed.\n"); ret = ENOMEM; diff --git a/src/util/child_common.c b/src/util/child_common.c index 81bbab7..e4a885b 100644 --- a/src/util/child_common.c +++ b/src/util/child_common.c @@ -772,3 +772,32 @@ void child_cleanup(int readfd, int writefd) } } } + +int child_io_destructor(void *ptr) +{ + int ret; + struct child_io_fds *io = talloc_get_type(ptr, struct child_io_fds); + if (io == NULL) return EOK; + + if (io->write_to_child_fd != -1) { + ret = close(io->write_to_child_fd); + io->write_to_child_fd = -1; + if (ret != EOK) { + ret = errno; + DEBUG(SSSDBG_CRIT_FAILURE, + "close failed [%d][%s].\n", ret, strerror(ret)); + } + } + + if (io->read_from_child_fd != -1) { + ret = close(io->read_from_child_fd); + io->read_from_child_fd = -1; + if (ret != EOK) { + ret = errno; + DEBUG(SSSDBG_CRIT_FAILURE, + "close failed [%d][%s].\n", ret, strerror(ret)); + } + } + + return EOK; +} diff --git a/src/util/child_common.h b/src/util/child_common.h index 95865bb..261da7f 100644 --- a/src/util/child_common.h +++ b/src/util/child_common.h @@ -45,6 +45,11 @@ struct io_buffer { size_t size; }; +struct child_io_fds { + int read_from_child_fd; + int write_to_child_fd; +}; + /* COMMON SIGCHLD HANDLING */ typedef void (*sss_child_fn_t)(int pid, int wait_status, void *pvt); @@ -113,4 +118,6 @@ errno_t exec_child(TALLOC_CTX *mem_ctx, void child_cleanup(int readfd, int writefd); +int child_io_destructor(void *ptr); + #endif /* __CHILD_COMMON_H__ */