Fix compiling on Linux

This commit is contained in:
styan 2020-05-05 00:11:59 +00:00
parent fd0cc6daf8
commit 7f7cb29305
3 changed files with 46 additions and 9 deletions

View File

@ -1,4 +1,9 @@
.POSIX:
MAGIC= case "`uname | tr A-Z a-z`" in\
*linux*)export CFLAGS="$$CFLAGS -D_XOPEN_SOURCE";\
export CFLAGS="$$CFLAGS -D_DEFAULT_SOURCE";\
;;\
esac
MAGICTLS=\
if command -v pkg-config >/dev/null 2>&1 &&\
pkg-config --exists libtls; then\
@ -10,6 +15,7 @@ MAGICTLS=\
MAGICBSD=\
if command -v pkg-config >/dev/null 2>&1 &&\
pkg-config --exists libbsd; then\
export CFLAGS="$$CFLAGS -DLIBBSD";\
export CFLAGS="$$CFLAGS `pkg-config --cflags libbsd`";\
export LDFLAGS="$$LDFLAGS `pkg-config --libs libbsd`";\
fi
@ -17,16 +23,18 @@ default: magic-libgeminiclient.a
all: magic
magic: magic-libgeminiclient.a magic-gemini-cat
magic-libgeminiclient.a:
@${MAGICTLS}; ${MAKE} ${MAKEFLAGS} libgeminiclient.a
@${MAGIC}; ${MAGICTLS}; ${MAKE} ${MAKEFLAGS} libgeminiclient.a
magic-gemini-cat:
@${MAGICTLS}; ${MAGICBSD}; ${MAKE} ${MAKEFLAGS} gemini-cat
@${MAGIC}; ${MAGICTLS}; ${MAGICBSD};\
${MAKE} ${MAKEFLAGS} gemini-cat
libgeminiclient.a: libgeminiclient.o
${AR} ${ARFLAGS} $@ libgeminiclient.o
libgeminiclient.o: libgeminiclient.c libgeminiclient.h
${CC} -c ${CFLAGS} -o $@ libgeminiclient.c
gemini-cat: gemini-cat.c libgeminiclient.a
${CC} -I. ${CFLAGS} ${LDFLAGS} -o $@ gemini-cat.c \
libgeminiclient.a
gemini-cat: gemini-cat.o libgeminiclient.a
${CC} -o $@ gemini-cat.o libgeminiclient.a ${LDFLAGS}
gemini-cat.o: gemini-cat.c libgeminiclient.h
${CC} -c -I. ${CFLAGS} -o $@ gemini-cat.c
install: libgeminiclient.a
install -m444 libgeminiclient.a \
"$$DESTDIR/$${PREFIX:-/usr/local}/lib/"

View File

@ -8,9 +8,14 @@
#include <unistd.h>
#include <err.h>
#include <readpassphrase.h>
#include <sysexits.h>
#ifdef LIBBSD
#include <bsd/readpassphrase.h>
#else
#include <readpassphrase.h>
#endif
#include <tls.h>
#include <libgeminiclient.h>

View File

@ -10,6 +10,7 @@
#include <err.h>
#include <fcntl.h>
#include <strings.h>
#include <unistd.h>
#include <tls.h>
@ -51,6 +52,7 @@ static int write_tofu(struct gemini_tofu *, int);
static void free_tofu(struct gemini_tofu *);
static size_t escapequery(char *, size_t, const char *, size_t);
static size_t get_hostname(char *, size_t, const char *, size_t, int);
static int setflock(int, int);
void
gemini_init(struct gemini *g)
@ -210,14 +212,22 @@ gemini_connect(struct gemini *g, const char *url)
goto err;
if (g->tofufile != NULL) {
if (g->tofufd < 0 && (g->tofufd = open(g->tofufile,
((g->flags & GEMINI_TOFU_WRITE) ?
(O_RDWR | O_CREAT) : O_RDONLY) |
O_EXLOCK, 0600)) < 0 && errno != ENOENT) {
(g->flags & GEMINI_TOFU_WRITE) ?
(O_RDWR | O_CREAT) : O_RDONLY, 0600)) < 0 &&
errno != ENOENT) {
warn("Could not open: %s", g->tofufile);
goto err;
}
if (g->tofufd >= 0 && (g->flags & GEMINI_TOFU_WRITE) &&
setflock(g->tofufd, F_WRLCK) == -1) {
(void)close(g->tofufd);
g->tofufd = -1;
warn("Could not lock the TOFU file");
goto err;
}
if (g->tofu == NULL && g->tofufd >= 0 &&
load_tofu(&g->tofu, g->tofufd) < 0) {
(void)setflock(g->tofufd, F_UNLCK);
(void)close(g->tofufd);
g->tofufd = -1;
warn("Could not load: %s", g->tofufile);
@ -432,6 +442,7 @@ gemini_fini(struct gemini *g)
g->tofu = NULL;
}
if (g->tofufd >= 0) {
(void)setflock(g->tofufd, F_UNLCK);
(void)close(g->tofufd);
g->tofufd = -1;
}
@ -771,3 +782,16 @@ get_hostname(char *dst, size_t dl, const char *src, size_t sl, int f)
}
return (he - hs);
}
int
setflock(int fd, int lock)
{
struct flock l;
(void)memset(&l, 0, sizeof(l));
l.l_type = lock;
l.l_whence = SEEK_SET;
l.l_start = 0;
l.l_len = 0;
return (fcntl(fd, F_SETLK, &l));
}