Hello community, here is the log from the commit of package libite for openSUSE:Factory checked in at 2019-08-28 18:35:06 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/libite (Old) and /work/SRC/openSUSE:Factory/.libite.new.7948 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "libite" Wed Aug 28 18:35:06 2019 rev:3 rq:726464 version:2.1.0 Changes: -------- --- /work/SRC/openSUSE:Factory/libite/libite.changes 2018-07-31 15:59:39.143572178 +0200 +++ /work/SRC/openSUSE:Factory/.libite.new.7948/libite.changes 2019-08-28 18:35:07.869287367 +0200 @@ -1,0 +2,15 @@ +Tue Aug 27 10:10:20 UTC 2019 - Martin Hauke <[email protected]> + +- Update to version 2.1.0 + Changes + * Add support for strmatch() and strnmatch() + * Add support for yorn(), safe yes-or-no prompt + * Add support for telnet expect/session APIs + * Add modified printhdr() which takes ANSI attribute + Fixes + * Fix pidfile_signal(): always return result of kill(), or the + result of remove() if we successfully sent SIGKILL + * Fix strtonum(): POSIX strtoll() returns EINVAL, check that + * Fix #13, support C++ extern "C" {} for header files + +------------------------------------------------------------------- Old: ---- libite-2.0.2.tar.gz New: ---- libite-2.1.0.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ libite.spec ++++++ --- /var/tmp/diff_new_pack.sU4y1V/_old 2019-08-28 18:35:08.509287256 +0200 +++ /var/tmp/diff_new_pack.sU4y1V/_new 2019-08-28 18:35:08.513287255 +0200 @@ -1,7 +1,7 @@ # # spec file for package libite # -# Copyright (c) 2018 SUSE LINUX GmbH, Nuernberg, Germany. +# Copyright (c) 2019 SUSE LINUX GmbH, Nuernberg, Germany. # Copyright (c) 2018, Martin Hauke <[email protected]> # # All modifications and additions to the file contributed by third parties @@ -13,13 +13,13 @@ # license that conforms to the Open Source Definition (Version 1.9) # published by the Open Source Initiative. -# Please submit bugfixes or comments via http://bugs.opensuse.org/ +# Please submit bugfixes or comments via https://bugs.opensuse.org/ # %define sover 5 Name: libite -Version: 2.0.2 +Version: 2.1.0 Release: 0 Summary: BSD function library License: MIT AND X11 ++++++ libite-2.0.2.tar.gz -> libite-2.1.0.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libite-2.0.2/ChangeLog.md new/libite-2.1.0/ChangeLog.md --- old/libite-2.0.2/ChangeLog.md 2018-05-10 19:13:56.000000000 +0200 +++ new/libite-2.1.0/ChangeLog.md 2019-08-26 21:59:57.000000000 +0200 @@ -3,6 +3,21 @@ All notable changes to the project are documented in this file. +[v2.1.0][] - 2019-08-26 +----------------------- + +### Changes +- Add support for `strmatch()` and `strnmatch()` +- Add support for `yorn()`, safe yes-or-no prompt +- Add support for telnet expect/session APIs +- Add modified `printhdr()` which takes ANSI attribute + +### Fixes +- Fix `pidfile_signal()`: always return result of `kill()`, or the + result of `remove()` if we successfully sent `SIGKILL` +- Fix `strtonum()`: POSIX `strtoll()` returns `EINVAL`, check that +- Fix #13, support C++ `extern "C" {}` for header files + [v2.0.2][] - 2018-05-10 ----------------------- @@ -324,7 +339,8 @@ Initial extraction of frog DNA from [Finit][]. See [README][] for API details. -[UNRELEASED]: https://github.com/troglobit/libite/compare/v2.0.2...HEAD +[UNRELEASED]: https://github.com/troglobit/libite/compare/v2.1.0...HEAD +[v2.1.0]: https://github.com/troglobit/libite/compare/v2.0.2...v2.1.0 [v2.0.2]: https://github.com/troglobit/libite/compare/v2.0.1...v2.0.2 [v2.0.1]: https://github.com/troglobit/libite/compare/v2.0.0...v2.0.1 [v2.0.0]: https://github.com/troglobit/libite/compare/v1.9.3...v2.0.0 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libite-2.0.2/Makefile.am new/libite-2.1.0/Makefile.am --- old/libite-2.0.2/Makefile.am 2018-05-10 19:13:56.000000000 +0200 +++ new/libite-2.1.0/Makefile.am 2019-08-26 21:59:57.000000000 +0200 @@ -1,6 +1,6 @@ ACLOCAL_AMFLAGS = -I m4 -doc_DATA = README.md LICENSE +doc_DATA = README.md LICENSE ChangeLog.md EXTRA_DIST = README.md LICENSE ChangeLog.md pkgconfigdir = $(libdir)/pkgconfig pkgconfig_DATA = libite.pc diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libite-2.0.2/README.md new/libite-2.1.0/README.md --- old/libite-2.0.2/README.md 2018-05-10 19:13:56.000000000 +0200 +++ new/libite-2.1.0/README.md 2019-08-26 21:59:57.000000000 +0200 @@ -284,6 +284,20 @@ `delete`, it is now called `opt`. The APIs are 100% compatible if the value `1` was used. +- `strmatch()`, `strnmatch()` + + Find matching string in an array of strings. Returns index in array + on match, or `-1` on error or not found. + +- `telnet_open(), telnet_close(), telnet_expect()` + + Poor mans telnet expect in C. Opens connection to a Telnet service; + FTP, Telnet, similar, and run an expect-like script. + +- `telnet_session()` + + Wrapper for the above three in one API. + - `tempfile()` Secure replacement for `tmpfile()`. Creates an invisible temporary @@ -303,6 +317,11 @@ **Note:** `which("/bin/ps aux")` will return `/bin/ps`, or `TRUE`, provided of course `/bin/ps` exists. +- `yorn(fmt, ...)` + + Pose a question to user, appended with `(y/N)?`, returns `TRUE` for + yes (both `y` and `Y` are handled) and `FALSE` for everything else. + GNU Functions ------------- @@ -384,9 +403,9 @@ sudo make install-strip sudo ldconfig -**Note:** When checking code from GitHub, use <kbd>./autogen.sh</kbd> to -generate a `configure` script. It is a generated file and otherwise only -included in released tarballs. +**Note:** When checking out code from GIT, use <kbd>./autogen.sh</kbd> +to generate a `configure` script. It is a generated file and otherwise +only included in released tarballs. [1]: https://github.com/troglobit/finit diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libite-2.0.2/configure.ac new/libite-2.1.0/configure.ac --- old/libite-2.0.2/configure.ac 2018-05-10 19:13:56.000000000 +0200 +++ new/libite-2.1.0/configure.ac 2019-08-26 21:59:57.000000000 +0200 @@ -1,4 +1,4 @@ -AC_INIT(libite, 2.0.2, https://github.com/troglobit/libite/issues) +AC_INIT(libite, 2.1.0, https://github.com/troglobit/libite/issues) AM_INIT_AUTOMAKE([1.11 foreign no-dist-gzip dist-xz]) AM_SILENT_RULES([yes]) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libite-2.0.2/debian/changelog new/libite-2.1.0/debian/changelog --- old/libite-2.0.2/debian/changelog 2018-05-10 19:13:56.000000000 +0200 +++ new/libite-2.1.0/debian/changelog 2019-08-26 21:59:57.000000000 +0200 @@ -1,3 +1,10 @@ +libite (2.1.0) unstable; urgency=medium + + * New functions; strmatch(), strnmatch(), yorn(), telnet expect APIs + * Fixes to pidfile_signal(), strtonum() and C++ linking + + -- Joachim Nilsson <[email protected]> Mon, 26 Aug 2019 20:21:46 +0200 + libite (2.0.2) unstable; urgency=medium * Fix issues with using `strlite.h` standalone diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libite-2.0.2/debian/compat new/libite-2.1.0/debian/compat --- old/libite-2.0.2/debian/compat 2018-05-10 19:13:56.000000000 +0200 +++ new/libite-2.1.0/debian/compat 2019-08-26 21:59:57.000000000 +0200 @@ -1 +1 @@ -9 +10 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libite-2.0.2/debian/control new/libite-2.1.0/debian/control --- old/libite-2.0.2/debian/control 2018-05-10 19:13:56.000000000 +0200 +++ new/libite-2.1.0/debian/control 2019-08-26 21:59:57.000000000 +0200 @@ -1,18 +1,18 @@ Source: libite Priority: optional Maintainer: Joachim Nilsson <[email protected]> -Build-Depends: dpkg-dev (>= 1.14.9), debhelper (>= 9), dh-autoreconf -Standards-Version: 3.9.6 +Build-Depends: dpkg-dev (>= 1.14.9), debhelper (>= 10) +Standards-Version: 4.1.0 Section: libs Homepage: https://github.com/troglobit/libite/ Vcs-Git: https://github.com/troglobit/libite.git Vcs-Browser: https://github.com/troglobit/libite/ Package: libite-dev -Priority: extra +Priority: optional Section: libdevel Architecture: any -Depends: ${misc:Depends}, libite (= ${binary:Version}) +Depends: ${misc:Depends}, libite5 (= ${binary:Version}) Description: static library, header files, and docs for libite Static library, header files, and documentation for libite. . @@ -31,21 +31,22 @@ license used by OpenBSD, and BSD licenses, all of them are extremely liberal and can be used freely in proprietary software if needed. -Package: libite +Package: libite5 Architecture: any Depends: ${misc:Depends}, ${shlibs:Depends} -Description: That missing frog DNA you've been looking for. MIT/X11/ISC/BSD License. - Libite is a lightweight library of frog DNA. It can be used to fill the - gaps in any dinosaur project. It holds useful functions and macros - developed by both Finit and the OpenBSD project. Most notably the - string functions: strlcpy(3), strlcat(3) and the highly useful *BSD - sys/queue.h and sys/tree.h API's. +Description: That missing frog DNA you've been looking for. + Libite, or -lite, is a lightweight library of frog DNA. It can be used + to fill the gaps in any dinosaur project. It holds useful functions + and macros developed by both Finit and the OpenBSD project. Most + notably the string functions: strlcpy(3), strlcat(3) and the highly + useful *BSD sys/queue.h and sys/tree.h API's. . - Libite is the frog DNA missing in GNU libc. However, -lite does not aim - to become another GLIB! One noticeable gap in GLIBC is the missing + Libite is the frog DNA missing in GNU libc. However, -lite does not + aim to become another GLIB! One noticeable gap in GLIBC is the missing _SAFE macros in the BSD sys/queue.h API — highly recommended when traversing lists to delete/free nodes. . - The code is open sourced under a mix of the MIT/X11 license, the ISC - license used by OpenBSD, and BSD licenses, all of them are extremely - liberal and can be used freely in proprietary software if needed. + The code is open source software under a mix of the MIT/X11 license, + the ISC license used by OpenBSD, and BSD licenses, all of them are + extremely liberal and can be used freely in proprietary software if + needed. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libite-2.0.2/debian/copyright new/libite-2.1.0/debian/copyright --- old/libite-2.0.2/debian/copyright 2018-05-10 19:13:56.000000000 +0200 +++ new/libite-2.1.0/debian/copyright 2019-08-26 21:59:57.000000000 +0200 @@ -61,9 +61,13 @@ License: MIT Files: strlcat.c strlcpy.c -Copyright: 998, 2015 Todd C. Miller <[email protected]> +Copyright: 1998, 2015 Todd C. Miller <[email protected]> License: MIT +Files: strmatch.c +Copyright: 2009-2018 Joachim Nilsson <[email protected]> +License: ISC + Files: strnlen.c Copyright: 2016 Joachim Nilsson <[email protected]> License: ISC @@ -72,6 +76,10 @@ Copyright: 2004 Ted Unangst and Todd Miller License: ISC +Files: telnet.c +Copyright: 2010, 2013, 2019 Joachim Nilsson <[email protected]> +License: ISC + Files: tempfile.c Copyright: 2015-2016 Joachim Nilsson <[email protected]> License: ISC @@ -80,5 +88,9 @@ Copyright: 2015 Joachim Nilsson <[email protected]> License: ISC +Files: yorn.c +Copyright: 2009 Joachim Nilsson <[email protected]> +License: ISC + Files: tests/*.c License: public-domain diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libite-2.0.2/debian/libite.dirs new/libite-2.1.0/debian/libite.dirs --- old/libite-2.0.2/debian/libite.dirs 2018-05-10 19:13:56.000000000 +0200 +++ new/libite-2.1.0/debian/libite.dirs 1970-01-01 01:00:00.000000000 +0100 @@ -1 +0,0 @@ -usr/lib diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libite-2.0.2/debian/libite.install new/libite-2.1.0/debian/libite.install --- old/libite-2.0.2/debian/libite.install 2018-05-10 19:13:56.000000000 +0200 +++ new/libite-2.1.0/debian/libite.install 1970-01-01 01:00:00.000000000 +0100 @@ -1 +0,0 @@ -usr/lib/*/lib*.so.* diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libite-2.0.2/debian/libite5.dirs new/libite-2.1.0/debian/libite5.dirs --- old/libite-2.0.2/debian/libite5.dirs 1970-01-01 01:00:00.000000000 +0100 +++ new/libite-2.1.0/debian/libite5.dirs 2019-08-26 21:59:57.000000000 +0200 @@ -0,0 +1 @@ +usr/lib diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libite-2.0.2/debian/libite5.install new/libite-2.1.0/debian/libite5.install --- old/libite-2.0.2/debian/libite5.install 1970-01-01 01:00:00.000000000 +0100 +++ new/libite-2.1.0/debian/libite5.install 2019-08-26 21:59:57.000000000 +0200 @@ -0,0 +1 @@ +usr/lib/*/lib*.so.* diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libite-2.0.2/debian/rules new/libite-2.1.0/debian/rules --- old/libite-2.0.2/debian/rules 2018-05-10 19:13:56.000000000 +0200 +++ new/libite-2.1.0/debian/rules 2019-08-26 21:59:57.000000000 +0200 @@ -1,4 +1,5 @@ #!/usr/bin/make -f +export DEB_BUILD_MAINT_OPTIONS = hardening=+all # Uncomment this to turn on verbose mode. #export DH_VERBOSE=1 @@ -6,3 +7,9 @@ %: dh $@ --with autoreconf +override_dh_auto_install: + dh_auto_install + -rm -f debian/libite/usr/share/doc/libite/LICENSE + +override_dh_installchangelogs: + dh_installchangelogs ChangeLog.md diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libite-2.0.2/debian/source/options new/libite-2.1.0/debian/source/options --- old/libite-2.0.2/debian/source/options 1970-01-01 01:00:00.000000000 +0100 +++ new/libite-2.1.0/debian/source/options 2019-08-26 21:59:57.000000000 +0200 @@ -0,0 +1 @@ +compression=xz diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libite-2.0.2/src/Makefile.am new/libite-2.1.0/src/Makefile.am --- old/libite-2.0.2/src/Makefile.am 2018-05-10 19:13:56.000000000 +0200 +++ new/libite-2.1.0/src/Makefile.am 2019-08-26 21:59:57.000000000 +0200 @@ -14,11 +14,13 @@ reallocarray.c rsync.c \ strlcpy.c strlcat.c strtonum.c \ strdupa.h strndupa.h strnlen.h \ - tempfile.c which.c \ + strmatch.c telnet.c tempfile.c \ + yorn.c which.c \ lite.h strlite.h \ queue.h tree.h ## Distribute these header files in the <lite/...> name space pkgincludedir = $(includedir)/lite -pkginclude_HEADERS = lite.h queue.h conio.h tree.h strlite.h strdupa.h strndupa.h strnlen.h +pkginclude_HEADERS = lite.h queue.h conio.h tree.h strlite.h strdupa.h \ + strndupa.h strnlen.h diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libite-2.0.2/src/conio.h new/libite-2.1.0/src/conio.h --- old/libite-2.0.2/src/conio.h 2018-05-10 19:13:56.000000000 +0200 +++ new/libite-2.1.0/src/conio.h 2019-08-26 21:59:57.000000000 +0200 @@ -15,6 +15,11 @@ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ +#ifdef __cplusplus +extern "C" +{ +#endif + #ifndef CONIO_H_ #define CONIO_H_ @@ -77,17 +82,34 @@ void initscr(int *row, int *col); -/* Print table heading @line to @fp, with optional leading newline */ -static inline void printheader(FILE *fp, const char *line, int nl) +/* Print table heading @line to @fp, with optional leading newline + * Example: + * _________________ <-- Empty line with UNDERSCORE to frame first heading + * First heading <-- In normal/RESETATTR + * SUBHEADING <-- In REVERSE and with capital letters like 'top' + */ +static inline void printhdr(FILE *fp, const char *line, int nl, int attr) { + if (attr < 0 || attr > 8) + attr = REVERSE; + fprintf(fp ?: stdout, - "%s\033[7m%s%*s\033[0m\n", - nl ? "\n" : "", - line, SCREEN_WIDTH - (int)strlen(line), ""); + "%s\033[%dm%s%*s\033[0m\n", + nl ? "\n" : "", attr, line, + SCREEN_WIDTH - (int)strlen(line), ""); +} + +static inline void printheader(FILE *fp, const char *line, int nl) +{ + printhdr(fp, line, nl, REVERSE); } #endif /* CONIO_H_ */ +#ifdef __cplusplus +} +#endif + /** * Local Variables: * indent-tabs-mode: t diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libite-2.0.2/src/fisdir.c new/libite-2.1.0/src/fisdir.c --- old/libite-2.0.2/src/fisdir.c 2018-05-10 19:13:56.000000000 +0200 +++ new/libite-2.1.0/src/fisdir.c 2019-08-26 21:59:57.000000000 +0200 @@ -25,17 +25,17 @@ #include <unistd.h> /** - * fexist - Check if a file exists and is a directory. - * @file: File to look for, with full path. + * fisdir - Check if a path exists and is a directory. + * @path: Path to file or directory * * Returns: - * %TRUE(1) if the file exists and is a directory, otherwise %FALSE(0). + * %TRUE(1) if @path exists and is a directory, otherwise %FALSE(0). */ -int fisdir(const char *file) +int fisdir(const char *path) { struct stat sb; - if (!stat(file, &sb) && S_ISDIR(sb.st_mode)) + if (!stat(path, &sb) && S_ISDIR(sb.st_mode)) return 1; return 0; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libite-2.0.2/src/fsendfile.c new/libite-2.1.0/src/fsendfile.c --- old/libite-2.0.2/src/fsendfile.c 2018-05-10 19:13:56.000000000 +0200 +++ new/libite-2.1.0/src/fsendfile.c 2019-08-26 21:59:57.000000000 +0200 @@ -51,8 +51,8 @@ errno = EINVAL; return -1; } - - buf = (char *)malloc(BUFSIZ); + + buf = malloc(BUFSIZ); if (!buf) return -1; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libite-2.0.2/src/lite.h new/libite-2.1.0/src/lite.h --- old/libite-2.0.2/src/lite.h 2018-05-10 19:13:56.000000000 +0200 +++ new/libite-2.1.0/src/lite.h 2019-08-26 21:59:57.000000000 +0200 @@ -22,6 +22,11 @@ * THE SOFTWARE. */ +#ifdef __cplusplus +extern "C" +{ +#endif + #ifndef LITE_H_ #define LITE_H_ @@ -52,12 +57,13 @@ #define LITE_FOPT_KEEP_MTIME 0x02 typedef struct lfile lfile_t; +typedef struct sdbuf sdbuf_t; char *chomp (char *str); char *fparseln (FILE *, size_t *, size_t *, const char[3], int); int fexist (const char *file); -int fisdir (const char *file); +int fisdir (const char *path); FILE *tempfile (void); ssize_t copyfile (const char *src, const char *dst, int len, int opt); @@ -90,6 +96,13 @@ void progress (int percent, int max_width); void progress_simple(int percent); +sdbuf_t*telnet_open (int addr, short port); +int telnet_close (sdbuf_t *ctx); +int telnet_expect (sdbuf_t *ctx, char *script[], FILE *output); +int telnet_session (int addr, short port, char *script[], FILE *output); + +int yorn (const char *fmt, ...); + char *which (const char *cmd); int whichp (const char *cmd); @@ -183,6 +196,10 @@ #endif /* LITE_H_ */ +#ifdef __cplusplus +} +#endif + /** * Local Variables: * indent-tabs-mode: t diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libite-2.0.2/src/pidfilefn.c new/libite-2.1.0/src/pidfilefn.c --- old/libite-2.0.2/src/pidfilefn.c 2018-05-10 19:13:56.000000000 +0200 +++ new/libite-2.1.0/src/pidfilefn.c 2019-08-26 21:59:57.000000000 +0200 @@ -111,10 +111,10 @@ return 1; ret = kill(pid, signal); - if ((ret == -1) || (signal == SIGTERM) || (signal == SIGKILL)) - (void)remove(pidfile); + if (!ret && signal == SIGKILL) + ret = remove(pidfile); - return 0; + return ret; } /** diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libite-2.0.2/src/queue.h new/libite-2.1.0/src/queue.h --- old/libite-2.0.2/src/queue.h 2018-05-10 19:13:56.000000000 +0200 +++ new/libite-2.1.0/src/queue.h 2019-08-26 21:59:57.000000000 +0200 @@ -32,6 +32,11 @@ * @(#)queue.h 8.5 (Berkeley) 8/20/94 */ +#ifdef __cplusplus +extern "C" +{ +#endif + #ifndef _SYS_QUEUE_H_ #define _SYS_QUEUE_H_ @@ -531,3 +536,7 @@ } while (0) #endif /* !_SYS_QUEUE_H_ */ + +#ifdef __cplusplus +} +#endif diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libite-2.0.2/src/strdupa.h new/libite-2.1.0/src/strdupa.h --- old/libite-2.0.2/src/strdupa.h 2018-05-10 19:13:56.000000000 +0200 +++ new/libite-2.1.0/src/strdupa.h 2019-08-26 21:59:57.000000000 +0200 @@ -23,6 +23,12 @@ * USE OR OTHER DEALINGS IN THE SOFTWARE. * ========================================================================== */ + +#ifdef __cplusplus +extern "C" +{ +#endif + #ifndef LITE_STRDUPA_H #define LITE_STRDUPA_H @@ -50,3 +56,7 @@ #endif /* !HAVE_STRDUPA */ #endif /* LITE_STRDUPA_H */ + +#ifdef __cplusplus +} +#endif diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libite-2.0.2/src/strlite.h new/libite-2.1.0/src/strlite.h --- old/libite-2.0.2/src/strlite.h 2018-05-10 19:13:56.000000000 +0200 +++ new/libite-2.1.0/src/strlite.h 2019-08-26 21:59:57.000000000 +0200 @@ -21,6 +21,11 @@ * THE SOFTWARE. */ +#ifdef __cplusplus +extern "C" +{ +#endif + #ifndef LITE_STRING_H_ #define LITE_STRING_H_ @@ -49,6 +54,9 @@ }) #endif +int strnmatch (const char *str, const char **list, size_t num); +int strmatch (const char *str, const char **list); + #ifndef strlcpy size_t strlcpy (char *dst, const char *src, size_t siz); #endif @@ -103,3 +111,7 @@ } #endif /* LITE_STRING_H_ */ + +#ifdef __cplusplus +} +#endif diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libite-2.0.2/src/strmatch.c new/libite-2.1.0/src/strmatch.c --- old/libite-2.0.2/src/strmatch.c 1970-01-01 01:00:00.000000000 +0100 +++ new/libite-2.1.0/src/strmatch.c 2019-08-26 21:59:57.000000000 +0200 @@ -0,0 +1,89 @@ +/* Simple string matcher function, finds partial matches. + * + * Copyright (c) 2009-2018 Joachim Nilsson <[email protected]> + * + * Permission to use, copy, modify, and/or 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 <string.h> + + +/** + * strnmatch - Finds matching strings from a finite list + * @str: String to look for + * @list: List of strings to search. + * @num: Number of entries in @list. + * + * This function searches the @list of strings for @str. If a (partial) match + * is found it returns the index in the @list. + * + * Very similar in function to strmatch(), but works for sets of strings that + * are not %NULL terminated. + * + * Returns: + * -1 on error, otherwise the index to the matching string. + */ +int strnmatch(const char *str, const char **list, size_t num) +{ + size_t i; + + if (!str || !list) { + errno = EINVAL; + return -1; + } + + for (i = 0; i < num; i++) { + if (!strncasecmp (str, list[i], strlen (str))) + return i; + } + + errno = ENOENT; + return -1; +} + +/** + * strmatch - Finds matching strings from a list + * @str: String to look for + * @list: %NULL terminated list of strings to search. + * + * This function searches the @list of strings for @str. If a (partial) match + * is found it returns the index in the @list. + * + * Please note, the @list MUST be terminated by a %NULL element. If that is + * not possible for you, we recommend using strnmatch() instead. + * + * Returns: + * -1 on error, otherwise the index to the matching string. + */ +int strmatch(const char *str, const char **list) +{ + size_t i; + + if (!list) { + errno = EINVAL; + return -1; + } + + for (i = 0; list[i]; i++) + ; + + return strnmatch(str, list, i); +} + +/** + * Local Variables: + * indent-tabs-mode: t + * c-file-style: "linux" + * End: + */ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libite-2.0.2/src/strndupa.h new/libite-2.1.0/src/strndupa.h --- old/libite-2.0.2/src/strndupa.h 2018-05-10 19:13:56.000000000 +0200 +++ new/libite-2.1.0/src/strndupa.h 2019-08-26 21:59:57.000000000 +0200 @@ -23,6 +23,12 @@ * USE OR OTHER DEALINGS IN THE SOFTWARE. * ========================================================================== */ + +#ifdef __cplusplus +extern "C" +{ +#endif + #ifndef LITE_STRNDUPA_H_ #define LITE_STRNDUPA_H_ @@ -51,3 +57,7 @@ #endif /* !HAVE_STRNDUPA */ #endif /* GNU_STRING_STRNDUPA_H */ + +#ifdef __cplusplus +} +#endif diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libite-2.0.2/src/strnlen.h new/libite-2.1.0/src/strnlen.h --- old/libite-2.0.2/src/strnlen.h 2018-05-10 19:13:56.000000000 +0200 +++ new/libite-2.1.0/src/strnlen.h 2019-08-26 21:59:57.000000000 +0200 @@ -15,6 +15,11 @@ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ +#ifdef __cplusplus +extern "C" +{ +#endif + #ifndef LITE_STRNLEN_H_ #define LITE_STRNLEN_H_ @@ -41,3 +46,7 @@ #endif #endif /* LITE_STRNLEN_H_ */ + +#ifdef __cplusplus +} +#endif diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libite-2.0.2/src/strtonum.c new/libite-2.1.0/src/strtonum.c --- old/libite-2.0.2/src/strtonum.c 2018-05-10 19:13:56.000000000 +0200 +++ new/libite-2.1.0/src/strtonum.c 2019-08-26 21:59:57.000000000 +0200 @@ -58,7 +58,7 @@ error = INVALID; } else { ll = strtoll(numstr, &ep, 10); - if (numstr == ep || *ep != '\0') + if (errno == EINVAL || numstr == ep || *ep != '\0') error = INVALID; else if ((ll == LLONG_MIN && errno == ERANGE) || ll < minval) error = TOOSMALL; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libite-2.0.2/src/telnet.c new/libite-2.1.0/src/telnet.c --- old/libite-2.0.2/src/telnet.c 1970-01-01 01:00:00.000000000 +0100 +++ new/libite-2.1.0/src/telnet.c 2019-08-26 21:59:57.000000000 +0200 @@ -0,0 +1,291 @@ +/* Poor mans telnet expect in C. + * + * Copyright (c) 2010, 2013, 2019 Joachim Nilsson <[email protected]> + * + * Permission to use, copy, modify, and/or 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 <poll.h> +#include <unistd.h> +#include <stdlib.h> +#include <arpa/inet.h> +#include <sys/socket.h> + +#include "lite.h" + +#define EXPECT_DEBUG 0 +#define EXPECT_POLL_TIMEOUT 3000 /* 3 sec timeout waiting for server. */ + +#if EXPECT_DEBUG +# define TELL(fmt, args...) fprintf (stderr, fmt "\n", ##args) +#else +# define TELL(fmt, args...) +#endif + +struct sdbuf { + int sd; + char *buf; +} sdbuf; + +/* Open telnet connection to @addr:@port and connect. */ +sdbuf_t *telnet_open(int addr, short port) +{ + struct sockaddr_in *sin; + struct sockaddr s; + sdbuf_t *ctx; + int saved_errno; + + ctx = (sdbuf_t *)malloc(sizeof(sdbuf_t)); + if (!ctx) { +// perror("Failed allocating expect ctxect"); + return NULL; + } + + ctx->buf = (char *)malloc(BUFSIZ); + if (!ctx->buf) { +// perror("Failed allocating expect buffer"); + free(ctx); + return NULL; + } + + ctx->sd = socket(PF_INET, SOCK_STREAM, 0); + if (-1 == ctx->sd) { + saved_errno = errno; +// perror ("Failed creating socket"); + free(ctx->buf); + free(ctx); + + errno = saved_errno; + return NULL; + } + + sin = (struct sockaddr_in *)&s; + sin->sin_family = AF_INET; + sin->sin_port = port; + sin->sin_addr.s_addr = addr; + if (-1 == connect(ctx->sd, &s, sizeof(s))) { + saved_errno = errno; +// perror ("Cannot connect to telnet daemon"); + telnet_close(ctx); + errno = saved_errno; + + return NULL; + } + + return ctx; +} + +int telnet_close(sdbuf_t *ctx) +{ + free(ctx->buf); + close(ctx->sd); + free(ctx); + + return 0; +} + +static int wait_substr(sdbuf_t *ctx, char *str) +{ + struct pollfd pfd = { ctx->sd, POLLIN, 0 }; + ssize_t len, tot = 0; + int err; + + while (1) { + err = poll(&pfd, 1, EXPECT_POLL_TIMEOUT); + if (err <= 0) { + if (0 == err) + errno = ETIMEDOUT; + + if (EINTR == errno) + continue; + +// perror("No prompt"); + return 1; + } + + len = read(ctx->sd, &ctx->buf[tot], BUFSIZ); + if (len <= 0) { + errno = ENOMSG; + return 1; + } + + tot += len; + ctx->buf[tot] = 0; + TELL("Got line: '%s' is it '%s'?", ctx->buf, str); + + if (strstr(ctx->buf, str)) + return 0; + } +} + +/** + * telnet_expect - Poor man's telnet expect + * @ctx: Telnet session context from telnet_open() + * @script: %NULL terminated list of expect and response strings + * @output: Optional output from session + * + * Issues @script sequence on telnet session specified in @ctx, with + * optional @output from session. + * + * The @script consists of strings of expect and response pairs. For + * example, expect "ogin: " followed by response "root\n", expect + * "assword: "with response "secret\n", concluded by %NULL. + * + * Returns: + * POSIX OK(0) or non-zero on error. + */ +int telnet_expect(sdbuf_t *ctx, char *script[], FILE *output) +{ + struct pollfd fd = { ctx->sd, POLLIN, 0 }; + ssize_t len; + int i, first = 1, cont = 1, result = 0; + + for (i = 0; script[i]; i++) { + /* when expecting the empty string, just wipe any available input */ + if (!strlen(script[i])) { + result = poll(&fd, 1, 0); + if (result > 0) + lseek(ctx->sd, 0, SEEK_END); + } else { + if (wait_substr(ctx, script[i])) { + result = ENOMSG; + return 1; + } + } + + i++; + + if (strlen(script[i])) { + TELL("Sending line: '%s'", script[i]); + if (-1 == write(ctx->sd, script[i], strlen(script[i]))) { + errno = ENOSPC; + return 1; + } + } + } + + while (cont) { + char *ptr = ctx->buf; + char *tmp; + + result = poll(&fd, 1, EXPECT_POLL_TIMEOUT); + if (result <= 0) { + if (0 == result) + errno = ETIMEDOUT; + + if (EINTR == errno) + continue; + +// perror ("No result"); + result = errno; + break; + } + + /* + * On VERY long outputs we need to send some love back to the + * server, otherwise it terminates the connection. --Jocke + */ + if (-1 == write(ctx->sd, "\n", 1)) + goto retry; + + len = read(ctx->sd, ctx->buf, BUFSIZ); + if (len == -1) { + retry: + if (EINTR == errno) + continue; + + result = errno; + break; + } + ctx->buf[len] = 0; + + TELL("Read line: '%s'", ctx->buf); + + /* Skip first line -- only an echo of the last command */ + if (first) { + first = 0; + ptr = strchr(ctx->buf, '\n'); + if (ptr) + ptr++; + else + ptr = ctx->buf; + } + + TELL("Comparing '%s' with '%s'", ptr, script[i - 2]); + + /* Skip last line -- only the returning prompt. */ + tmp = strstr(ptr, script[i - 2]); + if (tmp) { + TELL("OK, last line. Good bye!"); + result = 0; + cont = 0; + *tmp = 0; + + tmp = strrchr(ptr, '\n'); + if (tmp) + *++tmp = 0; + } + + if (output && *ptr) { + if (EOF == fputs(ptr, output)) { + /* Only happens when /tmp is full :( */ + result = ENOSPC; + /* We must complete read-out of descriptor */ + output = NULL; + } + } + } + + return result; +} + +/** + * telnet_session - Very simple expect-like implementation for telnet. + * @addr: Must be in network byte order, use htonl(). + * @port: IP port to connect to, use htons(). + * @script: Expect like script of paired 'expect', 'response' strings. + * @output: A &FILE pointer to a tmpfile() for output from the last command. + * + * This is a very simple expect-like implementation for querying and + * operating daemons remotely over telnet. + * + * The @script is a query-response type of list of strings leading up to + * a final command, which output is then written to the given @output file. + * + * Returns: + * POSIX OK(0), or non-zero with errno set on error. + */ +int telnet_session(int addr, short port, char *script[], FILE *output) +{ + sdbuf_t *sdbuf; + int result = 0; + + sdbuf = telnet_open(addr, port); + if (!sdbuf) + return errno; + + if (telnet_expect(sdbuf, script, output)) + result = errno; + + telnet_close(sdbuf); + + return errno = result; +} + +/** + * Local Variables: + * indent-tabs-mode: t + * c-file-style: "linux" + * End: + */ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libite-2.0.2/src/tree.h new/libite-2.1.0/src/tree.h --- old/libite-2.0.2/src/tree.h 2018-05-10 19:13:56.000000000 +0200 +++ new/libite-2.1.0/src/tree.h 2019-08-26 21:59:57.000000000 +0200 @@ -24,6 +24,11 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +#ifdef __cplusplus +extern "C" +{ +#endif + #ifndef _SYS_TREE_H_ #define _SYS_TREE_H_ @@ -746,3 +751,7 @@ (x) = (y)) #endif /* _SYS_TREE_H_ */ + +#ifdef __cplusplus +} +#endif diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libite-2.0.2/src/yorn.c new/libite-2.1.0/src/yorn.c --- old/libite-2.0.2/src/yorn.c 1970-01-01 01:00:00.000000000 +0100 +++ new/libite-2.1.0/src/yorn.c 2019-08-26 21:59:57.000000000 +0200 @@ -0,0 +1,92 @@ +/* Safe yes-or-no with prompt + * + * Copyright (c) 2009 Joachim Nilsson <[email protected]> + * + * Permission to use, copy, modify, and/or 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 <stdio.h> +#include <stdio_ext.h> /* __fpurge() */ +#include <stdarg.h> +#include <termios.h> +#include <unistd.h> + +static char rawgetch(void) +{ + struct termios savemodes, modmodes; + char val; + + if (!isatty(STDIN_FILENO)) + return getchar(); + + /* Backup terminal settings. */ + if (tcgetattr(STDIN_FILENO, &savemodes) < 0) { + return -1; + } + + /* "stty cbreak -echo" */ + modmodes = savemodes; + modmodes.c_lflag &= ~ICANON; + modmodes.c_lflag &= ~ECHO; + modmodes.c_cc[VMIN] = 1; + modmodes.c_cc[VTIME] = 0; + + /* Set terminal in raw mode. */ + if (tcsetattr(STDIN_FILENO, TCSANOW, &modmodes) < 0) { + tcsetattr(STDIN_FILENO, TCSANOW, &savemodes); + return -1; + } + + val = getchar(); + + /* Restore terminal to previous state. */ + tcsetattr(STDIN_FILENO, TCSANOW, &savemodes); + + return val; +} + +/** + * yorn - Pose a a Yes or No question and return answer + * @fmt: Standard printf() style argument(s). + * + * This function prints the given question on screen, waits for user + * input in the form of yes or no. + * + * Returns: + * True(1) or False(0). True if the answer is yes. + */ +int yorn(const char *fmt, ...) +{ + va_list ap; + char yorn; + + va_start(ap, fmt); + vfprintf(stderr, fmt, ap); + va_end(ap); + + __fpurge(stdin); + yorn = rawgetch(); + printf("%c\n", yorn); + fflush(stdout); + if (yorn != 'y' && yorn != 'Y') + return 0; + + return 1; +} + +/** + * Local Variables: + * indent-tabs-mode: t + * c-file-style: "linux" + * End: + */ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libite-2.0.2/tests/.gitignore new/libite-2.1.0/tests/.gitignore --- old/libite-2.0.2/tests/.gitignore 2018-05-10 19:13:56.000000000 +0200 +++ new/libite-2.1.0/tests/.gitignore 2019-08-26 21:59:57.000000000 +0200 @@ -12,7 +12,9 @@ progress rsync str +strmatch tempfile touch tree which +yorn diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libite-2.0.2/tests/Makefile.am new/libite-2.1.0/tests/Makefile.am --- old/libite-2.0.2/tests/Makefile.am 2018-05-10 19:13:56.000000000 +0200 +++ new/libite-2.1.0/tests/Makefile.am 2019-08-26 21:59:57.000000000 +0200 @@ -11,12 +11,14 @@ TESTS += lfile TESTS += makepath TESTS += pidfile -TESTS += str -TESTS += touch TESTS += progress TESTS += rsync +TESTS += str +TESTS += strmatch +TESTS += touch TESTS += tempfile TESTS += which +TESTS += yorn check_PROGRAMS = $(TESTS) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libite-2.0.2/tests/str.c new/libite-2.1.0/tests/str.c --- old/libite-2.0.2/tests/str.c 2018-05-10 19:13:56.000000000 +0200 +++ new/libite-2.1.0/tests/str.c 2019-08-26 21:59:57.000000000 +0200 @@ -2,18 +2,26 @@ int main(void) { + char buf[10]; int val; val = atonum("42"); if (val != 42) return 1; - + if (!string_match("eth1", "eth1234")) return 1; if (string_compare("eth1", "eth1234")) return 1; + if (!string_case_compare("somestring", "SoMeSTRING")) + return 1; + + strlcpy(buf, "tooloongstring", sizeof(buf)); + if (buf[9] == 'r') + return 1; + return 0; } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libite-2.0.2/tests/strmatch.c new/libite-2.1.0/tests/strmatch.c --- old/libite-2.0.2/tests/strmatch.c 1970-01-01 01:00:00.000000000 +0100 +++ new/libite-2.1.0/tests/strmatch.c 2019-08-26 21:59:57.000000000 +0200 @@ -0,0 +1,44 @@ +#include "check.h" +#define SYSLOG_NAMES +#include <syslog.h> + +#define SEVERITY_LEVEL { \ + CHOOSE(SEVERITY_NONE, "none"), \ + CHOOSE(SEVERITY_DEBUG, "debug"), \ + CHOOSE(SEVERITY_INFO, "info"), \ + CHOOSE(SEVERITY_NOTICE, "notice"), \ + CHOOSE(SEVERITY_WARNING, "warning"), \ + CHOOSE(SEVERITY_ERR, "err"), \ + CHOOSE(SEVERITY_CRIT, "crit"), \ + CHOOSE(SEVERITY_ALERT, "alert"), \ + CHOOSE(SEVERITY_EMERG, "emerg") \ +} + +#define CHOOSE(a, b) b +const char *levels[] = SEVERITY_LEVEL; + +#undef CHOOSE +#define CHOOSE(a, b) a +typedef enum SEVERITY_LEVEL severity_level_t; + +int main(void) +{ + size_t i; + int num; + struct { + char *str; + int val; + } t[] = { + { "warn", SEVERITY_WARNING }, + { "alert", SEVERITY_ALERT }, + { NULL, 0 } + }; + + for (i = 0; t[i].str; i++) { + num = strmatch(t[i].str, levels); + fail_unless(num >= 0); + fail_unless(num == t[i].val); + } + + return 0; +} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libite-2.0.2/tests/yorn.c new/libite-2.1.0/tests/yorn.c --- old/libite-2.0.2/tests/yorn.c 1970-01-01 01:00:00.000000000 +0100 +++ new/libite-2.1.0/tests/yorn.c 2019-08-26 21:59:57.000000000 +0200 @@ -0,0 +1,32 @@ +#include <stdio.h> +#include <unistd.h> +#include <sys/wait.h> + +#include "check.h" + +int main(int argc, char *argv[]) +{ + int chan[2]; + int status; + + pipe(chan); + + if (fork() > 0) { + dup2(chan[0], STDIN_FILENO); + if (yorn("Do you really wanna do this (y/N)? ")) { + printf("Affirmative!\n"); + _exit(0); + } + + printf("OK, aborting!\n"); + _exit(1); + } + + sleep(1); + if (write(chan[1], "Y", 1) != 1) + return 1; + + wait(&status); + + return WEXITSTATUS(status); +}
