mirror of
https://github.com/troglobit/libite.git
synced 2026-10-14 10:19:31 +00:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
1c9c038c06 | ||
|
|
e5b79443b8 | ||
|
|
589465f48b | ||
|
|
1f745ff9a0 | ||
|
|
71a0c53029 | ||
|
|
6608d2e8c9 | ||
|
|
62334c80fd | ||
|
|
626d5456f7 | ||
|
|
e3dff8e5be | ||
|
|
bbb951dc23 | ||
|
|
94800e7d5c | ||
|
|
3442d8e12b | ||
|
|
75f57283bd | ||
|
|
daf41d326b | ||
|
|
3179be4348 | ||
|
|
56530a8c78 | ||
|
|
abd6e3abd6 | ||
|
|
b078a8676f | ||
|
|
c2b92a38ef | ||
|
|
98b2e9d426 | ||
|
|
96d3e5dd8b | ||
|
|
ff626acb73 | ||
|
|
ba3f7c89fb | ||
|
|
714ea88cc9 | ||
|
|
add4d5d325 | ||
|
|
be6f276557 |
No files matched your search
@@ -6,6 +6,10 @@
|
|||||||
*.a
|
*.a
|
||||||
.deps
|
.deps
|
||||||
.libs
|
.libs
|
||||||
|
ID
|
||||||
|
GPATH
|
||||||
|
GRTAGS
|
||||||
|
GTAGS
|
||||||
tmp/
|
tmp/
|
||||||
compile
|
compile
|
||||||
config.*
|
config.*
|
||||||
|
|||||||
+20
-1
@@ -4,6 +4,23 @@ Change Log
|
|||||||
All notable changes to the project are documented in this file.
|
All notable changes to the project are documented in this file.
|
||||||
|
|
||||||
|
|
||||||
|
[v2.0.0][] - 2017-11-22
|
||||||
|
-----------------------
|
||||||
|
|
||||||
|
### Changes
|
||||||
|
- Remove `tree()`, moved to toolbox.git instead
|
||||||
|
- Remove `fmode()`, please use `stat()` instead, it's safer
|
||||||
|
- Add support for keeping mtime in `copy()` and `rsync()`
|
||||||
|
- Move source files to an `src/` sub-directory
|
||||||
|
- Move `initscr()` from `conio.h` to `conio.c`
|
||||||
|
- Update docs, recommend `mkpath()` over `makepath()`
|
||||||
|
- Bump ABI version, major changes to library
|
||||||
|
|
||||||
|
### Fixes
|
||||||
|
- Fix #7, inconsistent return value in `mkpath()` and `makepath()`
|
||||||
|
- Fix #8, constify `mkpath()` and `makepath()`
|
||||||
|
|
||||||
|
|
||||||
[v1.9.3][] - 2017-10-24
|
[v1.9.3][] - 2017-10-24
|
||||||
-----------------------
|
-----------------------
|
||||||
|
|
||||||
@@ -275,7 +292,9 @@ problems this may cause!
|
|||||||
Initial extraction of frog DNA from [Finit][]. See [README][] for API details.
|
Initial extraction of frog DNA from [Finit][]. See [README][] for API details.
|
||||||
|
|
||||||
|
|
||||||
[UNRELEASED]: https://github.com/troglobit/libite/compare/v1.9.2...HEAD
|
[UNRELEASED]: https://github.com/troglobit/libite/compare/v2.0.0...HEAD
|
||||||
|
[v2.0.0]: https://github.com/troglobit/libite/compare/v1.9.3...v2.0.0
|
||||||
|
[v1.9.3]: https://github.com/troglobit/libite/compare/v1.9.2...v1.9.3
|
||||||
[v1.9.2]: https://github.com/troglobit/libite/compare/v1.9.1...v1.9.2
|
[v1.9.2]: https://github.com/troglobit/libite/compare/v1.9.1...v1.9.2
|
||||||
[v1.9.1]: https://github.com/troglobit/libite/compare/v1.9.0...v1.9.1
|
[v1.9.1]: https://github.com/troglobit/libite/compare/v1.9.0...v1.9.1
|
||||||
[v1.9.0]: https://github.com/troglobit/libite/compare/v1.8.3...v1.9.0
|
[v1.9.0]: https://github.com/troglobit/libite/compare/v1.8.3...v1.9.0
|
||||||
|
|||||||
+4
-16
@@ -1,22 +1,10 @@
|
|||||||
ACLOCAL_AMFLAGS = -I m4
|
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 \
|
|
||||||
tempfile.c tree.c which.c
|
|
||||||
|
|
||||||
libite_la_CPPFLAGS = -D_GNU_SOURCE
|
|
||||||
libite_la_CFLAGS = -W -Wall -Wextra
|
|
||||||
libite_la_LDFLAGS = $(AM_LDFLAGS) -version-info 4:1:0
|
|
||||||
|
|
||||||
pkgconfigdir = $(libdir)/pkgconfig
|
|
||||||
pkgconfig_DATA = libite.pc
|
|
||||||
doc_DATA = README.md LICENSE
|
doc_DATA = README.md LICENSE
|
||||||
EXTRA_DIST = README.md LICENSE ChangeLog.md
|
EXTRA_DIST = README.md LICENSE ChangeLog.md
|
||||||
SUBDIRS = tests
|
pkgconfigdir = $(libdir)/pkgconfig
|
||||||
|
pkgconfig_DATA = libite.pc
|
||||||
|
SUBDIRS = src tests
|
||||||
|
|
||||||
## Generate .deb package
|
## Generate .deb package
|
||||||
package:
|
package:
|
||||||
@@ -48,7 +36,7 @@ release-hook:
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
## Target to run when building a release
|
## Target to run when building a release
|
||||||
release: dist release-hook md5-dist
|
release: distcheck release-hook md5-dist
|
||||||
@for file in $(DIST_ARCHIVES); do \
|
@for file in $(DIST_ARCHIVES); do \
|
||||||
printf "$$file \tDistribution tarball\n"; \
|
printf "$$file \tDistribution tarball\n"; \
|
||||||
printf "$$file.md5\t"; cat $$file.md5 | cut -f1 -d' '; \
|
printf "$$file.md5\t"; cat $$file.md5 | cut -f1 -d' '; \
|
||||||
|
|||||||
@@ -15,6 +15,8 @@ Table of Contents
|
|||||||
* [TODO](#todo)
|
* [TODO](#todo)
|
||||||
|
|
||||||
|
|
||||||
|
> **NOTE:** Incompatible changes in v2.0 compared to v1.x!
|
||||||
|
|
||||||
Introduction
|
Introduction
|
||||||
------------
|
------------
|
||||||
|
|
||||||
@@ -151,9 +153,18 @@ Generic Functions
|
|||||||
|
|
||||||
Perl like chomp function, chop off last char if newline.
|
Perl like chomp function, chop off last char if newline.
|
||||||
|
|
||||||
- `copyfile(src, dst, len, symlink)`
|
- `copyfile(src, dst, len, opt)`
|
||||||
|
|
||||||
Like the shell `cp(1)` and `dd(1),` can also create symlinks.
|
Like the shell `cp(1)` and `dd(1),`, can also copy symlinks and
|
||||||
|
preserve the mtime of the source file. The opt argument can be
|
||||||
|
a mask of:
|
||||||
|
|
||||||
|
- `LITE_FOPT_COPYFILE_SYM (0x01)`
|
||||||
|
- `LITE_FOPT_KEEP_MTIME (0x02)`
|
||||||
|
|
||||||
|
In releases prior to v2.0 the opt argument was called `symlink`.
|
||||||
|
The APIs are 100% compatible if the value `1` was used to enable
|
||||||
|
the symlink option.
|
||||||
|
|
||||||
- `dir(dir, ext, filter, list, strip)`
|
- `dir(dir, ext, filter, list, strip)`
|
||||||
|
|
||||||
@@ -175,10 +186,6 @@ Generic Functions
|
|||||||
|
|
||||||
Check for the existence of a directory, returns True(1) or False(0).
|
Check for the existence of a directory, returns True(1) or False(0).
|
||||||
|
|
||||||
- `fmode(file)`
|
|
||||||
|
|
||||||
Returns the `mode_t` bits of a file or directory.
|
|
||||||
|
|
||||||
- `fsendfile(src, dst, len)`
|
- `fsendfile(src, dst, len)`
|
||||||
|
|
||||||
Copy data between file streams, very similar to `fcopyfile()`, but
|
Copy data between file streams, very similar to `fcopyfile()`, but
|
||||||
@@ -268,10 +275,19 @@ Generic Functions
|
|||||||
Called multiple times with the same percentage value cause spinner to
|
Called multiple times with the same percentage value cause spinner to
|
||||||
spin.
|
spin.
|
||||||
|
|
||||||
- `rsync(src, dst, delete, *filter())`
|
- `rsync(src, dst, opt, *filter())`
|
||||||
|
|
||||||
Very simple `rsync()` to copy files files and directories
|
Very simple `rsync()` to copy files and directories recursively. It
|
||||||
recursively.
|
supports pruning files from the destination tree that do not exist in
|
||||||
|
the source tree and preserving the mtime of the source files. The opt
|
||||||
|
argument can be a mask of:
|
||||||
|
|
||||||
|
- `LITE_FOPT_RSYNC_DELETE (0x01)`
|
||||||
|
- `LITE_FOPT_KEEP_MTIME (0x02)`
|
||||||
|
|
||||||
|
In releases prior to v2.0 the argument controlling pruning was called
|
||||||
|
`delete`, it is now called `opt`. The APIs are 100% compatible if the
|
||||||
|
value `1` was used.
|
||||||
|
|
||||||
- `tempfile()`
|
- `tempfile()`
|
||||||
|
|
||||||
@@ -282,12 +298,6 @@ Generic Functions
|
|||||||
**Note:** Requires Linux v3.11, or later, will fall back to the old
|
**Note:** Requires Linux v3.11, or later, will fall back to the old
|
||||||
and unsafe `tmpfile()` on older systems.
|
and unsafe `tmpfile()` on older systems.
|
||||||
|
|
||||||
- `tree(path, show_perms)`
|
|
||||||
|
|
||||||
Very simple `/bin/tree` replacement. Draw ASCII tree of `path`, with
|
|
||||||
optional listing of file and directory permissions if `show_perms` is
|
|
||||||
set. The `path` argument should be a directory.
|
|
||||||
|
|
||||||
- `which(cmd)`, `whichp(cmd)`
|
- `which(cmd)`, `whichp(cmd)`
|
||||||
|
|
||||||
C implementation of UNIX which(1). Returns a malloc'ed string with the
|
C implementation of UNIX which(1). Returns a malloc'ed string with the
|
||||||
|
|||||||
+3
-3
@@ -1,10 +1,10 @@
|
|||||||
AC_INIT(libite, 1.9.3, https://github.com/troglobit/libite/issues)
|
AC_INIT(libite, 2.0.0, https://github.com/troglobit/libite/issues)
|
||||||
AM_INIT_AUTOMAKE([1.11 foreign no-dist-gzip dist-xz])
|
AM_INIT_AUTOMAKE([1.11 foreign no-dist-gzip dist-xz])
|
||||||
AM_SILENT_RULES([yes])
|
AM_SILENT_RULES([yes])
|
||||||
|
|
||||||
AC_CONFIG_SRCDIR(lite.h)
|
AC_CONFIG_SRCDIR(src/lite.h)
|
||||||
AM_CONFIG_HEADER(config.h)
|
AM_CONFIG_HEADER(config.h)
|
||||||
AC_CONFIG_FILES([Makefile tests/Makefile libite.pc])
|
AC_CONFIG_FILES([Makefile src/Makefile tests/Makefile libite.pc])
|
||||||
AC_CONFIG_MACRO_DIR([m4])
|
AC_CONFIG_MACRO_DIR([m4])
|
||||||
|
|
||||||
AC_PROG_CC
|
AC_PROG_CC
|
||||||
|
|||||||
Vendored
+12
@@ -1,3 +1,15 @@
|
|||||||
|
libite (2.0.0-1) unstable; urgency=low
|
||||||
|
|
||||||
|
* New upstream release, v2.0.0, fixes to:
|
||||||
|
- makepath(), mkpath()
|
||||||
|
* Changes to
|
||||||
|
- rsync(), API changes
|
||||||
|
- copyfile(), API changes
|
||||||
|
- tree(), removed from library
|
||||||
|
- fmode(), removed from library
|
||||||
|
|
||||||
|
-- Joachim Nilsson <troglobit@gmail.com> Sun, 19 Nov 2017 22:42:51 +0100
|
||||||
|
|
||||||
libite (1.9.3-1) unstable; urgency=low
|
libite (1.9.3-1) unstable; urgency=low
|
||||||
|
|
||||||
* New upstream release, v1.9.3, fixes to conio.h, initscr() and tree().
|
* New upstream release, v1.9.3, fixes to conio.h, initscr() and tree().
|
||||||
|
|||||||
@@ -1,56 +0,0 @@
|
|||||||
/* File mode bit operations
|
|
||||||
*
|
|
||||||
* Copyright (c) 2008 Claudio Matsuoka <http://helllabs.org/finit/>
|
|
||||||
*
|
|
||||||
* 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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <errno.h>
|
|
||||||
#include <sys/types.h>
|
|
||||||
#include <sys/stat.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
|
|
||||||
/**
|
|
||||||
* fmode - Return a file's mode bits.
|
|
||||||
* @file: File to look for, with full path.
|
|
||||||
*
|
|
||||||
* Returns:
|
|
||||||
* The mode bits or zero when @file does not exist and errno set to %ENOENT.
|
|
||||||
*/
|
|
||||||
mode_t fmode(char *file)
|
|
||||||
{
|
|
||||||
struct stat sb;
|
|
||||||
|
|
||||||
if (!file) {
|
|
||||||
errno = EINVAL;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!stat(file, &sb))
|
|
||||||
return sb.st_mode;
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Local Variables:
|
|
||||||
* indent-tabs-mode: t
|
|
||||||
* c-file-style: "linux"
|
|
||||||
* End:
|
|
||||||
*/
|
|
||||||
@@ -0,0 +1,24 @@
|
|||||||
|
lib_LTLIBRARIES = libite.la
|
||||||
|
|
||||||
|
libite_la_CPPFLAGS = -D_GNU_SOURCE
|
||||||
|
libite_la_CFLAGS = -W -Wall -Wextra
|
||||||
|
libite_la_LDFLAGS = $(AM_LDFLAGS) -version-info 5:0:0
|
||||||
|
libite_la_SOURCES = chomp.c copyfile.c \
|
||||||
|
conio.c conio.h \
|
||||||
|
dir.c \
|
||||||
|
fexist.c fisdir.c \
|
||||||
|
fparseln.c fsendfile.c \
|
||||||
|
ifconfig.c lfile.c \
|
||||||
|
makepath.c progress.c \
|
||||||
|
pidfile.c pidfilefn.c \
|
||||||
|
reallocarray.c rsync.c \
|
||||||
|
strlcpy.c strlcat.c strtonum.c \
|
||||||
|
strdupa.h strndupa.h strnlen.h \
|
||||||
|
tempfile.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
|
||||||
File renamed without changes.
+83
@@ -0,0 +1,83 @@
|
|||||||
|
/* A conio.h like implementation for VTANSI displays.
|
||||||
|
*
|
||||||
|
* Copyright (c) 2009-2017 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
|
||||||
|
* 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 <poll.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <termios.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
|
void initscr(int *row, int *col)
|
||||||
|
{
|
||||||
|
if (!row || !col)
|
||||||
|
return;
|
||||||
|
|
||||||
|
#if defined(TCSANOW) && defined(POLLIN)
|
||||||
|
struct termios tc, saved;
|
||||||
|
struct pollfd fd = { STDIN_FILENO, POLLIN, 0 };
|
||||||
|
|
||||||
|
if (!isatty(STDIN_FILENO) || !isatty(STDOUT_FILENO)) {
|
||||||
|
*row = 24;
|
||||||
|
*col = 80;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Disable echo to terminal while probing */
|
||||||
|
tcgetattr(STDOUT_FILENO, &tc);
|
||||||
|
saved = tc;
|
||||||
|
tc.c_cflag |= (CLOCAL | CREAD);
|
||||||
|
tc.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);
|
||||||
|
tcsetattr(STDOUT_FILENO, TCSANOW, &tc);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Save cursor pos+attr
|
||||||
|
* Diable top+bottom margins
|
||||||
|
* Set cursor at the far bottom,right pos
|
||||||
|
* Query term for resulting pos
|
||||||
|
*/
|
||||||
|
fprintf(stdout, "\e7" "\e[r" "\e[999;999H" "\e[6n");
|
||||||
|
fflush(stdout);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Wait here for terminal to echo back \e[row,lineR ...
|
||||||
|
*/
|
||||||
|
if (poll(&fd, 1, 300) <= 0 || scanf("\e[%d;%dR", row, col) != 2) {
|
||||||
|
*row = 24;
|
||||||
|
*col = 80;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Restore above saved cursor pos+attr
|
||||||
|
*/
|
||||||
|
fprintf(stdout, "\e8");
|
||||||
|
fflush(stdout);
|
||||||
|
|
||||||
|
/* Restore terminal */
|
||||||
|
tcsetattr(STDOUT_FILENO, TCSANOW, &saved);
|
||||||
|
|
||||||
|
return;
|
||||||
|
#else
|
||||||
|
*row = 24;
|
||||||
|
*col = 80;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Local Variables:
|
||||||
|
* indent-tabs-mode: t
|
||||||
|
* c-file-style: "linux"
|
||||||
|
* End:
|
||||||
|
*/
|
||||||
@@ -19,8 +19,6 @@
|
|||||||
#define CONIO_H_
|
#define CONIO_H_
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <termios.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
|
|
||||||
/* Attributes */
|
/* Attributes */
|
||||||
#define RESETATTR 0
|
#define RESETATTR 0
|
||||||
@@ -86,62 +84,6 @@ static inline void printheader(FILE *fp, const char *line, int nl)
|
|||||||
line, SCREEN_WIDTH - (int)strlen(line), "");
|
line, SCREEN_WIDTH - (int)strlen(line), "");
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Requries: #inlude <termios.h> and #include <poll.h> */
|
|
||||||
static inline void initscr(int *row, int *col)
|
|
||||||
{
|
|
||||||
if (!row || !col)
|
|
||||||
return;
|
|
||||||
|
|
||||||
#if defined(TCSANOW) && defined(POLLIN)
|
|
||||||
struct termios tc, saved;
|
|
||||||
struct pollfd fd = { STDIN_FILENO, POLLIN, 0 };
|
|
||||||
|
|
||||||
if (!isatty(STDIN_FILENO) || !isatty(STDOUT_FILENO)) {
|
|
||||||
*row = 24;
|
|
||||||
*col = 80;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Disable echo to terminal while probing */
|
|
||||||
tcgetattr(STDOUT_FILENO, &tc);
|
|
||||||
saved = tc;
|
|
||||||
tc.c_cflag |= (CLOCAL | CREAD);
|
|
||||||
tc.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);
|
|
||||||
tcsetattr(STDOUT_FILENO, TCSANOW, &tc);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Save cursor pos+attr
|
|
||||||
* Diable top+bottom margins
|
|
||||||
* Set cursor at the far bottom,right pos
|
|
||||||
* Query term for resulting pos
|
|
||||||
*/
|
|
||||||
fprintf(stdout, "\e7" "\e[r" "\e[999;999H" "\e[6n");
|
|
||||||
fflush(stdout);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Wait here for terminal to echo back \e[row,lineR ...
|
|
||||||
*/
|
|
||||||
if (poll(&fd, 1, 300) <= 0 || scanf("\e[%d;%dR", row, col) != 2) {
|
|
||||||
*row = 24;
|
|
||||||
*col = 80;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Restore above saved cursor pos+attr
|
|
||||||
*/
|
|
||||||
fprintf(stdout, "\e8");
|
|
||||||
fflush(stdout);
|
|
||||||
|
|
||||||
/* Restore terminal */
|
|
||||||
tcsetattr(STDOUT_FILENO, TCSANOW, &saved);
|
|
||||||
|
|
||||||
return;
|
|
||||||
#else
|
|
||||||
*row = 24;
|
|
||||||
*col = 80;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* CONIO_H_ */
|
#endif /* CONIO_H_ */
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -80,26 +80,46 @@ static ssize_t do_copy(int in, int out, size_t num, char *buffer, size_t len)
|
|||||||
return size;
|
return size;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void set_mtime(int in, int out)
|
||||||
|
{
|
||||||
|
struct stat st;
|
||||||
|
struct timespec tv[2];
|
||||||
|
|
||||||
|
fstat(in, &st);
|
||||||
|
tv[0] = st.st_atim;
|
||||||
|
tv[1] = st.st_mtim;
|
||||||
|
futimens(out, tv);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* copyfile - Copy a file to another.
|
* copyfile - Copy a file to another.
|
||||||
* @src: Full path name to source file.
|
* @src: Full path name to source file.
|
||||||
* @dst: Full path name to target file.
|
* @dst: Full path name to target file.
|
||||||
* @len: Number of bytes to copy, zero (0) for entire file.
|
* @len: Number of bytes to copy, zero (0) for entire file.
|
||||||
* @sym: Should symlinks be recreated (1) or followed (0)
|
* @opt: An option mask of %LITE_FOPT_COPYFILE_SYM, %LITE_FOPT_KEEP_MTIME
|
||||||
*
|
*
|
||||||
* This is a C implementation of the command line cp(1) utility. It is one
|
* This is a C implementation of the command line cp(1) utility. It is one
|
||||||
* of the classic missing links in the UNIX C library. This version is from
|
* of the classic missing links in the UNIX C library. This version is from
|
||||||
* the finit project, http://helllabs.org/finit/, which is a reimplementation
|
* the finit project, http://helllabs.org/finit/, which is a reimplementation
|
||||||
* of fastinit for the Asus EeePC.
|
* of fastinit for the Asus EeePC.
|
||||||
*
|
*
|
||||||
|
* The @opt field replaces the @sym argument in previous releases and
|
||||||
|
* works as follows. To maintain backwards compatibility with @sym
|
||||||
|
* the %LITE_FOPT_COPYFILE_SYM maintains a value of 1:
|
||||||
|
*
|
||||||
|
* %LITE_FOPT_COPYFILE_SYM: Recreate symlink or follow to copy target
|
||||||
|
* %LITE_FOPT_KEEP_MTIME: Preserve modification time
|
||||||
|
*
|
||||||
* Returns:
|
* Returns:
|
||||||
* The number of bytes copied, zero may be error (check errno!), but it
|
* The number of bytes copied, zero may be error (check errno!), but it
|
||||||
* may also indicate that @src was empty. If @src is a directory @errno
|
* may also indicate that @src was empty. If @src is a directory @errno
|
||||||
* will be set to %EISDIR since copyfile() is not recursive.
|
* will be set to %EISDIR since copyfile() is not recursive.
|
||||||
*/
|
*/
|
||||||
ssize_t copyfile(char *src, char *dst, int len, int sym)
|
ssize_t copyfile(char *src, char *dst, int len, int opt)
|
||||||
{
|
{
|
||||||
char *buffer;
|
char *buffer;
|
||||||
|
int sym = (opt & LITE_FOPT_COPYFILE_SYM) != 0;
|
||||||
|
int keep_mtim = (opt & LITE_FOPT_KEEP_MTIME) != 0;
|
||||||
int in, out, isdir = 0, saved_errno = 0;
|
int in, out, isdir = 0, saved_errno = 0;
|
||||||
size_t num;
|
size_t num;
|
||||||
ssize_t size = 0;
|
ssize_t size = 0;
|
||||||
@@ -155,7 +175,7 @@ ssize_t copyfile(char *src, char *dst, int len, int sym)
|
|||||||
goto exit;
|
goto exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
out = open(dst, O_WRONLY | O_CREAT | O_TRUNC, fmode(src));
|
out = open(dst, O_WRONLY | O_CREAT | O_TRUNC, st.st_mode);
|
||||||
if (out < 0) {
|
if (out < 0) {
|
||||||
close(in);
|
close(in);
|
||||||
saved_errno = errno;
|
saved_errno = errno;
|
||||||
@@ -165,6 +185,8 @@ ssize_t copyfile(char *src, char *dst, int len, int sym)
|
|||||||
size = do_copy(in, out, num, buffer, BUFSIZ);
|
size = do_copy(in, out, num, buffer, BUFSIZ);
|
||||||
if (!size && errno)
|
if (!size && errno)
|
||||||
saved_errno = errno;
|
saved_errno = errno;
|
||||||
|
else if (keep_mtim)
|
||||||
|
set_mtime(in, out);
|
||||||
|
|
||||||
close(out);
|
close(out);
|
||||||
close(in);
|
close(in);
|
||||||
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
+11
-7
@@ -43,6 +43,13 @@
|
|||||||
#define FPARSELN_UNESCREST 0x08
|
#define FPARSELN_UNESCREST 0x08
|
||||||
#define FPARSELN_UNESCALL 0x0f
|
#define FPARSELN_UNESCALL 0x0f
|
||||||
|
|
||||||
|
/*
|
||||||
|
* copyfile() and rsync() option flags
|
||||||
|
*/
|
||||||
|
#define LITE_FOPT_RSYNC_DELETE 0x01
|
||||||
|
#define LITE_FOPT_COPYFILE_SYM 0x01
|
||||||
|
#define LITE_FOPT_KEEP_MTIME 0x02
|
||||||
|
|
||||||
typedef struct lfile lfile_t;
|
typedef struct lfile lfile_t;
|
||||||
|
|
||||||
char *chomp (char *str);
|
char *chomp (char *str);
|
||||||
@@ -50,10 +57,9 @@ char *fparseln (FILE *, size_t *, size_t *, const char[3], int);
|
|||||||
|
|
||||||
int fexist (char *file);
|
int fexist (char *file);
|
||||||
int fisdir (const char *file);
|
int fisdir (const char *file);
|
||||||
mode_t fmode (char *file);
|
|
||||||
|
|
||||||
FILE *tempfile (void);
|
FILE *tempfile (void);
|
||||||
ssize_t copyfile (char *src, char *dst, int len, int sym);
|
ssize_t copyfile (char *src, char *dst, int len, int opt);
|
||||||
int movefile (char *src, char *dst);
|
int movefile (char *src, char *dst);
|
||||||
int fcopyfile (FILE *src, FILE *dst);
|
int fcopyfile (FILE *src, FILE *dst);
|
||||||
ssize_t fsendfile (FILE *src, FILE *dst, size_t len);
|
ssize_t fsendfile (FILE *src, FILE *dst, size_t len);
|
||||||
@@ -67,11 +73,11 @@ char *lfgetkey (lfile_t *lf, char *key);
|
|||||||
int lfgetint (lfile_t *lf, char *key);
|
int lfgetint (lfile_t *lf, char *key);
|
||||||
int fgetint (char *file, char *sep, char *key);
|
int fgetint (char *file, char *sep, char *key);
|
||||||
|
|
||||||
int mkpath (char *dir, mode_t mode);
|
int mkpath (const char *dir, mode_t mode);
|
||||||
int makepath (char *dir);
|
int makepath (const char *dir);
|
||||||
|
|
||||||
int dir (const char *dir, const char *type, int (*filter) (const char *file), char ***list, int strip);
|
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 opt, int (*filter) (const char *file));
|
||||||
|
|
||||||
int pidfile (const char *basename);
|
int pidfile (const char *basename);
|
||||||
int pidfile_signal(const char *pidfile, int signal);
|
int pidfile_signal(const char *pidfile, int signal);
|
||||||
@@ -80,8 +86,6 @@ pid_t pidfile_poll (const char *pidfile);
|
|||||||
|
|
||||||
void *reallocarray(void *optr, size_t nmemb, size_t size);
|
void *reallocarray(void *optr, size_t nmemb, size_t size);
|
||||||
|
|
||||||
int tree(char *path, int show_perms);
|
|
||||||
|
|
||||||
void progress (int percent, int max_width);
|
void progress (int percent, int max_width);
|
||||||
void progress_simple(int percent);
|
void progress_simple(int percent);
|
||||||
|
|
||||||
@@ -29,13 +29,13 @@
|
|||||||
* Returns:
|
* Returns:
|
||||||
* POSIX OK(0) on success, otherwise -1 with @errno set.
|
* POSIX OK(0) on success, otherwise -1 with @errno set.
|
||||||
*/
|
*/
|
||||||
int mkpath(char *dir, mode_t mode)
|
int mkpath(const char *dir, mode_t mode)
|
||||||
{
|
{
|
||||||
struct stat sb;
|
struct stat sb;
|
||||||
|
|
||||||
if (!dir) {
|
if (!dir) {
|
||||||
errno = EINVAL;
|
errno = EINVAL;
|
||||||
return 1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!stat(dir, &sb))
|
if (!stat(dir, &sb))
|
||||||
@@ -50,13 +50,18 @@ int mkpath(char *dir, mode_t mode)
|
|||||||
* makepath - Create all components of the specified directory.
|
* makepath - Create all components of the specified directory.
|
||||||
* @dir: Directory to create.
|
* @dir: Directory to create.
|
||||||
*
|
*
|
||||||
|
* Comment:
|
||||||
|
* It is recommended to use mkpath() over this function since it has
|
||||||
|
* the @mode argument while this function instead default ot 0777,
|
||||||
|
* which in most cases is insecure.
|
||||||
|
*
|
||||||
* Returns:
|
* Returns:
|
||||||
* POSIX OK (0) on success, otherwise -1 and errno set appropriately.
|
* POSIX OK (0) on success, otherwise -1 and errno set appropriately.
|
||||||
* This function returns EINVAL on bad argument, or ENOMEM when it
|
* This function returns EINVAL on bad argument, or ENOMEM when it
|
||||||
* fails allocating temporary memory. For other error codes see the
|
* fails allocating temporary memory. For other error codes see the
|
||||||
* mkdir() syscall description.
|
* mkdir() syscall description.
|
||||||
*/
|
*/
|
||||||
int makepath(char *dir)
|
int makepath(const char *dir)
|
||||||
{
|
{
|
||||||
return mkpath(dir, 0777);
|
return mkpath(dir, 0777);
|
||||||
}
|
}
|
||||||
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
+54
-20
@@ -16,6 +16,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
|
#include <fcntl.h> /* AT_* macros */
|
||||||
#include <stdlib.h> /* NULL, free() */
|
#include <stdlib.h> /* NULL, free() */
|
||||||
#include <string.h> /* strlen() */
|
#include <string.h> /* strlen() */
|
||||||
#include <strings.h> /* rindex() */
|
#include <strings.h> /* rindex() */
|
||||||
@@ -26,16 +27,17 @@
|
|||||||
|
|
||||||
#include "lite.h"
|
#include "lite.h"
|
||||||
|
|
||||||
static int copy(char *src, char *dst);
|
static int copy(char *src, char *dst, int opt);
|
||||||
static int mdir(char *buf, size_t buf_len, char *dir, char *name, mode_t mode);
|
static int mdir(char *buf, size_t buf_len, char *dir, char *name, struct stat *st);
|
||||||
static int prune(char *dst, char **new_files, int new_num);
|
static int prune(char *dst, char **new_files, int new_num);
|
||||||
|
static int set_mtime(char *fn, struct stat *st);
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* rsync - Synchronize contents and optionally remove non-existing backups
|
* rsync - Synchronize contents and optionally remove non-existing backups
|
||||||
* @src: Source directory
|
* @src: Source directory
|
||||||
* @dst: Destination directory
|
* @dst: Destination directory
|
||||||
* @delete: Prune files from @dst that no longer exist in @src.
|
* @opt: An option mask of %LITE_FOPT_RSYNC_DELETE, %LITE_FOPT_KEEP_MTIME
|
||||||
* @filter: Optional filtering function for source directory.
|
* @filter: Optional filtering function for source directory.
|
||||||
*
|
*
|
||||||
* This is a miniature implementation of the famous rsync for local use only.
|
* This is a miniature implementation of the famous rsync for local use only.
|
||||||
@@ -44,19 +46,29 @@ static int prune(char *dst, char **new_files, int new_num);
|
|||||||
* files removed from src since last backup are pruned from the destination
|
* files removed from src since last backup are pruned from the destination
|
||||||
* (backup) directory.
|
* (backup) directory.
|
||||||
*
|
*
|
||||||
* The filter callback, @filter, if provided, is used to determine what files to
|
* The @opt parameter to rsync() is an option mask for the most common
|
||||||
* include from the source directory when backing up. If a file is to be skipped
|
* rsync(1) options. Previously this argument was called @delete and
|
||||||
* the callback should simply return zero.
|
* to maintain backwards compatibility the value 1 is reserved:
|
||||||
|
*
|
||||||
|
* %LITE_FOPT_RSYNC_DELETE: Prune files from @dst that no longer exist in @src.
|
||||||
|
* %LITE_FOPT_KEEP_MTIME: Preserve modification time
|
||||||
|
*
|
||||||
|
* The filter callback, @filter, if provided, is used to determine what
|
||||||
|
* files to include from the source directory when backing up. If a
|
||||||
|
* file is to be skipped the callback should simply return zero.
|
||||||
*
|
*
|
||||||
* Returns:
|
* Returns:
|
||||||
* POSIX OK(0), or non-zero with @errno set on error.
|
* POSIX OK(0), or non-zero with @errno set on error.
|
||||||
*/
|
*/
|
||||||
int rsync(char *src, char *dst, int delete, int (*filter) (const char *file))
|
int rsync(char *src, char *dst, int opt, int (*filter)(const char *file))
|
||||||
{
|
{
|
||||||
char source[256];
|
char source[256];
|
||||||
char dest[256];
|
char dest[256];
|
||||||
int i = 0, num = 0, result = 0;
|
int delete = (opt & LITE_FOPT_RSYNC_DELETE) != 0;
|
||||||
|
int keep_mtim = (opt & LITE_FOPT_KEEP_MTIME);
|
||||||
|
int i = 0, num = 0, result = 0, do_mtim = 0;
|
||||||
char **files; /* Array of file names. */
|
char **files; /* Array of file names. */
|
||||||
|
struct stat st;
|
||||||
|
|
||||||
if (!fisdir(dst))
|
if (!fisdir(dst))
|
||||||
makedir(dst, 0755);
|
makedir(dst, 0755);
|
||||||
@@ -65,7 +77,7 @@ int rsync(char *src, char *dst, int delete, int (*filter) (const char *file))
|
|||||||
if (!fexist(src))
|
if (!fexist(src))
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
if (copy(src, dst))
|
if (copy(src, dst, keep_mtim))
|
||||||
result++;
|
result++;
|
||||||
|
|
||||||
return errno;
|
return errno;
|
||||||
@@ -80,9 +92,13 @@ int rsync(char *src, char *dst, int delete, int (*filter) (const char *file))
|
|||||||
else
|
else
|
||||||
ptr++;
|
ptr++;
|
||||||
|
|
||||||
if (mdir(dest, sizeof(dest), dst, ptr, fmode(src)))
|
if (stat(src, &st))
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
if (mdir(dest, sizeof(dest), dst, ptr, &st))
|
||||||
return 1;
|
return 1;
|
||||||
dst = dest;
|
dst = dest;
|
||||||
|
do_mtim = keep_mtim;
|
||||||
}
|
}
|
||||||
|
|
||||||
num = dir(src, "", filter, &files, 0);
|
num = dir(src, "", filter, &files, 0);
|
||||||
@@ -91,21 +107,31 @@ int rsync(char *src, char *dst, int delete, int (*filter) (const char *file))
|
|||||||
snprintf(source, sizeof(source), "%s%s%s", src, fisslashdir(src) ? "" : "/", files[i]);
|
snprintf(source, sizeof(source), "%s%s%s", src, fisslashdir(src) ? "" : "/", files[i]);
|
||||||
if (fisdir(source)) {
|
if (fisdir(source)) {
|
||||||
char dst2[256];
|
char dst2[256];
|
||||||
|
struct stat st;
|
||||||
|
|
||||||
strcat(source, "/");
|
strcat(source, "/");
|
||||||
if (mdir (dst2, sizeof(dst2), dst, files[i], fmode(source))) {
|
if (stat(source, &st))
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
if (mdir(dst2, sizeof(dst2), dst, files[i], &st)) {
|
||||||
result++;
|
result++;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
rsync(source, dst2, delete, filter);
|
rsync(source, dst2, opt, filter);
|
||||||
|
if (keep_mtim)
|
||||||
|
set_mtime(dst2, &st);
|
||||||
|
|
||||||
continue; /* Next file/dir in @src to copy... */
|
continue; /* Next file/dir in @src to copy... */
|
||||||
}
|
}
|
||||||
|
|
||||||
if (copy(source, dst))
|
if (copy(source, dst, keep_mtim))
|
||||||
result++;
|
result++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (do_mtim)
|
||||||
|
set_mtime(dest, &st);
|
||||||
|
|
||||||
/* We ignore any errors from the pruning, that phase albeit useful is only
|
/* We ignore any errors from the pruning, that phase albeit useful is only
|
||||||
* cosmetic. --Jocke 2011-03-24 */
|
* cosmetic. --Jocke 2011-03-24 */
|
||||||
if (delete)
|
if (delete)
|
||||||
@@ -120,11 +146,9 @@ int rsync(char *src, char *dst, int delete, int (*filter) (const char *file))
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int copy(char *src, char *dst)
|
static int copy(char *src, char *dst, int opt)
|
||||||
{
|
{
|
||||||
errno = 0;
|
copyfile(src, dst, 0, opt | LITE_FOPT_COPYFILE_SYM);
|
||||||
|
|
||||||
copyfile(src, dst, 0, 1);
|
|
||||||
if (errno) {
|
if (errno) {
|
||||||
if (errno != EEXIST)
|
if (errno != EEXIST)
|
||||||
return 1;
|
return 1;
|
||||||
@@ -136,10 +160,10 @@ static int copy(char *src, char *dst)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Creates dir/name @mode ... skipping / if dir already ends so. */
|
/* Creates dir/name @mode ... skipping / if dir already ends so. */
|
||||||
static int mdir(char *buf, size_t buf_len, char *dir, char *name, mode_t mode)
|
static int mdir(char *buf, size_t buf_len, char *dir, char *name, struct stat *st)
|
||||||
{
|
{
|
||||||
snprintf(buf, buf_len, "%s%s%s/", dir, fisslashdir(dir) ? "" : "/", name);
|
snprintf(buf, buf_len, "%s%s%s", dir, fisslashdir(dir) ? "" : "/", name);
|
||||||
if (mkdir(buf, mode)) {
|
if (mkdir(buf, st->st_mode)) {
|
||||||
if (EEXIST != errno)
|
if (EEXIST != errno)
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
@@ -193,6 +217,16 @@ static int prune(char *dst, char **new_files, int new_num)
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int set_mtime(char *fn, struct stat *st)
|
||||||
|
{
|
||||||
|
struct timespec tv[2];
|
||||||
|
|
||||||
|
tv[0] = st->st_atim;
|
||||||
|
tv[1] = st->st_mtim;
|
||||||
|
|
||||||
|
return utimensat(AT_FDCWD, fn, tv, AT_SYMLINK_NOFOLLOW);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Local Variables:
|
* Local Variables:
|
||||||
* indent-tabs-mode: t
|
* indent-tabs-mode: t
|
||||||
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
+1
-2
@@ -15,7 +15,6 @@ TESTS += touch
|
|||||||
TESTS += progress
|
TESTS += progress
|
||||||
TESTS += rsync
|
TESTS += rsync
|
||||||
TESTS += tempfile
|
TESTS += tempfile
|
||||||
TESTS += tree
|
|
||||||
TESTS += which
|
TESTS += which
|
||||||
|
|
||||||
check_PROGRAMS = $(TESTS)
|
check_PROGRAMS = $(TESTS)
|
||||||
@@ -23,5 +22,5 @@ check_PROGRAMS = $(TESTS)
|
|||||||
# Ignore warnings about unused result, in e.g. write()
|
# Ignore warnings about unused result, in e.g. write()
|
||||||
CFLAGS += -Wno-unused-result
|
CFLAGS += -Wno-unused-result
|
||||||
CPPFLAGS += -D_GNU_SOURCE
|
CPPFLAGS += -D_GNU_SOURCE
|
||||||
LDADD = -L../ ../libite.la
|
LDADD = -L../src/ ../src/libite.la
|
||||||
LDFLAGS += -static
|
LDFLAGS += -static
|
||||||
+2
-2
@@ -6,8 +6,8 @@
|
|||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <time.h>
|
#include <time.h>
|
||||||
|
|
||||||
#include "../conio.h"
|
#include "../src/conio.h"
|
||||||
#include "../lite.h"
|
#include "../src/lite.h"
|
||||||
|
|
||||||
#define PRINT(args...) if (verbose) printf(args)
|
#define PRINT(args...) if (verbose) printf(args)
|
||||||
|
|
||||||
|
|||||||
+2
-2
@@ -4,7 +4,7 @@
|
|||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include "check.h"
|
#include "check.h"
|
||||||
|
|
||||||
int checkpath(char *dir)
|
int checkpath(const char *dir)
|
||||||
{
|
{
|
||||||
char tmp[256];
|
char tmp[256];
|
||||||
struct stat sb;
|
struct stat sb;
|
||||||
@@ -20,7 +20,7 @@ int checkpath(char *dir)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int test_makepath(char *dir)
|
int test_makepath(const char *dir)
|
||||||
{
|
{
|
||||||
int ret = makepath(dir);
|
int ret = makepath(dir);
|
||||||
|
|
||||||
|
|||||||
@@ -2,7 +2,6 @@
|
|||||||
#include <unistd.h> /* usleep() */
|
#include <unistd.h> /* usleep() */
|
||||||
|
|
||||||
#include "check.h"
|
#include "check.h"
|
||||||
#include "../conio.h"
|
|
||||||
|
|
||||||
#define MAX_WIDTH 80
|
#define MAX_WIDTH 80
|
||||||
#define msleep(msec) usleep(msec * 1000)
|
#define msleep(msec) usleep(msec * 1000)
|
||||||
|
|||||||
+4
-3
@@ -53,9 +53,9 @@ static void check_tree(char *heading, char *dir)
|
|||||||
if (verbose) {
|
if (verbose) {
|
||||||
if (heading)
|
if (heading)
|
||||||
puts(heading);
|
puts(heading);
|
||||||
|
|
||||||
tree(dir, 1);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// XXX: Fixme, add code to list tree, nftw() possibly
|
||||||
}
|
}
|
||||||
|
|
||||||
int run_test(void)
|
int run_test(void)
|
||||||
@@ -72,7 +72,8 @@ int run_test(void)
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
setup_test();
|
setup_test();
|
||||||
result += rsync(BASE "src", DST, 0, NULL);
|
sleep(1);
|
||||||
|
result += rsync(BASE "src", DST, LITE_FOPT_KEEP_MTIME, NULL);
|
||||||
check_tree("Only partial rsync of src <-- No slash!", BASE);
|
check_tree("Only partial rsync of src <-- No slash!", BASE);
|
||||||
#if 0
|
#if 0
|
||||||
cleanup_test();
|
cleanup_test();
|
||||||
|
|||||||
@@ -1,19 +0,0 @@
|
|||||||
#include "check.h"
|
|
||||||
|
|
||||||
int main(void)
|
|
||||||
{
|
|
||||||
int result = 0;
|
|
||||||
size_t i;
|
|
||||||
struct { char *path; int fail; } arr[] = {
|
|
||||||
{ "/etc/passwd", -1 },
|
|
||||||
{ "/dev", 0 },
|
|
||||||
{ "/usr/sbin", 0 },
|
|
||||||
};
|
|
||||||
|
|
||||||
for (i = 0; i < NELEMS(arr); i++) {
|
|
||||||
if (tree(arr[i].path, 1) != arr[i].fail)
|
|
||||||
result++;
|
|
||||||
}
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
@@ -1,126 +0,0 @@
|
|||||||
/* Simple /bin/tree replacement
|
|
||||||
*
|
|
||||||
* Copyright (c) 2015 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
|
|
||||||
* 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 <dirent.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <sys/types.h>
|
|
||||||
#include <sys/stat.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
|
|
||||||
static int all = 0;
|
|
||||||
|
|
||||||
static int filter(const struct dirent *entry)
|
|
||||||
{
|
|
||||||
/* Skip current dir ".", and prev dir "..", from list of files */
|
|
||||||
if ((1 == strlen(entry->d_name) && entry->d_name[0] == '.') ||
|
|
||||||
(2 == strlen(entry->d_name) && !strcmp(entry->d_name, "..")))
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
if (!all && entry->d_name[0] == '.')
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void get_perms(struct stat *st, char *buf, size_t len)
|
|
||||||
{
|
|
||||||
mode_t m = st->st_mode;
|
|
||||||
|
|
||||||
snprintf(buf, len, "[%c%c%c%c%c%c%c%c%c%c] ",
|
|
||||||
S_ISCHR(m) ? 'c' : S_ISBLK(m) ? 'b' : S_ISFIFO(m) ? 'p' : S_ISLNK(m) ? 'l' : S_ISSOCK(m) ? 's' : '-',
|
|
||||||
(m & S_IRUSR) ? 'r' : '-',
|
|
||||||
(m & S_IWUSR) ? 'w' : '-',
|
|
||||||
(m & S_ISUID ) ? 's' : (m & S_IXUSR) ? 'x' : '-',
|
|
||||||
(m & S_IRGRP) ? 'r' : '-',
|
|
||||||
(m & S_IWGRP) ? 'w' : '-',
|
|
||||||
(m & S_ISGID) ? 's' : (m & S_IXGRP) ? 'x' : '-',
|
|
||||||
(m & S_IROTH) ? 'r' : '-',
|
|
||||||
(m & S_IWOTH) ? 'w' : '-',
|
|
||||||
(m & S_IXOTH) ? 'x' : '-'
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int descend(char *path, int show_perms, char *pfx)
|
|
||||||
{
|
|
||||||
int i, n, result = 0;
|
|
||||||
struct stat st;
|
|
||||||
struct dirent **namelist = NULL;
|
|
||||||
|
|
||||||
if (-1 == lstat(path, &st))
|
|
||||||
return 1;
|
|
||||||
|
|
||||||
if ((st.st_mode & S_IFMT) != S_IFDIR) {
|
|
||||||
errno = ENOTDIR;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
n = scandir(path, &namelist, filter, alphasort);
|
|
||||||
if (n) {
|
|
||||||
for (i = 0; i < n; i++) {
|
|
||||||
char t = ' ', p[14] = "", s[256] = "";
|
|
||||||
char buf[512];
|
|
||||||
char dir[80];
|
|
||||||
|
|
||||||
if (i + 1 == n) {
|
|
||||||
printf("%s `- ", pfx);
|
|
||||||
snprintf(dir, sizeof(dir), "%s ", pfx);
|
|
||||||
} else {
|
|
||||||
printf("%s|-- ", pfx);
|
|
||||||
snprintf(dir, sizeof(dir), "%s| ", pfx);
|
|
||||||
}
|
|
||||||
|
|
||||||
snprintf(buf, sizeof(buf), "%s/%s", path, namelist[i]->d_name);
|
|
||||||
if (!lstat(buf, &st)) {
|
|
||||||
if (show_perms)
|
|
||||||
get_perms(&st, p, sizeof(p));
|
|
||||||
if ((st.st_mode & S_IFMT) == S_IFDIR)
|
|
||||||
t = '/';
|
|
||||||
if (S_ISLNK(st.st_mode)) {
|
|
||||||
snprintf(s, sizeof(s), "-> ");
|
|
||||||
if (-1 == readlink(buf, &s[3], sizeof(s) - 3))
|
|
||||||
s[0] = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
printf("%s%s%c%s\n", p, namelist[i]->d_name, t, s);
|
|
||||||
if (t == '/')
|
|
||||||
result += descend(buf, show_perms, dir);
|
|
||||||
|
|
||||||
free(namelist[i]);
|
|
||||||
}
|
|
||||||
|
|
||||||
free(namelist);
|
|
||||||
}
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
int tree(char *path, int show_perms)
|
|
||||||
{
|
|
||||||
printf("[%s]\n", path);
|
|
||||||
return descend(path, show_perms, "");
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Local Variables:
|
|
||||||
* indent-tabs-mode: t
|
|
||||||
* c-file-style: "linux"
|
|
||||||
* End:
|
|
||||||
*/
|
|
||||||
Reference in new issue
Block a user