mirror of https://github.com/omar-polo/gmid.git
add a configure script and some compat
tested on openbsd, alpine and void
This commit is contained in:
parent
338f06f4e5
commit
12042ad700
|
@ -7,3 +7,9 @@ iri_test
|
||||||
docs
|
docs
|
||||||
lex.yy.c
|
lex.yy.c
|
||||||
y.tab.*
|
y.tab.*
|
||||||
|
Makefile.local
|
||||||
|
config.h
|
||||||
|
config.h.old
|
||||||
|
config.log
|
||||||
|
config.log.old
|
||||||
|
configure.local
|
||||||
|
|
21
Makefile
21
Makefile
|
@ -1,17 +1,11 @@
|
||||||
CC = cc
|
|
||||||
CFLAGS = -Wall -Wextra -g
|
|
||||||
LDFLAGS = -ltls
|
|
||||||
LEX = lex
|
|
||||||
YACC = yacc
|
|
||||||
|
|
||||||
PREFIX = /usr/local
|
|
||||||
|
|
||||||
# /usr/local/lib on FreeBSD
|
|
||||||
LIBDIR = /usr/lib/
|
|
||||||
|
|
||||||
.PHONY: all static clean test install
|
.PHONY: all static clean test install
|
||||||
|
|
||||||
all: gmid TAGS
|
all: Makefile.local gmid TAGS
|
||||||
|
|
||||||
|
Makefile.local: configure
|
||||||
|
./configure
|
||||||
|
|
||||||
|
include Makefile.local
|
||||||
|
|
||||||
lex.yy.c: lex.l y.tab.c
|
lex.yy.c: lex.l y.tab.c
|
||||||
${LEX} lex.l
|
${LEX} lex.l
|
||||||
|
@ -20,7 +14,7 @@ y.tab.c: parse.y
|
||||||
${YACC} -b y -d parse.y
|
${YACC} -b y -d parse.y
|
||||||
|
|
||||||
SRCS = gmid.c iri.c utf8.c ex.c server.c sandbox.c mime.c
|
SRCS = gmid.c iri.c utf8.c ex.c server.c sandbox.c mime.c
|
||||||
OBJS = ${SRCS:.c=.o} lex.yy.o y.tab.o
|
OBJS = ${SRCS:.c=.o} lex.yy.o y.tab.o ${COMPAT}
|
||||||
|
|
||||||
gmid: ${OBJS}
|
gmid: ${OBJS}
|
||||||
${CC} ${OBJS} -o gmid ${LDFLAGS}
|
${CC} ${OBJS} -o gmid ${LDFLAGS}
|
||||||
|
@ -36,6 +30,7 @@ TAGS: ${SRCS}
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
rm -f *.o lex.yy.c y.tab.c y.tab.h y.output gmid iri_test
|
rm -f *.o lex.yy.c y.tab.c y.tab.h y.output gmid iri_test
|
||||||
|
rm -f Makefile.local
|
||||||
|
|
||||||
iri_test: iri_test.o iri.o utf8.o
|
iri_test: iri_test.o iri.o utf8.o
|
||||||
${CC} iri_test.o iri.o utf8.o -o iri_test ${LDFLAGS}
|
${CC} iri_test.o iri.o utf8.o -o iri_test ${LDFLAGS}
|
||||||
|
|
|
@ -0,0 +1,84 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2021 Omar Polo <op@omarpolo.com>
|
||||||
|
*
|
||||||
|
* Permission to use, copy, modify, and distribute this software for any
|
||||||
|
* purpose with or without fee is hereby granted, provided that the above
|
||||||
|
* copyright notice and this permission notice appear in all copies.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||||
|
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||||
|
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||||
|
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||||
|
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||||
|
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||||
|
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <errno.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdarg.h>
|
||||||
|
|
||||||
|
/* cheat: if we don't have getprogname in stdlib, will link against
|
||||||
|
* compat/getprogname.c anyway. */
|
||||||
|
const char *getprogname(void);
|
||||||
|
|
||||||
|
static void vwarn_impl(const char*, va_list);
|
||||||
|
static void vwarnx_impl(const char*, va_list);
|
||||||
|
|
||||||
|
static void
|
||||||
|
vwarn_impl(const char *fmt, va_list ap)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "%s: ", getprogname());
|
||||||
|
vfprintf(stderr, fmt, ap);
|
||||||
|
fprintf(stderr, ": %s\n", strerror(errno));
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
vwarnx_impl(const char *fmt, va_list ap)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "%s: ", getprogname());
|
||||||
|
vfprintf(stderr, fmt, ap);
|
||||||
|
fprintf(stderr, "\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
err(int ret, const char *fmt, ...)
|
||||||
|
{
|
||||||
|
va_list ap;
|
||||||
|
|
||||||
|
va_start(ap, fmt);
|
||||||
|
vwarn_impl(fmt, va);
|
||||||
|
va_end(ap, fmt);
|
||||||
|
exit(ret);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
errx(int ret, const char *fmt, ...)
|
||||||
|
{
|
||||||
|
va_list ap;
|
||||||
|
|
||||||
|
va_start(ap, fmt);
|
||||||
|
vwarnx_impl(fmt, va);
|
||||||
|
va_end(ap, fmt);
|
||||||
|
exit(ret);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
warn(const char *fmt, ...)
|
||||||
|
{
|
||||||
|
va_list ap;
|
||||||
|
|
||||||
|
va_start(ap, fmt);
|
||||||
|
vwarn_impl(fmt, va);
|
||||||
|
va_end(ap, fmt);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
warnx(const char *fmt, ...)
|
||||||
|
{
|
||||||
|
va_list ap;
|
||||||
|
|
||||||
|
va_start(ap, fmt);
|
||||||
|
vwarnx_impl(fmt, va);
|
||||||
|
va_end(ap, fmt);
|
||||||
|
}
|
|
@ -0,0 +1,21 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2021 Omar Polo <op@omarpolo.com>
|
||||||
|
*
|
||||||
|
* Permission to use, copy, modify, and distribute this software for any
|
||||||
|
* purpose with or without fee is hereby granted, provided that the above
|
||||||
|
* copyright notice and this permission notice appear in all copies.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||||
|
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||||
|
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||||
|
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||||
|
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||||
|
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||||
|
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
const char *
|
||||||
|
getprogname(void)
|
||||||
|
{
|
||||||
|
return "gmid";
|
||||||
|
}
|
|
@ -0,0 +1,54 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 1998, 2015 Todd C. Miller <millert@openbsd.org>
|
||||||
|
*
|
||||||
|
* Permission to use, copy, modify, and distribute this software for any
|
||||||
|
* purpose with or without fee is hereby granted, provided that the above
|
||||||
|
* copyright notice and this permission notice appear in all copies.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||||
|
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||||
|
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||||
|
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||||
|
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||||
|
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||||
|
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||||
|
*/
|
||||||
|
#include "config.h"
|
||||||
|
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Appends src to string dst of size dsize (unlike strncat, dsize is the
|
||||||
|
* full size of dst, not space left). At most dsize-1 characters
|
||||||
|
* will be copied. Always NUL terminates (unless dsize <= strlen(dst)).
|
||||||
|
* Returns strlen(src) + MIN(dsize, strlen(initial dst)).
|
||||||
|
* If retval >= dsize, truncation occurred.
|
||||||
|
*/
|
||||||
|
size_t
|
||||||
|
strlcat(char *dst, const char *src, size_t dsize)
|
||||||
|
{
|
||||||
|
const char *odst = dst;
|
||||||
|
const char *osrc = src;
|
||||||
|
size_t n = dsize;
|
||||||
|
size_t dlen;
|
||||||
|
|
||||||
|
/* Find the end of dst and adjust bytes left but don't go past end. */
|
||||||
|
while (n-- != 0 && *dst != '\0')
|
||||||
|
dst++;
|
||||||
|
dlen = dst - odst;
|
||||||
|
n = dsize - dlen;
|
||||||
|
|
||||||
|
if (n-- == 0)
|
||||||
|
return(dlen + strlen(src));
|
||||||
|
while (*src != '\0') {
|
||||||
|
if (n != 0) {
|
||||||
|
*dst++ = *src;
|
||||||
|
n--;
|
||||||
|
}
|
||||||
|
src++;
|
||||||
|
}
|
||||||
|
*dst = '\0';
|
||||||
|
|
||||||
|
return(dlen + (src - osrc)); /* count does not include NUL */
|
||||||
|
}
|
|
@ -0,0 +1,49 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 1998, 2015 Todd C. Miller <millert@openbsd.org>
|
||||||
|
*
|
||||||
|
* Permission to use, copy, modify, and distribute this software for any
|
||||||
|
* purpose with or without fee is hereby granted, provided that the above
|
||||||
|
* copyright notice and this permission notice appear in all copies.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||||
|
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||||
|
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||||
|
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||||
|
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||||
|
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||||
|
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||||
|
*/
|
||||||
|
#include "config.h"
|
||||||
|
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copy string src to buffer dst of size dsize. At most dsize-1
|
||||||
|
* chars will be copied. Always NUL terminates (unless dsize == 0).
|
||||||
|
* Returns strlen(src); if retval >= dsize, truncation occurred.
|
||||||
|
*/
|
||||||
|
size_t
|
||||||
|
strlcpy(char *dst, const char *src, size_t dsize)
|
||||||
|
{
|
||||||
|
const char *osrc = src;
|
||||||
|
size_t nleft = dsize;
|
||||||
|
|
||||||
|
/* Copy as many bytes as will fit. */
|
||||||
|
if (nleft != 0) {
|
||||||
|
while (--nleft != 0) {
|
||||||
|
if ((*dst++ = *src++) == '\0')
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Not enough room in dst, add NUL and traverse rest of src. */
|
||||||
|
if (nleft == 0) {
|
||||||
|
if (dsize != 0)
|
||||||
|
*dst = '\0'; /* NUL-terminate dst */
|
||||||
|
while (*src++)
|
||||||
|
;
|
||||||
|
}
|
||||||
|
|
||||||
|
return(src - osrc - 1); /* count does not include NUL */
|
||||||
|
}
|
|
@ -0,0 +1,46 @@
|
||||||
|
/* from mandoc, with tweaks */
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2015 Ingo Schwarze <schwarze@openbsd.org>
|
||||||
|
*
|
||||||
|
* Permission to use, copy, modify, and distribute this software for any
|
||||||
|
* purpose with or without fee is hereby granted, provided that the above
|
||||||
|
* copyright notice and this permission notice appear in all copies.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||||
|
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||||
|
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||||
|
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||||
|
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||||
|
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||||
|
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||||
|
*
|
||||||
|
* This fallback implementation is not efficient:
|
||||||
|
* It does the formatting twice.
|
||||||
|
* Short of fiddling with the unknown internals of the system's
|
||||||
|
* printf(3) or completely reimplementing printf(3), i can't think
|
||||||
|
* of another portable solution.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdarg.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
int
|
||||||
|
vasprintf(char **ret, const char *format, va_list ap)
|
||||||
|
{
|
||||||
|
char buf[2];
|
||||||
|
va_list ap2;
|
||||||
|
int sz;
|
||||||
|
|
||||||
|
va_copy(ap2, ap);
|
||||||
|
sz = vsnprintf(buf, sizeof(buf), format, ap2);
|
||||||
|
va_end(ap2);
|
||||||
|
|
||||||
|
if (sz != -1 && (*ret = malloc(sz + 1)) != NULL) {
|
||||||
|
if (vsnprintf(*ret, sz + 1, format, ap) == sz)
|
||||||
|
return sz;
|
||||||
|
free(*ret);
|
||||||
|
}
|
||||||
|
*ret = NULL;
|
||||||
|
return -1;
|
||||||
|
}
|
|
@ -0,0 +1,328 @@
|
||||||
|
#!/bin/sh
|
||||||
|
#
|
||||||
|
# Copyright (c) 2021 Omar Polo <op@omarpolo.com>
|
||||||
|
#
|
||||||
|
# Permission to use, copy, modify, and distribute this software for any
|
||||||
|
# purpose with or without fee is hereby granted, provided that the above
|
||||||
|
# copyright notice and this permission notice appear in all copies.
|
||||||
|
#
|
||||||
|
# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||||
|
# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||||
|
# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||||
|
# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||||
|
# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||||
|
# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||||
|
# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||||
|
|
||||||
|
# adapted from mandoc configure and oconfigure, thanks schwarze@ and
|
||||||
|
# kristaps@!
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
[ -w config.log ] && mv config.log config.log.old
|
||||||
|
[ -w config.h ] && mv config.h config.h.old
|
||||||
|
|
||||||
|
# Output file descriptor usage:
|
||||||
|
# 1 (stdout): config.h, Makefile.local
|
||||||
|
# 2 (stderr): original stderr, usually to the console
|
||||||
|
# 3: config.log
|
||||||
|
|
||||||
|
exec 3> config.log
|
||||||
|
echo "file config.log: writing..."
|
||||||
|
|
||||||
|
# --------
|
||||||
|
# default settings: initialize all vars here
|
||||||
|
|
||||||
|
CC=cc
|
||||||
|
CFLAGS=
|
||||||
|
LDFLAGS=-ltls
|
||||||
|
YACC=yacc
|
||||||
|
LEX=lex
|
||||||
|
STATIC=
|
||||||
|
|
||||||
|
HAVE_ERR=
|
||||||
|
HAVE_GETPROGNAME=
|
||||||
|
HAVE_LIBTLS=
|
||||||
|
HAVE_STRLCAT=
|
||||||
|
HAVE_STRLCPY=
|
||||||
|
HAVE_VASPRINTF=
|
||||||
|
|
||||||
|
NEED_GNU_SOURCE=0
|
||||||
|
NEED_OPENBSD_SOURCE=0
|
||||||
|
|
||||||
|
PREFIX="/usr/local"
|
||||||
|
BINDIR=
|
||||||
|
|
||||||
|
INSTALL="install"
|
||||||
|
|
||||||
|
# try to auto detect CFLAGS and LDFLAGS
|
||||||
|
which pkg-config 2>/dev/null 1>&2 && {
|
||||||
|
if ! got=`pkg-config --cflags libtls`; then
|
||||||
|
CFLAGS="$got"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! got=`pkg-config --libs libtls`; then
|
||||||
|
LDFLAGS="$got"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# auto detect lex/flex
|
||||||
|
which ${LEX} 2>/dev/null 1>&2 || {
|
||||||
|
echo "${LEX} not found: trying flex" 1>&2
|
||||||
|
echo "${LEX} not found: trying flex" 1>&3
|
||||||
|
LEX=flex
|
||||||
|
which ${LEX} 2>/dev/null 1>&2 || {
|
||||||
|
echo "${LEX} not found: giving up" 1>&2
|
||||||
|
echo "${LEX} not found: giving up" 1>&3
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# auto detect yacc/bison
|
||||||
|
which ${YACC} 2>/dev/null 1>&2 || {
|
||||||
|
echo "${YACC} not found: trying bison" 1>&2
|
||||||
|
echo "${YACC} not found: trying bison" 1>&3
|
||||||
|
YACC=bison
|
||||||
|
which ${YACC} 2>/dev/null 1>&2 || {
|
||||||
|
echo "${YACC} not found: giving up" 1>&2
|
||||||
|
echo "${YACC} not found: giving up" 1>&3
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# --------
|
||||||
|
# allow certain variables to be overridden on the command line
|
||||||
|
|
||||||
|
for keyvals in "$@"; do
|
||||||
|
key=`echo $keyvals | cut -s -d '=' -f1`
|
||||||
|
if [ -z "$key" ]; then
|
||||||
|
echo "$0: invalid key-value: $keyvals" 1>&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
vals=`echo $keyvals | cut -d '=' -f 2-`
|
||||||
|
case "$key" in
|
||||||
|
BINDIR) BINDIR="$val" ;;
|
||||||
|
CC) CC="$val" ;;
|
||||||
|
CFLAGS) CFLAGS="$val" ;;
|
||||||
|
DESTDIR) DESTDIR="$val" ;;
|
||||||
|
LDFLAGS) LDFLAGS="$val" ;;
|
||||||
|
LEX) LEX="$lex" ;;
|
||||||
|
PREFIX) PREFIX="$val" ;;
|
||||||
|
YACC) YACC="$val" ;;
|
||||||
|
*)
|
||||||
|
echo "$0: invalid key: $key" 1>&2
|
||||||
|
exit 1
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
# --------
|
||||||
|
# tests functions
|
||||||
|
|
||||||
|
# Check whether this HAVE_ setting is manually overridden.
|
||||||
|
# If yes, use the override, if no, do not decide anything yet.
|
||||||
|
# Arguments: test file name, test var name, manual value
|
||||||
|
ismanual() {
|
||||||
|
[ -z "${3}" ] && return 1
|
||||||
|
echo "tested ${1}: HAVE_${2}=${3} (manual)" 1>&2
|
||||||
|
echo "tested ${1}: HAVE_${2}=${3} (manual)" 1>&3
|
||||||
|
echo 1>&3
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
# Run a single autoconfiguration test.
|
||||||
|
# In case of success, enable the feature.
|
||||||
|
# In case of failure, do not decide anything yet.
|
||||||
|
# Arguments: test file name, test var name, additional CFLAGS
|
||||||
|
singletest() {
|
||||||
|
n=${1}${3}
|
||||||
|
cat 1>&3 << __HEREDOC__
|
||||||
|
testing ${n} ...
|
||||||
|
${COMP} -o have/${1} have/${1}.c ${3} ${LDFLAGS}
|
||||||
|
__HEREDOC__
|
||||||
|
|
||||||
|
if ${COMP} -o "have/${1}" "have/${1}.c" ${3} ${LDFLAGS} 1>&3 2>&3
|
||||||
|
then
|
||||||
|
echo "partial result of ${n}: ${CC} succeeded" 1>&3
|
||||||
|
else
|
||||||
|
echo "tested ${n}: no (compilation failed)" 1>&2
|
||||||
|
echo "result of ${n}: ${CC} failed with exit status $?" 1>&3
|
||||||
|
echo "result of compiling ${n}: no" 1>&3
|
||||||
|
echo 1>&3
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ./have/${1} 1>&3 2>&3; then
|
||||||
|
echo "tested ${n}: yes" 1>&2
|
||||||
|
echo "result of running ${n}: yes" 1>&3
|
||||||
|
echo 1>&3
|
||||||
|
eval HAVE_${2}=1
|
||||||
|
[ "${3}" = "-D_GNU_SOURCE" ] && NEED_GNU_SOURCE=1
|
||||||
|
[ "${3}" = "-D_OPENBSD_SOURCE" ] && NEED_OPENBSD_SOURCE=1
|
||||||
|
[ "${3}" = "-lsocket" ] && LD_RECVMSG="-lsocket"
|
||||||
|
rm "have/${1}"
|
||||||
|
return 0
|
||||||
|
else
|
||||||
|
echo "tested ${n}: no (execution failed)" 1>&2
|
||||||
|
echo "result of ${n}: execution failed with exit status $?" 1>&3
|
||||||
|
echo "result of running ${n}: no" 1>&3
|
||||||
|
echo 1>&3
|
||||||
|
rm "have/${1}"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# Run a complete autoconfiguration test, including the check for
|
||||||
|
# a manual override and disabling the feature on failure.
|
||||||
|
# Arguments: test file name, test var name, additional CFLAGS
|
||||||
|
# The final argument can optionally be repeated a second time.
|
||||||
|
runtest() {
|
||||||
|
eval _manual=\${HAVE_${2}}
|
||||||
|
ismanual "${1}" "${2}" "${_manual}" && return 0
|
||||||
|
singletest "${1}" "${2}" "${3}" && return 0
|
||||||
|
[ -n "${4}" ] && singletest "${1}" "${2}" "${4}" && return 0
|
||||||
|
eval HAVE_${2}=0
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
|
||||||
|
# --------
|
||||||
|
# compiler options
|
||||||
|
|
||||||
|
DEFCFLAGS="-g -W -Wall -Wmissing-prototypes -Wstrict-prototypes -Wwrite-strings -Wno-unused-parameter"
|
||||||
|
|
||||||
|
if [ -n "${CFLAGS}" ]; then
|
||||||
|
COMP="${CC} ${CFLAGS} -Wno-unused -Werror"
|
||||||
|
else
|
||||||
|
COMP="${CC} ${CDEFCFLAGS} -Wno-unused -Werror"
|
||||||
|
fi
|
||||||
|
echo -n "testing ${CC} -W: " 1>&2
|
||||||
|
echo -n "testing ${CC} -W: " 1>&3
|
||||||
|
runtest noop WFLAG || true
|
||||||
|
|
||||||
|
if [ -n "${CFLAGS}" ]; then
|
||||||
|
echo "CFLAGS specified manually:" 1>&3
|
||||||
|
elif [ ${HAVE_WFLAG} -eq 0 ]; then
|
||||||
|
CFLAGS="-g"
|
||||||
|
else
|
||||||
|
CFLAGS="${DEFCFLAGS}"
|
||||||
|
fi
|
||||||
|
echo "selected CFLAGS=\"${CFLAGS}\"" 1>&2
|
||||||
|
echo "selected CFLAGS=\"${CFLAGS}\"" 1>&3
|
||||||
|
echo 1>&3
|
||||||
|
|
||||||
|
COMP="${CC} ${CFLAGS}"
|
||||||
|
[ ${HAVE_WFLAG} -eq 0 ] || COMP="${COMP} -Wno-unused -Werror"
|
||||||
|
|
||||||
|
if [ -n "${STATIC}" ]; then
|
||||||
|
echo "selected STATIC=\"${STATIC}\" (manual)" 1>&2
|
||||||
|
echo "selected STATIC=\"${STATIC}\" (manual)" 1>&3
|
||||||
|
echo 1>&3
|
||||||
|
else
|
||||||
|
runtest noop STATIC -static || true
|
||||||
|
[ ${HAVE_STATIC} -eq 0 ] || STATIC="-static"
|
||||||
|
echo "selected STATIC=\"${STATIC}\"" 1>&2
|
||||||
|
echo "selected STATIC=\"${STATIC}\"" 1>&3
|
||||||
|
echo 1>&3
|
||||||
|
fi
|
||||||
|
|
||||||
|
# --------
|
||||||
|
# tests for config.h
|
||||||
|
|
||||||
|
runtest err ERR || true
|
||||||
|
runtest libtls LIBTLS || true
|
||||||
|
runtest strlcat STRLCAT || true
|
||||||
|
runtest strlcpy STRLCPY || true
|
||||||
|
runtest vasprintf VASPRINTF "" -D_GNU_SOURCE || true
|
||||||
|
|
||||||
|
if [ ${HAVE_LIBTLS} -eq 0 ]; then
|
||||||
|
echo "FATAL: libtls not found" 1>&2
|
||||||
|
echo "FATAL: libtls not found" 1>&3
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# --------
|
||||||
|
# write config.h
|
||||||
|
|
||||||
|
exec > config.h
|
||||||
|
|
||||||
|
cat <<__HEREDOC__
|
||||||
|
#ifdef __cplusplus
|
||||||
|
#error "Do not use C++."
|
||||||
|
#endif
|
||||||
|
|
||||||
|
__HEREDOC__
|
||||||
|
|
||||||
|
[ ${NEED_GNU_SOURCE} -eq 0 ] || echo "#define _GNU_SOURCE"
|
||||||
|
[ ${NEED_OPENBSD_SOURCE} -eq 0 ] || echo "#define _OPENBSD_SOURCE"
|
||||||
|
|
||||||
|
[ ${HAVE_STRLCAT} -eq 0 -o ${HAVE_STRLCPY} -eq 0 ] \
|
||||||
|
&& echo "#include <sys/types.h>"
|
||||||
|
[ ${HAVE_VASPRINTF} -eq 0 ] && echo "#include <stdarg.h>"
|
||||||
|
|
||||||
|
cat <<__HEREDOC__
|
||||||
|
|
||||||
|
#define HAVE_ERR ${HAVE_ERR}
|
||||||
|
#define HAVE_GETPROGNAME ${HAVE_GETPROGNAME}
|
||||||
|
#define HAVE_STRLCAT ${HAVE_STRLCAT}
|
||||||
|
#define HAVE_STRLCPY ${HAVE_STRLCPY}
|
||||||
|
#define HAVE_VASPRINTF ${HAVE_VASPRINTF}
|
||||||
|
|
||||||
|
__HEREDOC__
|
||||||
|
|
||||||
|
if [ ${HAVE_ERR} -eq 0 ]; then
|
||||||
|
echo "extern void err(int, const char*, ...);"
|
||||||
|
echo "extern void errx(int, const char*, ...);"
|
||||||
|
echo "extern void warn(const char*, ...);"
|
||||||
|
echo "extern void warnx(const char*, ...);"
|
||||||
|
COMPAT="${COMPAT} compat/err.o"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ ${HAVE_STRLCAT} -eq 0 ]; then
|
||||||
|
echo "extern size_t strlcat(char*, const char*, size_t);"
|
||||||
|
COMPAT="${COMPAT} compat/strlcat.o"
|
||||||
|
fi
|
||||||
|
if [ ${HAVE_STRLCPY} -eq 0 ]; then
|
||||||
|
echo "extern size_t strlcpy(char*, const char*, size_t);"
|
||||||
|
COMPAT="${COMPAT} compat/strlcpy.o"
|
||||||
|
fi
|
||||||
|
if [ ${HAVE_VASPRINTF} -eq 0 ]; then
|
||||||
|
echo "extern int vasprintf(char**, const char*, va_list);"
|
||||||
|
COMPAT="${COMPAT} compat/vasprintf.o"
|
||||||
|
fi
|
||||||
|
echo "file config.h: written" 1>&2
|
||||||
|
echo "file config.h: written" 1>&3
|
||||||
|
|
||||||
|
# --------
|
||||||
|
# tests for Makefile.local
|
||||||
|
|
||||||
|
exec > Makefile.local
|
||||||
|
|
||||||
|
[ -z "${BINDIR}" ] && BINDIR="${PREFIX}/bin"
|
||||||
|
[ -z "${MANDIR}" ] && MANDIR="${PREFIX}/man"
|
||||||
|
|
||||||
|
[ -z "${INSTALL_PROGRAM}" ] && INSTALL_PROGRAM="${INSTALL} -m 0555"
|
||||||
|
[ -z "${INSTALL_LIB}" ] && INSTALL_LIB="${INSTALL} -m 0444"
|
||||||
|
[ -z "${INSTALL_MAN}" ] && INSTALL_MAN="${INSTALL} -m 0444"
|
||||||
|
[ -z "${INSTALL_DATA}" ] && INSTALL_DATA="${INSTALL} -m 0444"
|
||||||
|
|
||||||
|
cat << __HEREDOC__
|
||||||
|
CC = ${CC}
|
||||||
|
CFLAGS = ${CFLAGS}
|
||||||
|
LDFLAGS = ${LDFLAGS}
|
||||||
|
YACC = ${YACC}
|
||||||
|
LEX = ${LEX}
|
||||||
|
COMPAT = ${COMPAT}
|
||||||
|
STATIC = ${STATIC}
|
||||||
|
PREFIX = ${PREFIX}
|
||||||
|
BINDIR = ${BINDIR}
|
||||||
|
INCLUDEDIR = ${INCLUDEDIR}
|
||||||
|
INSTALL = ${INSTALL}
|
||||||
|
INSTALL_PROGRAM = ${INSTALL_PROGRAM}
|
||||||
|
INSTALL_LIB = ${INSTALL_LIB}
|
||||||
|
INSTALL_MAN = ${INSTALL_MAN}
|
||||||
|
INSTALL_DATA = ${INSTALL_DATA}
|
||||||
|
__HEREDOC__
|
||||||
|
|
||||||
|
echo "file Makefile.local: written" 1>&2
|
||||||
|
echo "file Makefile.local: written" 1>&3
|
||||||
|
|
||||||
|
exit 0
|
2
gmid.h
2
gmid.h
|
@ -28,6 +28,8 @@
|
||||||
#include <tls.h>
|
#include <tls.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
|
||||||
|
#include "config.h"
|
||||||
|
|
||||||
#ifndef INFTIM
|
#ifndef INFTIM
|
||||||
# define INFTIM -1
|
# define INFTIM -1
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -0,0 +1,26 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2021 Omar Polo <op@omarpolo.com>
|
||||||
|
*
|
||||||
|
* Permission to use, copy, modify, and distribute this software for any
|
||||||
|
* purpose with or without fee is hereby granted, provided that the above
|
||||||
|
* copyright notice and this permission notice appear in all copies.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||||
|
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||||
|
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||||
|
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||||
|
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||||
|
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||||
|
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <err.h>
|
||||||
|
|
||||||
|
int
|
||||||
|
main(void)
|
||||||
|
{
|
||||||
|
warnx("%d. warnx", 1);
|
||||||
|
warn("%d. warn", 2);
|
||||||
|
err(0, "%d. err", 3);
|
||||||
|
return 1;
|
||||||
|
}
|
|
@ -0,0 +1,23 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2021 Omar Polo <op@omarpolo.com>
|
||||||
|
*
|
||||||
|
* Permission to use, copy, modify, and distribute this software for any
|
||||||
|
* purpose with or without fee is hereby granted, provided that the above
|
||||||
|
* copyright notice and this permission notice appear in all copies.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||||
|
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||||
|
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||||
|
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||||
|
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||||
|
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||||
|
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
int
|
||||||
|
main(void)
|
||||||
|
{
|
||||||
|
return getprogname() == NULL;
|
||||||
|
}
|
|
@ -0,0 +1,23 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2021 Omar Polo <op@omarpolo.com>
|
||||||
|
*
|
||||||
|
* Permission to use, copy, modify, and distribute this software for any
|
||||||
|
* purpose with or without fee is hereby granted, provided that the above
|
||||||
|
* copyright notice and this permission notice appear in all copies.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||||
|
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||||
|
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||||
|
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||||
|
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||||
|
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||||
|
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <tls.h>
|
||||||
|
|
||||||
|
int
|
||||||
|
main(void)
|
||||||
|
{
|
||||||
|
return tls_init() != 0;
|
||||||
|
}
|
|
@ -0,0 +1,21 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2021 Omar Polo <op@omarpolo.com>
|
||||||
|
*
|
||||||
|
* Permission to use, copy, modify, and distribute this software for any
|
||||||
|
* purpose with or without fee is hereby granted, provided that the above
|
||||||
|
* copyright notice and this permission notice appear in all copies.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||||
|
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||||
|
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||||
|
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||||
|
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||||
|
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||||
|
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
int
|
||||||
|
main(void)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
|
@ -0,0 +1,25 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2021 Omar Polo <op@omarpolo.com>
|
||||||
|
*
|
||||||
|
* Permission to use, copy, modify, and distribute this software for any
|
||||||
|
* purpose with or without fee is hereby granted, provided that the above
|
||||||
|
* copyright notice and this permission notice appear in all copies.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||||
|
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||||
|
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||||
|
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||||
|
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||||
|
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||||
|
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
int
|
||||||
|
main(void)
|
||||||
|
{
|
||||||
|
char buf[3] = "a";
|
||||||
|
return ! (strlcat(buf, "b", sizeof(buf)) == 2 &&
|
||||||
|
buf[0] == 'a' && buf[1] == 'b' && buf[2] == '\0');
|
||||||
|
}
|
|
@ -0,0 +1,25 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2021 Omar Polo <op@omarpolo.com>
|
||||||
|
*
|
||||||
|
* Permission to use, copy, modify, and distribute this software for any
|
||||||
|
* purpose with or without fee is hereby granted, provided that the above
|
||||||
|
* copyright notice and this permission notice appear in all copies.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||||
|
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||||
|
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||||
|
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||||
|
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||||
|
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||||
|
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
int
|
||||||
|
main(void)
|
||||||
|
{
|
||||||
|
char buf[2] = "";
|
||||||
|
return ! (strlcpy(buf, "a", sizeof(buf)) == 1 &&
|
||||||
|
buf[0] == 'a' && buf[1] == '\0');
|
||||||
|
}
|
|
@ -0,0 +1,46 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2021 Omar Polo <op@omarpolo.com>
|
||||||
|
*
|
||||||
|
* Permission to use, copy, modify, and distribute this software for any
|
||||||
|
* purpose with or without fee is hereby granted, provided that the above
|
||||||
|
* copyright notice and this permission notice appear in all copies.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||||
|
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||||
|
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||||
|
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||||
|
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||||
|
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||||
|
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdarg.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
static int testfn(char **, const char*, ...);
|
||||||
|
|
||||||
|
static int
|
||||||
|
testfn(char **ret, const char *fmt, ...)
|
||||||
|
{
|
||||||
|
va_list ap;
|
||||||
|
int irc;
|
||||||
|
|
||||||
|
va_start(ap, fmt);
|
||||||
|
irc = vasprintf(ret, fmt, ap);
|
||||||
|
va_end(ap);
|
||||||
|
|
||||||
|
return irc;
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
main(void)
|
||||||
|
{
|
||||||
|
char *ret;
|
||||||
|
|
||||||
|
if (testfn(&ret, "%s.", "Text") != 5)
|
||||||
|
return 1;
|
||||||
|
if (strcmp(ret, "Text."))
|
||||||
|
return 2;
|
||||||
|
return 0;
|
||||||
|
}
|
Loading…
Reference in New Issue