summaryrefslogtreecommitdiffstats
path: root/src/util
diff options
context:
space:
mode:
Diffstat (limited to 'src/util')
-rw-r--r--src/util/child_common.c29
-rw-r--r--src/util/child_common.h7
2 files changed, 36 insertions, 0 deletions
diff --git a/src/util/child_common.c b/src/util/child_common.c
index 81bbab70e..e4a885b6e 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 95865bb52..261da7f9c 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__ */