skalibs

Mirror/fork of https://skarnet.org/software/skalibs/
git clone https://ccx.te2000.cz/git/skalibs
Log | Files | Refs | README | LICENSE

commit 6011d413604df8224b91ca9f9b3d50663b60e117
parent 98d3a523be4fff36f65e71c37df8b9e127b12b83
Author: Laurent Bercot <ska-skaware@skarnet.org>
Date:   Fri, 20 Sep 2019 18:22:27 +0000

 sysdeps redesign: first part: minimize clr tests

 Remaining clr:
  emptyregex: can be safely guessed to no
  nullispointer: can't be safely guessed, but do we need the test?
  devurandom: can't be safely guessed
  malloc0: can more or less be safely guessed to no

Diffstat:
MMakefile | 4++--
Mconfigure | 338++++++++++++++++++++++++++++++++++++++++++++++----------------------------------
Mpatch-for-solaris | 2+-
Msrc/librandom/random_string.c | 11++---------
Msrc/sysdeps/tryaccept4.c | 4++++
Msrc/sysdeps/trygetrandom.c | 18++----------------
Msrc/sysdeps/trypipe2.c | 3+++
Msrc/sysdeps/tryppoll.c | 11+++++++++++
Msrc/sysdeps/trysplice.c | 27++++++++++-----------------
Dtools/gen-bits-internal.sh | 9---------
Mtools/gen-bits.sh | 6+++++-
Atools/gen-sysdepsh.sh | 39+++++++++++++++++++++++++++++++++++++++
12 files changed, 274 insertions(+), 198 deletions(-)

diff --git a/Makefile b/Makefile @@ -134,8 +134,8 @@ libskarnet.so.xyzzy: $(ALL_DOBJS) .DELETE_ON_ERROR: -src/include/$(package)/sysdeps.h: $(sysdeps)/sysdeps.h - exec cat < $< > $@ +src/include/$(package)/sysdeps.h: $(sysdeps)/sysdeps $(sysdeps)/target + exec tools/gen-sysdepsh.sh `cat $(sysdeps)/target` < $(sysdeps)/sysdeps > $@ src/include/$(package)/uint16.h: $(sysdeps)/sysdeps src/headers/bits-header src/headers/bits-footer src/headers/bits-lendian src/headers/bits-bendian src/headers/bits-template src/headers/uint64-include src/include/$(package)/uint64.h exec tools/gen-bits.sh $(sysdeps)/sysdeps 16 6 7 5 17 > $@ diff --git a/configure b/configure @@ -58,6 +58,11 @@ echo () { printf %s\\n "$*" } +echon () { + IFS=" " + printf %s "$*" +} + quote () { tr '\n' ' ' <<EOF | grep '^[-[:alnum:]_=,./:]* $' >/dev/null 2>&1 && { echo "$1" ; return 0 ; } $1 @@ -116,12 +121,27 @@ tryldflag () { fi } + +# Sysdeps determination functions + +iscached () +{ + if test -n "$sysdepspre" && grep -qF "${1}: " "$sysdepspre" ; then + v=`grep -F "${1}: " "$sysdepspre" | tail -n 1 | awk '{print $2;}'` + echo "${1}: $v" >> "$sysdeps/sysdeps" + echo " ... user-provided: $v" + return 0 ; + else + return 1 ; + fi +} + choose () { what="$1" name="$2" - macro="$3" - echo "Checking whether system has $4..." - shift 4 + if iscached "$name" ; then return ; fi + echo "Checking whether system has $3..." + shift 3 libs="$*" r=true case "$what" in @@ -143,40 +163,122 @@ choose () { esac fi rm -f try$name.o try$name - echo "#undef ${package_macro_name}_HAS$macro" >> $sysdeps/sysdeps.h if $r ; then echo "$name: yes" >> $sysdeps/sysdeps - echo "#define ${package_macro_name}_HAS$macro" >> $sysdeps/sysdeps.h echo " ... yes" else echo "$name: no" >> $sysdeps/sysdeps echo " ... no" fi - echo >> $sysdeps/sysdeps.h +} + +trybasic () { + $CC_AUTO $CPPFLAGS_AUTO $CPPFLAGS $CPPFLAGS_POST $CFLAGS_AUTO $CFLAGS $CFLAGS_POST -o "$tmpe" -c "$1" 2>/dev/null + r=$? + rm -f "$tmpe" + return $r +} + +tryendianness () { + echo "Checking endianness..." + if iscached endianness ; then return ; fi + for i in endian.h sys/endian.h machine/endian.h ; do + cat > "$tmpc" <<EOF +#include <$i> +int a = 1 ; +EOF + if trybasic "$tmpc" ; then + cat > "$tmpc" <<EOF +#ifndef _BSD_SOURCE +#define _BSD_SOURCE +#endif +#ifndef _GNU_SOURCE +#define _GNU_SOURCE +#endif +#ifndef _DEFAULT_SOURCE +#define _DEFAULT_SOURCE +#endif +#include <$i> +int a = LITTLE_ENDIAN ; +int b = BIG_ENDIAN ; +int c = BYTE_ORDER ; +EOF + trybasic "$tmpc" || exit 5 + for j in little big pdp ; do + k=`echo $j | tr a-z A-Z` + cat > "$tmpc" <<EOF +#ifndef _BSD_SOURCE +#define _BSD_SOURCE +#endif +#ifndef _GNU_SOURCE +#define _GNU_SOURCE +#endif +#ifndef _DEFAULT_SOURCE +#define _DEFAULT_SOURCE +#endif +#include <$i> +int a[BYTE_ORDER == ${k}_ENDIAN ? 1 : -1] ; +EOF + if trybasic "$tmpc" ; then + echo "endianness: $j" >> "$sysdeps/sysdeps" + echo " ... $j" + rm -f "$tmpc" + return + fi + done + rm -f "$tmpc" + echo "$0: error: unable to determine endianness according to $i" 1>&2 + exit 1 + fi + done + rm -f "$tmpc" + echo "$0: error: unable to determine endianness: no endian.h found" 1>&2 + exit 1 +} + +trysigned () { + cat > "$tmpc" <<EOF +#include <sys/types.h> +int a[($1)-1 < 0 ? 1 : -1] ; +EOF + trybasic "$tmpc" + r=$? + rm -f "$tmpc" + return $r +} + +trysizes () { + t="$1" ; shift + for arg ; do + cat > "$tmpc" <<EOF +#include <sys/types.h> +int a[sizeof($t) == $arg ? 1 : -1] ; +EOF + if trybasic "$tmpc" ; then + rm -f "$tmpc" + echo "$arg" + return + fi + done + rm -f "$tmpc" + echo "$0: error: unable to determine the size of $t on the target" 1>&2 + exit 1 +} + +trystdtype () { + t="$1" ; shift + iscached "sizeofu$t" || { echon "sizeofu${t}: " ; trysizes "$t" "$@" ; } >> "$sysdeps/sysdeps" } trytypes () { echo "Checking size and signedness of standard types..." - $CC_AUTO $CPPFLAGS_AUTO $CPPFLAGS $CPPFLAGS_POST $CFLAGS_AUTO $CFLAGS $CFLAGS_POST $LDFLAGS_AUTO $LDFLAGS $LDFLAGS_POST -o output-types src/sysdeps/output-types.c - ./output-types >> $sysdeps/sysdeps - ./output-types | grep -F sizeof | while read key value ; do - caps=$(echo $key | sed s/:\$// | tr a-z A-Z) - echo "#undef ${package_macro_name}_${caps}" - echo "#define ${package_macro_name}_${caps} $value" - echo - done >> $sysdeps/sysdeps.h - ./output-types | grep -F signed | while read key value ; do - caps=$(echo $key | sed s/:\$// | tr a-z A-Z) - echo "#undef ${package_macro_name}_HASUN${caps}" - echo "#undef ${package_macro_name}_HAS${caps}" - if test $value = yes ; then - echo "#define ${package_macro_name}_HAS${caps}" - else - echo "#define ${package_macro_name}_HASUN${caps}" - fi - echo - done >> $sysdeps/sysdeps.h - rm -f output-types + trystdtype short 2 4 + trystdtype int 4 8 2 + trystdtype long 8 4 + for t in size uid gid pid time dev ino ; do + iscached "signed$t" || { echon "signed${t}: " ; if trysigned "${t}_t" ; then echo "yes" ; else echo "no" ; fi ; } >> "$sysdeps/sysdeps" + iscached "sizeof$t" || { echon "sizeof${t}: " ; trysizes "${t}_t" 4 8 2 ; } >> "$sysdeps/sysdeps" + done echo " ... done" } @@ -231,7 +333,7 @@ libdir='$prefix/lib/$package' includedir='$prefix/include' datadir='$prefix/etc' sysdepdir='$prefix/lib/$package/sysdeps' -sysdeps= +sysdepspre= shared=true static=true allpic=true @@ -261,7 +363,7 @@ for arg ; do --includedir=*) includedir=${arg#*=} ;; --datadir=*) datadir=${arg#*=} ;; --sysdepdir=*) sysdepdir=${arg#*=} ;; - --with-sysdeps=*) sysdeps=${arg#*=} ;; + --with-sysdeps=*) sysdepspre=${arg#*=} ;; --with-include=*) var=${arg#*=} ; stripdir var ; addincpath="$addincpath -I$var" ;; --with-lib=*) var=${arg#*=} ; stripdir var ; addlibspath="$addlibspath -L$var" ; vpaths="$vpaths $var" ;; --with-dynlib=*) var=${arg#*=} ; stripdir var ; addlibdpath="$addlibdpath -L$var" ; vpathd="$vpathd $var" ;; @@ -308,7 +410,7 @@ fi # Expand installation directories stripdir prefix -for i in exec_prefix dynlibdir libdir includedir datadir sysdepdir sysdeps sproot ; do +for i in exec_prefix dynlibdir libdir includedir datadir sysdepdir sysdepspre sproot ; do eval tmp=\${$i} eval $i=$tmp stripdir $i @@ -419,22 +521,21 @@ if $shared ; then tryldflag LDFLAGS -Wl,--hash-style=both fi -if test -n "$sysdeps" ; then - if test ! -d $sysdeps || test ! -f $sysdeps/target ; then - echo "$0: error: $sysdeps is not a valid sysdeps directory" +if test -n "$sysdepspre" ; then + if test ! -d "$sysdepspre" || test ! -f $sysdepspre/target ; then + echo "$0: error: $sysdepspre is not a valid sysdeps directory" exit 1 fi - if [ "x$target" != "x$(cat $sysdeps/target)" ] ; then - echo "$0: error: target $target does not match the contents of $sysdeps/target" + if [ "x$target" != "x$(cat $sysdepspre/target)" ] ; then + echo "$0: error: target $target does not match the contents of $sysdepspre/target" exit 1 fi - echo "Using pre-computed sysdeps in $sysdeps." - spawn_lib=$(cat $sysdeps/spawn.lib) - socket_lib=$(cat $sysdeps/socket.lib) - sysclock_lib=$(cat $sysdeps/sysclock.lib) - tainnow_lib=$(cat $sysdeps/tainnow.lib) - timer_lib=$(cat $sysdeps/timer.lib) - util_lib=$(cat $sysdeps/util.lib) + echo "Using pre-computed sysdeps in $sysdepspre." + spawn_lib=$(cat $sysdepspre/spawn.lib) + socket_lib=$(cat $sysdepspre/socket.lib) + sysclock_lib=$(cat $sysdepspre/sysclock.lib) + timer_lib=$(cat $sysdepspre/timer.lib) + util_lib=$(cat $sysdepspre/util.lib) else if test -n "$cross" ; then echo "$0: warning: possible cross-build attempt with a native compiler" 1>&2 @@ -442,17 +543,6 @@ else sysdeps=sysdeps.cfg mkdir -p $sysdeps echo "$target" > $sysdeps/target - echo "target: $target" > $sysdeps/sysdeps - cat <<EOF > $sysdeps/sysdeps.h -/* ISC license. */ - -#ifndef SYSDEPS_H -#define SYSDEPS_H - -#undef SKALIBS_TARGET -#define SKALIBS_TARGET "$target" - -EOF exec 3>&1 util_lib= @@ -461,105 +551,68 @@ EOF socket_lib=`trylibs lsock 'accessible socket functions' -lsocket -lnsl` || fail "$0: unable to determine socket.lib sysdep" echo "$socket_lib" > $sysdeps/socket.lib - hasclock=true - sysclock_lib=`trylibs clockrt 'clock_gettime()' -lrt` || hasclock=false - tainnow_lib=$sysclock_lib + hasclock=yes + sysclock_lib=`trylibs clockrt 'clock_gettime()' -lrt` || hasclock=no echo "$sysclock_lib" > $sysdeps/sysclock.lib - echo "$tainnow_lib" > $sysdeps/tainnow.lib - echo "#undef ${package_macro_name}_HASCLOCKRT" >> $sysdeps/sysdeps.h - if $hasclock ; then - echo 'clockrt: yes' >> $sysdeps/sysdeps - echo "#define ${package_macro_name}_HASCLOCKRT" >> $sysdeps/sysdeps.h - else - echo 'clockrt: no' >> $sysdeps/sysdeps - fi - echo >> $sysdeps/sysdeps.h - choose cl clockmon CLOCKMON CLOCK_MONOTONIC $sysclock_lib - choose cl clockboot CLOCKBOOT CLOCK_BOOTTIME $sysclock_lib + echo "clockrt: $hasclock" >> $sysdeps/sysdeps - hasspawn=true - spawn_lib=`trylibs posixspawn 'posix_spawn()' -lrt` || hasspawn=false + choose cl clockmon CLOCK_MONOTONIC $sysclock_lib + choose cl clockboot CLOCK_BOOTTIME $sysclock_lib + + hasspawn=yes + spawn_lib=`trylibs posixspawn 'posix_spawn()' -lrt` || hasspawn=no echo "$spawn_lib" > $sysdeps/spawn.lib - echo "#undef ${package_macro_name}_HASPOSIXSPAWN" >> $sysdeps/sysdeps.h - if $hasspawn ; then - echo 'posixspawn: yes' >> $sysdeps/sysdeps - echo "#define ${package_macro_name}_HASPOSIXSPAWN" >> $sysdeps/sysdeps.h - else - echo 'posixspawn: no' >> $sysdeps/sysdeps - fi - echo >> $sysdeps/sysdeps.h + echo "posixspawn: $hasspawn" >> $sysdeps/sysdeps - hastimer=true - timer_lib=`trylibs timer 'timer_create()' -lrt` || hastimer=false + hastimer=yes + timer_lib=`trylibs timer 'timer_create()' -lrt` || hastimer=no echo "$timer_lib" > $sysdeps/timer.lib - echo "#undef ${package_macro_name}_HASTIMER" >> $sysdeps/sysdeps.h - if $hastimer ; then - echo 'timer: yes' >> $sysdeps/sysdeps - echo "#define ${package_macro_name}_HASTIMER" >> $sysdeps/sysdeps.h - else - echo 'timer: no' >> $sysdeps/sysdeps - fi - echo >> $sysdeps/sysdeps.h + echo "timer: $hastimer" >> $sysdeps/sysdeps exec 3>&- - echo "Checking system endianness..." - $CC_AUTO $CPPFLAGS_AUTO $CPPFLAGS $CPPFLAGS_POST $CFLAGS_AUTO $CFLAGS $CFLAGS_POST $LDFLAGS_AUTO $LDFLAGS $LDFLAGS_POST -o tryendianness src/sysdeps/tryendianness.c - endianness=$(./tryendianness) || fail "$0: unable to determine endianness" - echo "endianness: $endianness" >> $sysdeps/sysdeps - { - echo "#undef ${package_macro_name}_ENDIANNESS" - echo "#define ${package_macro_name}_ENDIANNESS \"$endianness\"" - echo - } >> $sysdeps/sysdeps.h - echo " ... $endianness" - rm -f tryendianness - + tryendianness trytypes - choose clr nullispointer NULLISPOINTER 'a pointer-typed NULL' - choose clr accept4 ACCEPT4 'accept4()' - choose c cmsgcloexec CMSGCLOEXEC 'MSG_CMSG_CLOEXEC' - choose clr devurandom DEVURANDOM '/dev/urandom' - choose cl dirfd DIRFD 'dirfd()' - choose cl eventfd EVENTFD 'eventfd()' - choose cl flock FLOCK 'flock()' - choose cl getpeereid GETPEEREID 'getpeereid()' - choose cl sopeercred SOPEERCRED 'SO_PEERCRED' - choose cl getpeerucred GETPEERUCRED 'getpeerucred()' - choose cl ipv6 IPV6 'IPv6 support' $socket_lib - choose clr malloc0 MALLOC0 'non-NULL malloc(0)' - choose c msgdontwait MSGDONTWAIT 'MSG_DONTWAIT' - choose c odirectory ODIRECTORY 'O_DIRECTORY' - choose cl openat OPENAT 'openat()' - choose cl linkat LINKAT 'linkat()' - choose cl memmem MEMMEM 'memmem()' - choose clr pipe2 PIPE2 'pipe2()' - choose clr ppoll PPOLL 'ppoll()' - choose cl revoke REVOKE 'revoke()' - choose cl sendfile SENDFILE 'sendfile()' - choose cl setgroups SETGROUPS 'setgroups()' - choose cl settimeofday SETTIMEOFDAY 'settimeofday()' - choose clr signalfd SIGNALFD 'signalfd()' - choose clr splice SPLICE 'splice()' - choose cl strcasestr STRCASESTR 'strcasestr()' - choose c strnlen STRNLEN 'strnlen()' - choose c uint64t UINT64T 'uint64_t' - choose cl futimens FUTIMENS 'futimens()' - choose cl futimes FUTIMES 'futimes()' - choose cl arc4random ARC4RANDOM 'arc4random()' - choose cl arc4random_addrandom ARC4RANDOM_ADDRANDOM 'arc4random_addrandom()' - choose clr getrandom GETRANDOM 'getrandom()' - choose cl itimer ITIMER 'setitimer()' - choose cl namespaces NAMESPACES 'namespaces' - choose cl nsgetparent NSGETPARENT 'NS_GET_PARENT' - choose cl explicit_bzero EXPLICIT_BZERO 'explicit_bzero()' - choose clr emptyregex EMPTYREGEX 'regcomp() accept empty regexes' - - echo '#endif' >> $sysdeps/sysdeps.h -fi + choose cl accept4 'accept4()' + choose c cmsgcloexec 'MSG_CMSG_CLOEXEC' + choose cl dirfd 'dirfd()' + choose cl eventfd 'eventfd()' + choose cl flock 'flock()' + choose cl getrandom 'getrandom()' + choose cl getpeereid 'getpeereid()' + choose cl sopeercred 'SO_PEERCRED' + choose cl getpeerucred 'getpeerucred()' + choose cl ipv6 'IPv6 support' $socket_lib + choose c msgdontwait 'MSG_DONTWAIT' + choose c odirectory 'O_DIRECTORY' + choose cl openat 'openat()' + choose cl linkat 'linkat()' + choose cl memmem 'memmem()' + choose cl pipe2 'pipe2()' + choose cl ppoll 'ppoll()' + choose cl revoke 'revoke()' + choose cl sendfile 'sendfile()' + choose cl setgroups 'setgroups()' + choose cl settimeofday 'settimeofday()' + choose cl signalfd 'signalfd()' + choose cl splice 'splice()' + choose cl strcasestr 'strcasestr()' + choose c strnlen 'strnlen()' + choose c uint64t 'uint64_t' + choose cl futimens 'futimens()' + choose cl futimes 'futimes()' + choose cl arc4random 'arc4random()' + choose cl arc4random_addrandom 'arc4random_addrandom()' + choose cl itimer 'setitimer()' + choose cl namespaces 'namespaces' + choose cl nsgetparent 'NS_GET_PARENT' + choose cl explicit_bzero 'explicit_bzero()' + + choose clr emptyregex 'regcomp() accept empty regexes' + choose clr nullispointer 'a pointer-typed NULL' + choose clr devurandom '/dev/urandom' + choose clr malloc0 'non-NULL malloc(0)' -echo "Copying $sysdeps/sysdeps.h to src/include/${package}/sysdeps.h ..." -cat < $sysdeps/sysdeps.h > src/include/${package}/sysdeps.h -echo " ... done" +fi echo "Creating config.mak..." cmdline=$(quote "$0") @@ -587,7 +640,6 @@ ipv6 := ${ipv6} SPAWN_LIB := ${spawn_lib} SOCKET_LIB := ${socket_lib} SYSCLOCK_LIB := ${sysclock_lib} -TAINNOW_LIB := ${tainnow_lib} TIMER_LIB := ${timer_lib} UTIL_LIB := ${util_lib} CC := ${CC_AUTO} diff --git a/patch-for-solaris b/patch-for-solaris @@ -21,7 +21,7 @@ patchit ./tools/gen-deps.sh patchit ./tools/gen-types.sh patchit ./tools/gen-types-internal.sh patchit ./tools/gen-bits.sh -patchit ./tools/gen-bits-internal.sh +patchit ./tools/make-sysdepsh.sh echo 'SHELL := /usr/xpg4/bin/sh' > Makefile.tmp echo >> Makefile.tmp diff --git a/src/librandom/random_string.c b/src/librandom/random_string.c @@ -16,21 +16,14 @@ void random_string (char *s, size_t n) #else #ifdef SKALIBS_HASGETRANDOM -#include <skalibs/nonposix.h> -#include <unistd.h> -#include <sys/syscall.h> +#include <sys/random.h> #include <skalibs/random.h> -static int getrandom (void *buf, size_t buflen, unsigned int flags) -{ - return syscall(SYS_getrandom, buf, buflen, flags) ; -} - void random_string (char *s, size_t n) { while (n) { - int r = getrandom(s, n, 0) ; + ssize_t r = getrandom(s, n, 0) ; if (r >= 0) { s += r ; diff --git a/src/sysdeps/tryaccept4.c b/src/sysdeps/tryaccept4.c @@ -11,6 +11,10 @@ #define _GNU_SOURCE #endif +#ifndef _DEFAULT_SOURCE +#define _DEFAULT_SOURCE +#endif + #include <sys/socket.h> #include <sys/stat.h> #include <fcntl.h> diff --git a/src/sysdeps/trygetrandom.c b/src/sysdeps/trygetrandom.c @@ -1,24 +1,10 @@ /* ISC license. */ -#undef _POSIX_C_SOURCE -#undef _XOPEN_SOURCE - -#ifndef _GNU_SOURCE -#define _GNU_SOURCE -#endif - -#include <sys/types.h> -#include <unistd.h> -#include <sys/syscall.h> - -static int getrandom (void *buf, size_t buflen, unsigned int flags) -{ - return syscall(SYS_getrandom, buf, buflen, flags) ; -} +#include <sys/random.h> int main (void) { char buf[4] ; - if (getrandom(buf, 4, 0) < 0) return 1 ; + if (getrandom(buf, 4, GRND_NONBLOCK) < 0) return 1 ; return 0 ; } diff --git a/src/sysdeps/trypipe2.c b/src/sysdeps/trypipe2.c @@ -12,6 +12,9 @@ #ifndef _BSD_SOURCE #define _BSD_SOURCE #endif +#ifndef _DEFAULT_SOURCE +#define _DEFAULT_SOURCE +#endif #ifndef _NETBSD_SOURCE #define _NETBSD_SOURCE #endif diff --git a/src/sysdeps/tryppoll.c b/src/sysdeps/tryppoll.c @@ -1,9 +1,20 @@ /* ISC license. */ +#undef _POSIX_C_SOURCE +#undef _XOPEN_SOURCE + +#ifndef _BSD_SOURCE +#define _BSD_SOURCE +#endif + #ifndef _GNU_SOURCE #define _GNU_SOURCE #endif +#ifndef _DEFAULT_SOURCE +#define _DEFAULT_SOURCE +#endif + #include <sys/stat.h> #include <fcntl.h> #include <time.h> diff --git a/src/sysdeps/trysplice.c b/src/sysdeps/trysplice.c @@ -1,29 +1,22 @@ /* ISC license. */ +#undef _POSIX_C_SOURCE +#undef _XOPEN_SOURCE + #ifndef _GNU_SOURCE #define _GNU_SOURCE #endif -#include <sys/stat.h> #include <fcntl.h> -#include <unistd.h> - -#define N 4096 +#include <sys/uio.h> int main (void) { - int p[2] ; - int fd ; - if (pipe(p) < 0) return 111 ; - fd = open("./src/sysdeps/trysplice.c", O_RDONLY) ; - if (fd < 0) return 111 ; - - for (;;) - { - ssize_t r = splice(fd, 0, p[1], 0, N, 0) ; - if (r < 0) return 1 ; - if (!r) break ; - if (splice(p[0], 0, 1, 0, r, 0) < r) return 2 ; - } + char s[2][2] ; + struct iovec v[2] = { { .iov_base = s[0], .iov_len = 2 }, { .iov_base = s[1], .iov_len = 2 } } ; + loff_t in, out ; + ssize_t r = splice(0, &in, 1, &out, 4096, SPLICE_F_MOVE) ; + r = tee(0, 1, 4096, SPLICE_F_NONBLOCK) ; + r = vmsplice(0, v, 2, 0) ; return 0 ; } diff --git a/tools/gen-bits-internal.sh b/tools/gen-bits-internal.sh @@ -1,9 +0,0 @@ -#!/bin/sh -e - -bits="$1" -dfmt="$2" -ofmt="$3" -xfmt="$4" -bfmt="$5" - -exec sed -e "s/@BITS@/$bits/g; s/@DFMT@/$dfmt/g; s/@OFMT@/$ofmt/g; s/@XFMT@/$xfmt/g; s/@BFMT@/$bfmt/g;" < src/headers/bits-template diff --git a/tools/gen-bits.sh b/tools/gen-bits.sh @@ -7,6 +7,10 @@ ofmt="$4" xfmt="$5" bfmt="$6" +gen_bits() { + sed -e "s/@BITS@/$1/g; s/@DFMT@/$2/g; s/@OFMT@/$3/g; s/@XFMT@/$4/g; s/@BFMT@/$5/g;" < src/headers/bits-template +} + tools/gen-types-internal.sh "" "" "$bits" < src/headers/bits-header if test "$bits" = 64 ; then @@ -33,5 +37,5 @@ else fi tools/gen-types-internal.sh "" "" "$bits" < src/headers/bits-${endian}endian -tools/gen-bits-internal.sh "$bits" "$dfmt" "$ofmt" "$xfmt" "$bfmt" +gen_bits "$bits" "$dfmt" "$ofmt" "$xfmt" "$bfmt" exec tools/gen-types-internal.sh "" "" "$bits" < src/headers/bits-footer diff --git a/tools/gen-sysdepsh.sh b/tools/gen-sysdepsh.sh @@ -0,0 +1,39 @@ +#!/bin/sh + +cat <<EOF +/* ISC license. */ + +#ifndef SYSDEPS_H +#define SYSDEPS_H + +#undef SKALIBS_TARGET +#define SKALIBS_TARGET "$1" + +EOF + +while read k v ; do + k=$(echo "${k%%:}" | tr a-z A-Z) + if test ${k} != ${k##SIGNED} ; then + echo "#undef SKALIBS_HASUN$k" + echo "#undef SKALIBS_HAS$k" + if test $v = yes ; then + echo "#define SKALIBS_HAS$k" + else + echo "#define SKALIBS_HASUN$k" + fi + elif test ${k} != ${k##SIZEOF} ; then + echo "#undef SKALIBS_HAS$k" + echo "#define SKALIBS_HAS$k $v" + elif test ${k} = ENDIANNESS ; then + echo '#undef SKALIBS_ENDIANNESS' + echo "#define SKALIBS_ENDIANNESS $v" + else + echo "#undef SKALIBS_HAS$k" + if test $v = yes ; then + echo "#define SKALIBS_HAS$k" + fi + fi + echo +done + +echo '#endif'