diff options
-rw-r--r-- | Makefile | 19 | ||||
-rw-r--r-- | compat.c (renamed from compat.h) | 76 | ||||
-rwxr-xr-x | configure | 50 | ||||
-rw-r--r-- | imap.c | 10 | ||||
-rw-r--r-- | notemap.c | 27 |
5 files changed, 111 insertions, 71 deletions
diff --git a/Makefile b/Makefile index caaa9ac..5fac27e 100644 --- a/Makefile +++ b/Makefile @@ -1,11 +1,8 @@ -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 = -lcrypto -ltls +LDLIBS = -ltls -include config.mk @@ -15,15 +12,15 @@ OBJS += notemap.o notemap: ${OBJS} ${CC} ${LDFLAGS} ${OBJS} ${LDLIBS} -o $@ -${OBJS}: compat.h imap.h +${OBJS}: imap.h clean: rm -f notemap ${OBJS} install: notemap notemap.1 - install -d ${PREFIX}/bin ${MANDIR}/man1 - install notemap ${PREFIX}/bin - gzip -c notemap.1 > ${MANDIR}/man1/notemap.1.gz + install -d ${DESTDIR}${PREFIX}/bin ${DESTDIR}${MANDIR}/man1 + install notemap ${DESTDIR}${PREFIX}/bin + install -m 644 notemap.1 ${DESTDIR}${MANDIR}/man1 uninstall: - rm -f ${PREFIX}/bin/notemap ${MANDIR}/man1/notemap.1.gz + rm -f ${DESTDIR}${PREFIX}/bin/notemap ${DESTDIR}${MANDIR}/man1/notemap.1 diff --git a/compat.h b/compat.c index 5b865a9..347536d 100644 --- a/compat.h +++ b/compat.c @@ -25,23 +25,13 @@ * covered work. */ -#ifdef __linux__ - -#define _GNU_SOURCE - #include <assert.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> -// Defined in libcrypto: -void arc4random_buf(void *buf, size_t nbytes); - -#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"); @@ -49,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 b4aa6be..54c02bf 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/notemap.c b/notemap.c index 9d65a9a..8cdde70 100644 --- a/notemap.c +++ b/notemap.c @@ -25,8 +25,6 @@ * covered work. */ -#include "compat.h" - #include <err.h> #include <inttypes.h> #include <stdbool.h> @@ -40,18 +38,21 @@ #include <time.h> #include <unistd.h> -#ifndef NO_READPASSPHRASE_H +#ifdef __APPLE__ +#include <sys/random.h> +#endif + +#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 typedef unsigned char byte; @@ -73,10 +74,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 } @@ -124,7 +125,9 @@ static void lookup(const char **host, const char **port, const char *domain) { static const char *uuidGen(void) { byte uuid[16]; - arc4random_buf(uuid, sizeof(uuid)); + int error = getentropy(uuid, sizeof(uuid)); + if (error) err(EX_OSERR, "getentropy"); + uuid[6] &= 0x0F; uuid[6] |= 0x40; uuid[8] &= 0x3F; |