mirror of
https://github.com/troglobit/libite.git
synced 2026-10-13 10:14:42 +00:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
7df1b75fa0 | ||
|
|
9b1b7ca4cf | ||
|
|
1e064b8b4d | ||
|
|
18dde87f0a | ||
|
|
fcb38c9cc5 | ||
|
|
ab69ae8374 | ||
|
|
95f7a91a8a | ||
|
|
aab5a1145c | ||
|
|
fe1a3a731d | ||
|
|
cd073f5221 | ||
|
|
1a9d3bd91b | ||
|
|
8cc267f259 | ||
|
|
35d396ec27 | ||
|
|
7e91307138 | ||
|
|
2b8f54fbc7 | ||
|
|
2e58dd3203 | ||
|
|
41392f7e85 | ||
|
|
e4329d6c25 | ||
|
|
7113b3d1d8 | ||
|
|
9b6ef1f053 |
No files matched your search
+30
-2
@@ -3,6 +3,32 @@ Change Log
|
||||
|
||||
All notable changes to the project are documented in this file.
|
||||
|
||||
[v1.6.0][] - 2016-05-13
|
||||
-----------------------
|
||||
|
||||
### Changes
|
||||
|
||||
- Add support for NetBSD `fparaseln()` for the benefit of [Mg][]
|
||||
- Add support for OpenBSD `reallocarray()` for the benefit of [Mg][]
|
||||
- Constify `fisdir()` argument
|
||||
|
||||
|
||||
[v1.5.1][] - 2016-04-17
|
||||
-----------------------
|
||||
|
||||
Minor fix release.
|
||||
|
||||
### Changes
|
||||
- Update README.md, add help when libite is used in autotools projects.
|
||||
Spell checking and minor cleanup.
|
||||
|
||||
### Fixes
|
||||
- Activate use of `utimensat()` when `pidfile()` is called multiple
|
||||
times. This reduces the overhead of calling open+write+close to
|
||||
simply updating the mtime of the PID file.
|
||||
- Westermo fixes for `fcopyfile()`: nothing copied on embedded PPC
|
||||
system when using `tmpfile()` as source.
|
||||
|
||||
|
||||
[v1.5.0][] - 2016-03-20
|
||||
-----------------------
|
||||
@@ -11,7 +37,6 @@ This release changes the header file namespace. Apologies for any
|
||||
problems this may cause!
|
||||
|
||||
### Changes
|
||||
|
||||
- Change namespace for header files: `libite/` to `lite/`, e.g. using
|
||||
`pkg-config` your C program must now `#include <lite/lite.h>`
|
||||
- Update `pidfile()` to use `utimensat()` to update atime+mtime instead
|
||||
@@ -139,7 +164,9 @@ problems this may cause!
|
||||
Initial extraction of frog DNA from [Finit][]. See [README][] for API details.
|
||||
|
||||
|
||||
[UNRELEASED]: https://github.com/troglobit/libite/compare/v1.5.0...HEAD
|
||||
[UNRELEASED]: https://github.com/troglobit/libite/compare/v1.6.0...HEAD
|
||||
[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
|
||||
[v1.5.0]: https://github.com/troglobit/libite/compare/v1.4.4...v1.5.0
|
||||
[v1.4.4]: https://github.com/troglobit/libite/compare/v1.4.3...v1.4.4
|
||||
[v1.4.3]: https://github.com/troglobit/libite/compare/v1.4.2...v1.4.3
|
||||
@@ -152,6 +179,7 @@ Initial extraction of frog DNA from [Finit][]. See [README][] for API details.
|
||||
[v1.1.0]: https://github.com/troglobit/libite/compare/v1.0.0...v1.1.0
|
||||
[v1.0.0]: https://github.com/troglobit/libite/compare/TAIL...v1.0.0
|
||||
[Finit]: https://github.com/troglobit/finit/
|
||||
[Mg]: https://github.com/troglobit/mg
|
||||
[README]: https://github.com/troglobit/libite/blob/v1.0.0/README.md
|
||||
|
||||
<!--
|
||||
|
||||
+4
-3
@@ -3,9 +3,10 @@ ACLOCAL_AMFLAGS = -I m4
|
||||
lib_LTLIBRARIES = libite.la
|
||||
pkgincludedir = $(includedir)/lite
|
||||
pkginclude_HEADERS = lite.h queue.h conio.h tree.h
|
||||
libite_la_SOURCES = chomp.c copyfile.c dir.c fexist.c fisdir.c fmode.c fsendfile.c \
|
||||
ifconfig.c lfile.c makepath.c pidfile.c pidfilefn.c progress.c \
|
||||
rsync.c strlcpy.c strlcat.c strtonum.c tempfile.c tree.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
|
||||
|
||||
@@ -2,6 +2,22 @@
|
||||
===========================
|
||||
[![Travis Status][]][Travis]
|
||||
|
||||
|
||||
Table of Contents
|
||||
-----------------
|
||||
|
||||
* [Introduction](#introduction)
|
||||
* [Using -lite](#using--lite)
|
||||
* [Helper Macros](#helper-macros)
|
||||
* [Generic Functions](#generic-functions)
|
||||
* [OpenBSD Functions](#openbsd-functions)
|
||||
* [Build & Install](#origin--references)
|
||||
* [TODO](#todo)
|
||||
|
||||
|
||||
Introduction
|
||||
------------
|
||||
|
||||
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][1] and the [OpenBSD][2] project. Most notably
|
||||
@@ -10,7 +26,7 @@ useful *BSD [sys/queue.h][4] and [sys/tree.h][7] API's.
|
||||
|
||||
Libite is the frog DNA missing in GNU libc. However, -lite does not aim
|
||||
to become another [GLIB][5]! One noticeable gap in GLIBC is the missing
|
||||
`_SAFE` macros in tje BSD `sys/queue.h` API — highly recommended
|
||||
`_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][MIT], the
|
||||
@@ -26,9 +42,9 @@ Using -lite
|
||||
-----------
|
||||
|
||||
Libite is by default installed as a library and a set of include files.
|
||||
To prevent clashing with include files of the same name -lite employs a
|
||||
include file namespace `lite/`, which is strongly recommended to use in
|
||||
your applications:
|
||||
To prevent clashing with include files of the same name `-lite` employs
|
||||
an include file namespace `lite/`, which is strongly recommended to use
|
||||
in your applications:
|
||||
|
||||
#include <lite/lite.h>
|
||||
#include <lite/conio.h>
|
||||
@@ -40,6 +56,19 @@ The output from the `pkg-config` tool holds no surprises in this regard:
|
||||
$ pkg-config --libs --static --cflags libite
|
||||
-I/usr/local/include -L/usr/local/lib -lite
|
||||
|
||||
The prefix path `/usr/local/` shown here is only the default. Use the
|
||||
`configure` script to select a different prefix when installing libite.
|
||||
|
||||
For GNU autotools based projects, use the following in `configure.ac`:
|
||||
|
||||
# Check for required libraries
|
||||
PKG_CHECK_MODULES([lite], [libite >= 1.5.0])
|
||||
|
||||
and in your `Makefile.am`:
|
||||
|
||||
proggy_CFLAGS = $(lite_CFLAGS)
|
||||
proggy_LDADD = $(lite_LIBS)
|
||||
|
||||
|
||||
Helper Macros
|
||||
-------------
|
||||
@@ -59,15 +88,15 @@ Helper Macros
|
||||
|
||||
- `erase(path)`
|
||||
|
||||
Erase file/directory with `remove()`. Errors on stderr
|
||||
Erase file/directory with `remove()`. Errors on `stderr`
|
||||
|
||||
- `makedir(path)`
|
||||
|
||||
Create directory, like `mkdir()`. Errors on stderr
|
||||
Create directory, like `mkdir()`. Errors on `stderr`
|
||||
|
||||
- `makefifo(path)`
|
||||
|
||||
Create a FIFO, like `mkfifo()`. Errors on stderr
|
||||
Create a FIFO, like `mkfifo()`. Errors on `stderr`
|
||||
|
||||
- `min(a,b)`/`max(a,b)`
|
||||
|
||||
@@ -75,7 +104,7 @@ Helper Macros
|
||||
|
||||
- `touch(path)`
|
||||
|
||||
Create a file, or update mtime. Errors on stderr
|
||||
Create a file, or update mtime. Errors on `stderr`
|
||||
|
||||
- `S_ISEXEC(mode_t m)`
|
||||
|
||||
@@ -91,7 +120,7 @@ Helper Macros
|
||||
|
||||
- `ISOTHER(word,bit)`
|
||||
|
||||
Is any other bits, except bit, in (integer) word set?
|
||||
Are any other bits, except bit, in (integer) word set?
|
||||
|
||||
- `SETBIT(word,bit)`
|
||||
|
||||
@@ -135,11 +164,11 @@ Generic Functions
|
||||
|
||||
- `fexist(file)`
|
||||
|
||||
Check for the existance of a file, returns True(1) or False(0).
|
||||
Check for the existence of a file, returns True(1) or False(0).
|
||||
|
||||
- `fisdir(path)`
|
||||
|
||||
Check for the existance of a directory, returns True(1) or False(0).
|
||||
Check for the existence of a directory, returns True(1) or False(0).
|
||||
|
||||
- `fmode(file)`
|
||||
|
||||
@@ -154,7 +183,7 @@ Generic Functions
|
||||
- `ifconfig(ifname, addr, mask, up)`
|
||||
|
||||
Basic ifconfig like operations on an interface. Only supports IPv4
|
||||
adresses. Note that mask is not CIDR notation.
|
||||
addresses. Note that mask is not CIDR notation.
|
||||
|
||||
- `lfopen(file, sep)`, `lfclose(lf)`
|
||||
|
||||
@@ -163,7 +192,7 @@ Generic Functions
|
||||
|
||||
- `lftok(lf)`
|
||||
|
||||
Read tokens, delimeted by `sep`, from file opened with `lfopen()`.
|
||||
Read tokens, delimited by `sep`, from file opened with `lfopen()`.
|
||||
|
||||
- `lfgetkey(lf, key)`
|
||||
|
||||
@@ -206,7 +235,7 @@ Generic Functions
|
||||
existence of this file, so make sure to have your signal handlers
|
||||
properly setup before calling this function.
|
||||
|
||||
The pidfile is removed when the program exits, using an `atexit()`
|
||||
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.
|
||||
@@ -253,10 +282,15 @@ Generic Functions
|
||||
set. The `path` argument should be a directory.
|
||||
|
||||
|
||||
OpenBSD Functions
|
||||
-----------------
|
||||
OpenBSD/NetBSD/FreeBSD Functions
|
||||
--------------------------------
|
||||
|
||||
The following are popular OpenBSD functions and highly useful macros.
|
||||
The following are popular functions and highly useful macros from the
|
||||
*BSD world of UNIX that are sadly missing on Linux.
|
||||
|
||||
- `fparseln(fp, *len, *lineno, delim, flags)`
|
||||
|
||||
http://man.openbsd.org/OpenBSD-current/man3/fparseln.3
|
||||
|
||||
- `pidfile(basename)`
|
||||
|
||||
@@ -267,6 +301,10 @@ The following are popular OpenBSD functions and highly useful macros.
|
||||
file `__pidfile_name`, similar to `__progname`. See previous section
|
||||
for details.
|
||||
|
||||
- `reallocarray(ptr, nmemb, size)`
|
||||
|
||||
http://man.openbsd.org/OpenBSD-current/man3/reallocarray.3
|
||||
|
||||
- `strlcpy(dst, src, len)`
|
||||
|
||||
http://www.openbsd.org/cgi-bin/man.cgi/OpenBSD-current/man3/strlcpy.3
|
||||
@@ -298,8 +336,8 @@ weight utility library. Libite (LITE) employs the de facto standard GNU
|
||||
configure and build system:
|
||||
|
||||
./configure
|
||||
make all
|
||||
make install
|
||||
make -j5
|
||||
make install-strip
|
||||
|
||||
|
||||
TODO
|
||||
|
||||
@@ -0,0 +1,7 @@
|
||||
TODO ... in no particular order
|
||||
===============================
|
||||
|
||||
* Investigate adding FreeBSD pidfile_open() et al
|
||||
* Investigate FreeBSD libutil library, could be useful for porting between unices
|
||||
|
||||
|
||||
@@ -57,7 +57,6 @@ int main(void)
|
||||
/**
|
||||
* Local Variables:
|
||||
* compile-command: "make V=1 -f chomp.mk"
|
||||
* version-control: t
|
||||
* indent-tabs-mode: t
|
||||
* c-file-style: "linux"
|
||||
* End:
|
||||
|
||||
+1
-6
@@ -1,6 +1,4 @@
|
||||
# Use v2.61 for backwards compat with Ubuntu 12.04 LTS
|
||||
AC_PREREQ([2.61])
|
||||
AC_INIT(libite, 1.5.0, https://github.com/troglobit/libite/issues)
|
||||
AC_INIT(libite, 1.6.0, https://github.com/troglobit/libite/issues)
|
||||
AM_INIT_AUTOMAKE([1.11 foreign no-dist-gzip dist-xz])
|
||||
AM_SILENT_RULES([yes])
|
||||
|
||||
@@ -13,7 +11,4 @@ AC_PROG_CC
|
||||
AM_PROG_AR
|
||||
LT_INIT
|
||||
|
||||
AC_HEADER_STDC
|
||||
AC_C_CONST
|
||||
|
||||
AC_OUTPUT
|
||||
@@ -75,7 +75,6 @@
|
||||
|
||||
/**
|
||||
* Local Variables:
|
||||
* version-control: t
|
||||
* indent-tabs-mode: t
|
||||
* c-file-style: "linux"
|
||||
* End:
|
||||
|
||||
+9
-14
@@ -237,27 +237,23 @@ int movefile(char *src, char *dst)
|
||||
*/
|
||||
int fcopyfile(FILE *src, FILE *dst)
|
||||
{
|
||||
int ret;
|
||||
char *buffer;
|
||||
char *buf;
|
||||
|
||||
if (!src || !dst) {
|
||||
errno = EINVAL;
|
||||
return -1;
|
||||
}
|
||||
|
||||
buffer = malloc(BUFSIZ);
|
||||
if (!buffer)
|
||||
buf = malloc(BUFSIZ);
|
||||
if (!buf)
|
||||
return -1;
|
||||
|
||||
ret = do_copy(fileno(src), fileno(dst), BUFSIZ, buffer, BUFSIZ);
|
||||
if (ret > 0)
|
||||
ret = 0;
|
||||
else if (errno)
|
||||
ret = -1;
|
||||
while (fgets(buf, BUFSIZ, src))
|
||||
fputs(buf, dst);
|
||||
|
||||
free(buf);
|
||||
|
||||
free(buffer);
|
||||
|
||||
return ret;
|
||||
return 0;
|
||||
}
|
||||
|
||||
#ifdef UNITTEST
|
||||
@@ -267,7 +263,7 @@ int main(void)
|
||||
{
|
||||
int i = 0;
|
||||
char *files[] = {
|
||||
"/etc/passwd", "/tmp/tok", "/tmp/tok",
|
||||
"/etc/passwd", "/tmp/mypwd", "/tmp/mypwd",
|
||||
"/etc/passwd", "/tmp/", "/tmp/passwd",
|
||||
"/etc/passwd", "/tmp", "/tmp/passwd",
|
||||
NULL
|
||||
@@ -319,7 +315,6 @@ int main(void)
|
||||
/**
|
||||
* Local Variables:
|
||||
* compile-command: "make V=1 -f copyfile.mk"
|
||||
* version-control: t
|
||||
* indent-tabs-mode: t
|
||||
* c-file-style: "linux"
|
||||
* End:
|
||||
|
||||
@@ -222,7 +222,6 @@ int main(int argc, char *argv[])
|
||||
/**
|
||||
* Local Variables:
|
||||
* compile-command: "make V=1 -f dir.mk"
|
||||
* version-control: t
|
||||
* indent-tabs-mode: t
|
||||
* c-file-style: "linux"
|
||||
* End:
|
||||
|
||||
@@ -74,7 +74,6 @@ int main(void)
|
||||
/**
|
||||
* Local Variables:
|
||||
* compile-command: "make V=1 -f fexist.mk"
|
||||
* version-control: t
|
||||
* indent-tabs-mode: t
|
||||
* c-file-style: "linux"
|
||||
* End:
|
||||
|
||||
@@ -32,7 +32,7 @@
|
||||
* Returns:
|
||||
* %TRUE(1) if the file exists and is a directory, otherwise %FALSE(0).
|
||||
*/
|
||||
int fisdir(char *file)
|
||||
int fisdir(const char *file)
|
||||
{
|
||||
struct stat sb;
|
||||
|
||||
@@ -73,7 +73,6 @@ int main(void)
|
||||
/**
|
||||
* Local Variables:
|
||||
* compile-command: "make V=1 -f fisdir.mk"
|
||||
* version-control: t
|
||||
* indent-tabs-mode: t
|
||||
* c-file-style: "linux"
|
||||
* End:
|
||||
|
||||
@@ -50,7 +50,6 @@ mode_t fmode(char *file)
|
||||
|
||||
/**
|
||||
* Local Variables:
|
||||
* version-control: t
|
||||
* indent-tabs-mode: t
|
||||
* c-file-style: "linux"
|
||||
* End:
|
||||
|
||||
+202
@@ -0,0 +1,202 @@
|
||||
/* $NetBSD: fparseln.c,v 1.10 2009/10/21 01:07:45 snj Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1997 Christos Zoulas. All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
||||
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
||||
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#include <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>
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include "lite.h"
|
||||
|
||||
#define _DIAGASSERT(t)
|
||||
|
||||
static int isescaped(const char *, const char *, int);
|
||||
|
||||
/* isescaped():
|
||||
* Return true if the character in *p that belongs to a string
|
||||
* that starts in *sp, is escaped by the escape character esc.
|
||||
*/
|
||||
static int
|
||||
isescaped(const char *sp, const char *p, int esc)
|
||||
{
|
||||
const char *cp;
|
||||
size_t ne;
|
||||
|
||||
_DIAGASSERT(sp != NULL);
|
||||
_DIAGASSERT(p != NULL);
|
||||
|
||||
/* No escape character */
|
||||
if (esc == '\0')
|
||||
return 0;
|
||||
|
||||
/* Count the number of escape characters that precede ours */
|
||||
for (ne = 0, cp = p; --cp >= sp && *cp == esc; ne++)
|
||||
continue;
|
||||
|
||||
/* Return true if odd number of escape characters */
|
||||
return (ne & 1) != 0;
|
||||
}
|
||||
|
||||
|
||||
/* fparseln():
|
||||
* Read a line from a file parsing continuations ending in \
|
||||
* and eliminating trailing newlines, or comments starting with
|
||||
* the comment char.
|
||||
*/
|
||||
char *
|
||||
fparseln(FILE *fp, size_t *size, size_t *lineno, const char str[3], int flags)
|
||||
{
|
||||
static const char dstr[3] = { '\\', '\\', '#' };
|
||||
|
||||
ssize_t s;
|
||||
size_t len, ptrlen;
|
||||
char *buf;
|
||||
char *ptr, *cp;
|
||||
int cnt;
|
||||
char esc, con, nl, com;
|
||||
|
||||
_DIAGASSERT(fp != NULL);
|
||||
|
||||
len = 0;
|
||||
buf = NULL;
|
||||
ptrlen = 0;
|
||||
ptr = NULL;
|
||||
cnt = 1;
|
||||
|
||||
if (str == NULL)
|
||||
str = dstr;
|
||||
|
||||
esc = str[0];
|
||||
con = str[1];
|
||||
com = str[2];
|
||||
/*
|
||||
* XXX: it would be cool to be able to specify the newline character,
|
||||
* getdelim(3) does let us, but supporting it would diverge from BSDs.
|
||||
*/
|
||||
nl = '\n';
|
||||
|
||||
flockfile(fp);
|
||||
|
||||
while (cnt) {
|
||||
cnt = 0;
|
||||
|
||||
if (lineno)
|
||||
(*lineno)++;
|
||||
|
||||
s = getline(&ptr, &ptrlen, fp);
|
||||
if (s < 0)
|
||||
break;
|
||||
|
||||
if (s && com) { /* Check and eliminate comments */
|
||||
for (cp = ptr; cp < ptr + s; cp++)
|
||||
if (*cp == com && !isescaped(ptr, cp, esc)) {
|
||||
s = cp - ptr;
|
||||
cnt = s == 0 && buf == NULL;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (s && nl) { /* Check and eliminate newlines */
|
||||
cp = &ptr[s - 1];
|
||||
|
||||
if (*cp == nl)
|
||||
s--; /* forget newline */
|
||||
}
|
||||
|
||||
if (s && con) { /* Check and eliminate continuations */
|
||||
cp = &ptr[s - 1];
|
||||
|
||||
if (*cp == con && !isescaped(ptr, cp, esc)) {
|
||||
s--; /* forget continuation char */
|
||||
cnt = 1;
|
||||
}
|
||||
}
|
||||
|
||||
if (s == 0) {
|
||||
/*
|
||||
* nothing to add, skip realloc except in case
|
||||
* we need a minimal buf to return an empty line
|
||||
*/
|
||||
if (cnt || buf != NULL)
|
||||
continue;
|
||||
}
|
||||
|
||||
if ((cp = realloc(buf, len + s + 1)) == NULL) {
|
||||
funlockfile(fp);
|
||||
free(buf);
|
||||
free(ptr);
|
||||
return NULL;
|
||||
}
|
||||
buf = cp;
|
||||
|
||||
(void) memcpy(buf + len, ptr, s);
|
||||
len += s;
|
||||
buf[len] = '\0';
|
||||
}
|
||||
|
||||
funlockfile(fp);
|
||||
free(ptr);
|
||||
|
||||
if ((flags & FPARSELN_UNESCALL) != 0 && esc && buf != NULL &&
|
||||
strchr(buf, esc) != NULL) {
|
||||
ptr = cp = buf;
|
||||
while (cp[0] != '\0') {
|
||||
int skipesc;
|
||||
|
||||
while (cp[0] != '\0' && cp[0] != esc)
|
||||
*ptr++ = *cp++;
|
||||
if (cp[0] == '\0' || cp[1] == '\0')
|
||||
break;
|
||||
|
||||
skipesc = 0;
|
||||
if (cp[1] == com)
|
||||
skipesc += (flags & FPARSELN_UNESCCOMM);
|
||||
if (cp[1] == con)
|
||||
skipesc += (flags & FPARSELN_UNESCCONT);
|
||||
if (cp[1] == esc)
|
||||
skipesc += (flags & FPARSELN_UNESCESC);
|
||||
if (cp[1] != com && cp[1] != con && cp[1] != esc)
|
||||
skipesc = (flags & FPARSELN_UNESCREST);
|
||||
|
||||
if (skipesc)
|
||||
cp++;
|
||||
else
|
||||
*ptr++ = *cp++;
|
||||
*ptr++ = *cp++;
|
||||
}
|
||||
*ptr = '\0';
|
||||
len = strlen(buf);
|
||||
}
|
||||
|
||||
if (size)
|
||||
*size = len;
|
||||
return buf;
|
||||
}
|
||||
@@ -112,7 +112,6 @@ int main(void)
|
||||
/**
|
||||
* Local Variables:
|
||||
* compile-command: "make V=1 -f fsendfile.mk"
|
||||
* version-control: t
|
||||
* indent-tabs-mode: t
|
||||
* c-file-style: "linux"
|
||||
* End:
|
||||
|
||||
@@ -85,7 +85,6 @@ int ifconfig(char *ifname, char *addr, char *mask, int up)
|
||||
|
||||
/**
|
||||
* Local Variables:
|
||||
* version-control: t
|
||||
* indent-tabs-mode: t
|
||||
* c-file-style: "linux"
|
||||
* End:
|
||||
|
||||
@@ -228,7 +228,6 @@ int main(void)
|
||||
/**
|
||||
* Local Variables:
|
||||
* compile-command: "make V=1 -f lfile.mk"
|
||||
* version-control: t
|
||||
* indent-tabs-mode: t
|
||||
* c-file-style: "linux"
|
||||
* End:
|
||||
|
||||
@@ -34,12 +34,22 @@
|
||||
#include <sys/param.h> /* MAX(), isset(), setbit(), TRUE, FALSE, et consortes. :-) */
|
||||
#include <unistd.h>
|
||||
|
||||
/*
|
||||
* fparseln() specific operation flags.
|
||||
*/
|
||||
#define FPARSELN_UNESCESC 0x01
|
||||
#define FPARSELN_UNESCCONT 0x02
|
||||
#define FPARSELN_UNESCCOMM 0x04
|
||||
#define FPARSELN_UNESCREST 0x08
|
||||
#define FPARSELN_UNESCALL 0x0f
|
||||
|
||||
typedef struct lfile lfile_t;
|
||||
|
||||
char *chomp (char *str);
|
||||
char *fparseln (FILE *, size_t *, size_t *, const char[3], int);
|
||||
|
||||
int fexist (char *file);
|
||||
int fisdir (char *file);
|
||||
int fisdir (const char *file);
|
||||
mode_t fmode (char *file);
|
||||
|
||||
FILE *tempfile (void);
|
||||
@@ -68,6 +78,8 @@ int pidfile_signal(const char *pidfile, int signal);
|
||||
pid_t pidfile_read (const char *pidfile);
|
||||
pid_t pidfile_poll (const char *pidfile);
|
||||
|
||||
void *reallocarray(void *optr, size_t nmemb, size_t size);
|
||||
|
||||
#ifndef strlcpy
|
||||
size_t strlcpy (char *dst, const char *src, size_t siz);
|
||||
#endif
|
||||
@@ -208,7 +220,6 @@ static inline int string_case_compare (const char *a, const char *b)
|
||||
|
||||
/**
|
||||
* Local Variables:
|
||||
* version-control: t
|
||||
* indent-tabs-mode: t
|
||||
* c-file-style: "linux"
|
||||
* End:
|
||||
|
||||
@@ -117,7 +117,6 @@ int main(void)
|
||||
/**
|
||||
* Local Variables:
|
||||
* compile-command: "make V=1 -f makepath.mk"
|
||||
* version-control: t
|
||||
* indent-tabs-mode: t
|
||||
* c-file-style: "linux"
|
||||
* End:
|
||||
|
||||
@@ -63,8 +63,7 @@ pidfile(const char *basename)
|
||||
atexit_already = 0;
|
||||
|
||||
if (pidfile_path != NULL) {
|
||||
if (0) { //pid == pidfile_pid) {
|
||||
printf("Updating mtime ...\n");
|
||||
if (pid == pidfile_pid) {
|
||||
utimensat(0, pidfile_path, NULL, 0);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -168,7 +168,6 @@ int main(void)
|
||||
/**
|
||||
* Local Variables:
|
||||
* compile-command: "make V=1 -f progress.mk"
|
||||
* version-control: t
|
||||
* indent-tabs-mode: t
|
||||
* c-file-style: "linux"
|
||||
* End:
|
||||
|
||||
@@ -0,0 +1,38 @@
|
||||
/* $OpenBSD: reallocarray.c,v 1.2 2014/12/08 03:45:00 bcook Exp $ */
|
||||
/*
|
||||
* Copyright (c) 2008 Otto Moerbeek <otto@drijf.net>
|
||||
*
|
||||
* Permission to use, copy, modify, and 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 <sys/types.h>
|
||||
#include <errno.h>
|
||||
#include <stdint.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
/*
|
||||
* This is sqrt(SIZE_MAX+1), as s1*s2 <= SIZE_MAX
|
||||
* if both s1 < MUL_NO_OVERFLOW and s2 < MUL_NO_OVERFLOW
|
||||
*/
|
||||
#define MUL_NO_OVERFLOW ((size_t)1 << (sizeof(size_t) * 4))
|
||||
|
||||
void *
|
||||
reallocarray(void *optr, size_t nmemb, size_t size)
|
||||
{
|
||||
if ((nmemb >= MUL_NO_OVERFLOW || size >= MUL_NO_OVERFLOW) &&
|
||||
nmemb > 0 && SIZE_MAX / nmemb < size) {
|
||||
errno = ENOMEM;
|
||||
return NULL;
|
||||
}
|
||||
return realloc(optr, size * nmemb);
|
||||
}
|
||||
@@ -306,7 +306,6 @@ int main(int argc, char *argv[])
|
||||
/**
|
||||
* Local Variables:
|
||||
* compile-command: "make V=1 -f rsync.mk"
|
||||
* version-control: t
|
||||
* indent-tabs-mode: t
|
||||
* c-file-style: "linux"
|
||||
* End:
|
||||
|
||||
@@ -71,7 +71,6 @@ int main(void)
|
||||
/**
|
||||
* Local Variables:
|
||||
* compile-command: "make V=1 -f tempfile.mk"
|
||||
* version-control: t
|
||||
* indent-tabs-mode: t
|
||||
* c-file-style: "linux"
|
||||
* End:
|
||||
|
||||
Reference in new issue
Block a user