about summary refs log tree commit diff
diff options
context:
space:
mode:
authorJune McEnroe <june@causal.agency>2021-03-08 17:46:01 -0500
committerJune McEnroe <june@causal.agency>2021-03-08 17:46:01 -0500
commit33bb9f5f9dbdc5795cd639c5e6dae2e1ce9b00d3 (patch)
tree64b1a7455d0224a705867cad70168403b1f8a0d3
parentReference "Mailing List" post in README (diff)
downloadbubger-33bb9f5f9dbdc5795cd639c5e6dae2e1ce9b00d3.tar.gz
bubger-33bb9f5f9dbdc5795cd639c5e6dae2e1ce9b00d3.zip
Port to Linux
-rw-r--r--README.78
-rw-r--r--compat.c79
-rwxr-xr-xconfigure6
3 files changed, 89 insertions, 4 deletions
diff --git a/README.7 b/README.7
index cbf33ef..6f260f5 100644
--- a/README.7
+++ b/README.7
@@ -1,4 +1,4 @@
-.Dd March  4, 2021
+.Dd March  8, 2021
 .Dt README 7
 .Os "Causal Agency"
 .
@@ -30,9 +30,9 @@ provided by either
 (for OpenSSL)
 or by LibreSSL.
 It targets
-.Fx
-and
-.Ox .
+.Fx ,
+.Ox ,
+macOS and Linux.
 On
 .Ox ,
 it additionally requires
diff --git a/compat.c b/compat.c
new file mode 100644
index 0000000..be72f4a
--- /dev/null
+++ b/compat.c
@@ -0,0 +1,79 @@
+/* Copyright (C) 2019  C. McEnroe <june@causal.agency>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ *
+ * Additional permission under GNU GPL version 3 section 7:
+ *
+ * If you modify this Program, or any covered work, by linking or
+ * combining it with OpenSSL (or a modified version of that library),
+ * containing parts covered by the terms of the OpenSSL License and the
+ * original SSLeay license, the licensors of this Program grant you
+ * additional permission to convey the resulting work. Corresponding
+ * Source for a non-source form of such a combination shall include the
+ * source code for the parts of OpenSSL used as well as that of the
+ * covered work.
+ */
+
+#include <assert.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+typedef int Read(void *, char *, int);
+typedef int Write(void *, const char *, int);
+typedef fpos_t Seek(void *, fpos_t, int);
+typedef int Close(void *);
+
+struct Funopen {
+	void *cookie;
+	Read *readfn;
+	Write *writefn;
+	Close *closefn;
+};
+
+static ssize_t cookieRead(void *cookie, char *buf, size_t size) {
+	struct Funopen *funopen = cookie;
+	return funopen->readfn(funopen->cookie, buf, size);
+}
+
+static ssize_t cookieWrite(void *cookie, const char *buf, size_t size) {
+	struct Funopen *funopen = cookie;
+	return funopen->writefn(funopen->cookie, buf, size);
+}
+
+static int cookieClose(void *cookie) {
+	struct Funopen *funopen = cookie;
+	int ret = 0;
+	if (funopen->closefn) ret = funopen->closefn(funopen->cookie);
+	free(cookie);
+	return ret;
+}
+
+FILE *funopen(
+	const void *cookie,
+	Read *readfn, Write *writefn, Seek *seekfn, Close *closefn
+) {
+	struct Funopen *funopen = malloc(sizeof(*funopen));
+	if (!funopen) return NULL;
+	funopen->cookie = (void *)cookie;
+	funopen->readfn = readfn;
+	funopen->writefn = writefn;
+	assert(!seekfn);
+	funopen->closefn = closefn;
+	cookie_io_functions_t fns = {
+		.read = (readfn ? cookieRead : NULL),
+		.write = (writefn ? cookieWrite : NULL),
+		.close = cookieClose,
+	};
+	return fopencookie(funopen, (!readfn ? "w" : !writefn ? "r" : "r+"), fns);
+}
diff --git a/configure b/configure
index 00f19e6..38bc6d5 100755
--- a/configure
+++ b/configure
@@ -39,6 +39,12 @@ case "$(uname)" in
 		config libtls
 		ldlibs -liconv -lresolv
 		;;
+	(Linux)
+		cflags -D_GNU_SOURCE
+		ldlibs -lresolv
+		config libtls
+		echo 'OBJS += compat.o'
+		;;
 	(*)
 		config libtls
 		;;