summary refs log tree commit diff
path: root/compat.c
diff options
context:
space:
mode:
authorJune McEnroe <june@causal.agency>2020-10-29 11:34:56 -0400
committerJune McEnroe <june@causal.agency>2020-10-29 11:35:34 -0400
commitf17f882b5e748c71d9365d8769711d8ff8af015f (patch)
tree9eadef4e8d2cf8eb2bc010b0edd2a506e4f12286 /compat.c
parentRefactor IMAP struct (diff)
downloadimbox-f17f882b5e748c71d9365d8769711d8ff8af015f.tar.gz
imbox-f17f882b5e748c71d9365d8769711d8ff8af015f.zip
Rewrite compat and add configure script
Diffstat (limited to '')
-rw-r--r--compat.c (renamed from compat.h)73
1 files changed, 30 insertions, 43 deletions
diff --git a/compat.h b/compat.c
index a40b732..347536d 100644
--- a/compat.h
+++ b/compat.c
@@ -25,20 +25,13 @@
  * covered work.
  */
 
-#ifdef __linux__
-
-#define _GNU_SOURCE
-
 #include <assert.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
 #include <unistd.h>
 
-#define NO_READPASSPHRASE_H
-#define RPP_STDIN 1
-static inline char *
-readpassphrase(const char *prompt, char *buf, size_t bufsiz, int flags) {
+char *readpassphrase(const char *prompt, char *buf, size_t bufsiz, int flags) {
 	if (flags) {
 		if (!fgets(buf, bufsiz, stdin)) return NULL;
 		return strsep(&buf, "\n");
@@ -46,57 +39,51 @@ readpassphrase(const char *prompt, char *buf, size_t bufsiz, int flags) {
 	return getpass(prompt);
 }
 
-typedef int _readfn(void *, char *, int);
-typedef int _writefn(void *, const char *, int);
-typedef fpos_t _seekfn(void *, fpos_t, int);
-typedef int _closefn(void *);
+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 {
+struct Funopen {
 	void *cookie;
-	_readfn *readfn;
-	_writefn *writefn;
-	_closefn *closefn;
+	Read *readfn;
+	Write *writefn;
+	Close *closefn;
 };
 
-static inline ssize_t
-_cookie_read(void *cookie, char *buf, size_t size) {
-	struct _funopen *funopen = cookie;
-	assert((size_t)(int)size == size);
+static ssize_t cookieRead(void *cookie, char *buf, size_t size) {
+	struct Funopen *funopen = cookie;
 	return funopen->readfn(funopen->cookie, buf, size);
 }
 
-static inline ssize_t
-_cookie_write(void *cookie, const char *buf, size_t size) {
-	struct _funopen *funopen = cookie;
-	assert((size_t)(int)size == 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 inline int
-_cookie_close(void *cookie) {
-	struct _funopen *funopen = cookie;
-	int ret = (funopen->closefn ? funopen->closefn(funopen->cookie) : 0);
+static int cookieClose(void *cookie) {
+	struct Funopen *funopen = cookie;
+	int ret = 0;
+	if (funopen->closefn) ret = funopen->closefn(funopen->cookie);
 	free(cookie);
 	return ret;
 }
 
-static const cookie_io_functions_t _cookie_fns = {
-	.read = _cookie_read,
-	.write = _cookie_write,
-	.close = _cookie_close,
-};
-
-static inline FILE *
-funopen(
+FILE *funopen(
 	const void *cookie,
-	_readfn *readfn, _writefn *writefn, _seekfn *seekfn, _closefn *closefn
+	Read *readfn, Write *writefn, Seek *seekfn, Close *closefn
 ) {
-	struct _funopen *funopen = malloc(sizeof(*funopen));
+	struct Funopen *funopen = malloc(sizeof(*funopen));
 	if (!funopen) return NULL;
+	funopen->cookie = (void *)cookie;
+	funopen->readfn = readfn;
+	funopen->writefn = writefn;
 	assert(!seekfn);
-	*funopen = (struct _funopen) { (void *)cookie, readfn, writefn, closefn };
-	const char *mode = (!readfn ? "w" : !writefn ? "r" : "r+");
-	return fopencookie(funopen, mode, _cookie_fns);
+	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);
 }
-
-#endif /* __linux__ */