summaryrefslogtreecommitdiffstats
path: root/sbin
diff options
context:
space:
mode:
authorpjd <pjd@FreeBSD.org>2011-01-28 21:48:15 +0000
committerpjd <pjd@FreeBSD.org>2011-01-28 21:48:15 +0000
commitbc13ed0bfab98e8ff4f210dc7c7f9d5667670fe4 (patch)
treed03e790c17b693fd514eaa42889239fb762d2877 /sbin
parent8de8b315a5a4d3c75f2a792f1850be1e311fe444 (diff)
downloadFreeBSD-src-bc13ed0bfab98e8ff4f210dc7c7f9d5667670fe4.zip
FreeBSD-src-bc13ed0bfab98e8ff4f210dc7c7f9d5667670fe4.tar.gz
Add function to close all unneeded descriptors after fork(2).
MFC after: 1 week
Diffstat (limited to 'sbin')
-rw-r--r--sbin/hastd/hastd.c28
-rw-r--r--sbin/hastd/hastd.h2
2 files changed, 29 insertions, 1 deletions
diff --git a/sbin/hastd/hastd.c b/sbin/hastd/hastd.c
index c2064e7..ad91131 100644
--- a/sbin/hastd/hastd.c
+++ b/sbin/hastd/hastd.c
@@ -1,6 +1,6 @@
/*-
* Copyright (c) 2009-2010 The FreeBSD Foundation
- * Copyright (c) 2010 Pawel Jakub Dawidek <pjd@FreeBSD.org>
+ * Copyright (c) 2010-2011 Pawel Jakub Dawidek <pjd@FreeBSD.org>
* All rights reserved.
*
* This software was developed by Pawel Jakub Dawidek under sponsorship from
@@ -93,6 +93,32 @@ g_gate_load(void)
}
}
+void
+descriptors_cleanup(struct hast_resource *res)
+{
+ struct hast_resource *tres;
+
+ TAILQ_FOREACH(tres, &cfg->hc_resources, hr_next) {
+ if (tres == res) {
+ PJDLOG_VERIFY(res->hr_role == HAST_ROLE_SECONDARY ||
+ (res->hr_remotein == NULL &&
+ res->hr_remoteout == NULL));
+ continue;
+ }
+ if (tres->hr_remotein != NULL)
+ proto_close(tres->hr_remotein);
+ if (tres->hr_remoteout != NULL)
+ proto_close(tres->hr_remoteout);
+ }
+ if (cfg->hc_controlin != NULL)
+ proto_close(cfg->hc_controlin);
+ proto_close(cfg->hc_controlconn);
+ proto_close(cfg->hc_listenconn);
+ (void)pidfile_close(pfh);
+ hook_fini();
+ pjdlog_fini();
+}
+
static void
child_exit_log(unsigned int pid, int status)
{
diff --git a/sbin/hastd/hastd.h b/sbin/hastd/hastd.h
index 1157f92..b0a4037 100644
--- a/sbin/hastd/hastd.h
+++ b/sbin/hastd/hastd.h
@@ -43,6 +43,8 @@ extern const char *cfgpath;
extern bool sigexit_received;
extern struct pidfh *pfh;
+void descriptors_cleanup(struct hast_resource *res);
+
void hastd_primary(struct hast_resource *res);
void hastd_secondary(struct hast_resource *res, struct nv *nvin);
OpenPOWER on IntegriCloud