mirror of
https://github.com/troglobit/libite.git
synced 2026-10-13 10:14:42 +00:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
8587971fb9 | ||
|
|
6545ac8fd4 | ||
|
|
9105e8d3d8 | ||
|
|
3555af6a6a | ||
|
|
42715eab8a | ||
|
|
497d58dbf0 | ||
|
|
9ab70ebbcd | ||
|
|
bad363883d | ||
|
|
7f3215b3e6 | ||
|
|
729cc5307f | ||
|
|
66290d132f | ||
|
|
59f7a78441 | ||
|
|
b716776863 | ||
|
|
018ecaca15 | ||
|
|
a293c37777 | ||
|
|
a4937a93e2 | ||
|
|
94d547c9ec | ||
|
|
68cf8b6576 | ||
|
|
b6a55fcc46 | ||
|
|
5f29ef6413 | ||
|
|
627c47caff | ||
|
|
7c2ed556b9 | ||
|
|
6dec4e3858 | ||
|
|
dff92356b3 | ||
|
|
883c90112d | ||
|
|
a2c8dddaad | ||
|
|
14f547b638 | ||
|
|
6f2a03bba7 | ||
|
|
cdfffa312b | ||
|
|
50cb72018f | ||
|
|
e8a3117158 | ||
|
|
7cf2a3786c | ||
|
|
1c1d5c94e3 | ||
|
|
23703c75da | ||
|
|
efae15416c | ||
|
|
661b4b4d0b | ||
|
|
682b662bd5 | ||
|
|
75d4edb424 | ||
|
|
141d4f6936 | ||
|
|
63aa6c5d07 | ||
|
|
1d698418c7 | ||
|
|
92d81280a9 | ||
|
|
267465f3d2 | ||
|
|
c22a6e64d9 | ||
|
|
16ae343df2 | ||
|
|
6e558e98f0 | ||
|
|
69291d3e74 | ||
|
|
6fdffeb355 | ||
|
|
b2f6721813 | ||
|
|
3c350b8862 | ||
|
|
5b786ce221 | ||
|
|
86b883e2af | ||
|
|
2d6e8850a2 | ||
|
|
d8cb477861 | ||
|
|
27644677dd | ||
|
|
3588c9b01f | ||
|
|
ca3ea5ae92 | ||
|
|
188d968f89 | ||
|
|
8e2c58501c | ||
|
|
1da317ce1e | ||
|
|
fe39284d50 | ||
|
|
c3c23b9aef | ||
|
|
d45f2bad5b | ||
|
|
61fb7aeca2 | ||
|
|
dedcaf92d5 | ||
|
|
c009c49a92 | ||
|
|
12f619a320 |
No files matched your search
+8
-7
@@ -1,10 +1,8 @@
|
||||
# Travis CI integration -- https://travis-ci.org/troglobit/libuev
|
||||
# Travis CI integration -- https://travis-ci.org/troglobit/libite
|
||||
# Defaults to GNU GCC and autotools: ./configure && make && make test
|
||||
language: c
|
||||
|
||||
# Some of the autotests may use sudo, so use non-dockerized build atm.
|
||||
# http://stackoverflow.com/questions/26299552/travis-sudo-is-disabled
|
||||
#sudo: true
|
||||
# Use docker for quicker builds, it now allows https://docs.travis-ci.com/user/apt/
|
||||
sudo: false
|
||||
|
||||
# Test build with both GCC and Clang (LLVM)
|
||||
@@ -12,8 +10,11 @@ compiler:
|
||||
- gcc
|
||||
- clang
|
||||
|
||||
# - make test
|
||||
script:
|
||||
- ./autogen.sh
|
||||
- ./configure --disable-silent-rules
|
||||
- make -j5 clean all
|
||||
- ./configure --prefix=/tmp --disable-silent-rules
|
||||
- make clean
|
||||
- make -j5
|
||||
- make install-strip
|
||||
- ls -lR /tmp
|
||||
- make check
|
||||
+59
-1
@@ -3,6 +3,60 @@ Change Log
|
||||
|
||||
All notable changes to the project are documented in this file.
|
||||
|
||||
|
||||
[v1.8.3][] - 2017-01-08
|
||||
-----------------------
|
||||
|
||||
### Changes
|
||||
- Support absolute path in `pidfile()`. Needed by, e.g. Inadyn
|
||||
- Add initial `debian/` packaging
|
||||
- Update README with note on remembering to set `umask()`
|
||||
|
||||
### Fixes
|
||||
- In use-cases when `pidfile()` is called consecutively, e.g. on
|
||||
`SIGHUP`, recreate PID file if it no longer exists
|
||||
|
||||
|
||||
[v1.8.2][] - 2016-09-05
|
||||
-----------------------
|
||||
|
||||
### Changes
|
||||
- Updated build instructions in README.
|
||||
- Converted `touch()`, `makedir()`, `makefifo()`, and `erase()` from
|
||||
macros to inline functions. Also removed implicit logging to stderr
|
||||
on error.
|
||||
|
||||
### Fixes
|
||||
- Fix small memory leak in `pidfile()` ... at exit.
|
||||
- Fixes for building on musl libc
|
||||
|
||||
|
||||
[v1.8.1][] - 2016-06-25
|
||||
-----------------------
|
||||
|
||||
### Fixes
|
||||
|
||||
- `fparseln()`, portability fix for NetBSD
|
||||
- `pidfile()`, portability fix for NetBSD and OpenBSD
|
||||
|
||||
|
||||
[v1.8.0][] - 2016-06-06
|
||||
-----------------------
|
||||
|
||||
### Changes
|
||||
- Change return type of `fsendfile()` from `size_t` to `ssize_t`
|
||||
- Change `dir()` semantics: do not assert and always return error
|
||||
without calling `perror()` or similar.
|
||||
- The OpenBSD `pidfile()` function's prefix path `_PATH_VARRUN`
|
||||
can now be overridden by setting the hidden `__pidfile_path`
|
||||
variable. E.g., to `_PATH_TMP`. Make sure read the docs!
|
||||
- Add new unit test framework `make check`.
|
||||
|
||||
### Fixes
|
||||
- Fix bad path in new `strndupa()` header file.
|
||||
- Add missing progress bar API's to `lite.h`
|
||||
|
||||
|
||||
[v1.7.0][] - 2016-06-05
|
||||
-----------------------
|
||||
|
||||
@@ -177,7 +231,11 @@ problems this may cause!
|
||||
Initial extraction of frog DNA from [Finit][]. See [README][] for API details.
|
||||
|
||||
|
||||
[UNRELEASED]: https://github.com/troglobit/libite/compare/v1.7.0...HEAD
|
||||
[UNRELEASED]: https://github.com/troglobit/libite/compare/v1.8.3...HEAD
|
||||
[v1.8.3]: https://github.com/troglobit/libite/compare/v1.8.2...v1.8.3
|
||||
[v1.8.2]: https://github.com/troglobit/libite/compare/v1.8.1...v1.8.2
|
||||
[v1.8.1]: https://github.com/troglobit/libite/compare/v1.8.0...v1.8.1
|
||||
[v1.8.0]: https://github.com/troglobit/libite/compare/v1.7.0...v1.8.0
|
||||
[v1.7.0]: https://github.com/troglobit/libite/compare/v1.6.0...v1.7.0
|
||||
[v1.6.0]: https://github.com/troglobit/libite/compare/v1.5.1...v1.6.0
|
||||
[v1.5.1]: https://github.com/troglobit/libite/compare/v1.5.0...v1.5.1
|
||||
|
||||
+4
-3
@@ -6,6 +6,7 @@ Maintenance
|
||||
|
||||
* Leverage GitHub issues for milestone planning
|
||||
* Reference issues from GitHub pull requests to alert issue subscribers
|
||||
* Encourage contributors to write unit tests
|
||||
* Bump library ABI version just before release!
|
||||
|
||||
|
||||
@@ -53,9 +54,9 @@ It must be updated according to the [GNU Libtool recommendations][1]:
|
||||
release of your software. More frequent updates are unnecessary, and
|
||||
only guarantee that the current interface number gets larger faster.
|
||||
3. If the library *source code has changed at all* since the last update,
|
||||
then increment revision (`c:r:a` becomes `c:r+1:a`).
|
||||
4. If any *interfaces have been added, removed, or changed* since the
|
||||
last update, increment current, and set revision to 0.
|
||||
then increment revision (`c:r:a` --> `c:r+1:a`)
|
||||
4. If any *interfaces have been added, removed, or changed* since last
|
||||
update, increment current, and zero revision (`c:r:a` --> `c+1:0:0`)
|
||||
5. If any *interfaces have been added* since the last public release,
|
||||
then increment age.
|
||||
6. If any *interfaces have been removed or changed* since the last
|
||||
|
||||
+25
-24
@@ -3,49 +3,50 @@ ACLOCAL_AMFLAGS = -I m4
|
||||
lib_LTLIBRARIES = libite.la
|
||||
pkgincludedir = $(includedir)/lite
|
||||
pkginclude_HEADERS = lite.h queue.h conio.h tree.h strlite.h strdupa.h strndupa.h strnlen.h
|
||||
libite_la_SOURCES = chomp.c copyfile.c dir.c fexist.c fisdir.c fmode.c fparseln.c \
|
||||
fsendfile.c ifconfig.c lfile.c makepath.c pidfile.c pidfilefn.c \
|
||||
progress.c reallocarray.c rsync.c strlcpy.c strlcat.c strtonum.c \
|
||||
libite_la_SOURCES = chomp.c copyfile.c dir.c fexist.c fisdir.c fmode.c fparseln.c \
|
||||
fsendfile.c ifconfig.c lfile.c makepath.c pidfile.c pidfilefn.c \
|
||||
progress.c reallocarray.c rsync.c strlcpy.c strlcat.c strtonum.c \
|
||||
tempfile.c tree.c
|
||||
|
||||
libite_la_CPPFLAGS = -D_GNU_SOURCE
|
||||
libite_la_CFLAGS = -W -Wall -Wextra
|
||||
libite_la_LDFLAGS = $(AM_LDFLAGS) -version-info 2:3:0
|
||||
libite_la_LDFLAGS = $(AM_LDFLAGS) -version-info 3:1:0
|
||||
|
||||
pkgconfigdir = $(libdir)/pkgconfig
|
||||
pkgconfig_DATA = libite.pc
|
||||
doc_DATA = README.md LICENSE
|
||||
EXTRA_DIST = README.md LICENSE ChangeLog.md
|
||||
SUBDIRS = tests
|
||||
|
||||
## Generate MD5 checksum file
|
||||
MD5 = md5sum
|
||||
md5-dist:
|
||||
@for file in $(DIST_ARCHIVES); do \
|
||||
$(MD5) $$file > $$file.md5; \
|
||||
@for file in $(DIST_ARCHIVES); do \
|
||||
$(MD5) $$file > $$file.md5; \
|
||||
done
|
||||
|
||||
## Check if tagged in git
|
||||
release-hook:
|
||||
if [ ! `git tag | grep $(PACKAGE_VERSION)` ]; then \
|
||||
echo; \
|
||||
printf "\e[1m\e[41mCannot find release tag $(PACKAGE_VERSION)\e[0m\n"; \
|
||||
printf "\e[1m\e[5mDo release anyway?\e[0m "; read yorn; \
|
||||
if [ "$$yorn" != "y" -a "$$yorn" != "Y" ]; then \
|
||||
printf "OK, aborting release.\n"; \
|
||||
exit 1; \
|
||||
fi; \
|
||||
echo; \
|
||||
else \
|
||||
echo; \
|
||||
printf "\e[1m\e[42mFound GIT release tag $(PACKAGE_VERSION)\e[0m\n"; \
|
||||
printf "\e[1m\e[44m>>Remember to push tags!\e[0m\n"; \
|
||||
echo; \
|
||||
if [ ! `git tag | grep $(PACKAGE_VERSION)` ]; then \
|
||||
echo; \
|
||||
printf "\033[1m\033[41mCannot find release tag $(PACKAGE_VERSION)\033[0m\n"; \
|
||||
printf "\033[1m\033[5mDo release anyway?\033[0m "; read yorn; \
|
||||
if [ "$$yorn" != "y" -a "$$yorn" != "Y" ]; then \
|
||||
printf "OK, aborting release.\n"; \
|
||||
exit 1; \
|
||||
fi; \
|
||||
echo; \
|
||||
else \
|
||||
echo; \
|
||||
printf "\033[1m\033[42mFound GIT release tag $(PACKAGE_VERSION)\033[0m\n"; \
|
||||
printf "\033[1m\033[44m>>Remember to push tags!\033[0m\n"; \
|
||||
echo; \
|
||||
fi
|
||||
|
||||
## Target to run when building a release
|
||||
release: dist release-hook md5-dist
|
||||
@for file in $(DIST_ARCHIVES); do \
|
||||
printf "$$file \tDistribution tarball\n"; \
|
||||
printf "$$file.md5\t"; cat $$file.md5 | cut -f1 -d' '; \
|
||||
mv $$file* ../; \
|
||||
@for file in $(DIST_ARCHIVES); do \
|
||||
printf "$$file \tDistribution tarball\n"; \
|
||||
printf "$$file.md5\t"; cat $$file.md5 | cut -f1 -d' '; \
|
||||
mv $$file* ../; \
|
||||
done
|
||||
@@ -70,6 +70,14 @@ and in your `Makefile.am`:
|
||||
proggy_LDADD = $(lite_LIBS)
|
||||
|
||||
|
||||
Important Note
|
||||
--------------
|
||||
|
||||
When using functions like `mkpath()`, `makepath()`, and `makefifo()`,
|
||||
make sure your `umask()` is correct so you do not accidentally create
|
||||
files and directories accessible to other users than intended.
|
||||
|
||||
|
||||
Helper Macros
|
||||
-------------
|
||||
|
||||
@@ -155,7 +163,8 @@ Generic Functions
|
||||
|
||||
Wrapper for `scandir()` with optional filter. Returns a list of
|
||||
names: files and directories that must be freed after use. See
|
||||
the unit test at the bottom for an example.
|
||||
the unit test for an example, or take a look at `glob(3)`, it's
|
||||
probably what you want anyway.
|
||||
|
||||
- `fcopyfile(src, dst)`
|
||||
|
||||
@@ -187,8 +196,8 @@ Generic Functions
|
||||
|
||||
- `lfopen(file, sep)`, `lfclose(lf)`
|
||||
|
||||
API for parsing UNIX style configuration files like `/etc/protocols`
|
||||
and `/etc/services`.
|
||||
LITE file API for parsing UNIX style configuration files like
|
||||
`/etc/protocols` and `/etc/services`.
|
||||
|
||||
- `lftok(lf)`
|
||||
|
||||
@@ -222,11 +231,13 @@ Generic Functions
|
||||
with the `dst` name. On successful operation the source is removed
|
||||
and the function returns POSIX OK (0).
|
||||
|
||||
- `pidfile(basename)`
|
||||
- `pidfile(name)`
|
||||
|
||||
Create a daemon PID file in `_PATH_VARRUN` using either `basename` or,
|
||||
if `basename` is `NULL`, `__progname`. The resulting file name is
|
||||
available to the user as a read-only pointer:
|
||||
Create a daemon PID file using either the `name` as a full path, if
|
||||
`name` starts with `/`, or in `_PATH_VARRUN` using `name` as the
|
||||
basename of the application. If `name` is `NULL`, then `__progname`
|
||||
is used as the basename. The resulting file name is available to the
|
||||
user as a read-only pointer:
|
||||
|
||||
extern char *__pidfile_name;
|
||||
|
||||
@@ -237,14 +248,14 @@ Generic Functions
|
||||
|
||||
The PID file is removed when the program exits, using an `atexit()`
|
||||
handler. However, depending on how the program terminates the file
|
||||
may still exist even though the program is no longer running. This
|
||||
is only a problem for clients.
|
||||
may still exist even though the program is no longer running.
|
||||
|
||||
Calling this function multiple times updates the mtime of the file.
|
||||
Only one `atexit()` handler is created, regardless of the amount of
|
||||
times the function is called.
|
||||
times the function is called. If the file is removed, subsequent
|
||||
calls to this function will recreate the file.
|
||||
|
||||
See below for link to OpenBSD man page.
|
||||
See below for a link to OpenBSD man page.
|
||||
|
||||
- `pidfile_read(pidfile)`
|
||||
|
||||
@@ -315,10 +326,14 @@ The following are popular functions and highly useful macros from the
|
||||
|
||||
http://www.openbsd.org/cgi-bin/man.cgi/OpenBSD-current/man3/pidfile.3
|
||||
|
||||
**Note:** this version of `pidfile()` has been extended to handle it
|
||||
being called multiple times, and also to export the path to the PID
|
||||
file `__pidfile_name`, similar to `__progname`. See previous section
|
||||
for details.
|
||||
**Note:** the version of `pidfile()` in -lite has been extended to
|
||||
handle it being called multiple times, i.e. to not create multiple
|
||||
`atexit()` handlers, and also to export a few internal paths:
|
||||
|
||||
- `__pidfile_path`: prefix path, default `_PATH_VARRUN`. Notice the
|
||||
trailing slash requirement if you want to override it!
|
||||
- `__pidfile_name`: full path to PID file , similar to `__progname`.
|
||||
See previous section for details.
|
||||
|
||||
- `reallocarray(ptr, nmemb, size)`
|
||||
|
||||
@@ -357,7 +372,8 @@ system:
|
||||
|
||||
./configure
|
||||
make -j5
|
||||
make install-strip
|
||||
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
|
||||
|
||||
@@ -45,18 +45,8 @@ char *chomp(char *str)
|
||||
return str;
|
||||
}
|
||||
|
||||
#ifdef UNITTEST
|
||||
#include <stdio.h>
|
||||
int main(void)
|
||||
{
|
||||
int i; char t[][16] = { "hej\ndej", "Slime\n\n\\n", "Tripple\n\n\n", "" };
|
||||
for (i = 0; t[i][0]; i++) printf("[%02d]: '%s'\n", i, chomp(t[i])); return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
/**
|
||||
* Local Variables:
|
||||
* compile-command: "make V=1 -f chomp.mk"
|
||||
* indent-tabs-mode: t
|
||||
* c-file-style: "linux"
|
||||
* End:
|
||||
|
||||
+2
-2
@@ -1,10 +1,10 @@
|
||||
AC_INIT(libite, 1.7.0, https://github.com/troglobit/libite/issues)
|
||||
AC_INIT(libite, 1.8.3, https://github.com/troglobit/libite/issues)
|
||||
AM_INIT_AUTOMAKE([1.11 foreign no-dist-gzip dist-xz])
|
||||
AM_SILENT_RULES([yes])
|
||||
|
||||
AC_CONFIG_SRCDIR(lite.h)
|
||||
AM_CONFIG_HEADER(config.h)
|
||||
AC_CONFIG_FILES([Makefile libite.pc])
|
||||
AC_CONFIG_FILES([Makefile tests/Makefile libite.pc])
|
||||
AC_CONFIG_MACRO_DIR([m4])
|
||||
|
||||
AC_PROG_CC
|
||||
|
||||
@@ -49,24 +49,24 @@
|
||||
#define WHITE 0x17
|
||||
|
||||
/* Esc[2JEsc[1;1H - Clear screen and move cursor to 1,1 (upper left) pos. */
|
||||
#define clrscr() fputs ("\e[2J\e[1;1H", stdout)
|
||||
#define clrscr() fputs ("\033[2J\033[1;1H", stdout)
|
||||
/* Esc[K - Erases from the current cursor position to the end of the current line. */
|
||||
#define clreol() fputs ("\e[K", stdout)
|
||||
#define clreol() fputs ("\033[K", stdout)
|
||||
/* Esc[2K - Erases the entire current line. */
|
||||
#define delline() fputs ("\e[2K", stdout)
|
||||
#define delline() fputs ("\033[2K", stdout)
|
||||
/* Esc[Line;ColumnH - Moves the cursor to the specified position (coordinates) */
|
||||
#define gotoxy(x,y) printf("\e[%d;%dH", y, x)
|
||||
#define gotoxy(x,y) printf("\033[%d;%dH", y, x)
|
||||
/* Esc[?25l (lower case L) - Hide Cursor */
|
||||
#define hidecursor() fputs ("\e[?25l", stdout)
|
||||
#define hidecursor() fputs ("\033[?25l", stdout)
|
||||
/* Esc[?25h (lower case H) - Show Cursor */
|
||||
#define showcursor() fputs ("\e[?25h", stdout)
|
||||
#define showcursor() fputs ("\033[?25h", stdout)
|
||||
|
||||
/* Esc[Value;...;Valuem - Set Graphics Mode */
|
||||
#define __set_gm(attr,color,val) \
|
||||
if (!color) \
|
||||
printf("\e[%dm", attr); \
|
||||
printf("\033[%dm", attr); \
|
||||
else \
|
||||
printf("\e[%d;%dm", color & 0x10 ? 1 : 0, (color & 0xF) + val)
|
||||
printf("\033[%d;%dm", color & 0x10 ? 1 : 0, (color & 0xF) + val)
|
||||
#define textattr(attr) __set_gm(attr, 0, 0)
|
||||
#define textcolor(color) __set_gm(RESETATTR, color, 30)
|
||||
#define textbackground(color) __set_gm(RESETATTR, color, 40)
|
||||
|
||||
-61
@@ -23,13 +23,9 @@
|
||||
|
||||
#include <errno.h>
|
||||
#include <fcntl.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <sys/stat.h>
|
||||
|
||||
#include "lite.h"
|
||||
|
||||
|
||||
/* Tests if dst is a directory, if so, reallocates dst and appends src filename returning 1 */
|
||||
static int adjust_target(char *src, char **dst)
|
||||
{
|
||||
@@ -256,65 +252,8 @@ int fcopyfile(FILE *src, FILE *dst)
|
||||
return 0;
|
||||
}
|
||||
|
||||
#ifdef UNITTEST
|
||||
#include <err.h>
|
||||
|
||||
int main(void)
|
||||
{
|
||||
int i = 0;
|
||||
char *files[] = {
|
||||
"/etc/passwd", "/tmp/mypwd", "/tmp/mypwd",
|
||||
"/etc/passwd", "/tmp/", "/tmp/passwd",
|
||||
"/etc/passwd", "/tmp", "/tmp/passwd",
|
||||
NULL
|
||||
};
|
||||
FILE *src, *dst;
|
||||
|
||||
printf("=>Start testing fcopyfile()\n");
|
||||
while (files[i]) {
|
||||
printf("fcopyfile(%s, %s)\t", files[i], files[i + 1]);
|
||||
src = fopen(files[i], "r");
|
||||
dst = fopen(files[i + 1], "w");
|
||||
if (fcopyfile(src, dst)) {
|
||||
if (!fisdir(files[i + 1]))
|
||||
err(1, "Failed fcopyfile(%s, %s)", files[i], files[i + 1]);
|
||||
}
|
||||
|
||||
if (src)
|
||||
fclose(src);
|
||||
if (dst)
|
||||
fclose(dst);
|
||||
|
||||
if (fexist(files[i + 2]))
|
||||
printf("OK => %s", files[i + 2]);
|
||||
printf("\n");
|
||||
|
||||
erase(files[i + 2]);
|
||||
i += 3;
|
||||
}
|
||||
|
||||
printf("\n=>Start testing copyfile()\n");
|
||||
i = 0;
|
||||
while (files[i]) {
|
||||
printf("copyfile(%s, %s)\t", files[i], files[i + 1]);
|
||||
if (!copyfile(files[i], files[i + 1], 0, 0))
|
||||
err(1, "Failed copyfile(%s, %s)", files[i], files[i + 1]);
|
||||
|
||||
if (fexist(files[i + 2]))
|
||||
printf("OK => %s", files[i + 2]);
|
||||
printf("\n");
|
||||
|
||||
erase(files[i + 2]);
|
||||
i += 3;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
#endif /* UNITTEST */
|
||||
|
||||
/**
|
||||
* Local Variables:
|
||||
* compile-command: "make V=1 -f copyfile.mk"
|
||||
* indent-tabs-mode: t
|
||||
* c-file-style: "linux"
|
||||
* End:
|
||||
|
||||
@@ -1,4 +0,0 @@
|
||||
OBJS = fisdir.o fexist.o fmode.o
|
||||
TARGET = $(OBJS) copyfile.test clean
|
||||
|
||||
include rules.mk
|
||||
@@ -0,0 +1,8 @@
|
||||
tmp/*
|
||||
libuev/*
|
||||
libuev*
|
||||
autoreconf*
|
||||
debhelper*
|
||||
files
|
||||
!*.dirs
|
||||
!*.install
|
||||
Vendored
+5
@@ -0,0 +1,5 @@
|
||||
libite (1.8.2-1) unstable; urgency=low
|
||||
|
||||
* Initial release.
|
||||
|
||||
-- Joachim Nilsson <troglobit@gmail.com> Tue, 29 Nov 2016 08:23:35 +0100
|
||||
Vendored
+1
@@ -0,0 +1 @@
|
||||
config.log
|
||||
Vendored
+1
@@ -0,0 +1 @@
|
||||
9
|
||||
Vendored
+51
@@ -0,0 +1,51 @@
|
||||
Source: libite
|
||||
Priority: optional
|
||||
Maintainer: Joachim Nilsson <troglobit@gmail.com>
|
||||
Build-Depends: dpkg-dev (>= 1.14.9), debhelper (>= 9), dh-autoreconf
|
||||
Standards-Version: 3.9.6
|
||||
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
|
||||
Section: libdevel
|
||||
Architecture: any
|
||||
Depends: ${misc:Depends}, libite (= ${binary:Version})
|
||||
Description: static library, header files, and docs for libite
|
||||
Static library, header files, and documentation for libite.
|
||||
.
|
||||
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.
|
||||
.
|
||||
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.
|
||||
|
||||
Package: libite
|
||||
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.
|
||||
.
|
||||
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.
|
||||
Vendored
+84
@@ -0,0 +1,84 @@
|
||||
Format: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
|
||||
Source: https.//github.com/troglobit/libite/
|
||||
|
||||
Files: *
|
||||
Copyright:
|
||||
2008-2010 Claudio Matsuoka <cmatsuoka@gmail.com>
|
||||
2008-2016 Joachim Nilsson <troglobit@gmail.com>
|
||||
License: MIT
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
THE SOFTWARE.
|
||||
|
||||
Files: chomp.c
|
||||
Copyright: 2014-2015 Joachim Nilsson <troglobit@gmail.com>
|
||||
License: ISC
|
||||
|
||||
Files: conio.h
|
||||
Copyright: 2009-2013 Joachim Nilsson <troglobit@gmail.com>
|
||||
License: ISC
|
||||
|
||||
Files: dir.c
|
||||
Copyright: 2008-2016 Joachim Nilsson <troglobit@gmail.com>
|
||||
License: ISC
|
||||
|
||||
Files: lfile.c
|
||||
Copyright: 2015-2016 Joachim Nilsson <troglobit@gmail.com>
|
||||
License: ISC
|
||||
|
||||
Files: pidfile.c
|
||||
Copyright: 1999 The NetBSD Foundation, Inc.
|
||||
License: BSD-2-clause
|
||||
|
||||
Files: queue.h
|
||||
Copyright: 1991, 1993 The Regents of the University of California.
|
||||
License: BSD-3-clause
|
||||
|
||||
Files: reallocarray.c
|
||||
Copyright: 2008 Otto Moerbeek <otto@drijf.net>
|
||||
License: ISC
|
||||
|
||||
Files: rsync.c
|
||||
Copyright: 2011, 2012 Joachim Nilsson <troglobit@gmail.com>
|
||||
License: ISC
|
||||
|
||||
Files: strdupa.h strndupa.h
|
||||
Copyright: 2009 William Ahern
|
||||
License: MIT
|
||||
|
||||
Files: strlcat.c strlcpy.c
|
||||
Copyright: 998, 2015 Todd C. Miller <Todd.Miller@courtesan.com>
|
||||
License: MIT
|
||||
|
||||
Files: strnlen.c
|
||||
Copyright: 2016 Joachim Nilsson <troglobit@gmail.com>
|
||||
License: ISC
|
||||
|
||||
Files: strtonum.c
|
||||
Copyright: 2004 Ted Unangst and Todd Miller
|
||||
License: ISC
|
||||
|
||||
Files: tempfile.c
|
||||
Copyright: 2015-2016 Joachim Nilsson <troglobit@gmail.com>
|
||||
License: ISC
|
||||
|
||||
Files: tree.c
|
||||
Copyright: 2015 Joachim Nilsson <troglobit@gmail.com>
|
||||
License: ISC
|
||||
|
||||
Files: tests/*.c
|
||||
License: public-domain
|
||||
Vendored
+1
@@ -0,0 +1 @@
|
||||
README.md
|
||||
Vendored
+2
@@ -0,0 +1,2 @@
|
||||
usr/lib
|
||||
usr/include
|
||||
Vendored
+4
@@ -0,0 +1,4 @@
|
||||
usr/include/lite/*.h
|
||||
usr/lib/*/lib*.a
|
||||
usr/lib/*/lib*.so
|
||||
usr/lib/*/pkgconfig/lib*.pc
|
||||
Vendored
+1
@@ -0,0 +1 @@
|
||||
usr/lib
|
||||
Vendored
+1
@@ -0,0 +1 @@
|
||||
usr/lib/*/lib*.so.*
|
||||
+8
@@ -0,0 +1,8 @@
|
||||
#!/usr/bin/make -f
|
||||
|
||||
# Uncomment this to turn on verbose mode.
|
||||
#export DH_VERBOSE=1
|
||||
|
||||
%:
|
||||
dh $@ --with autoreconf
|
||||
|
||||
Vendored
+1
@@ -0,0 +1 @@
|
||||
3.0 (native)
|
||||
@@ -1,6 +1,6 @@
|
||||
/* Functions for operating on files in directories.
|
||||
*
|
||||
* Copyright (c) 2008-2014 Joachim Nilsson <troglobit@gmail.com>
|
||||
* Copyright (c) 2008-2016 Joachim Nilsson <troglobit@gmail.com>
|
||||
*
|
||||
* Permission to use, copy, modify, and/or distribute this software for any
|
||||
* purpose with or without fee is hereby granted, provided that the above
|
||||
@@ -15,14 +15,14 @@
|
||||
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
#include <assert.h>
|
||||
#include <errno.h>
|
||||
#include <dirent.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
static const char *matcher_type = NULL;
|
||||
static int (*matcher_filter) (const char *file) = NULL;
|
||||
|
||||
static int matcher(const struct dirent *entry)
|
||||
{
|
||||
char *pos = strrchr(entry->d_name, '.');
|
||||
@@ -72,7 +72,8 @@ static int matcher(const struct dirent *entry)
|
||||
* would be returned as "config0".
|
||||
*
|
||||
* Returns:
|
||||
* Number of files in @list, zero if no matching files of @type.
|
||||
* Number of files in @list, zero if no matching files of @type, or
|
||||
* non-zero on error with @errno set.
|
||||
*/
|
||||
int dir(const char *dir, const char *type, int (*filter) (const char *file), char ***list, int strip)
|
||||
{
|
||||
@@ -80,7 +81,10 @@ int dir(const char *dir, const char *type, int (*filter) (const char *file), cha
|
||||
char **files;
|
||||
struct dirent **namelist;
|
||||
|
||||
assert(list);
|
||||
if (!list) {
|
||||
errno = EINVAL;
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (!dir)
|
||||
/* Assuming current directory */
|
||||
@@ -92,9 +96,10 @@ int dir(const char *dir, const char *type, int (*filter) (const char *file), cha
|
||||
matcher_type = type;
|
||||
matcher_filter = filter;
|
||||
n = scandir(dir, &namelist, matcher, alphasort);
|
||||
if (n < 0) {
|
||||
perror("scandir");
|
||||
} else if (n > 0) {
|
||||
if (n < 0)
|
||||
return -1;
|
||||
|
||||
if (n > 0) {
|
||||
files = (char **)malloc(n * sizeof(char *));
|
||||
for (i = 0; i < n; i++) {
|
||||
if (files) {
|
||||
@@ -119,109 +124,8 @@ int dir(const char *dir, const char *type, int (*filter) (const char *file), cha
|
||||
return num;
|
||||
}
|
||||
|
||||
#ifdef UNITTEST
|
||||
#include <errno.h>
|
||||
#include <sys/stat.h>
|
||||
#include <fcntl.h>
|
||||
#include "lite.h"
|
||||
|
||||
#define DIR_TYPE_IMAGE ".img"
|
||||
#define DIR_TYPE_SYSLOG ""
|
||||
#define DIR_TYPE_CONFIG ".cfg"
|
||||
#define STARTUP_CONFIG "startup-config.cfg"
|
||||
|
||||
int simulate_files(int creat)
|
||||
{
|
||||
int i;
|
||||
char *files[] =
|
||||
{ "config0.cfg", "config1.cfg", "config2.cfg", "config3.cfg",
|
||||
"rr109.img", "rx100.img", "rx107.img", "rm957.img", "messages"
|
||||
};
|
||||
|
||||
for (i = 0; i < NELEMS(files); i++) {
|
||||
if (creat)
|
||||
touch(files[i]);
|
||||
else
|
||||
erase(files[i]);
|
||||
}
|
||||
|
||||
if (creat)
|
||||
symlink("config2.cfg", STARTUP_CONFIG);
|
||||
else
|
||||
erase(STARTUP_CONFIG);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int cfg_dir_filter(const char *file)
|
||||
{
|
||||
/* Skip the STARTUP_CONFIG file, it is a symbolic link to the
|
||||
* current startup configuration. */
|
||||
return ! !strcmp(file, STARTUP_CONFIG);
|
||||
}
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
int i, num;
|
||||
char *type = DIR_TYPE_CONFIG;
|
||||
char **files;
|
||||
int once = 1;
|
||||
|
||||
int is_startup_config(const char *entry) {
|
||||
static char file[80];
|
||||
|
||||
if (once) {
|
||||
int len = readlink(STARTUP_CONFIG, file, sizeof(file));
|
||||
|
||||
if (len == -1)
|
||||
return 0;
|
||||
|
||||
file[len] = 0;
|
||||
once = 0; /* Only once per call to dir() */
|
||||
}
|
||||
//printf ("Comparing link %s with entry %s\n", file, entry);
|
||||
return !strcmp(file, entry);
|
||||
}
|
||||
|
||||
simulate_files(1);
|
||||
|
||||
if (argc >= 2) {
|
||||
if (!strcasecmp("CONFIG", argv[1])) {
|
||||
type = DIR_TYPE_CONFIG;
|
||||
system("ls -l *" DIR_TYPE_CONFIG);
|
||||
}
|
||||
if (!strcasecmp("IMAGE", argv[1])) {
|
||||
type = DIR_TYPE_IMAGE;
|
||||
system("ls -l *" DIR_TYPE_IMAGE);
|
||||
}
|
||||
if (!strcasecmp("SYSLOG", argv[1])) {
|
||||
type = DIR_TYPE_SYSLOG;
|
||||
system("ls -l *");
|
||||
}
|
||||
}
|
||||
|
||||
num = dir(NULL, type, cfg_dir_filter, &files, 0);
|
||||
if (num) {
|
||||
for (i = 0; i < num; i++) {
|
||||
printf("%s", files[i]);
|
||||
if (is_startup_config(files[i]))
|
||||
printf(" --> startup-config");
|
||||
printf("\n");
|
||||
|
||||
free(files[i]);
|
||||
}
|
||||
free(files);
|
||||
}
|
||||
|
||||
simulate_files(0);
|
||||
|
||||
return 0;
|
||||
}
|
||||
#endif /* UNITTEST */
|
||||
|
||||
/**
|
||||
* Local Variables:
|
||||
* compile-command: "make V=1 -f dir.mk"
|
||||
* indent-tabs-mode: t
|
||||
* c-file-style: "linux"
|
||||
* End:
|
||||
|
||||
@@ -44,36 +44,8 @@ int fexist(char *file)
|
||||
return 1;
|
||||
}
|
||||
|
||||
#ifdef UNITTEST
|
||||
#include "lite.h"
|
||||
|
||||
int main(void)
|
||||
{
|
||||
int i = 0;
|
||||
struct { char *file; int exist; } arr[] = {
|
||||
{ "/etc/passwd", 1 },
|
||||
{ "/etc/kalle", 0 },
|
||||
{ "/sbin/init", 1 },
|
||||
{ "/dev/null", 1 },
|
||||
{ NULL, 0 },
|
||||
};
|
||||
FILE *src, *dst;
|
||||
|
||||
for (i = 0; i < NELEMS(arr); i++) {
|
||||
if (fexist(arr[i].file) != arr[i].exist)
|
||||
err(1, "Failed fexist(%s)", arr[i].file ?: "NULL");
|
||||
else
|
||||
printf("File %-11s %-14s => OK!\n", arr[i].file ?: "NULL",
|
||||
arr[i].exist ? "does exist" : "does not exist");
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
#endif /* UNITTEST */
|
||||
|
||||
/**
|
||||
* Local Variables:
|
||||
* compile-command: "make V=1 -f fexist.mk"
|
||||
* indent-tabs-mode: t
|
||||
* c-file-style: "linux"
|
||||
* End:
|
||||
|
||||
@@ -21,7 +21,6 @@
|
||||
* THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include <unistd.h>
|
||||
|
||||
@@ -42,37 +41,8 @@ int fisdir(const char *file)
|
||||
return 0;
|
||||
}
|
||||
|
||||
#ifdef UNITTEST
|
||||
#include "lite.h"
|
||||
|
||||
int main(void)
|
||||
{
|
||||
int i = 0;
|
||||
struct { char *file; int exist; } arr[] = {
|
||||
{ "/etc/passwd", 0 },
|
||||
{ "/etc/", 1 },
|
||||
{ "/sbin/init", 0 },
|
||||
{ "/dev/null", 0 },
|
||||
{ "/dev/", 1 },
|
||||
{ NULL, 0 },
|
||||
};
|
||||
FILE *src, *dst;
|
||||
|
||||
for (i = 0; i < NELEMS(arr); i++) {
|
||||
if (fisdir(arr[i].file) != arr[i].exist)
|
||||
err(1, "Failed fisdir(%s)", arr[i].file ?: "NULL");
|
||||
else
|
||||
printf("fisdir() %-11s %-18s => OK!\n", arr[i].file ?: "NULL",
|
||||
arr[i].exist ? "is a directory" : "is NOT a directory");
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
#endif /* UNITTEST */
|
||||
|
||||
/**
|
||||
* Local Variables:
|
||||
* compile-command: "make V=1 -f fisdir.mk"
|
||||
* indent-tabs-mode: t
|
||||
* c-file-style: "linux"
|
||||
* End:
|
||||
|
||||
+2
-5
@@ -24,11 +24,6 @@
|
||||
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
#if defined(LIBC_SCCS) && !defined(lint)
|
||||
__RCSID("$NetBSD: fparseln.c,v 1.10 2009/10/21 01:07:45 snj Exp $");
|
||||
#endif /* LIBC_SCCS and not lint */
|
||||
|
||||
#include <assert.h>
|
||||
#include <errno.h>
|
||||
#include <stdio.h>
|
||||
@@ -36,7 +31,9 @@ __RCSID("$NetBSD: fparseln.c,v 1.10 2009/10/21 01:07:45 snj Exp $");
|
||||
#include <stdlib.h>
|
||||
#include "lite.h"
|
||||
|
||||
#ifndef _DIAGASSERT
|
||||
#define _DIAGASSERT(t)
|
||||
#endif
|
||||
|
||||
static int isescaped(const char *, const char *, int);
|
||||
|
||||
|
||||
+4
-37
@@ -41,10 +41,11 @@
|
||||
* The number of bytes copied. If an error is detected -1 is returned
|
||||
* and @errno will be set accordingly.
|
||||
*/
|
||||
size_t fsendfile(FILE *src, FILE *dst, size_t len)
|
||||
ssize_t fsendfile(FILE *src, FILE *dst, size_t len)
|
||||
{
|
||||
char *buf;
|
||||
size_t blk = BUFSIZ, num = 0, tot = 0;
|
||||
size_t tot = 0;
|
||||
ssize_t blk = BUFSIZ, num = 0;
|
||||
|
||||
if (!src) {
|
||||
errno = EINVAL;
|
||||
@@ -73,45 +74,11 @@ size_t fsendfile(FILE *src, FILE *dst, size_t len)
|
||||
|
||||
free(buf);
|
||||
|
||||
return (num == (size_t)-1) ? (size_t)-1 : tot;
|
||||
return (num == -1) ? -1 : (ssize_t)tot;
|
||||
}
|
||||
|
||||
#ifdef UNITTEST
|
||||
#include <err.h>
|
||||
#include <unistd.h>
|
||||
|
||||
int main(void)
|
||||
{
|
||||
int i = 0;
|
||||
char *files[] = {
|
||||
"/etc/passwd", "/tmp/tok",
|
||||
"/etc/passwd", "/tmp/passwd",
|
||||
"/etc/passwd", "/tmp/passwd",
|
||||
NULL
|
||||
};
|
||||
FILE *src, *dst;
|
||||
|
||||
while (files[i]) {
|
||||
src = fopen(files[i], "r");
|
||||
dst = fopen(files[i + 1], "w");
|
||||
printf("fsendfile(%s, %s, 512)\t", files[i], files[i + 1]);
|
||||
if (-1 == fsendfile(src, dst, 512))
|
||||
err(1, "Failed fsendfile(%s, %s)", files[i], files[i + 1]);
|
||||
|
||||
if (!access(files[i + 1], F_OK))
|
||||
printf("OK => %s\n", files[i + 1]);
|
||||
|
||||
remove(files[i + 1]);
|
||||
i += 2;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
#endif /* UNITTEST */
|
||||
|
||||
/**
|
||||
* Local Variables:
|
||||
* compile-command: "make V=1 -f fsendfile.mk"
|
||||
* indent-tabs-mode: t
|
||||
* c-file-style: "linux"
|
||||
* End:
|
||||
|
||||
@@ -1,4 +0,0 @@
|
||||
OBJS =
|
||||
TARGET = fsendfile.test clean
|
||||
|
||||
include rules.mk
|
||||
@@ -1,6 +1,6 @@
|
||||
/* Parse UNIX /etc configuration files like /etc/protocols and /etc/services
|
||||
*
|
||||
* Copyright (c) 2015 Joachim Nilsson <troglobit@gmail.com>
|
||||
* Copyright (c) 2015-2016 Joachim Nilsson <troglobit@gmail.com>
|
||||
*
|
||||
* Permission to use, copy, modify, and/or distribute this software for any
|
||||
* purpose with or without fee is hereby granted, provided that the above
|
||||
@@ -187,47 +187,8 @@ int fgetint(char *file, char *sep, char *key)
|
||||
return val;
|
||||
}
|
||||
|
||||
#ifdef UNITTEST
|
||||
int main(void)
|
||||
{
|
||||
int val;
|
||||
lfile_t lf;
|
||||
|
||||
val = fgetint("/etc/protocols", " \n\t", "udp");
|
||||
if (val == -1) {
|
||||
perror("Failed locating 'udp' protocol");
|
||||
return 1;
|
||||
}
|
||||
printf("udp has proto %d\n", val);
|
||||
|
||||
val = fgetint("/etc/services", " /\n\t", "ftp");
|
||||
if (val == -1) {
|
||||
perror("Failed locating 'ftp' service");
|
||||
return 1;
|
||||
}
|
||||
printf("ftp is inet port %d\n", val);
|
||||
|
||||
val = fgetint("/etc/group", "x:\n", "utmp");
|
||||
if (val == -1) {
|
||||
perror("Failed locating group 'utmp'");
|
||||
return 1;
|
||||
}
|
||||
printf("utmp is gid %d\n", val);
|
||||
|
||||
val = fgetint("/etc/passwd", "x:\n", "nobody");
|
||||
if (val == -1) {
|
||||
perror("Failed locating user 'nobody'");
|
||||
return 1;
|
||||
}
|
||||
printf("nobody is uid %d\n", val);
|
||||
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
/**
|
||||
* Local Variables:
|
||||
* compile-command: "make V=1 -f lfile.mk"
|
||||
* indent-tabs-mode: t
|
||||
* c-file-style: "linux"
|
||||
* End:
|
||||
|
||||
@@ -25,7 +25,7 @@
|
||||
#ifndef LITE_H_
|
||||
#define LITE_H_
|
||||
|
||||
#include <err.h>
|
||||
#include <errno.h>
|
||||
#include <stdio.h>
|
||||
#include <stdint.h> /* uint8_t, uint16_t, uint32_t, INT32_MAX, etc. */
|
||||
#include <sys/stat.h>
|
||||
@@ -56,7 +56,7 @@ FILE *tempfile (void);
|
||||
ssize_t copyfile (char *src, char *dst, int len, int sym);
|
||||
int movefile (char *src, char *dst);
|
||||
int fcopyfile (FILE *src, FILE *dst);
|
||||
size_t fsendfile (FILE *src, FILE *dst, size_t len);
|
||||
ssize_t fsendfile (FILE *src, FILE *dst, size_t len);
|
||||
|
||||
int ifconfig (char *ifname, char *addr, char *mask, int up);
|
||||
|
||||
@@ -71,7 +71,7 @@ int mkpath (char *dir, mode_t mode);
|
||||
int makepath (char *dir);
|
||||
|
||||
int dir (const char *dir, const char *type, int (*filter) (const char *file), char ***list, int strip);
|
||||
int rsync (char *src, char *dst, int delete, int (*filter) (const char *file));
|
||||
int rsync (char *src, char *dst, int delete, int (*filter) (const char *file));
|
||||
|
||||
int pidfile (const char *basename);
|
||||
int pidfile_signal(const char *pidfile, int signal);
|
||||
@@ -80,20 +80,44 @@ pid_t pidfile_poll (const char *pidfile);
|
||||
|
||||
void *reallocarray(void *optr, size_t nmemb, size_t size);
|
||||
|
||||
int tree(char *path, int show_perms);
|
||||
int tree(char *path, int show_perms);
|
||||
|
||||
void progress (int percent, int max_width);
|
||||
void progress_simple(int percent);
|
||||
|
||||
#ifndef touch
|
||||
# define touch(x) do { if (mknod((x), S_IFREG|0644, 0) && errno != EEXIST) warn("Failed creating %s", x); } while (0)
|
||||
static inline int touch(const char *path)
|
||||
{
|
||||
if (mknod((path), S_IFREG|0644, 0) && errno != EEXIST)
|
||||
return -1;
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
#ifndef makedir
|
||||
# define makedir(x, p) do { if (mkdir(x, p) && errno != EEXIST) warn("Failed creating directory %s", x); } while (0)
|
||||
static inline int makedir(const char *path, mode_t mode)
|
||||
{
|
||||
if (mkdir(path, mode) && errno != EEXIST)
|
||||
return -1;
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
#ifndef makefifo
|
||||
# define makefifo(x, p) do { if (mkfifo(x, p) && errno != EEXIST) warn("Failed creating FIFO %s", x); } while (0)
|
||||
static inline int makefifo(const char *path, mode_t mode)
|
||||
{
|
||||
if (mkfifo(path, mode) && errno != EEXIST)
|
||||
return -1;
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
#ifndef erase
|
||||
# define erase(x) do { if (remove(x) && errno != ENOENT) warn("Failed removing %s", x); } while (0)
|
||||
static inline int erase(const char *path)
|
||||
{
|
||||
if (remove(path) && errno != ENOENT)
|
||||
return -1;
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifndef chardev
|
||||
# define chardev(x,m,maj,min) mknod((x), S_IFCHR|(m), makedev((maj),(min)))
|
||||
#endif
|
||||
|
||||
+10
-67
@@ -1,6 +1,6 @@
|
||||
/* mkpath() -- Create all components leading up to a given directory
|
||||
*
|
||||
* Copyright (c) 2013 Joachim Nilsson <troglobit@gmail.com>
|
||||
* Copyright (c) 2013-2016 Joachim Nilsson <troglobit@gmail.com>
|
||||
*
|
||||
* Permission to use, copy, modify, and/or distribute this software for any
|
||||
* purpose with or without fee is hereby granted, provided that the above
|
||||
@@ -17,12 +17,18 @@
|
||||
|
||||
#include <errno.h>
|
||||
#include <libgen.h>
|
||||
#include <limits.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <sys/stat.h>
|
||||
#include <sys/types.h>
|
||||
#include "lite.h"
|
||||
|
||||
/**
|
||||
* mkpath - Like makepath() but takes a mode_t argument
|
||||
* @dir: Directory to created, relative or absolute
|
||||
* @mode: A &mode_t mode to create @dir with
|
||||
*
|
||||
* Returns:
|
||||
* POSIX OK(0) on success, otherwise -1 with @errno set.
|
||||
*/
|
||||
int mkpath(char *dir, mode_t mode)
|
||||
{
|
||||
struct stat sb;
|
||||
@@ -55,71 +61,8 @@ int makepath(char *dir)
|
||||
return mkpath(dir, 0777);
|
||||
}
|
||||
|
||||
/********************************* UNIT TESTS ************************************/
|
||||
#ifdef UNITTEST
|
||||
#include "lite.h"
|
||||
|
||||
int checkpath(char *dir)
|
||||
{
|
||||
char tmp[256];
|
||||
struct stat sb;
|
||||
|
||||
snprintf(tmp, sizeof(tmp), "ls -ld %s", dir);
|
||||
if (system(tmp))
|
||||
perror("system");
|
||||
|
||||
if (!stat(dir, &sb) && S_ISDIR(sb.st_mode))
|
||||
return 0;
|
||||
|
||||
errno = ENOTDIR;
|
||||
return 1;
|
||||
}
|
||||
|
||||
int test_makepath(char *dir)
|
||||
{
|
||||
int ret = makepath(dir);
|
||||
|
||||
if (!ret)
|
||||
ret = checkpath(dir);
|
||||
if (ret)
|
||||
perror("Failed");
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
int main(void)
|
||||
{
|
||||
int i, ret = 0;
|
||||
char *list[] = {
|
||||
"/tmp/tok/",
|
||||
"/tmp/tok2",
|
||||
"/tmp/ab",
|
||||
"/tmp/b",
|
||||
"/tmp/a/",
|
||||
"/tmp/a/b",
|
||||
"/tmp/a/c/",
|
||||
"../../sometestdir/arpa/inet",
|
||||
NULL
|
||||
};
|
||||
|
||||
for (i = 0; list[i]; i++)
|
||||
rmdir(list[i]);
|
||||
|
||||
printf("Testing makepath() ...\n");
|
||||
for (i = 0; list[i] && !ret; i++)
|
||||
ret = test_makepath(list[i]);
|
||||
|
||||
printf("\nCleaning up ...\n");
|
||||
for (i = 0; list[i]; i++)
|
||||
rmdir(list[i]);
|
||||
|
||||
return ret;
|
||||
}
|
||||
#endif /* UNITTEST */
|
||||
|
||||
/**
|
||||
* Local Variables:
|
||||
* compile-command: "make V=1 -f makepath.mk"
|
||||
* indent-tabs-mode: t
|
||||
* c-file-style: "linux"
|
||||
* End:
|
||||
|
||||
@@ -1,4 +0,0 @@
|
||||
OBJS =
|
||||
TARGET = makepath.test clean
|
||||
|
||||
include rules.mk
|
||||
@@ -1,4 +1,4 @@
|
||||
/* Updated by troglobit for libite/finit/uftpd projects 2016/03/19 */
|
||||
/* Updated by troglobit for libite/finit/uftpd projects 2016/07/04 */
|
||||
/* $OpenBSD: pidfile.c,v 1.11 2015/06/03 02:24:36 millert Exp $ */
|
||||
/* $NetBSD: pidfile.c,v 1.4 2001/02/19 22:43:42 cgd Exp $ */
|
||||
|
||||
@@ -32,6 +32,7 @@
|
||||
*/
|
||||
|
||||
#include <sys/stat.h> /* utimensat() */
|
||||
#include <sys/time.h> /* utimensat() on *BSD */
|
||||
#include <sys/types.h>
|
||||
#include <errno.h>
|
||||
#include <paths.h>
|
||||
@@ -41,10 +42,11 @@
|
||||
|
||||
#ifndef pidfile
|
||||
static char *pidfile_path = NULL;
|
||||
static pid_t pidfile_pid;
|
||||
static pid_t pidfile_pid = 0;
|
||||
|
||||
static void pidfile_cleanup(void);
|
||||
|
||||
const char *__pidfile_path = _PATH_VARRUN; /* Note: includes trailing slash '/' */
|
||||
const char *__pidfile_name = NULL;
|
||||
extern char *__progname;
|
||||
|
||||
@@ -63,9 +65,9 @@ pidfile(const char *basename)
|
||||
atexit_already = 0;
|
||||
|
||||
if (pidfile_path != NULL) {
|
||||
if (pid == pidfile_pid) {
|
||||
if (!access(pidfile_path, R_OK) && pid == pidfile_pid) {
|
||||
utimensat(0, pidfile_path, NULL, 0);
|
||||
return 0;
|
||||
return (0);
|
||||
}
|
||||
free(pidfile_path);
|
||||
pidfile_path = NULL;
|
||||
@@ -73,9 +75,13 @@ pidfile(const char *basename)
|
||||
atexit_already = 1;
|
||||
}
|
||||
|
||||
/* _PATH_VARRUN includes trailing / */
|
||||
if (asprintf(&pidfile_path, "%s%s.pid", _PATH_VARRUN, basename) == -1)
|
||||
return (-1);
|
||||
if (basename[0] != '/') {
|
||||
if (asprintf(&pidfile_path, "%s%s.pid", __pidfile_path, basename) == -1)
|
||||
return (-1);
|
||||
} else {
|
||||
if (asprintf(&pidfile_path, "%s", basename) == -1)
|
||||
return (-1);
|
||||
}
|
||||
|
||||
if ((f = fopen(pidfile_path, "w")) == NULL) {
|
||||
save_errno = errno;
|
||||
@@ -95,6 +101,7 @@ pidfile(const char *basename)
|
||||
return (-1);
|
||||
}
|
||||
(void) fclose(f);
|
||||
__pidfile_name = pidfile_path;
|
||||
|
||||
/*
|
||||
* LITE extension, no need to set up another atexit() handler
|
||||
@@ -113,7 +120,6 @@ pidfile(const char *basename)
|
||||
errno = save_errno;
|
||||
return (-1);
|
||||
}
|
||||
__pidfile_name = pidfile_path;
|
||||
|
||||
return (0);
|
||||
}
|
||||
@@ -121,8 +127,10 @@ pidfile(const char *basename)
|
||||
static void
|
||||
pidfile_cleanup(void)
|
||||
{
|
||||
|
||||
if (pidfile_path != NULL && pidfile_pid == getpid())
|
||||
if (pidfile_path != NULL && pidfile_pid == getpid()) {
|
||||
(void) unlink(pidfile_path);
|
||||
free(pidfile_path);
|
||||
pidfile_path = NULL;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
-126
@@ -21,7 +21,6 @@
|
||||
#include <signal.h>
|
||||
#include <unistd.h>
|
||||
|
||||
extern char *__pidfile_name;
|
||||
extern char *chomp(char *str);
|
||||
|
||||
/**
|
||||
@@ -118,131 +117,6 @@ int pidfile_signal(const char *pidfile, int signal)
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/********************************* UNIT TESTS ************************************/
|
||||
#ifdef UNITTEST
|
||||
#include <paths.h>
|
||||
#include <stdarg.h>
|
||||
#include <time.h>
|
||||
#include "lite.h"
|
||||
|
||||
extern char *__progname;
|
||||
static char PIDFILE[42];
|
||||
static int verbose = 0;
|
||||
static struct stat before, after;
|
||||
|
||||
static int test(int result, const char *fmt, ...)
|
||||
{
|
||||
char buf[80];
|
||||
size_t len;
|
||||
va_list ap;
|
||||
const char success[] = " \e[1m[ OK ]\e[0m\n";
|
||||
const char failure[] = " \e[7m[FAIL]\e[0m\n";
|
||||
const char dots[] = " .....................................................................";
|
||||
|
||||
va_start(ap, fmt);
|
||||
len = vsnprintf(buf, sizeof(buf), fmt, ap);
|
||||
va_end(ap);
|
||||
|
||||
write(STDERR_FILENO, buf, len);
|
||||
write(STDERR_FILENO, dots, 60 - len); /* pad with dots. */
|
||||
|
||||
if (!result)
|
||||
write(STDERR_FILENO, success, strlen(success));
|
||||
else
|
||||
write(STDERR_FILENO, failure, strlen(failure));
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
static inline int timespec_newer(const struct timespec *a, const struct timespec *b)
|
||||
{
|
||||
if (a->tv_sec != b->tv_sec)
|
||||
return a->tv_sec > b->tv_sec;
|
||||
|
||||
return a->tv_nsec > b->tv_nsec;
|
||||
}
|
||||
|
||||
char *timespec2str(struct timespec *ts, char *buf, size_t len)
|
||||
{
|
||||
size_t ret, pos;
|
||||
struct tm t;
|
||||
|
||||
memset(buf, 0, len);
|
||||
|
||||
tzset();
|
||||
if (localtime_r(&(ts->tv_sec), &t) == NULL)
|
||||
return buf;
|
||||
|
||||
ret = strftime(buf, len, "%F %T", &t);
|
||||
if (ret == 0)
|
||||
return buf;
|
||||
len -= ret - 1;
|
||||
|
||||
pos = strlen(buf);
|
||||
len -= pos;
|
||||
snprintf(&buf[pos], len, ".%09ld", ts->tv_nsec);
|
||||
|
||||
return buf;
|
||||
}
|
||||
|
||||
static void sigterm_handler(int UNUSED(signo))
|
||||
{
|
||||
if (verbose)
|
||||
printf("Exiting ...\n");
|
||||
}
|
||||
|
||||
static void sigalrm_handler(int UNUSED(signo))
|
||||
{
|
||||
pidfile(NULL);
|
||||
if (!fexist(PIDFILE))
|
||||
err(1, "failed creating %s", PIDFILE);
|
||||
stat(PIDFILE, &before);
|
||||
}
|
||||
|
||||
static int mtime()
|
||||
{
|
||||
int ret;
|
||||
char buf[80];
|
||||
|
||||
/* Must sleep a while here otherwise we execute too fast => no mtime change :-( */
|
||||
usleep(10000);
|
||||
|
||||
if (verbose)
|
||||
printf("Calling pidfile() again to update mtime ...\n");
|
||||
pidfile(NULL);
|
||||
stat(PIDFILE, &after);
|
||||
|
||||
ret = timespec_newer(&after.st_mtim, &before.st_mtim);
|
||||
if (verbose) {
|
||||
printf("Before: %s\n", timespec2str(&before.st_mtim, buf, sizeof(buf)));
|
||||
printf("After : %s\n", timespec2str(&after.st_mtim, buf, sizeof(buf)));
|
||||
}
|
||||
|
||||
return !ret;
|
||||
}
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
if (argc > 1 && !strcmp(argv[1], "-v"))
|
||||
verbose = 1;
|
||||
|
||||
snprintf(PIDFILE, sizeof(PIDFILE), "%s%s.pid", _PATH_VARRUN, __progname);
|
||||
|
||||
signal(SIGTERM, sigterm_handler);
|
||||
signal(SIGALRM, sigalrm_handler);
|
||||
alarm(1);
|
||||
|
||||
return test(pidfile_poll(PIDFILE) != getpid(), "Testing pidfile_poll()")
|
||||
|| test(strcmp(__pidfile_name, PIDFILE), "Testing __pidfile_name vs guessed PID filename")
|
||||
|| test(mtime(), "Testing mtime update of followup pidfile() call")
|
||||
|| test(pidfile_signal(PIDFILE, SIGTERM), "Testing signalling ourselves")
|
||||
;
|
||||
|
||||
return 0;
|
||||
}
|
||||
#endif /* UNITTEST */
|
||||
|
||||
/**
|
||||
* Local Variables:
|
||||
* compile-command: "make V=1 -f pidfilefn.mk"
|
||||
|
||||
@@ -1,6 +0,0 @@
|
||||
CFLAGS = -W -Wall -Wextra -Werror
|
||||
OBJS = pidfile.o chomp.o fexist.o
|
||||
ASROOT = 1
|
||||
TARGET = clean $(OBJS) pidfilefn.test
|
||||
|
||||
include rules.mk
|
||||
-52
@@ -114,60 +114,8 @@ void progress_simple(int percent)
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef UNITTEST
|
||||
#include <stdlib.h> /* atexit() */
|
||||
#include <unistd.h> /* usleep() */
|
||||
|
||||
#define MAX_WIDTH 80
|
||||
#define msleep(msec) usleep(msec * 1000)
|
||||
|
||||
static void bye(void)
|
||||
{
|
||||
showcursor();
|
||||
}
|
||||
|
||||
static void testit(int fn, int percent)
|
||||
{
|
||||
if (fn)
|
||||
progress(percent, MAX_WIDTH);
|
||||
else
|
||||
progress_simple(percent);
|
||||
}
|
||||
|
||||
static void test(int fn)
|
||||
{
|
||||
int i, percent, block = 0, num = 85;
|
||||
|
||||
while (block < num) {
|
||||
percent = block * 100 / num;
|
||||
for (i = 0; i < 10; i++) {
|
||||
testit(fn, percent);
|
||||
msleep(5);
|
||||
}
|
||||
block++;
|
||||
msleep(10);
|
||||
}
|
||||
testit(fn, 100);
|
||||
}
|
||||
|
||||
int main(void)
|
||||
{
|
||||
atexit(bye);
|
||||
hidecursor();
|
||||
|
||||
printf("\nAdvanced:\n");
|
||||
test(1);
|
||||
printf("\nSimple:\n");
|
||||
test(0);
|
||||
printf("\n");
|
||||
|
||||
return 0;
|
||||
}
|
||||
#endif /* UNITTEST */
|
||||
|
||||
/**
|
||||
* Local Variables:
|
||||
* compile-command: "make V=1 -f progress.mk"
|
||||
* indent-tabs-mode: t
|
||||
* c-file-style: "linux"
|
||||
* End:
|
||||
|
||||
@@ -1,4 +0,0 @@
|
||||
OBJS =
|
||||
TARGET = progress.test clean
|
||||
|
||||
include rules.mk
|
||||
@@ -193,119 +193,8 @@ static int prune(char *dst, char **new_files, int new_num)
|
||||
return result;
|
||||
}
|
||||
|
||||
#ifdef UNITTEST
|
||||
#define BASE "/tmp/.unittest/"
|
||||
#define SRC BASE "src/"
|
||||
#define DST BASE "dst/"
|
||||
|
||||
static int verbose = 0;
|
||||
static char *files[] = {
|
||||
SRC "sub1/1.tst",
|
||||
SRC "sub1/2.tst",
|
||||
SRC "sub1/3.tst",
|
||||
SRC "sub2/4.tst",
|
||||
SRC "sub2/5.tst",
|
||||
SRC "sub2/6.tst",
|
||||
SRC "sub3/7.tst",
|
||||
SRC "sub3/8.tst",
|
||||
SRC "sub3/9.tst",
|
||||
NULL
|
||||
};
|
||||
|
||||
void cleanup_test(void)
|
||||
{
|
||||
system("rm -rf " BASE);
|
||||
}
|
||||
|
||||
void setup_test(void)
|
||||
{
|
||||
int i;
|
||||
char cmd[256];
|
||||
mode_t dir_modes[] = { 755, 700 };
|
||||
mode_t file_modes[] = { 644, 600 };
|
||||
|
||||
cleanup_test();
|
||||
|
||||
mkdir(BASE, 0755);
|
||||
mkdir(SRC, 0755);
|
||||
mkdir(DST, 0755);
|
||||
|
||||
for (i = 0; files[i]; i++) {
|
||||
snprintf(cmd, sizeof(cmd), "mkdir -m %d -p `dirname %s`",
|
||||
dir_modes[i % 2], files[i]);
|
||||
system(cmd);
|
||||
|
||||
snprintf(cmd, sizeof(cmd), "touch %s; chmod %d %s", files[i],
|
||||
file_modes[i % 2], files[i]);
|
||||
system(cmd);
|
||||
}
|
||||
}
|
||||
|
||||
static void check_tree(char *heading, char *dir)
|
||||
{
|
||||
if (verbose) {
|
||||
char cmd[128];
|
||||
|
||||
if (heading)
|
||||
puts(heading);
|
||||
|
||||
tree(dir, 1);
|
||||
}
|
||||
}
|
||||
|
||||
int run_test(void)
|
||||
{
|
||||
int result = 0;
|
||||
|
||||
#if 0
|
||||
setup_test();
|
||||
check_tree("Before:", BASE);
|
||||
|
||||
result += rsync(SRC, DST, 0, NULL);
|
||||
check_tree("After:", BASE);
|
||||
cleanup_test();
|
||||
#endif
|
||||
|
||||
setup_test();
|
||||
result += rsync(BASE "src", DST, 0, NULL);
|
||||
check_tree("Only partial rsync of src <-- No slash!", BASE);
|
||||
#if 0
|
||||
cleanup_test();
|
||||
setup_test();
|
||||
result += rsync(BASE "src/sub1", BASE "dst", 0, NULL);
|
||||
check_tree("Only partial rsync of src/sub1 <-- No slashes!!", BASE);
|
||||
|
||||
cleanup_test();
|
||||
setup_test();
|
||||
result += rsync(BASE "src/sub1/", DST, 0, NULL);
|
||||
check_tree("Only partial rsync of src/sub1/", BASE);
|
||||
|
||||
cleanup_test();
|
||||
setup_test();
|
||||
result += rsync(BASE "src/sub1", DST, 0, NULL);
|
||||
check_tree("Only partial rsync of src/sub1 <-- No slash!", BASE);
|
||||
|
||||
result += rsync("/etc", "/var/tmp", 0, NULL);
|
||||
check_tree("Real life test:", "/var/tmp");
|
||||
#endif
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
if (argc > 1)
|
||||
verbose = !strncmp("-v", argv[1], 2);
|
||||
|
||||
atexit(cleanup_test);
|
||||
|
||||
return run_test();
|
||||
}
|
||||
#endif /* UNITTEST */
|
||||
|
||||
/**
|
||||
* Local Variables:
|
||||
* compile-command: "make V=1 -f rsync.mk"
|
||||
* indent-tabs-mode: t
|
||||
* c-file-style: "linux"
|
||||
* End:
|
||||
|
||||
@@ -1,4 +0,0 @@
|
||||
OBJS = dir.o copyfile.o fexist.o fisdir.o fmode.o tree.o
|
||||
TARGET = clean $(OBJS) rsync.test
|
||||
|
||||
include rules.mk
|
||||
@@ -1,30 +0,0 @@
|
||||
CFLAGS += -g -O0
|
||||
CPPFLAGS += -D_GNU_SOURCE
|
||||
|
||||
ifeq ($V,1)
|
||||
VERBOSE = -v
|
||||
REDIRECT =
|
||||
else
|
||||
VERBOSE =
|
||||
REDIRECT = >/dev/null
|
||||
endif
|
||||
|
||||
# Some tests may need to be run as root, e.g. pidfile()
|
||||
ifeq ($(ASROOT), 1)
|
||||
SUDO = sudo -n
|
||||
else
|
||||
SUDO =
|
||||
endif
|
||||
|
||||
all: $(TARGET)
|
||||
|
||||
%.test: %.c
|
||||
@printf " TEST $@\n"
|
||||
@$(CC) $(CFLAGS) $(CPPFLAGS) -g -o $@ -DUNITTEST $< $(OBJS)
|
||||
@$(RM) $(OBJS)
|
||||
@$(SUDO) ./$@ $(VERBOSE) $(REDIRECT)
|
||||
|
||||
clean::
|
||||
-@$(RM) $(OBJS) $(DEPS) $(TARGET) $(SOLIB) $(STATICLIB)
|
||||
-@$(RM) $(JUNK) unittest *.o *.a *.so* *.unittest *.test
|
||||
|
||||
@@ -23,9 +23,8 @@
|
||||
* USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
* ==========================================================================
|
||||
*/
|
||||
#ifndef GNU_STRING_STRDUPA_H
|
||||
#define GNU_STRING_STRDUPA_H
|
||||
|
||||
#ifndef LITE_STRDUPA_H
|
||||
#define LITE_STRDUPA_H
|
||||
|
||||
#if !defined(HAVE_STRDUPA)
|
||||
#if defined(strdupa)
|
||||
@@ -33,7 +32,6 @@
|
||||
#endif
|
||||
#endif
|
||||
|
||||
|
||||
#if !HAVE_STRDUPA
|
||||
#if defined(__GNUC__)
|
||||
#include <stddef.h> /* size_t */
|
||||
@@ -51,5 +49,4 @@
|
||||
#endif /* __GNUC__ */
|
||||
#endif /* !HAVE_STRDUPA */
|
||||
|
||||
|
||||
#endif /* GNU_STRING_STRDUPA_H */
|
||||
#endif /* LITE_STRDUPA_H */
|
||||
+3
-8
@@ -23,9 +23,8 @@
|
||||
* USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
* ==========================================================================
|
||||
*/
|
||||
#ifndef GNU_STRING_STRNDUPA_H
|
||||
#define GNU_STRING_STRNDUPA_H
|
||||
|
||||
#ifndef LITE_STRNDUPA_H_
|
||||
#define LITE_STRNDUPA_H_
|
||||
|
||||
#if !defined(HAVE_STRNDUPA)
|
||||
#if defined(strndupa)
|
||||
@@ -33,14 +32,11 @@
|
||||
#endif
|
||||
#endif
|
||||
|
||||
|
||||
#if !HAVE_STRNDUPA
|
||||
#if defined(__GNUC__)
|
||||
#include <stddef.h> /* size_t */
|
||||
|
||||
#include <string.h> /* memcpy(3) */
|
||||
|
||||
#include <gnu/string/strnlen.h>
|
||||
#include "strnlen.h"
|
||||
|
||||
#define strndupa(src, lim) (__extension__ ({ \
|
||||
size_t len_ = strnlen(src, lim); \
|
||||
@@ -54,5 +50,4 @@
|
||||
#endif /* __GNUC__ */
|
||||
#endif /* !HAVE_STRNDUPA */
|
||||
|
||||
|
||||
#endif /* GNU_STRING_STRNDUPA_H */
|
||||
@@ -15,8 +15,8 @@
|
||||
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
#ifndef LITE_STRNLEN_H
|
||||
#define LITE_STRNLEN_H
|
||||
#ifndef LITE_STRNLEN_H_
|
||||
#define LITE_STRNLEN_H_
|
||||
|
||||
#if !defined(HAVE_STRNLEN)
|
||||
#if defined(strnlen)
|
||||
@@ -24,7 +24,6 @@
|
||||
#endif
|
||||
#endif
|
||||
|
||||
|
||||
#if !HAVE_STRNLEN
|
||||
#include <stddef.h> /* size_t */
|
||||
|
||||
@@ -41,4 +40,4 @@ static inline size_t xstrnlen(const char *str, size_t lim)
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* LITE_STRNLEN_H */
|
||||
#endif /* LITE_STRNLEN_H_ */
|
||||
+1
-10
@@ -1,6 +1,6 @@
|
||||
/* A secure tmpfile() replacement.
|
||||
*
|
||||
* Copyright (c) 2015 Joachim Nilsson <troglobit@gmail.com>
|
||||
* Copyright (c) 2015-2016 Joachim Nilsson <troglobit@gmail.com>
|
||||
*
|
||||
* Permission to use, copy, modify, and/or distribute this software for any
|
||||
* purpose with or without fee is hereby granted, provided that the above
|
||||
@@ -51,17 +51,8 @@ FILE *tempfile(void)
|
||||
#endif
|
||||
}
|
||||
|
||||
#ifdef UNITTEST
|
||||
int main(void)
|
||||
{
|
||||
FILE *fp = tempfile(); system("ls -lrt "
|
||||
_PATH_TMP " | tail -10"); return fclose(fp);
|
||||
}
|
||||
#endif
|
||||
|
||||
/**
|
||||
* Local Variables:
|
||||
* compile-command: "make V=1 -f tempfile.mk"
|
||||
* indent-tabs-mode: t
|
||||
* c-file-style: "linux"
|
||||
* End:
|
||||
|
||||
@@ -1,4 +0,0 @@
|
||||
OBJS =
|
||||
TARGET = tempfile.test clean
|
||||
|
||||
include rules.mk
|
||||
@@ -0,0 +1,15 @@
|
||||
*.log
|
||||
*.trs
|
||||
chomp
|
||||
copyfile
|
||||
dir
|
||||
fexist
|
||||
fisdir
|
||||
fsendfile
|
||||
lfile
|
||||
makepath
|
||||
pidfile
|
||||
progress
|
||||
rsync
|
||||
tempfile
|
||||
tree
|
||||
@@ -0,0 +1,24 @@
|
||||
EXTRA_DIST = check.h
|
||||
CLEANFILES = *~ *.trs *.log
|
||||
|
||||
TESTS =
|
||||
TESTS += chomp
|
||||
TESTS += copyfile
|
||||
TESTS += dir
|
||||
TESTS += fexist
|
||||
TESTS += fisdir
|
||||
TESTS += fsendfile
|
||||
TESTS += lfile
|
||||
TESTS += makepath
|
||||
TESTS += pidfile
|
||||
TESTS += progress
|
||||
TESTS += rsync
|
||||
TESTS += tempfile
|
||||
TESTS += tree
|
||||
|
||||
check_PROGRAMS = $(TESTS)
|
||||
|
||||
# Ignore warnings about unused result, in e.g. write()
|
||||
CPPFLAGS = -D_GNU_SOURCE
|
||||
LDADD = -L../ ../libite.la
|
||||
LDFLAGS = -static
|
||||
@@ -0,0 +1,78 @@
|
||||
#ifndef LITE_TESTS_CHECK_H_
|
||||
#define LITE_TESTS_CHECK_H_
|
||||
|
||||
#include <stdarg.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <time.h>
|
||||
|
||||
#include "../lite.h"
|
||||
|
||||
#define fail_unless(test) \
|
||||
do { \
|
||||
if (!(test)) { \
|
||||
fprintf(stderr, \
|
||||
"----------------------------------------------\n" \
|
||||
"%s:%d: test FAILED:\nFailed test: %s\n" \
|
||||
"----------------------------------------------\n", \
|
||||
__FILE__, __LINE__, #test); \
|
||||
exit(1); \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
static inline int test(int result, const char *fmt, ...)
|
||||
{
|
||||
char buf[80];
|
||||
size_t len;
|
||||
va_list ap;
|
||||
const char success[] = " \033[1m[ OK ]\033[0m\n";
|
||||
const char failure[] = " \033[7m[FAIL]\033[0m\n";
|
||||
const char dots[] = " .....................................................................";
|
||||
|
||||
va_start(ap, fmt);
|
||||
len = vsnprintf(buf, sizeof(buf), fmt, ap);
|
||||
va_end(ap);
|
||||
|
||||
write(STDERR_FILENO, buf, len);
|
||||
write(STDERR_FILENO, dots, 60 - len); /* pad with dots. */
|
||||
|
||||
if (!result)
|
||||
write(STDERR_FILENO, success, strlen(success));
|
||||
else
|
||||
write(STDERR_FILENO, failure, strlen(failure));
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
static inline int timespec_newer(const struct timespec *a, const struct timespec *b)
|
||||
{
|
||||
if (a->tv_sec != b->tv_sec)
|
||||
return a->tv_sec > b->tv_sec;
|
||||
|
||||
return a->tv_nsec > b->tv_nsec;
|
||||
}
|
||||
|
||||
static inline char *timespec2str(struct timespec *ts, char *buf, size_t len)
|
||||
{
|
||||
size_t ret, pos;
|
||||
struct tm t;
|
||||
|
||||
memset(buf, 0, len);
|
||||
|
||||
tzset();
|
||||
if (localtime_r(&(ts->tv_sec), &t) == NULL)
|
||||
return buf;
|
||||
|
||||
ret = strftime(buf, len, "%F %T", &t);
|
||||
if (ret == 0)
|
||||
return buf;
|
||||
len -= ret - 1;
|
||||
|
||||
pos = strlen(buf);
|
||||
len -= pos;
|
||||
snprintf(&buf[pos], len, ".%09ld", ts->tv_nsec);
|
||||
|
||||
return buf;
|
||||
}
|
||||
|
||||
#endif /* LITE_TESTS_CHECK_H_ */
|
||||
@@ -0,0 +1,24 @@
|
||||
#include "check.h"
|
||||
|
||||
int main(void)
|
||||
{
|
||||
size_t i;
|
||||
char t[][16] = {
|
||||
"hej\ndej",
|
||||
"Slime\n\n\\n",
|
||||
"Tripple\n\n\n"
|
||||
};
|
||||
|
||||
for (i = 0; i < NELEMS(t); i++) {
|
||||
char *str = t[i];
|
||||
size_t len;
|
||||
|
||||
chomp(str);
|
||||
len = strlen(str);
|
||||
printf("[%02zd]: '%s'\n", i, str);
|
||||
|
||||
fail_unless(str[len] != '\n');
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -0,0 +1,55 @@
|
||||
#include <err.h>
|
||||
#include <errno.h>
|
||||
#include "check.h"
|
||||
|
||||
int main(void)
|
||||
{
|
||||
int i = 0;
|
||||
char *files[] = {
|
||||
"/etc/passwd", "/tmp/mypwd", "/tmp/mypwd",
|
||||
"/etc/passwd", "/tmp/", "/tmp/passwd",
|
||||
"/etc/passwd", "/tmp", "/tmp/passwd",
|
||||
NULL
|
||||
};
|
||||
FILE *src, *dst;
|
||||
|
||||
printf("=>Start testing fcopyfile()\n");
|
||||
while (files[i]) {
|
||||
printf("fcopyfile(%s, %s)\t", files[i], files[i + 1]);
|
||||
src = fopen(files[i], "r");
|
||||
dst = fopen(files[i + 1], "w");
|
||||
if (fcopyfile(src, dst)) {
|
||||
if (!fisdir(files[i + 1]))
|
||||
err(1, "Failed fcopyfile(%s, %s)", files[i], files[i + 1]);
|
||||
}
|
||||
|
||||
if (src)
|
||||
fclose(src);
|
||||
if (dst)
|
||||
fclose(dst);
|
||||
|
||||
if (fexist(files[i + 2]))
|
||||
printf("OK => %s", files[i + 2]);
|
||||
printf("\n");
|
||||
|
||||
erase(files[i + 2]);
|
||||
i += 3;
|
||||
}
|
||||
|
||||
printf("\n=>Start testing copyfile()\n");
|
||||
i = 0;
|
||||
while (files[i]) {
|
||||
printf("copyfile(%s, %s)\t", files[i], files[i + 1]);
|
||||
if (!copyfile(files[i], files[i + 1], 0, 0))
|
||||
err(1, "Failed copyfile(%s, %s)", files[i], files[i + 1]);
|
||||
|
||||
if (fexist(files[i + 2]))
|
||||
printf("OK => %s", files[i + 2]);
|
||||
printf("\n");
|
||||
|
||||
erase(files[i + 2]);
|
||||
i += 3;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
+99
@@ -0,0 +1,99 @@
|
||||
#include <errno.h>
|
||||
#include <fcntl.h>
|
||||
#include <stdlib.h>
|
||||
#include <sys/stat.h>
|
||||
#include "check.h"
|
||||
|
||||
#define DIR_TYPE_IMAGE ".img"
|
||||
#define DIR_TYPE_SYSLOG ""
|
||||
#define DIR_TYPE_CONFIG ".cfg"
|
||||
#define STARTUP_CONFIG "startup-config.cfg"
|
||||
|
||||
int simulate_files(int creat)
|
||||
{
|
||||
size_t i;
|
||||
char *files[] =
|
||||
{ "config0.cfg", "config1.cfg", "config2.cfg", "config3.cfg",
|
||||
"rr109.img", "rx100.img", "rx107.img", "rm957.img", "messages"
|
||||
};
|
||||
|
||||
for (i = 0; i < NELEMS(files); i++) {
|
||||
if (creat)
|
||||
touch(files[i]);
|
||||
else
|
||||
erase(files[i]);
|
||||
}
|
||||
|
||||
if (creat)
|
||||
symlink("config2.cfg", STARTUP_CONFIG);
|
||||
else
|
||||
erase(STARTUP_CONFIG);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int cfg_dir_filter(const char *file)
|
||||
{
|
||||
/* Skip the STARTUP_CONFIG file, it is a symbolic link to the
|
||||
* current startup configuration. */
|
||||
return ! !strcmp(file, STARTUP_CONFIG);
|
||||
}
|
||||
|
||||
static int is_startup_config(const char *entry)
|
||||
{
|
||||
static int once = 1;
|
||||
static char file[80];
|
||||
|
||||
if (once) {
|
||||
int len = readlink(STARTUP_CONFIG, file, sizeof(file));
|
||||
|
||||
if (len == -1)
|
||||
return 0;
|
||||
|
||||
file[len] = 0;
|
||||
once = 0; /* Only once per call to dir() */
|
||||
}
|
||||
//printf ("Comparing link %s with entry %s\n", file, entry);
|
||||
return !strcmp(file, entry);
|
||||
}
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
int i, num;
|
||||
char *type = DIR_TYPE_CONFIG;
|
||||
char **files;
|
||||
|
||||
simulate_files(1);
|
||||
|
||||
if (argc >= 2) {
|
||||
if (!strcasecmp("CONFIG", argv[1])) {
|
||||
type = DIR_TYPE_CONFIG;
|
||||
system("ls -l *" DIR_TYPE_CONFIG);
|
||||
}
|
||||
if (!strcasecmp("IMAGE", argv[1])) {
|
||||
type = DIR_TYPE_IMAGE;
|
||||
system("ls -l *" DIR_TYPE_IMAGE);
|
||||
}
|
||||
if (!strcasecmp("SYSLOG", argv[1])) {
|
||||
type = DIR_TYPE_SYSLOG;
|
||||
system("ls -l *");
|
||||
}
|
||||
}
|
||||
|
||||
num = dir(NULL, type, cfg_dir_filter, &files, 0);
|
||||
if (num) {
|
||||
for (i = 0; i < num; i++) {
|
||||
printf("%s", files[i]);
|
||||
if (is_startup_config(files[i]))
|
||||
printf(" --> startup-config");
|
||||
printf("\n");
|
||||
|
||||
free(files[i]);
|
||||
}
|
||||
free(files);
|
||||
}
|
||||
|
||||
simulate_files(0);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -0,0 +1,24 @@
|
||||
#include <err.h>
|
||||
#include "check.h"
|
||||
|
||||
int main(void)
|
||||
{
|
||||
size_t i = 0;
|
||||
struct { char *file; int exist; } arr[] = {
|
||||
{ "/etc/passwd", 1 },
|
||||
{ "/etc/kalle", 0 },
|
||||
{ "/sbin/init", 1 },
|
||||
{ "/dev/null", 1 },
|
||||
{ NULL, 0 },
|
||||
};
|
||||
|
||||
for (i = 0; i < NELEMS(arr); i++) {
|
||||
if (fexist(arr[i].file) != arr[i].exist)
|
||||
err(1, "Failed fexist(%s)", arr[i].file ?: "NULL");
|
||||
else
|
||||
printf("File %-11s %-14s => OK!\n", arr[i].file ?: "NULL",
|
||||
arr[i].exist ? "does exist" : "does not exist");
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -0,0 +1,25 @@
|
||||
#include <err.h>
|
||||
#include "check.h"
|
||||
|
||||
int main(void)
|
||||
{
|
||||
size_t i = 0;
|
||||
struct { char *file; int exist; } arr[] = {
|
||||
{ "/etc/passwd", 0 },
|
||||
{ "/etc/", 1 },
|
||||
{ "/sbin/init", 0 },
|
||||
{ "/dev/null", 0 },
|
||||
{ "/dev/", 1 },
|
||||
{ NULL, 0 },
|
||||
};
|
||||
|
||||
for (i = 0; i < NELEMS(arr); i++) {
|
||||
if (fisdir(arr[i].file) != arr[i].exist)
|
||||
err(1, "Failed fisdir(%s)", arr[i].file ?: "NULL");
|
||||
else
|
||||
printf("fisdir() %-11s %-18s => OK!\n", arr[i].file ?: "NULL",
|
||||
arr[i].exist ? "is a directory" : "is NOT a directory");
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -0,0 +1,31 @@
|
||||
#include <err.h>
|
||||
#include <unistd.h>
|
||||
#include "check.h"
|
||||
|
||||
int main(void)
|
||||
{
|
||||
int i = 0;
|
||||
char *files[] = {
|
||||
"/etc/passwd", "/tmp/tok",
|
||||
"/etc/passwd", "/tmp/passwd",
|
||||
"/etc/passwd", "/tmp/passwd",
|
||||
NULL
|
||||
};
|
||||
FILE *src, *dst;
|
||||
|
||||
while (files[i]) {
|
||||
src = fopen(files[i], "r");
|
||||
dst = fopen(files[i + 1], "w");
|
||||
printf("fsendfile(%s, %s, 512)\t", files[i], files[i + 1]);
|
||||
if (-1 == fsendfile(src, dst, 512))
|
||||
err(1, "Failed fsendfile(%s, %s)", files[i], files[i + 1]);
|
||||
|
||||
if (!access(files[i + 1], F_OK))
|
||||
printf("OK => %s\n", files[i + 1]);
|
||||
|
||||
remove(files[i + 1]);
|
||||
i += 2;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -0,0 +1,67 @@
|
||||
#include <stdio.h>
|
||||
#include "check.h"
|
||||
|
||||
#define FSTAB "/etc/fstab"
|
||||
|
||||
static int fstab(void)
|
||||
{
|
||||
int field = 1;
|
||||
char *token, *dev;
|
||||
lfile_t *lf;
|
||||
|
||||
lf = lfopen(FSTAB, " \t\n");
|
||||
if (!lf) {
|
||||
perror("Failed opening " FSTAB);
|
||||
return 1;
|
||||
}
|
||||
|
||||
while ((token = lftok(lf))) {
|
||||
if (field == 1)
|
||||
dev = token;
|
||||
if (field == 6) {
|
||||
field = 0;
|
||||
printf("Found %s passno %d\n", dev, atoi(token));
|
||||
}
|
||||
|
||||
field++;
|
||||
}
|
||||
|
||||
lfclose(lf);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int main(void)
|
||||
{
|
||||
int val;
|
||||
|
||||
val = fgetint("/etc/protocols", " \n\t", "udp");
|
||||
if (val == -1) {
|
||||
perror("Failed locating 'udp' protocol");
|
||||
return 1;
|
||||
}
|
||||
printf("udp has proto %d\n", val);
|
||||
|
||||
val = fgetint("/etc/services", " /\n\t", "ftp");
|
||||
if (val == -1) {
|
||||
perror("Failed locating 'ftp' service");
|
||||
return 1;
|
||||
}
|
||||
printf("ftp is inet port %d\n", val);
|
||||
|
||||
val = fgetint("/etc/group", "x:\n", "utmp");
|
||||
if (val == -1) {
|
||||
perror("Failed locating group 'utmp'");
|
||||
return 1;
|
||||
}
|
||||
printf("utmp is gid %d\n", val);
|
||||
|
||||
val = fgetint("/etc/passwd", "x:\n", "nobody");
|
||||
if (val == -1) {
|
||||
perror("Failed locating user 'nobody'");
|
||||
return 1;
|
||||
}
|
||||
printf("nobody is uid %d\n", val);
|
||||
|
||||
return fstab();
|
||||
}
|
||||
@@ -0,0 +1,67 @@
|
||||
#include <errno.h>
|
||||
#include <errno.h>
|
||||
#include <libgen.h>
|
||||
#include <stdlib.h>
|
||||
#include "check.h"
|
||||
|
||||
int checkpath(char *dir)
|
||||
{
|
||||
char tmp[256];
|
||||
struct stat sb;
|
||||
|
||||
snprintf(tmp, sizeof(tmp), "ls -ld %s", dir);
|
||||
if (system(tmp))
|
||||
perror("system");
|
||||
|
||||
if (!stat(dir, &sb) && S_ISDIR(sb.st_mode))
|
||||
return 0;
|
||||
|
||||
errno = ENOTDIR;
|
||||
return 1;
|
||||
}
|
||||
|
||||
int test_makepath(char *dir)
|
||||
{
|
||||
int ret = makepath(dir);
|
||||
|
||||
if (!ret)
|
||||
ret = checkpath(dir);
|
||||
if (ret)
|
||||
perror("Failed");
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
int main(void)
|
||||
{
|
||||
int i, ret = 0;
|
||||
char *list[] = {
|
||||
"/tmp/libite-test/tok/",
|
||||
"/tmp/libite-test/tok2",
|
||||
"/tmp/libite-test/ab",
|
||||
"/tmp/libite-test/b",
|
||||
"/tmp/libite-test/a/",
|
||||
"/tmp/libite-test/a/b",
|
||||
"/tmp/libite-test/a/c/",
|
||||
NULL
|
||||
};
|
||||
|
||||
printf("Testing makepath() ...\n");
|
||||
mkdir("/tmp/libite-test", 0755);
|
||||
|
||||
for (i = 0; list[i] && !ret; i++)
|
||||
ret |= test_makepath(list[i]);
|
||||
|
||||
printf("\nCleaning up ...\n");
|
||||
system("rm -rf /tmp/libite-test");
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* Local Variables:
|
||||
* indent-tabs-mode: t
|
||||
* c-file-style: "linux"
|
||||
* compile-command: "make makepath && ./makepath"
|
||||
* End:
|
||||
*/
|
||||
+131
@@ -0,0 +1,131 @@
|
||||
#include <err.h>
|
||||
#include <paths.h>
|
||||
#include <signal.h>
|
||||
#include <stdarg.h>
|
||||
#include <time.h>
|
||||
|
||||
#include "check.h"
|
||||
|
||||
#define PRINT(args...) if (verbose) printf(args)
|
||||
|
||||
extern char *__pidfile_name;
|
||||
extern char *__pidfile_path;
|
||||
|
||||
static char *ident;
|
||||
static char *pidfile_arg;
|
||||
static char PIDFILE[42];
|
||||
static int verbose = 0;
|
||||
static struct stat before, after;
|
||||
|
||||
static void sigterm_handler(int UNUSED(signo))
|
||||
{
|
||||
PRINT("Exiting ...\n");
|
||||
remove(PIDFILE);
|
||||
}
|
||||
|
||||
static void sigalrm_handler(int UNUSED(signo))
|
||||
{
|
||||
PRINT("Calling pidfile(%s)\n", pidfile_arg ?: "NULL");
|
||||
if (pidfile(pidfile_arg))
|
||||
err(1, "failed creating1 %s", pidfile_arg);
|
||||
if (!fexist(PIDFILE))
|
||||
err(1, "failed creating2 %s, created %s", PIDFILE, __pidfile_name);
|
||||
stat(PIDFILE, &before);
|
||||
}
|
||||
|
||||
static int mtime()
|
||||
{
|
||||
int ret;
|
||||
char buf[80];
|
||||
|
||||
/* Must sleep a while here otherwise we execute too fast => no mtime change :-( */
|
||||
usleep(10000);
|
||||
|
||||
PRINT("Calling pidfile() again to update mtime ...\n");
|
||||
if (pidfile(pidfile_arg))
|
||||
err(1, "failed creating3 %s", pidfile_arg);
|
||||
stat(PIDFILE, &after);
|
||||
|
||||
ret = timespec_newer(&after.st_mtim, &before.st_mtim);
|
||||
PRINT("Before: %s\n", timespec2str(&before.st_mtim, buf, sizeof(buf)));
|
||||
PRINT("After : %s\n", timespec2str(&after.st_mtim, buf, sizeof(buf)));
|
||||
|
||||
return !ret;
|
||||
}
|
||||
|
||||
int test_pidfile(char *arg0)
|
||||
{
|
||||
/* pidfile() argument */
|
||||
pidfile_arg = arg0;
|
||||
|
||||
/* Expected PID file name */
|
||||
if (!arg0)
|
||||
snprintf(PIDFILE, sizeof(PIDFILE), "%s%s.pid", __pidfile_path, ident);
|
||||
else if (arg0[0] != '/')
|
||||
snprintf(PIDFILE, sizeof(PIDFILE), "%s%s.pid", __pidfile_path, arg0);
|
||||
else
|
||||
snprintf(PIDFILE, sizeof(PIDFILE), "%s", arg0);
|
||||
|
||||
PRINT("Verifying pidfile(%s) ... PID: %d\n", PIDFILE, getpid());
|
||||
|
||||
/* Remove any lingering files from previous test runs */
|
||||
remove(PIDFILE);
|
||||
|
||||
signal(SIGTERM, sigterm_handler);
|
||||
signal(SIGALRM, sigalrm_handler);
|
||||
|
||||
/* For signalling test */
|
||||
alarm(1);
|
||||
|
||||
return test(pidfile_poll(PIDFILE) != getpid(), "Testing pidfile_poll()")
|
||||
|| test(strcmp(__pidfile_name, PIDFILE), "Testing __pidfile_name vs guessed PID filename")
|
||||
|| test(mtime(), "Testing mtime update of followup pidfile() call")
|
||||
|| test(pidfile_signal(PIDFILE, SIGTERM), "Testing signalling ourselves")
|
||||
;
|
||||
}
|
||||
|
||||
static char *progname(char *arg0)
|
||||
{
|
||||
char *nm;
|
||||
|
||||
nm = strrchr(arg0, '/');
|
||||
if (nm)
|
||||
nm++;
|
||||
else
|
||||
nm = arg0;
|
||||
|
||||
return nm;
|
||||
}
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
int ret = 0;
|
||||
size_t i;
|
||||
char *pidfiles[] = {
|
||||
NULL,
|
||||
"pidfile_test1",
|
||||
"/var/tmp/pidfile_test2.pid",
|
||||
};
|
||||
|
||||
if (argc > 1 && !strcmp(argv[1], "-v"))
|
||||
verbose = 1;
|
||||
|
||||
/* Override default _PATH_VARRUN in pidfile() */
|
||||
__pidfile_path = _PATH_TMP;
|
||||
|
||||
/* Find __progname, not all C libraries support this */
|
||||
ident = progname(argv[0]);
|
||||
|
||||
for (i = 0; i < NELEMS(pidfiles); i++)
|
||||
ret += test_pidfile(pidfiles[i]);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* Local Variables:
|
||||
* indent-tabs-mode: t
|
||||
* c-file-style: "linux"
|
||||
* compile-command: "make pidfile && ./pidfile -v"
|
||||
* End:
|
||||
*/
|
||||
@@ -0,0 +1,51 @@
|
||||
#include <stdlib.h> /* atexit() */
|
||||
#include <unistd.h> /* usleep() */
|
||||
|
||||
#include "check.h"
|
||||
#include "../conio.h"
|
||||
|
||||
#define MAX_WIDTH 80
|
||||
#define msleep(msec) usleep(msec * 1000)
|
||||
|
||||
static void bye(void)
|
||||
{
|
||||
showcursor();
|
||||
}
|
||||
|
||||
static void testit(int fn, int percent)
|
||||
{
|
||||
if (fn)
|
||||
progress(percent, MAX_WIDTH);
|
||||
else
|
||||
progress_simple(percent);
|
||||
}
|
||||
|
||||
static void run_test(int fn)
|
||||
{
|
||||
int i, percent, block = 0, num = 85;
|
||||
|
||||
while (block < num) {
|
||||
percent = block * 100 / num;
|
||||
for (i = 0; i < 10; i++) {
|
||||
testit(fn, percent);
|
||||
msleep(1);
|
||||
}
|
||||
block++;
|
||||
msleep(1);
|
||||
}
|
||||
testit(fn, 100);
|
||||
}
|
||||
|
||||
int main(void)
|
||||
{
|
||||
atexit(bye);
|
||||
hidecursor();
|
||||
|
||||
printf("\nAdvanced:\n");
|
||||
run_test(1);
|
||||
printf("\nSimple:\n");
|
||||
run_test(0);
|
||||
printf("\n");
|
||||
|
||||
return 0;
|
||||
}
|
||||
+108
@@ -0,0 +1,108 @@
|
||||
#include <stdlib.h>
|
||||
#include "check.h"
|
||||
|
||||
#define BASE "/tmp/.unittest/"
|
||||
#define SRC BASE "src/"
|
||||
#define DST BASE "dst/"
|
||||
|
||||
static int verbose = 0;
|
||||
static char *files[] = {
|
||||
SRC "sub1/1.tst",
|
||||
SRC "sub1/2.tst",
|
||||
SRC "sub1/3.tst",
|
||||
SRC "sub2/4.tst",
|
||||
SRC "sub2/5.tst",
|
||||
SRC "sub2/6.tst",
|
||||
SRC "sub3/7.tst",
|
||||
SRC "sub3/8.tst",
|
||||
SRC "sub3/9.tst",
|
||||
NULL
|
||||
};
|
||||
|
||||
void cleanup_test(void)
|
||||
{
|
||||
system("rm -rf " BASE);
|
||||
}
|
||||
|
||||
void setup_test(void)
|
||||
{
|
||||
int i;
|
||||
char cmd[256];
|
||||
mode_t dir_modes[] = { 755, 700 };
|
||||
mode_t file_modes[] = { 644, 600 };
|
||||
|
||||
cleanup_test();
|
||||
|
||||
mkdir(BASE, 0755);
|
||||
mkdir(SRC, 0755);
|
||||
mkdir(DST, 0755);
|
||||
|
||||
for (i = 0; files[i]; i++) {
|
||||
snprintf(cmd, sizeof(cmd), "mkdir -m %d -p `dirname %s`",
|
||||
dir_modes[i % 2], files[i]);
|
||||
system(cmd);
|
||||
|
||||
snprintf(cmd, sizeof(cmd), "touch %s; chmod %d %s", files[i],
|
||||
file_modes[i % 2], files[i]);
|
||||
system(cmd);
|
||||
}
|
||||
}
|
||||
|
||||
static void check_tree(char *heading, char *dir)
|
||||
{
|
||||
if (verbose) {
|
||||
if (heading)
|
||||
puts(heading);
|
||||
|
||||
tree(dir, 1);
|
||||
}
|
||||
}
|
||||
|
||||
int run_test(void)
|
||||
{
|
||||
int result = 0;
|
||||
|
||||
#if 0
|
||||
setup_test();
|
||||
check_tree("Before:", BASE);
|
||||
|
||||
result += rsync(SRC, DST, 0, NULL);
|
||||
check_tree("After:", BASE);
|
||||
cleanup_test();
|
||||
#endif
|
||||
|
||||
setup_test();
|
||||
result += rsync(BASE "src", DST, 0, NULL);
|
||||
check_tree("Only partial rsync of src <-- No slash!", BASE);
|
||||
#if 0
|
||||
cleanup_test();
|
||||
setup_test();
|
||||
result += rsync(BASE "src/sub1", BASE "dst", 0, NULL);
|
||||
check_tree("Only partial rsync of src/sub1 <-- No slashes!!", BASE);
|
||||
|
||||
cleanup_test();
|
||||
setup_test();
|
||||
result += rsync(BASE "src/sub1/", DST, 0, NULL);
|
||||
check_tree("Only partial rsync of src/sub1/", BASE);
|
||||
|
||||
cleanup_test();
|
||||
setup_test();
|
||||
result += rsync(BASE "src/sub1", DST, 0, NULL);
|
||||
check_tree("Only partial rsync of src/sub1 <-- No slash!", BASE);
|
||||
|
||||
result += rsync("/etc", "/var/tmp", 0, NULL);
|
||||
check_tree("Real life test:", "/var/tmp");
|
||||
#endif
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
if (argc > 1)
|
||||
verbose = !strncmp("-v", argv[1], 2);
|
||||
|
||||
atexit(cleanup_test);
|
||||
|
||||
return run_test();
|
||||
}
|
||||
@@ -0,0 +1,25 @@
|
||||
#include <fcntl.h> /* O_TMPFILE requires -D_GNU_SOURCE */
|
||||
#include <paths.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include "check.h"
|
||||
|
||||
#ifndef O_TMPFILE
|
||||
#warning O_TMPFILE is missing, either too old GLIBC, Linux, or non-Linux system
|
||||
#endif
|
||||
|
||||
int main(void)
|
||||
{
|
||||
FILE *fp;
|
||||
|
||||
printf("Before tempfile():\n");
|
||||
system("ls -lrt " _PATH_TMP " | tail -3");
|
||||
|
||||
fp = tempfile();
|
||||
fail_unless(fp != NULL);
|
||||
|
||||
printf("\nAfter tempfile(), should be same list:\n");
|
||||
system("ls -lrt " _PATH_TMP " | tail -3");
|
||||
|
||||
return fclose(fp);
|
||||
}
|
||||
@@ -0,0 +1,19 @@
|
||||
#include "check.h"
|
||||
|
||||
int main(void)
|
||||
{
|
||||
int result = 0;
|
||||
size_t i;
|
||||
struct { char *path; int fail; } arr[] = {
|
||||
{ "/etc/passwd", -1 },
|
||||
{ "/dev", 0 },
|
||||
{ "/sbin", 0 },
|
||||
};
|
||||
|
||||
for (i = 0; i < NELEMS(arr); i++) {
|
||||
if (tree(arr[i].path, 1) != arr[i].fail)
|
||||
result++;
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
@@ -120,30 +120,8 @@ int tree(char *path, int show_perms)
|
||||
return descend(path, show_perms, "");
|
||||
}
|
||||
|
||||
#ifdef UNITTEST
|
||||
#include "lite.h"
|
||||
|
||||
int main(void)
|
||||
{
|
||||
int i, result = 0;
|
||||
struct { char *path; int fail; } arr[] = {
|
||||
{ "/etc/passwd", -1 },
|
||||
{ "/dev", 0 },
|
||||
{ "/sbin", 0 },
|
||||
};
|
||||
|
||||
for (i = 0; i < NELEMS(arr); i++) {
|
||||
if (tree(arr[i].path, 1) != arr[i].fail)
|
||||
result++;
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
#endif
|
||||
|
||||
/**
|
||||
* Local Variables:
|
||||
* compile-command: "make V=1 -f tree.mk"
|
||||
* indent-tabs-mode: t
|
||||
* c-file-style: "linux"
|
||||
* End:
|
||||
|
||||
Reference in new issue
Block a user