about summary refs log tree commit diff
diff options
context:
space:
mode:
authorC. McEnroe <june@causal.agency>2020-10-29 11:34:56 -0400
committerC. McEnroe <june@causal.agency>2020-10-29 11:35:34 -0400
commitf17f882b5e748c71d9365d8769711d8ff8af015f (patch)
tree9eadef4e8d2cf8eb2bc010b0edd2a506e4f12286
parentRefactor IMAP struct (diff)
downloadimbox-f17f882b5e748c71d9365d8769711d8ff8af015f.tar.gz
imbox-f17f882b5e748c71d9365d8769711d8ff8af015f.zip
Rewrite compat and add configure script
-rw-r--r--Makefile17
-rw-r--r--compat.c (renamed from compat.h)73
-rwxr-xr-xconfigure50
-rw-r--r--imap.c10
-rw-r--r--imbox.c19
5 files changed, 103 insertions, 66 deletions
diff --git a/Makefile b/Makefile
index a22cd7c..925b713 100644
--- a/Makefile
+++ b/Makefile
@@ -1,10 +1,7 @@
-PREFIX = /usr/local
-MANDIR = ${PREFIX}/share/man
-LIBRESSL_PREFIX = /usr/local
+PREFIX ?= /usr/local
+MANDIR ?= ${PREFIX}/share/man
 
 CFLAGS += -std=c11 -Wall -Wextra -Wpedantic
-CFLAGS += ${LIBRESSL_PREFIX:%=-I%/include}
-LDFLAGS += ${LIBRESSL_PREFIX:%=-L%/lib}
 LDLIBS = -ltls
 
 BINS = imbox git-fetch-email
@@ -20,15 +17,15 @@ all: ${BINS}
 imbox: ${OBJS}
 	${CC} ${LDFLAGS} ${OBJS} ${LDLIBS} -o $@
 
-${OBJS}: compat.h imap.h
+${OBJS}: imap.h
 
 clean:
 	rm -f ${BINS} ${OBJS}
 
 install: ${BINS} ${MANS}
-	install -d ${PREFIX}/bin ${MANDIR}/man1
-	install ${BINS} ${PREFIX}/bin
-	for man in ${MANS}; do gzip -c $$man > ${MANDIR}/man1/$$man.gz; done
+	install -d ${DESTDIR}${PREFIX}/bin ${DESTDIR}${MANDIR}/man1
+	install ${BINS} ${DESTDIR}${PREFIX}/bin
+	install -m 644 ${MANS} ${DESTDIR}${MANDIR}/man1
 
 uninstall:
-	rm -f ${BINS:%=${PREFIX}/bin/%} ${MANS:%=${MANDIR}/man1/%.gz}
+	rm -f ${BINS:%=${PREFIX}/bin/%} ${MANS:%=${MANDIR}/man1/%}
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__ */
diff --git a/configure b/configure
new file mode 100755
index 0000000..ccea81d
--- /dev/null
+++ b/configure
@@ -0,0 +1,50 @@
+#!/bin/sh
+set -eu
+
+cflags() {
+	echo "CFLAGS += $*"
+}
+ldlibs() {
+	echo "LDLIBS ${o:-}= $*"
+	o=+
+}
+config() {
+	pkg-config --print-errors "$@"
+	cflags $(pkg-config --cflags "$@")
+	ldlibs $(pkg-config --libs "$@")
+}
+defstr() {
+	cflags "-D'$1=\"$2\"'"
+}
+defvar() {
+	defstr "$1" "$(pkg-config --variable=$3 $2)${4:-}"
+}
+
+exec >config.mk
+
+for opt; do
+	case "${opt}" in
+		(--prefix=*) echo "PREFIX = ${opt#*=}" ;;
+		(--mandir=*) echo "MANDIR = ${opt#*=}" ;;
+		(*) echo "warning: unsupported option ${opt}" >&2 ;;
+	esac
+done
+
+case "$(uname)" in
+	(FreeBSD)
+		config libtls
+		defstr DRILL_PATH /usr/bin/drill
+		;;
+	(OpenBSD)
+		ldlibs -ltls
+		defstr DIG_PATH /usr/bin/dig
+		;;
+	(Linux)
+		cflags -D_GNU_SOURCE -DDECLARE_RPP
+		config libtls
+		echo 'OBJS += compat.o'
+		;;
+	(*)
+		config libtls
+		;;
+esac
diff --git a/imap.c b/imap.c
index 77381f7..8437a2c 100644
--- a/imap.c
+++ b/imap.c
@@ -25,8 +25,6 @@
  * covered work.
  */
 
-#include "compat.h"
-
 #include <err.h>
 #include <stdbool.h>
 #include <stdio.h>
@@ -35,6 +33,14 @@
 #include <sysexits.h>
 #include <tls.h>
 
+FILE *funopen(
+	const void *cookie,
+	int (*readfn)(void *, char *, int),
+	int (*writefn)(void *, const char *, int),
+	fpos_t (*seekfn)(void *, fpos_t, int),
+	int (*closefn)(void *)
+);
+
 #include "imap.h"
 
 const char *Atoms[AtomCap] = {
diff --git a/imbox.c b/imbox.c
index e58663e..7e2233d 100644
--- a/imbox.c
+++ b/imbox.c
@@ -25,8 +25,6 @@
  * covered work.
  */
 
-#include "compat.h"
-
 #include <err.h>
 #include <inttypes.h>
 #include <stdio.h>
@@ -36,18 +34,17 @@
 #include <sysexits.h>
 #include <unistd.h>
 
-#ifndef NO_READPASSPHRASE_H
+#ifdef DECLARE_RPP
+#define RPP_STDIN 1
+char * readpassphrase(const char *prompt, char *buf, size_t bufsiz, int flags);
+#else
 #include <readpassphrase.h>
 #endif
 
 #include "imap.h"
 
-#if !defined(DIG_PATH) && !defined(DRILL_PATH)
-#	ifdef __FreeBSD__
-#		define DRILL_PATH "/usr/bin/drill"
-#	else
-#		define DIG_PATH "dig"
-#	endif
+#ifndef DIG_PATH
+#define DIG_PATH "dig"
 #endif
 
 #define FETCH_HEADERS \
@@ -91,10 +88,10 @@ static void lookup(const char **host, const char **port, const char *domain) {
 		dup2(rw[1], STDERR_FILENO);
 		close(rw[1]);
 #ifdef DRILL_PATH
-		execlp(DRILL_PATH, DRILL_PATH, buf, "SRV", NULL);
+		execlp(DRILL_PATH, "drill", buf, "SRV", NULL);
 		err(EX_CONFIG, "%s", DRILL_PATH);
 #else
-		execlp(DIG_PATH, DIG_PATH, "-t", "SRV", "-q", buf, "+short", NULL);
+		execlp(DIG_PATH, "dig", "-t", "SRV", "-q", buf, "+short", NULL);
 		err(EX_CONFIG, "%s", DIG_PATH);
 #endif
 	}