diff --git a/devel/ding-libs/files/extra-patch-Makefile.am b/devel/ding-libs/files/extra-patch-Makefile.am new file mode 100644 index 0000000..4990479 --- /dev/null +++ b/devel/ding-libs/files/extra-patch-Makefile.am @@ -0,0 +1,20 @@ +--- Makefile.am.orig 2014-05-09 20:57:53 UTC ++++ Makefile.am +@@ -42,7 +42,7 @@ + + DOXYGEN = @DOXYGEN@ + +-pkgconfigdir = $(libdir)/pkgconfig ++pkgconfigdir = $(prefix)/libdata/pkgconfig + + dist_pkgconfig_DATA = + dist_doc_DATA = +@@ -233,6 +233,8 @@ + dist_include_HEADERS += ini/ini_config.h ini/ini_configobj.h ini/ini_valueobj.h ini/ini_comment.h + + libini_config_la_SOURCES = \ ++ ini/flags.c \ ++ ini/fmemopen.c \ + ini/ini_config.c \ + ini/ini_config.h \ + ini/ini_get_value.c \ diff --git a/devel/ding-libs/files/extra-patch-ini__ini_fileobj.c b/devel/ding-libs/files/extra-patch-ini__ini_fileobj.c new file mode 100644 index 0000000..24d94ee --- /dev/null +++ b/devel/ding-libs/files/extra-patch-ini__ini_fileobj.c @@ -0,0 +1,12 @@ +--- ini/ini_fileobj.c.orig 2014-10-28 15:23:27 UTC ++++ ini/ini_fileobj.c +@@ -32,6 +32,9 @@ + #include "ini_config_priv.h" + #include "path_utils.h" + ++extern int __sflags(const char *, int *); ++FILE *fmemopen(void * __restrict, size_t, const char * __restrict); ++ + #define ICONV_BUFFER 5000 + + #define BOM4_SIZE 4 diff --git a/devel/ding-libs/files/extra-patch-ini__libini_config.sym b/devel/ding-libs/files/extra-patch-ini__libini_config.sym new file mode 100644 index 0000000..fcdf6342 --- /dev/null +++ b/devel/ding-libs/files/extra-patch-ini__libini_config.sym @@ -0,0 +1,11 @@ +--- ini/libini_config.sym.orig 2014-10-23 22:57:13 UTC ++++ ini/libini_config.sym +@@ -1,6 +1,8 @@ + INI_CONFIG_1.1.0 { + global: + /* ini_config.h */ ++ __sflags; ++ fmemopen; + config_from_file; + config_from_fd; + config_from_file_with_metadata; diff --git a/devel/ding-libs/files/flags.c b/devel/ding-libs/files/flags.c new file mode 100644 index 0000000..087c44a --- /dev/null +++ b/devel/ding-libs/files/flags.c @@ -0,0 +1,113 @@ +/*- + * Copyright (c) 1990, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Chris Torek. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#if defined(LIBC_SCCS) && !defined(lint) +static char sccsid[] = "@(#)flags.c 8.1 (Berkeley) 6/4/93"; +#endif /* LIBC_SCCS and not lint */ +#include +__FBSDID("$FreeBSD: head/lib/libc/stdio/flags.c 255303 2013-09-06 13:47:16Z jilles $"); + +#include +#include +#include +#include + +// #include "local.h" + +/* + * Return the (stdio) flags for a given mode. Store the flags + * to be passed to an _open() syscall through *optr. + * Return 0 on error. + */ +int +__sflags(const char *mode, int *optr) +{ + int ret, m, o, known; + + switch (*mode++) { + + case 'r': /* open for reading */ + ret = __SRD; + m = O_RDONLY; + o = 0; + break; + + case 'w': /* open for writing */ + ret = __SWR; + m = O_WRONLY; + o = O_CREAT | O_TRUNC; + break; + + case 'a': /* open for appending */ + ret = __SWR; + m = O_WRONLY; + o = O_CREAT | O_APPEND; + break; + + default: /* illegal mode */ + errno = EINVAL; + return (0); + } + + do { + known = 1; + switch (*mode++) { + case 'b': + /* 'b' (binary) is ignored */ + break; + case '+': + /* [rwa][b]\+ means read and write */ + ret = __SRW; + m = O_RDWR; + break; + case 'x': + /* 'x' means exclusive (fail if the file exists) */ + o |= O_EXCL; + break; + case 'e': + /* set close-on-exec */ + o |= O_CLOEXEC; + break; + default: + known = 0; + break; + } + } while (known); + + if ((o & O_EXCL) != 0 && m == O_RDONLY) { + errno = EINVAL; + return (0); + } + + *optr = m | o; + return (ret); +} diff --git a/devel/ding-libs/files/fmemopen.c b/devel/ding-libs/files/fmemopen.c new file mode 100644 index 0000000..559b36a --- /dev/null +++ b/devel/ding-libs/files/fmemopen.c @@ -0,0 +1,259 @@ +/*- + * Copyright (C) 2013 Pietro Cerutti + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +__FBSDID("$FreeBSD: head/lib/libc/stdio/fmemopen.c 266971 2014-06-02 13:48:57Z gahr $"); + +#include +#include +#include +#include +#include +#include +// #include "local.h" + +struct fmemopen_cookie +{ + char *buf; /* pointer to the memory region */ + bool own; /* did we allocate the buffer ourselves? */ + char bin; /* is this a binary buffer? */ + size_t size; /* buffer length in bytes */ + size_t len; /* data length in bytes */ + size_t off; /* current offset into the buffer */ +}; + +static int fmemopen_read(void *cookie, char *buf, int nbytes); +static int fmemopen_write(void *cookie, const char *buf, int nbytes); +static fpos_t fmemopen_seek(void *cookie, fpos_t offset, int whence); +static int fmemopen_close(void *cookie); + +FILE * +fmemopen(void * __restrict buf, size_t size, const char * __restrict mode) +{ + struct fmemopen_cookie *ck; + FILE *f; + int flags, rc; + + /* + * POSIX says we shall return EINVAL if size is 0. + */ + if (size == 0) { + errno = EINVAL; + return (NULL); + } + + /* + * Retrieve the flags as used by open(2) from the mode argument, and + * validate them. + */ + rc = __sflags(mode, &flags); + if (rc == 0) { + errno = EINVAL; + return (NULL); + } + + /* + * There's no point in requiring an automatically allocated buffer + * in write-only mode. + */ + if (!(flags & O_RDWR) && buf == NULL) { + errno = EINVAL; + return (NULL); + } + + ck = malloc(sizeof(struct fmemopen_cookie)); + if (ck == NULL) { + return (NULL); + } + + ck->off = 0; + ck->size = size; + + /* Check whether we have to allocate the buffer ourselves. */ + ck->own = ((ck->buf = buf) == NULL); + if (ck->own) { + ck->buf = malloc(size); + if (ck->buf == NULL) { + free(ck); + return (NULL); + } + } + + /* + * POSIX distinguishes between w+ and r+, in that w+ is supposed to + * truncate the buffer. + */ + if (ck->own || mode[0] == 'w') { + ck->buf[0] = '\0'; + } + + /* Check for binary mode. */ + ck->bin = strchr(mode, 'b') != NULL; + + /* + * The size of the current buffer contents is set depending on the + * mode: + * + * for append (text-mode), the position of the first NULL byte, or the + * size of the buffer if none is found + * + * for append (binary-mode), the size of the buffer + * + * for read, the size of the buffer + * + * for write, 0 + */ + switch (mode[0]) { + case 'a': + ck->off = ck->len = strnlen(ck->buf, ck->size); + break; + case 'r': + ck->len = size; + break; + case 'w': + ck->len = 0; + break; + } + + f = funopen(ck, + flags & O_WRONLY ? NULL : fmemopen_read, + flags & O_RDONLY ? NULL : fmemopen_write, + fmemopen_seek, fmemopen_close); + + if (f == NULL) { + if (ck->own) + free(ck->buf); + free(ck); + return (NULL); + } + + /* + * Turn off buffering, so a write past the end of the buffer + * correctly returns a short object count. + */ + setvbuf(f, NULL, _IONBF, 0); + + return (f); +} + +static int +fmemopen_read(void *cookie, char *buf, int nbytes) +{ + struct fmemopen_cookie *ck = cookie; + + if (nbytes > ck->len - ck->off) + nbytes = ck->len - ck->off; + + if (nbytes == 0) + return (0); + + memcpy(buf, ck->buf + ck->off, nbytes); + + ck->off += nbytes; + + return (nbytes); +} + +static int +fmemopen_write(void *cookie, const char *buf, int nbytes) +{ + struct fmemopen_cookie *ck = cookie; + + if (nbytes > ck->size - ck->off) + nbytes = ck->size - ck->off; + + if (nbytes == 0) + return (0); + + memcpy(ck->buf + ck->off, buf, nbytes); + + ck->off += nbytes; + + if (ck->off > ck->len) + ck->len = ck->off; + + /* + * We append a NULL byte if all these conditions are met: + * - the buffer is not binary + * - the buffer is not full + * - the data just written doesn't already end with a NULL byte + */ + if (!ck->bin && ck->off < ck->size && ck->buf[ck->off - 1] != '\0') + ck->buf[ck->off] = '\0'; + + return (nbytes); +} + +static fpos_t +fmemopen_seek(void *cookie, fpos_t offset, int whence) +{ + struct fmemopen_cookie *ck = cookie; + + + switch (whence) { + case SEEK_SET: + if (offset > ck->size) { + errno = EINVAL; + return (-1); + } + ck->off = offset; + break; + + case SEEK_CUR: + if (ck->off + offset > ck->size) { + errno = EINVAL; + return (-1); + } + ck->off += offset; + break; + + case SEEK_END: + if (offset > 0 || -offset > ck->len) { + errno = EINVAL; + return (-1); + } + ck->off = ck->len + offset; + break; + + default: + errno = EINVAL; + return (-1); + } + + return (ck->off); +} + +static int +fmemopen_close(void *cookie) +{ + struct fmemopen_cookie *ck = cookie; + + if (ck->own) + free(ck->buf); + + free(ck); + + return (0); +} diff --git a/devel/ding-libs/files/patch-ini__ini_parse_ut.c b/devel/ding-libs/files/patch-ini__ini_parse_ut.c new file mode 100644 index 0000000..afb5bf7 --- /dev/null +++ b/devel/ding-libs/files/patch-ini__ini_parse_ut.c @@ -0,0 +1,10 @@ +--- ini/ini_parse_ut.c.orig 2014-05-09 20:57:53 UTC ++++ ini/ini_parse_ut.c +@@ -26,6 +26,7 @@ + #include + #include + #include ++#include + #include "ini_defines.h" + #include "ini_configobj.h" + #include "ini_config_priv.h" diff --git a/devel/ding-libs/Makefile b/devel/ding-libs/Makefile index cda2d1a..d69ce76 100644 --- a/devel/ding-libs/Makefile +++ b/devel/ding-libs/Makefile @@ -3,6 +3,7 @@ PORTNAME= ding-libs DISTVERSION= 0.4.0 +PORTREVISION= 0 CATEGORIES= devel MASTER_SITES= https://fedorahosted.org/released/${PORTNAME}/ @@ -12,9 +13,14 @@ COMMENT= Collection of useful libraries for developers LICENSE= GPLv3 GNU_CONFIGURE= yes -CPPFLAGS+= -I${LOCALBASE}/include -L${LOCALBASE}/lib -USES= gettext libtool pkgconfig +CPPFLAGS+= -I${LOCALBASE}/include +LIBS+= -L/usr/local/lib -liconv -lintl + +USE_AUTOTOOLS= libtoolize aclocal autoconf autoheader automake +AUTOMAKE_ARGS= -a -c -f + +USES= iconv gettext libtool pkgconfig USE_LDCONFIG= yes INSTALL_TARGET= install-strip @@ -30,11 +36,22 @@ CONFIGURE_ARGS= --docdir=${DOCSDIR} CONFIGURE_ARGS= --docdir=/dev/null .endif +#fmemopen was commit r246120 +.if ${OSVERSION} < 901502 +EXTRA_PATCHES= ${FILESDIR}/extra-patch-Makefile.am \ + ${FILESDIR}/extra-patch-ini__libini_config.sym \ + ${FILESDIR}/extra-patch-ini__ini_fileobj.c +.endif + post-patch: - @${REINPLACE_CMD} -e 's|libdir)/pkgconfig|prefix)/libdata/pkgconfig|' ${WRKSRC}/Makefile.in + @${REINPLACE_CMD} -e 's|libdir)/pkgconfig|prefix)/libdata/pkgconfig|' ${WRKSRC}/Makefile.am @${REINPLACE_CMD} -e 's|malloc.h|stdlib.h|g' ${WRKSRC}/collection/collection_tools.c \ ${WRKSRC}/refarray/ref_array.c - @${REINPLACE_CMD} -e 's|if git log -1 &>/dev/null; then|if true; then|g' \ - ${WRKSRC}/configure + @${REINPLACE_CMD} -e 's|git log -1 &>/dev/null|true|g' \ + ${WRKSRC}/configure.ac +.if ${OSVERSION} < 901502 + @${CP} ${FILESDIR}/fmemopen.c ${WRKSRC}/ini/fmemopen.c + @${CP} ${FILESDIR}/flags.c ${WRKSRC}/ini/flags.c +.endif .include