summaryrefslogtreecommitdiffstats
path: root/comm/third_party/libgpg-error/src/syscall-clamp.c
diff options
context:
space:
mode:
Diffstat (limited to 'comm/third_party/libgpg-error/src/syscall-clamp.c')
-rw-r--r--comm/third_party/libgpg-error/src/syscall-clamp.c80
1 files changed, 80 insertions, 0 deletions
diff --git a/comm/third_party/libgpg-error/src/syscall-clamp.c b/comm/third_party/libgpg-error/src/syscall-clamp.c
new file mode 100644
index 0000000000..99748f4e4c
--- /dev/null
+++ b/comm/third_party/libgpg-error/src/syscall-clamp.c
@@ -0,0 +1,80 @@
+/* syscall-clamp.c - Syscall clamp related stuff
+ * Copyright (C) 2016, 2017 g10 Code GmbH
+ *
+ * This file is part of Libgpg-error.
+ *
+ * Libgpg-error is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public License
+ * as published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * Libgpg-error is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this program; if not, see <https://www.gnu.org/licenses/>.
+ * SPDX-License-Identifier: LGPL-2.1+
+ */
+
+#include <config.h>
+
+#include "gpgrt-int.h"
+
+/*
+ * Functions called before and after blocking syscalls.
+ * gpgrt_set_syscall_clamp is used to set them.
+ */
+static void (*pre_syscall_func)(void);
+static void (*post_syscall_func)(void);
+
+
+/*
+ * Register the syscall clamp. These two functions are called
+ * immediately before and after a possible blocking system call. This
+ * should be used before any I/O happens. The function is commonly
+ * used with the nPth library:
+ *
+ * gpgrt_set_syscall_clamp (npth_unprotect, npth_protect);
+ *
+ * These functions may not modify ERRNO.
+ *
+ * Setting the clamp is not thread-safe and should thus be done as
+ * early as possible.
+ */
+void
+_gpgrt_set_syscall_clamp (void (*pre)(void), void (*post)(void))
+{
+ pre_syscall_func = pre;
+ post_syscall_func = post;
+}
+
+/*
+ * Return the current sycall clamp functions. This can be used by
+ * other libraries which have blocking functions.
+ */
+void
+_gpgrt_get_syscall_clamp (void (**r_pre)(void), void (**r_post)(void))
+{
+ *r_pre = pre_syscall_func;
+ *r_post = post_syscall_func;
+}
+
+
+/* Call this function before a blocking system or libc call. */
+void
+_gpgrt_pre_syscall (void)
+{
+ if (pre_syscall_func)
+ pre_syscall_func ();
+}
+
+
+/* Call this function after a blocking system or libc call. */
+void
+_gpgrt_post_syscall (void)
+{
+ if (post_syscall_func)
+ post_syscall_func ();
+}