From 2af587d68d11b1826c356364b4e9679199eee2ed Mon Sep 17 00:00:00 2001 From: Laurent Bercot Date: Thu, 18 May 2023 02:19:59 +0000 Subject: Add slurpn, refactor slurp, fix avltree/cdbmake bugs, add strerr_warnf Signed-off-by: Laurent Bercot --- NEWS | 3 +++ package/deps.mak | 6 +++-- src/include/skalibs/avltree.h | 2 +- src/include/skalibs/cdbmake.h | 2 +- src/include/skalibs/djbunix.h | 8 +++++++ src/include/skalibs/strerr.h | 52 +++++++++++++++++++++++++++++++++++++++++ src/libstddjb/openslurpclose.c | 8 +------ src/libstddjb/openslurpnclose.c | 13 +++++++++++ src/libstddjb/slurp.c | 26 +-------------------- src/libstddjb/slurpn.c | 35 +++++++++++++++++++++++++++ 10 files changed, 119 insertions(+), 36 deletions(-) create mode 100644 src/libstddjb/openslurpnclose.c create mode 100644 src/libstddjb/slurpn.c diff --git a/NEWS b/NEWS index cc7f57d..3ab6bd1 100644 --- a/NEWS +++ b/NEWS @@ -3,7 +3,10 @@ Changelog for skalibs. In 2.13.2.0 ----------- + - Bugfixes. - New accessor function: selfpipe_fd(). + - New functions: slurpn(), openslurpnclose(). + - New strerr macros to warn with a "fatal" message In 2.13.1.1 diff --git a/package/deps.mak b/package/deps.mak index 787e042..3e16015 100644 --- a/package/deps.mak +++ b/package/deps.mak @@ -438,7 +438,8 @@ src/libstddjb/openc_write.o src/libstddjb/openc_write.lo: src/libstddjb/openc_wr src/libstddjb/openreadfileclose.o src/libstddjb/openreadfileclose.lo: src/libstddjb/openreadfileclose.c src/include/skalibs/allreadwrite.h src/include/skalibs/djbunix.h src/include/skalibs/stralloc.h src/libstddjb/openreadnclose.o src/libstddjb/openreadnclose.lo: src/libstddjb/openreadnclose.c src/include/skalibs/djbunix.h src/libstddjb/openreadnclose_nb.o src/libstddjb/openreadnclose_nb.lo: src/libstddjb/openreadnclose_nb.c src/include/skalibs/djbunix.h -src/libstddjb/openslurpclose.o src/libstddjb/openslurpclose.lo: src/libstddjb/openslurpclose.c src/include/skalibs/djbunix.h src/include/skalibs/stralloc.h +src/libstddjb/openslurpclose.o src/libstddjb/openslurpclose.lo: src/libstddjb/openslurpclose.c src/include/skalibs/djbunix.h +src/libstddjb/openslurpnclose.o src/libstddjb/openslurpnclose.lo: src/libstddjb/openslurpnclose.c src/include/skalibs/djbunix.h src/libstddjb/openwritenclose.o src/libstddjb/openwritenclose.lo: src/libstddjb/openwritenclose.c src/include/skalibs/djbunix.h src/libstddjb/openwritenclose_suffix.o src/libstddjb/openwritenclose_suffix.lo: src/libstddjb/openwritenclose_suffix.c src/include/skalibs/djbunix.h src/libstddjb/openwritenclose_unsafe.o src/libstddjb/openwritenclose_unsafe.lo: src/libstddjb/openwritenclose_unsafe.c src/include/skalibs/djbunix.h @@ -493,7 +494,8 @@ src/libstddjb/skagetlnmaxsep.o src/libstddjb/skagetlnmaxsep.lo: src/libstddjb/sk src/libstddjb/skagetlnsep.o src/libstddjb/skagetlnsep.lo: src/libstddjb/skagetlnsep.c src/include/skalibs/buffer.h src/include/skalibs/siovec.h src/include/skalibs/skamisc.h src/include/skalibs/stralloc.h src/libstddjb/skagetlnsep_loose.o src/libstddjb/skagetlnsep_loose.lo: src/libstddjb/skagetlnsep_loose.c src/include/skalibs/skamisc.h src/include/skalibs/stralloc.h src/libstddjb/skalibs_tzisright.o src/libstddjb/skalibs_tzisright.lo: src/libstddjb/skalibs_tzisright.c src/libstddjb/djbtime-internal.h -src/libstddjb/slurp.o src/libstddjb/slurp.lo: src/libstddjb/slurp.c src/include/skalibs/allreadwrite.h src/include/skalibs/djbunix.h src/include/skalibs/stralloc.h +src/libstddjb/slurp.o src/libstddjb/slurp.lo: src/libstddjb/slurp.c src/include/skalibs/djbunix.h +src/libstddjb/slurpn.o src/libstddjb/slurpn.lo: src/libstddjb/slurpn.c src/include/skalibs/allreadwrite.h src/include/skalibs/djbunix.h src/include/skalibs/stralloc.h src/libstddjb/socket_accept4.o src/libstddjb/socket_accept4.lo: src/libstddjb/socket_accept4.c src/include/skalibs/djbunix.h src/include/skalibs/nonposix.h src/include/skalibs/socket.h src/include/skalibs/sysdeps.h src/include/skalibs/uint16.h src/libstddjb/socket_accept4_u32.o src/libstddjb/socket_accept4_u32.lo: src/libstddjb/socket_accept4_u32.c src/include/skalibs/socket.h src/include/skalibs/uint32.h src/libstddjb/socket_accept6.o src/libstddjb/socket_accept6.lo: src/libstddjb/socket_accept6.c src/include/skalibs/djbunix.h src/include/skalibs/ip46.h src/include/skalibs/nonposix.h src/include/skalibs/socket.h src/include/skalibs/sysdeps.h src/include/skalibs/uint16.h diff --git a/src/include/skalibs/avltree.h b/src/include/skalibs/avltree.h index 5840395..11f1f23 100644 --- a/src/include/skalibs/avltree.h +++ b/src/include/skalibs/avltree.h @@ -51,8 +51,8 @@ extern int avltree_insert (avltree *, uint32_t) ; extern int avltree_delete (avltree *, void const *) ; -#define avltree_iter(t, f, p) avlnode_iter(avltree_nodes(t), avltree_totalsize(t), avltree_root(t), f, p) #define avltree_iter_nocancel(t, cut, f, p) avlnode_iter(avltree_nodes(t), avltree_totalsize(t), cut, avltree_root(t), f, p) +#define avltree_iter(t, f, p) avltree_iter_nocancel(t, avltree_totalsize(t), f, p) #define avltree_iter_withcancel(t, f, cancelf, p) avlnode_iter_withcancel(avltree_nodes(t), avltree_totalsize(t), avltree_root(t), f, cancelf, p) #endif diff --git a/src/include/skalibs/cdbmake.h b/src/include/skalibs/cdbmake.h index 26fcba5..0da0a86 100644 --- a/src/include/skalibs/cdbmake.h +++ b/src/include/skalibs/cdbmake.h @@ -22,7 +22,7 @@ struct cdbmaker_s #define CDBMAKER_ZERO { .hplist = GENALLOC_ZERO, .pos = 2048, .b = BUFFER_INIT(&fd_writev, -1, 0, 0) } extern int cdbmake_start (cdbmaker *, int) ; -extern int cdbmake_add (cdbmaker *, char const *, unsigned int, char const *, unsigned int) ; +extern int cdbmake_add (cdbmaker *, char const *, uint32_t, char const *, uint32_t) ; extern int cdbmake_finish (cdbmaker *) ; #endif diff --git a/src/include/skalibs/djbunix.h b/src/include/skalibs/djbunix.h index cae59b4..5401515 100644 --- a/src/include/skalibs/djbunix.h +++ b/src/include/skalibs/djbunix.h @@ -84,6 +84,14 @@ extern int sagethostname (stralloc *) ; extern int slurp (stralloc *, int) ; extern int openslurpclose (stralloc *, char const *) ; +/* + TODO: next ABI break: change to +#define slurp(sa, fd) slurpn((fd), (sa), 0) +#define openslurpclose(sa, fn) openslurpnclose((fn), (sa), 0) +*/ + +extern int slurpn (int, stralloc *, size_t) ; +extern int openslurpnclose (char const *, stralloc *, size_t) ; extern ssize_t readnclose (int fd, char *, size_t) ; /* closes fd */ extern ssize_t openreadnclose (char const *, char *, size_t) ; extern ssize_t openreadnclose_nb (char const *, char *, size_t) ; diff --git a/src/include/skalibs/strerr.h b/src/include/skalibs/strerr.h index d2b7492..648a104 100644 --- a/src/include/skalibs/strerr.h +++ b/src/include/skalibs/strerr.h @@ -25,6 +25,8 @@ extern char const *PROG ; #define strerr_warnwn(n, ...) strerr_warnn((n)+2, PROG, ": warning: ", __VA_ARGS__) #define strerr_warnwnsys(n, ...) strerr_warnnsys((n)+2, PROG, ": warning: ", __VA_ARGS__) +#define strerr_warnfn(n, ...) strerr_warnn((n)+2, PROG, ": fatal: ", __VA_ARGS__) +#define strerr_warnfnsys(n, ...) strerr_warnnsys((n)+2, PROG, ": fatal: ", __VA_ARGS__) #define strerr_diewn(e, n, ...) strerr_dien(e, (n)+2, PROG, ": warning: ", __VA_ARGS__) #define strerr_diewnsys(e, n, ...) strerr_diensys(e, (n)+2, PROG, ": warning: ", __VA_ARGS__) #define strerr_diefn(e, n, ...) strerr_dien(e, (n)+2, PROG, ": fatal: ", __VA_ARGS__) @@ -32,6 +34,8 @@ extern char const *PROG ; #define strerr_warnw(...) strerr_warn(PROG, ": warning: ", __VA_ARGS__) #define strerr_warnwsys(...) strerr_warnsys(PROG, ": warning: ", __VA_ARGS__) +#define strerr_warnf(...) strerr_warn(PROG, ": fatal: ", __VA_ARGS__) +#define strerr_warnfsys(...) strerr_warnsys(PROG, ": fatal: ", __VA_ARGS__) #define strerr_diew(e, ...) strerr_die(e, PROG, ": warning: ", __VA_ARGS__) #define strerr_diewsys(e, ...) strerr_diesys(e, PROG, ": warning: ", __VA_ARGS__) #define strerr_dief(e, ...) strerr_die(e, PROG, ": fatal: ", __VA_ARGS__) @@ -39,6 +43,8 @@ extern char const *PROG ; #define strerr_warnwun(n, ...) strerr_warnwn((n)+1, "unable to ", __VA_ARGS__) #define strerr_warnwunsys(n, ...) strerr_warnwnsys((n)+1, "unable to ", __VA_ARGS__) +#define strerr_warnfun(n, ...) strerr_warnfn((n)+1, "unable to ", __VA_ARGS__) +#define strerr_warnfunsys(n, ...) strerr_warnfnsys((n)+1, "unable to ", __VA_ARGS__) #define strerr_diewun(e, n, ...) strerr_diewn(e, (n)+1, "unable to ", __VA_ARGS__) #define strerr_diewunsys(e, n, ...) strerr_diewnsys(e, (n)+1, "unable to ", __VA_ARGS__) #define strerr_diefun(e, n, ...) strerr_diefn(e, (n)+1, ": unable to ", __VA_ARGS__) @@ -46,6 +52,8 @@ extern char const *PROG ; #define strerr_warnwu(...) strerr_warnw("unable to ", __VA_ARGS__) #define strerr_warnwusys(...) strerr_warnwsys("unable to ", __VA_ARGS__) +#define strerr_warnfu(...) strerr_warnf("unable to ", __VA_ARGS__) +#define strerr_warnfusys(...) strerr_warnfsys("unable to ", __VA_ARGS__) #define strerr_diewu(e, ...) strerr_diew(e, "unable to ", __VA_ARGS__) #define strerr_diewusys(e, ...) strerr_diewsys(e, "unable to ", __VA_ARGS__) #define strerr_diefu(e, ...) strerr_dief(e, "unable to ", __VA_ARGS__) @@ -91,6 +99,28 @@ extern char const *PROG ; #define strerr_warnw9sys(x1, x2, x3, x4, x5, x6, x7, x8, x9) strerr_warnwnsys(9, x1, x2, x3, x4, x5, x6, x7, x8, x9) #define strerr_warnw10sys(x1, x2, x3, x4, x5, x6, x7, x8, x9, x10) strerr_warnwnsys(10, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10) +#define strerr_warnf1x(x1) strerr_warnfn(1, x1) +#define strerr_warnf2x(x1, x2) strerr_warnfn(2, x1, x2) +#define strerr_warnf3x(x1, x2, x3) strerr_warnfn(3, x1, x2, x3) +#define strerr_warnf4x(x1, x2, x3, x4) strerr_warnfn(4, x1, x2, x3, x4) +#define strerr_warnf5x(x1, x2, x3, x4, x5) strerr_warnfn(5, x1, x2, x3, x4, x5) +#define strerr_warnf6x(x1, x2, x3, x4, x5, x6) strerr_warnfn(6, x1, x2, x3, x4, x5, x6) +#define strerr_warnf7x(x1, x2, x3, x4, x5, x6, x7) strerr_warnfn(7, x1, x2, x3, x4, x5, x6, x7) +#define strerr_warnf8x(x1, x2, x3, x4, x5, x6, x7, x8) strerr_warnfn(8, x1, x2, x3, x4, x5, x6, x7, x8) +#define strerr_warnf9x(x1, x2, x3, x4, x5, x6, x7, x8, x9) strerr_warnfn(9, x1, x2, x3, x4, x5, x6, x7, x8, x9) +#define strerr_warnf10x(x1, x2, x3, x4, x5, x6, x7, x8, x9, x10) strerr_warnfn(10, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10) + +#define strerr_warnf1sys(x1) strerr_warnfnsys(1, x1) +#define strerr_warnf2sys(x1, x2) strerr_warnfnsys(2, x1, x2) +#define strerr_warnf3sys(x1, x2, x3) strerr_warnfnsys(3, x1, x2, x3) +#define strerr_warnf4sys(x1, x2, x3, x4) strerr_warnfnsys(4, x1, x2, x3, x4) +#define strerr_warnf5sys(x1, x2, x3, x4, x5) strerr_warnfnsys(5, x1, x2, x3, x4, x5) +#define strerr_warnf6sys(x1, x2, x3, x4, x5, x6) strerr_warnfnsys(6, x1, x2, x3, x4, x5, x6) +#define strerr_warnf7sys(x1, x2, x3, x4, x5, x6, x7) strerr_warnfnsys(7, x1, x2, x3, x4, x5, x6, x7) +#define strerr_warnf8sys(x1, x2, x3, x4, x5, x6, x7, x8) strerr_warnfnsys(8, x1, x2, x3, x4, x5, x6, x7, x8) +#define strerr_warnf9sys(x1, x2, x3, x4, x5, x6, x7, x8, x9) strerr_warnfnsys(9, x1, x2, x3, x4, x5, x6, x7, x8, x9) +#define strerr_warnf10sys(x1, x2, x3, x4, x5, x6, x7, x8, x9, x10) strerr_warnfnsys(10, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10) + #define strerr_diew1x(e, x1) strerr_diewn(e, 1, x1) #define strerr_diew2x(e, x1, x2) strerr_diewn(e, 2, x1, x2) #define strerr_diew3x(e, x1, x2, x3) strerr_diewn(e, 3, x1, x2, x3) @@ -157,6 +187,28 @@ extern char const *PROG ; #define strerr_warnwu9sys(x1, x2, x3, x4, x5, x6, x7, x8, x9) strerr_warnwunsys(9, x1, x2, x3, x4, x5, x6, x7, x8, x9) #define strerr_warnwu10sys(x1, x2, x3, x4, x5, x6, x7, x8, x9, x10) strerr_warnwunsys(10, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10) +#define strerr_warnfu1x(x1) strerr_warnfun(1, x1) +#define strerr_warnfu2x(x1, x2) strerr_warnfun(2, x1, x2) +#define strerr_warnfu3x(x1, x2, x3) strerr_warnfun(3, x1, x2, x3) +#define strerr_warnfu4x(x1, x2, x3, x4) strerr_warnfun(4, x1, x2, x3, x4) +#define strerr_warnfu5x(x1, x2, x3, x4, x5) strerr_warnfun(5, x1, x2, x3, x4, x5) +#define strerr_warnfu6x(x1, x2, x3, x4, x5, x6) strerr_warnfun(6, x1, x2, x3, x4, x5, x6) +#define strerr_warnfu7x(x1, x2, x3, x4, x5, x6, x7) strerr_warnfun(7, x1, x2, x3, x4, x5, x6, x7) +#define strerr_warnfu8x(x1, x2, x3, x4, x5, x6, x7, x8) strerr_warnfun(8, x1, x2, x3, x4, x5, x6, x7, x8) +#define strerr_warnfu9x(x1, x2, x3, x4, x5, x6, x7, x8, x9) strerr_warnfun(9, x1, x2, x3, x4, x5, x6, x7, x8, x9) +#define strerr_warnfu10x(x1, x2, x3, x4, x5, x6, x7, x8, x9, x10) strerr_warnfun(10, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10) + +#define strerr_warnfu1sys(x1) strerr_warnfunsys(1, x1) +#define strerr_warnfu2sys(x1, x2) strerr_warnfunsys(2, x1, x2) +#define strerr_warnfu3sys(x1, x2, x3) strerr_warnfunsys(3, x1, x2, x3) +#define strerr_warnfu4sys(x1, x2, x3, x4) strerr_warnfunsys(4, x1, x2, x3, x4) +#define strerr_warnfu5sys(x1, x2, x3, x4, x5) strerr_warnfunsys(5, x1, x2, x3, x4, x5) +#define strerr_warnfu6sys(x1, x2, x3, x4, x5, x6) strerr_warnfunsys(6, x1, x2, x3, x4, x5, x6) +#define strerr_warnfu7sys(x1, x2, x3, x4, x5, x6, x7) strerr_warnfunsys(7, x1, x2, x3, x4, x5, x6, x7) +#define strerr_warnfu8sys(x1, x2, x3, x4, x5, x6, x7, x8) strerr_warnfunsys(8, x1, x2, x3, x4, x5, x6, x7, x8) +#define strerr_warnfu9sys(x1, x2, x3, x4, x5, x6, x7, x8, x9) strerr_warnfunsys(9, x1, x2, x3, x4, x5, x6, x7, x8, x9) +#define strerr_warnfu10sys(x1, x2, x3, x4, x5, x6, x7, x8, x9, x10) strerr_warnfunsys(10, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10) + #define strerr_diewu1x(e, x1) strerr_diewun(e, 1, x1) #define strerr_diewu2x(e, x1, x2) strerr_diewun(e, 2, x1, x2) #define strerr_diewu3x(e, x1, x2, x3) strerr_diewun(e, 3, x1, x2, x3) diff --git a/src/libstddjb/openslurpclose.c b/src/libstddjb/openslurpclose.c index 8485413..e6b0570 100644 --- a/src/libstddjb/openslurpclose.c +++ b/src/libstddjb/openslurpclose.c @@ -1,14 +1,8 @@ /* ISC license. */ -#include #include int openslurpclose (stralloc *sa, char const *fn) { - int r ; - int fd = openbc_read(fn) ; - if (fd == -1) return 0 ; - r = slurp(sa, fd) ; - fd_close(fd) ; - return r ; + return openslurpnclose(fn, sa, 0) ; } diff --git a/src/libstddjb/openslurpnclose.c b/src/libstddjb/openslurpnclose.c new file mode 100644 index 0000000..3672e16 --- /dev/null +++ b/src/libstddjb/openslurpnclose.c @@ -0,0 +1,13 @@ +/* ISC license. */ + +#include + +int openslurpnclose (char const *fn, stralloc *sa, size_t max) +{ + int r ; + int fd = openbc_read(fn) ; + if (fd == -1) return 0 ; + r = slurpn(fd, sa, max) ; + fd_close(fd) ; + return r ; +} diff --git a/src/libstddjb/slurp.c b/src/libstddjb/slurp.c index 7437142..eccd833 100644 --- a/src/libstddjb/slurp.c +++ b/src/libstddjb/slurp.c @@ -1,32 +1,8 @@ /* ISC license. */ -#include - -#include -#include #include -#define N 4096 - int slurp (stralloc *sa, int fd) { - size_t sabase = sa->len ; - int wasnull = !sa->s ; - for (;;) - { - ssize_t r ; - if (!stralloc_readyplus(sa, N)) break ; - r = fd_read(fd, sa->s + sa->len, N) ; - switch (r) - { - case -1 : goto err ; - case 0 : return 1 ; - default : sa->len += r ; - } - } - -err: - if (wasnull) stralloc_free(sa) ; - else sa->len = sabase ; - return 0 ; + return slurpn(fd, sa, 0) ; } diff --git a/src/libstddjb/slurpn.c b/src/libstddjb/slurpn.c new file mode 100644 index 0000000..c9c5c11 --- /dev/null +++ b/src/libstddjb/slurpn.c @@ -0,0 +1,35 @@ +/* ISC license. */ + +#include +#include + +#include +#include +#include + +#define N 4096 + +int slurpn (int fd, stralloc *sa, size_t max) +{ + size_t sabase = sa->len ; + int wasnull = !sa->s ; + for (;;) + { + ssize_t r ; + size_t n = max && sa->len + N > max ? max - sa->len : N ; + if (!n) { errno = ENOBUFS ; goto err ; } + if (!stralloc_readyplus(sa, n)) break ; + r = fd_read(fd, sa->s + sa->len, n) ; + switch (r) + { + case -1 : goto err ; + case 0 : return 1 ; + default : sa->len += r ; + } + } + +err: + if (wasnull) stralloc_free(sa) ; + else sa->len = sabase ; + return 0 ; +} -- cgit v1.2.3