From c00ac21fe20ca11c40dee546ab05ed2af24bfbe0 Mon Sep 17 00:00:00 2001 From: Joachim Nilsson Date: Thu, 18 Jun 2015 01:11:22 +0200 Subject: [PATCH] Remove libite and chomp() in preparing for ... libite. Signed-off-by: Joachim Nilsson --- helpers.c | 8 - helpers.h | 25 --- libite/Makefile | 93 ------------ libite/copyfile.c | 377 ---------------------------------------------- libite/dir.c | 229 ---------------------------- libite/fexist.c | 53 ------- libite/fisdir.c | 51 ------- libite/fmode.c | 57 ------- libite/lite.h | 102 ------------- libite/rsync.c | 302 ------------------------------------- libite/rsync.mk | 22 --- libite/strlcat.c | 66 -------- libite/strlcpy.c | 61 -------- libite/strtonum.c | 67 -------- 14 files changed, 1513 deletions(-) delete mode 100644 libite/Makefile delete mode 100644 libite/copyfile.c delete mode 100644 libite/dir.c delete mode 100644 libite/fexist.c delete mode 100644 libite/fisdir.c delete mode 100644 libite/fmode.c delete mode 100644 libite/lite.h delete mode 100644 libite/rsync.c delete mode 100644 libite/rsync.mk delete mode 100644 libite/strlcat.c delete mode 100644 libite/strlcpy.c delete mode 100644 libite/strtonum.c diff --git a/helpers.c b/helpers.c index c136f4cd..2c1b8d61 100644 --- a/helpers.c +++ b/helpers.c @@ -243,14 +243,6 @@ int getgroup(char *group) } #endif -void chomp(char *str) -{ - char *x = strrchr(str, 0x0a); - - if (x) - *x = 0; -} - /* Signal safe sleep ... we get a lot of SIGCHLD at reboot */ void do_sleep(unsigned int sec) { diff --git a/helpers.h b/helpers.h index 3a992409..6887e7ce 100644 --- a/helpers.h +++ b/helpers.h @@ -43,30 +43,6 @@ do { \ #define FLOG_PERROR(fmt, args...) DO_LOG(LOG_CRIT, fmt ". Error %d: %s", ##args, errno, strerror(errno)) -#ifndef touch -# define touch(x) do { if (mknod((x), S_IFREG|0644, 0) && errno != EEXIST) _pe("Failed creating %s", x); } while (0) -#endif -#ifndef makedir -# define makedir(x, p) do { if (mkdir(x, p) && errno != EEXIST) _pe("Failed creating directory %s", x); } while (0) -#endif -#ifndef makefifo -# define makefifo(x, p) do { if (mkfifo(x, p) && errno != EEXIST) _pe("Failed creating FIFO %s", x); } while (0) -#endif -#ifndef erase -# define erase(x) do { if (remove(x) && errno != ENOENT) _pe("Failed removing %s", x); } while (0) -#endif -#ifndef chardev -# define chardev(x,m,maj,min) mknod((x), S_IFCHR|(m), makedev((maj),(min))) -#endif -#ifndef blkdev -# define blkdev(x,m,maj,min) mknod((x), S_IFBLK|(m), makedev((maj),(min))) -#endif -#ifndef S_ISEXEC -# define S_ISEXEC(m) (((m) & S_IXUSR) == S_IXUSR) -#endif -#ifndef UNUSED -#define UNUSED(x) UNUSED_ ## x __attribute__ ((unused)) -#endif /* Esc[2JEsc[1;1H Clear screen and move cursor to 1,1 (upper left) pos. */ #define clrscr() fputs("\e[2J\e[1;1H", stderr) /* Esc[K Erases from the current cursor position to the end of the current line. */ @@ -107,7 +83,6 @@ void print (int action, const char *fmt, ...); void print_desc (char *action, char *desc); int print_result (int fail); int start_process (char *cmd, char *args[], int console); -void chomp (char *str); void do_sleep (unsigned int sec); int getuser (char *username); int getgroup (char *group); diff --git a/libite/Makefile b/libite/Makefile deleted file mode 100644 index 9b99e7a5..00000000 --- a/libite/Makefile +++ /dev/null @@ -1,93 +0,0 @@ -# Finit libite -- Light-weight utility functions and C-library extensions -# -# Copyright (c) 2008-2014 Joachim Nilsson -# -# 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. - -.EXPORT_ALL_VARIABLES: -.PHONY: all install clean - -include ../common.mk - -ifneq ($(STATIC), 1) -CFLAGS += -fPIC -endif -HEADERS = lite.h -OBJS := copyfile.o dir.o fexist.o fisdir.o fmode.o rsync.o -OBJS += strlcpy.o strlcat.o strtonum.o -DEPS := $(OBJS:.o=.d) - -VER = 0 -LIBNAME = libite -SOLIB = $(LIBNAME).so.$(VER) -SYMLIB = $(LIBNAME).so -STATICLIB = $(LIBNAME).a -ifeq ($(STATIC), 1) -TARGET = $(STATICLIB) -else -TARGET = $(STATICLIB) $(SOLIB) -endif - - -all: $(TARGET) - -$(OBJS): Makefile - -$(SOLIB): $(OBJS) - @printf " LINK %s\n" $@ - @$(CC) $(LDFLAGS) -shared $(OBJS) -lrt -lcrypt -Wl,-soname,$@ -o $@ - -$(STATICLIB): Makefile $(OBJS) - @printf " ARCHIVE $@\n" - @$(AR) $(ARFLAGS) $@ $(OBJS) - -install-exec: all - @install -d $(DESTDIR)$(libdir) - @printf " INSTALL $(DESTDIR)$(libdir)/$(SOLIB)\n" - @$(STRIPINST) $(STATICLIB) $(DESTDIR)$(libdir)/$(STATICLIB) -ifeq ($(STATIC), 0) - @$(STRIPINST) $(SOLIB) $(DESTDIR)$(libdir)/$(SOLIB) - @ln -sf $(SOLIB) $(DESTDIR)$(libdir)/$(SYMLIB) -endif - -install-dev: - @for file in $(HEADERS); do \ - printf " INSTALL $(DESTDIR)$(incdir)/$$file\n"; \ - $(INSTALL) -m 0644 $$file $(DESTDIR)$(incdir)/$$file; \ - done - -install: install-exec install-dev - -uninstall: - -@$(RM) $(DESTDIR)$(libdir)/$(SOLIB) - -@$(RM) $(DESTDIR)$(libdir)/$(SYMLIB) - -@$(RM) $(DESTDIR)$(libdir)/$(STATICLIB) - -@for file in $(HEADERS); do \ - $(RM) $(DESTDIR)$(incdir)/$$file; \ - done - -clean: - -@$(RM) $(OBJS) $(DEPS) $(TARGET) $(SOLIB) $(STATICLIB) - -distclean: - -@$(RM) $(JUNK) unittest *.o *.a *.so* *.unittest - -ifneq ($(MAKECMDGOALS),distclean) --include $(DEPS) -endif diff --git a/libite/copyfile.c b/libite/copyfile.c deleted file mode 100644 index a7e5170d..00000000 --- a/libite/copyfile.c +++ /dev/null @@ -1,377 +0,0 @@ -/* Fastinit (finit) copyfile() implementation. - * - * Copyright (c) 2008 Claudio Matsuoka - * - * 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 -#include -#include -#include -#include -#include -#include /* MAX(), isset(), setbit(), TRUE, FALSE, et consortes. :-) */ -#include -#include -#include - -#include "lite.h" - -static int adjust_target(char *src, char **dst); - -/** - * copyfile - Copy a file to another. - * @src: Source file. - * @dst: Target file. - * @len: Number of bytes to copy, zero (0) for entire file. - * @sym: Should symlinks be recreated (1) or followed (0) - * - * 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 - * the finit project, http://helllabs.org/finit/, which is a reimplementation - * of fastinit for the Asus EeePC. - * - * Only some small changes to save stack space have been introduced. - * - * Returns: - * 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 - * will be set to %EISDIR since copyfile() is not recursive. - */ -ssize_t copyfile(char *src, char *dst, int len, int sym) -{ - char *buffer; - int in, out, isdir = 0, saved_errno = 0; - ssize_t num, size = 0; - - errno = 0; - - buffer = malloc(BUFSIZ); - if (!buffer) - return 0; - - if (fisdir(src)) { - saved_errno = EISDIR; /* Error: source is a directory */ - goto exit; - } - - /* Check if target is a directory, then append src filename. */ - isdir = adjust_target(src, &dst); - - if (sym) { - size = readlink(src, buffer, BUFSIZ); - if (size > 0) { - if (size >= (ssize_t) BUFSIZ) { - saved_errno = ENOBUFS; - goto exit; - } - - buffer[size] = 0; - size = !symlink(buffer, dst); - goto exit; - } - } - - /* 0: copy entire file */ - if (len == 0) - len = INT_MAX; /* XXX: 2047 MiB should sufficient ... */ - - in = open(src, O_RDONLY); - if (in < 0) { - saved_errno = errno; - goto exit; - } - - out = open(dst, O_WRONLY | O_CREAT | O_TRUNC, fmode(src)); - if (out < 0) { - close(in); - saved_errno = errno; - goto exit; - } - - do { - int clen = len > BUFSIZ ? BUFSIZ : len; - - num = read(in, buffer, clen); - if (num > 0) - size += write(out, buffer, num); - len -= clen; - } while (len > 0 && num == BUFSIZ); - - close(out); - close(in); - -exit: - free(buffer); - if (isdir) - free(dst); - errno = saved_errno; - - return size; -} - -/** - * movefile - Move a file to another location - * @src: Source file. - * @dst: Target file, or location. - * - * This is a C implementation of the command line mv(1) utility. - * Usually the rename() API is sufficient, but not when moving across - * file system boundaries. - * - * The @src argument must include the full path to the source file, - * whereas the @dst argument may only be a directory, in which case the - * same file name from @src is used. - * - * Returns: - * POSIX OK(0), or non-zero with errno set. - */ -int movefile(char *src, char *dst) -{ - int isdir, result = 0; - - /* Check if target is a directory, then append the src base filename. */ - isdir = adjust_target(src, &dst); - - if (rename(src, dst)) { - if (errno == EXDEV) { - errno = 0; - copyfile(src, dst, 0, 0); - if (errno) - result = 1; - else - result = remove(src); - } else { - result = 1; - } - } - - if (isdir) - free(dst); - - return result; -} - -/** - * copy_filep - Copy between FILE *fp. - * @src: Source FILE. - * @dst: Destination FILE. - * - * Function takes signals into account and will restart the syscalls as long - * as error is %EINTR. - * - * Returns: - * POSIX OK(0), or non-zero with errno set on error. - */ -int copy_filep(FILE *src, FILE *dst) -{ - int result = 0; - char *buf; - - if (!src || !dst) - return EINVAL; - - buf = (char *)malloc(BUFSIZ); - if (!buf) - return errno; - - while (1) { - errno = 0; - if (!fgets(buf, BUFSIZ, src)) { - if (errno == EINTR) { - clearerr(src); - continue; - } - - if (feof(src)) - break; - - result = errno; - goto exit; - } - - while (EOF == fputs(buf, dst)) { - if (errno == EINTR) { - clearerr(dst); - continue; - } - - result = errno; - goto exit; - } - } - -exit: - free(buf); - return errno = result; -} - -/** - * fsendfile - copy data between file streams - * @out: Destination stream - * @in: Source stream - * @sz: Size in bytes to copy. - * - * @out may be NULL, in which case @sz bytes are read and discarded - * from @in. This is useful for streams where seeks are not - * permitted. Additionally @sz may be the special value zero (0) in - * which case fsendfile will copy until EOF is seen on @src. - * - * Returns: - * The number of bytes copied. If there was an error, -1 is returned - * and errno will be set accordingly. - */ -size_t fsendfile (FILE *out, FILE *in, size_t sz) -{ - char *buf; - size_t blk = BUFSIZ, num = 0, tot = 0; - - buf = (char *)malloc(BUFSIZ); - if (!buf) - return -1; - - while (!sz || tot < sz) { - if (sz && ((sz - tot) < BUFSIZ)) - blk = sz - tot; - - num = fread(buf, 1, blk, in); - if (num == 0) - break; - - if (out && (fwrite(buf, num, 1, out) != 1)) { - num = -1; - break; - } - - tot += num; - } - - free(buf); - - return (num == (size_t)-1) ? (size_t)-1 : tot; -} - -/* Tests if dst is a directory, if so, reallocates dst and appends src filename returning 1 */ -static int adjust_target(char *src, char **dst) -{ - int isdir = 0; - - if (fisdir(*dst)) { - int slash = 0; - char *tmp, *ptr = strrchr(src, '/'); - - if (!ptr) - ptr = src; - else - ptr++; - - tmp = malloc(strlen(*dst) + strlen(ptr) + 2); - if (!tmp) { - errno = EISDIR; - return 0; - } - - isdir = 1; /* Free dst before exit! */ - slash = fisslashdir(*dst); - - sprintf(tmp, "%s%s%s", *dst, slash ? "" : "/", ptr); - *dst = tmp; - } - - return isdir; -} - -#ifdef UNITTEST -#include -/* XXX: Make a real set of unit tests ... */ -#if 0 -int main(int argc, char *argv[]) -{ - if (argc < 3) { - fprintf(stderr, - "Usage: %s \nCopies the file to the file.\n", - argv[0]); - return 1; - } - - printf("Copying file %s to %s\n", argv[1], argv[2]); - - return copyfile(argv[1], argv[2], 0, 0); -} -#else -int main(void) -{ - int i = 0; - char *files[] = { - "/etc/passwd", "/tmp/tok", "/tmp/tok", - "/etc/passwd", "/tmp/", "/tmp/passwd", - "/etc/passwd", "/tmp", "/tmp/passwd", - NULL - }; - FILE *src, *dst; - - fprintf(stderr, "\n=>Start testing copy_filep()\n"); - while (files[i]) { - fprintf(stderr, "copy_filep(%s, %s)\t", files[i], - files[i + 1]); - src = fopen(files[i], "r"); - dst = fopen(files[i + 1], "w"); - if (copy_filep(src, dst)) - perror("Failed"); - - if (src) - fclose(src); - if (dst) - fclose(dst); - - if (fexist(files[i + 2])) - fprintf(stderr, "OK => %s\n", files[i + 2]); - - erase(files[i + 2]); - i += 3; - } - - printf("\n\n=>Start testing copyfile()\n"); - i = 0; - while (files[i]) { - fprintf(stderr, "copyfile(%s, %s)\t", files[i], files[i + 1]); - if (!copyfile(files[i], files[i + 1], 0, 0)) - perror("Failed"); - - if (fexist(files[i + 2])) - fprintf(stderr, "OK => %s\n", files[i + 2]); - - erase(files[i + 2]); - i += 3; - } - - return 0; -} -#endif -#endif /* UNITTEST */ - -/** - * Local Variables: - * compile-command: "gcc -g -I../include -o unittest -DUNITTEST copyfile.c && ./unittest" - * version-control: t - * indent-tabs-mode: t - * c-file-style: "linux" - * End: - */ diff --git a/libite/dir.c b/libite/dir.c deleted file mode 100644 index fbb57b76..00000000 --- a/libite/dir.c +++ /dev/null @@ -1,229 +0,0 @@ -/* Functions for operating on files in directories. - * - * Copyright (c) 2008-2014 Joachim Nilsson - * - * 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 -#include -#include -#include -#include - -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, '.'); - - if (matcher_filter && !matcher_filter(entry->d_name)) - /* User matcher overrides the rest. */ - return 0; - - /* Skip current 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; - - /* filetype == "" */ - if (matcher_type[0] == 0) - return 1; - - /* Entry has no "." */ - if (!pos) - return 0; - - return !strcmp(pos, matcher_type); -} - -/** - * dir - List all files of a certain type in the given directory. - * @dir: Base directory for dir operation. - * @type: File type suffix, e.g. ".cfg". - * @filter: Optional file name filter. - * @list: Pointer to an array of file names. - * @strip: Flag, if set dir() strips the file type. - * - * This function returns a @list of files, matching the @type suffix, - * in the given directory @dir. - * - * The @list argument is a pointer to where to store the dynamically - * allocated list of file names. This list should be free'd by first - * calling free() on each file name and then on the list itself. - * - * If @filter is not %NULL it will be called for each file found. If - * @filter returns non-zero the @file argument will be included in the - * resulting @list. If @filter returns zero for given @file it will - * be discarded. - * - * If the @strip flag is set the resulting @list of files has their - * file type stripped, including the dot. So a match "config0.cfg" - * would be returned as "config0". - * - * Returns: - * Number of files in @list, zero if no matching files of @type. - */ -int dir(const char *dir, const char *type, int (*filter) (const char *file), char ***list, int strip) -{ - int i, n, num = 0; - char **files; - struct dirent **namelist; - - assert(list); - - if (!dir) - /* Assuming current directory */ - dir = "."; - if (!type) - /* Assuming all files. */ - type = ""; - - matcher_type = type; - matcher_filter = filter; - n = scandir(dir, &namelist, matcher, alphasort); - if (n < 0) { - perror("scandir"); - } else if (n > 0) { - files = (char **)malloc(n * sizeof(char *)); - for (i = 0; i < n; i++) { - if (files) { - char *name = namelist[i]->d_name; - char *type = strrchr(name, '.'); - - if (type && strip) - *type = 0; - - files[i] = strdup(name); - num++; - } - free(namelist[i]); - } - if (num) - *list = files; - } - - if (namelist) - free(namelist); - - return num; -} - -#ifdef UNITTEST -#include -#include -#include -#include "otn/c.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 < ARRAY_ELEMENTS(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: "gcc -g -DUNITTEST -o unittest dir.c" - * version-control: t - * indent-tabs-mode: t - * c-file-style: "linux" - * End: - */ diff --git a/libite/fexist.c b/libite/fexist.c deleted file mode 100644 index 88e6af73..00000000 --- a/libite/fexist.c +++ /dev/null @@ -1,53 +0,0 @@ -/* Check if file exists - * - * Copyright (c) 2008 Claudio Matsuoka - * - * 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 -#include - -/** - * fexist - Check if a file exists in the file system. - * @file: File to look for, with full path. - * - * Returns: - * %TRUE(1) if the file exists, otherwise %FALSE(0). - */ -int fexist(char *file) -{ - if (!file) { - errno = EINVAL; - return 0; /* Doesn't exist ... */ - } - - if (-1 == access(file, F_OK)) - return 0; - - return 1; -} - -/** - * Local Variables: - * version-control: t - * indent-tabs-mode: t - * c-file-style: "linux" - * End: - */ diff --git a/libite/fisdir.c b/libite/fisdir.c deleted file mode 100644 index 2eeb98b9..00000000 --- a/libite/fisdir.c +++ /dev/null @@ -1,51 +0,0 @@ -/* Check if directory exists - * - * Copyright (c) 2008 Claudio Matsuoka - * - * 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 -#include -#include - -/** - * fexist - Check if a file exists and is a directory. - * @file: File to look for, with full path. - * - * Returns: - * %TRUE(1) if the file exists and is a directory, otherwise %FALSE(0). - */ -int fisdir(char *file) -{ - struct stat sb; - - if (!stat(file, &sb) && S_ISDIR(sb.st_mode)) - return 1; - - return 0; -} - -/** - * Local Variables: - * version-control: t - * indent-tabs-mode: t - * c-file-style: "linux" - * End: - */ diff --git a/libite/fmode.c b/libite/fmode.c deleted file mode 100644 index 6f27ecb9..00000000 --- a/libite/fmode.c +++ /dev/null @@ -1,57 +0,0 @@ -/* File mode bit operations - * - * Copyright (c) 2008 Claudio Matsuoka - * - * 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 -#include -#include -#include - -/** - * 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: - * version-control: t - * indent-tabs-mode: t - * c-file-style: "linux" - * End: - */ diff --git a/libite/lite.h b/libite/lite.h deleted file mode 100644 index 1dfc733c..00000000 --- a/libite/lite.h +++ /dev/null @@ -1,102 +0,0 @@ -/* Collection of utility funcs and C library extensions for finit & its plugins - * - * Copyright (c) 2008-2010 Claudio Matsuoka - * Copyright (c) 2008-2014 Joachim Nilsson - * - * 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. - */ - -#ifndef FINIT_LITE_H_ -#define FINIT_LITE_H_ - -#include -#include -#include -#include -#include /* MAX(), isset(), setbit(), TRUE, FALSE, et consortes. :-) */ -#include - -int fexist (char *file); -int fisdir (char *file); -mode_t fmode (char *file); - -ssize_t copyfile (char *src, char *dst, int len, int sym); -int movefile (char *src, char *dst); -int copy_filep (FILE *src, FILE *dst); -size_t fsendfile (FILE *out, FILE *in, size_t sz); - -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)); - -#ifndef strlcpy -size_t strlcpy (char *dst, const char *src, size_t siz); -#endif -#ifndef strlcat -size_t strlcat (char *dst, const char *src, size_t siz); -#endif -#ifndef strtonum -long long strtonum (const char *numstr, long long minval, long long maxval, const char **errstrp); -#endif - -static inline int fisslashdir(char *dir) -{ - if (!dir) return 0; - if (strlen (dir) > 0) return dir[strlen (dir) - 1] == '/'; - return 0; -} - - -/* Validate string, non NULL and not zero length */ -static inline int string_valid (const char *s) -{ - return s && strlen (s); -} - -/* Relaxed comparison, e.g., sys_string_match("small", "smaller") => TRUE */ -static inline int string_match (const char *a, const char *b) -{ - size_t min = MIN(strlen (a), strlen (b)); - - return !strncasecmp (a, b, min); -} - -/* Strict comparison, e.g., sys_string_match("small", "smaller") => FALSE */ -static inline int string_compare (const char *a, const char *b) -{ - return strlen (a) == strlen (b) && !strcmp (a, b); -} - -/* Strict comparison, like sys_string_compare(), but case insensitive, - * e.g., sys_string_match("small", "SmAlL") => TRUE - */ -static inline int string_case_compare (const char *a, const char *b) -{ - return strlen (a) == strlen (b) && !strcasecmp (a, b); -} - -#endif /* FINIT_LITE_H_ */ - -/** - * Local Variables: - * version-control: t - * indent-tabs-mode: t - * c-file-style: "linux" - * End: - */ - diff --git a/libite/rsync.c b/libite/rsync.c deleted file mode 100644 index ade21183..00000000 --- a/libite/rsync.c +++ /dev/null @@ -1,302 +0,0 @@ -/* Micro "rsync" implementation. - * - * Copyright (c) 2011, 2012 Joachim Nilsson - * - * 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 -#include /* NULL, free() */ -#include /* strlen() */ -#include /* rindex() */ -#include -#include /* MAX(), isset(), setbit(), TRUE, FALSE, et consortes. :-) */ -#include -#include - -#include "lite.h" -#include "../helpers.h" - -static int copy(char *src, char *dst); -static int mdir(char *buf, size_t buf_len, char *dir, char *name, mode_t mode); -static int prune(char *dst, char **new_files, int new_num); - - -/** - * rsync - Synchronize contents and optionally remove non-existing backups - * @src: Source directory - * @dst: Destination directory - * @delete: Prune files from @dst that no longer exist in @src. - * @filter: Optional filtering function for source directory. - * - * This is a miniature implementation of the famous rsync for local use only. - * In fact, it is not even a true rsync since it copies all files from @src - * to @dst. The @delete option is useful for creating backups, when set all - * files removed from src since last backup are pruned from the destination - * (backup) directory. - * - * 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: - * POSIX OK(0), or non-zero with @errno set on error. - */ -int rsync(char *src, char *dst, int delete, int (*filter) (const char *file)) -{ - char source[256]; - char dest[256]; - int i = 0, num = 0, result = 0; - char **files; /* Array of file names. */ - - if (!fisdir(dst)) - makedir(dst, 0755); - - if (!fisdir(src)) { - if (!fexist(src)) - return 1; - - if (copy(src, dst)) - result++; - - return errno; - } - - /* Copy dir as well? */ - if (!fisslashdir(src)) { - char *ptr = rindex(src, '/'); - - if (!ptr) - ptr = src; - else - ptr++; - - if (mdir(dest, sizeof(dest), dst, ptr, fmode(src))) - return 1; - dst = dest; - } - - num = dir(src, "", filter, &files, 0); - for (i = 0; i < num; i++) { - /* Recursively copy sub-directries */ - snprintf(source, sizeof(source), "%s%s%s", src, fisslashdir(src) ? "" : "/", files[i]); - if (fisdir(source)) { - char dst2[256]; - - strcat(source, "/"); - if (mdir (dst2, sizeof(dst2), dst, files[i], fmode(source))) { - result++; - continue; - } - - rsync(source, dst2, delete, filter); - continue; /* Next file/dir in @src to copy... */ - } - - if (copy(source, dst)) - result++; - } - - /* We ignore any errors from the pruning, that phase albeit useful is only - * cosmetic. --Jocke 2011-03-24 */ - if (delete) - prune(dst, files, num); - - if (num) { - for (i = 0; i < num; i++) - free(files[i]); - free(files); - } - - return result; -} - -static int copy(char *src, char *dst) -{ - errno = 0; - - copyfile(src, dst, 0, 1); - if (errno) { - if (errno != EEXIST) - return 1; - - errno = 0; - } - - return 0; -} - -/* 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) -{ - snprintf(buf, buf_len, "%s%s%s/", dir, fisslashdir(dir) ? "" : "/", name); - if (mkdir(buf, mode)) { - if (EEXIST != errno) - return 1; - - errno = 0; - } - - return 0; -} - - -static int find(char *file, char **files, int num) -{ - int n; - - for (n = 0; n < num; n++) - if (!strncmp (files[n], file, MAX(strlen(files[n]), strlen(file)))) - return 1; - - return 0; -} - - -/* Prune old files, no longer existing on source, from destination directory. */ -static int prune(char *dst, char **new_files, int new_num) -{ - int num, result = 0; - char **files; - - num = dir(dst, "", NULL, &files, 0); - if (num) { - int i; - - for (i = 0; i < num; i++) { - if (!find(files[i], new_files, new_num)) { - char *name; - size_t len = strlen(files[i]) + 2 + strlen(dst); - - name = malloc(len); - if (name) { - snprintf(name, len, "%s%s%s", dst, fisslashdir(dst) ? "" : "/", files[i]); - if (remove(name)) - result++; - free(name); - } - } - free(files[i]); - } - free(files); - } - - return result; -} - -#ifdef UNITTEST -#define BASE "/tmp/.unittest/" -#define SRC BASE "src/" -#define DST BASE "dst/" - -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); - } -} - -int run_test() -{ -#if 0 - setup_test(); - puts("Before:"); - system("tree -np " BASE); - - rsync(SRC, DST, 0, NULL); - puts("After:"); - system("tree -np " BASE); - cleanup_test(); -#endif - - setup_test(); - rsync(BASE "src", DST, 0, NULL); - puts("Only partial rsync of src <-- No slash!"); - system("tree -np " BASE); -#if 0 - cleanup_test(); - setup_test(); - rsync(BASE "src/sub1", BASE "dst", 0, NULL); - puts("Only partial rsync of src/sub1 <-- No slashes!!"); - system("tree -np " BASE); - - cleanup_test(); - setup_test(); - rsync(BASE "src/sub1/", DST, 0, NULL); - puts("Only partial rsync of src/sub1/"); - system("tree -np " BASE); - - cleanup_test(); - setup_test(); - rsync(BASE "src/sub1", DST, 0, NULL); - puts("Only partial rsync of src/sub1 <-- No slash!"); - system("tree -np " BASE); - - rsync("/etc", "/var/tmp", 0, NULL); - puts("Real life test:"); - system("tree -np /var/tmp"); -#endif - return 0; -} - -int main(int argc, char *argv[]) -{ - atexit(cleanup_test); - - return run_test(); -} -#endif /* UNITTEST */ - -/** - * Local Variables: - * compile-command: "make -f rsync.mk" - * version-control: t - * indent-tabs-mode: t - * c-file-style: "linux" - * End: - */ diff --git a/libite/rsync.mk b/libite/rsync.mk deleted file mode 100644 index 8556c786..00000000 --- a/libite/rsync.mk +++ /dev/null @@ -1,22 +0,0 @@ -# Unittest makefile for rsync.c -.PHONY: clean - -SRC = rsync.c -OBJS = dir.o copyfile.o fexist.o fisdir.o fmode.o -UNIT = rsync.unittest -#CPPFLAGS = -DDEBUG -I../../.. -I../../include - -all: build run - -clean: - @rm -f $(OBJS) $(UNIT) - -# This rule also forces a cleanup of built objects to not leave any object files -# lingering in the tree to interfere with cross builds. -build: clean $(OBJS) - $(CC) $(CFLAGS) $(CPPFLAGS) -o $(UNIT) -DUNITTEST $(SRC) $(OBJS) - @rm -f $(OBJS) - -run: - @./$(UNIT) - diff --git a/libite/strlcat.c b/libite/strlcat.c deleted file mode 100644 index 18406f3b..00000000 --- a/libite/strlcat.c +++ /dev/null @@ -1,66 +0,0 @@ -/* $OpenBSD: strlcat.c,v 1.13 2005/08/08 08:05:37 espie Exp $ */ - -/* - * Copyright (c) 1998 Todd C. Miller - * - * 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 -#include - -#ifndef strlcat -/* - * Appends src to string dst of size siz (unlike strncat, siz is the - * full size of dst, not space left). At most siz-1 characters - * will be copied. Always NUL terminates (unless siz <= strlen(dst)). - * Returns strlen(src) + MIN(siz, strlen(initial dst)). - * If retval >= siz, truncation occurred. - */ -size_t -strlcat(char *dst, const char *src, size_t siz) -{ - char *d = dst; - const char *s = src; - size_t n = siz; - size_t dlen; - - /* Find the end of dst and adjust bytes left but don't go past end */ - while (n-- != 0 && *d != '\0') - d++; - dlen = d - dst; - n = siz - dlen; - - if (n == 0) - return(dlen + strlen(s)); - while (*s != '\0') { - if (n != 1) { - *d++ = *s; - n--; - } - s++; - } - *d = '\0'; - - return(dlen + (s - src)); /* count does not include NUL */ -} -#endif - -/** - * Local Variables: - * version-control: t - * c-file-style: "bsd" - * End: - */ - - diff --git a/libite/strlcpy.c b/libite/strlcpy.c deleted file mode 100644 index e20808df..00000000 --- a/libite/strlcpy.c +++ /dev/null @@ -1,61 +0,0 @@ -/* $OpenBSD: strlcpy.c,v 1.11 2006/05/05 15:27:38 millert Exp $ */ - -/* - * Copyright (c) 1998 Todd C. Miller - * - * 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 -#include - -#ifndef strlcpy -/* - * Copy src to string dst of size siz. At most siz-1 characters - * will be copied. Always NUL terminates (unless siz == 0). - * Returns strlen(src); if retval >= siz, truncation occurred. - */ -size_t -strlcpy(char *dst, const char *src, size_t siz) -{ - char *d = dst; - const char *s = src; - size_t n = siz; - - /* Copy as many bytes as will fit */ - if (n != 0) { - while (--n != 0) { - if ((*d++ = *s++) == '\0') - break; - } - } - - /* Not enough room in dst, add NUL and traverse rest of src */ - if (n == 0) { - if (siz != 0) - *d = '\0'; /* NUL-terminate dst */ - while (*s++) - ; - } - - return(s - src - 1); /* count does not include NUL */ -} - -#endif - -/** - * Local Variables: - * version-control: t - * c-file-style: "bsd" - * End: - */ diff --git a/libite/strtonum.c b/libite/strtonum.c deleted file mode 100644 index 73ebdbe2..00000000 --- a/libite/strtonum.c +++ /dev/null @@ -1,67 +0,0 @@ -/* $OpenBSD: strtonum.c,v 1.6 2004/08/03 19:38:01 millert Exp $ */ - -/* - * Copyright (c) 2004 Ted Unangst and Todd Miller - * All rights reserved. - * - * 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 -#include -#include - -#ifndef strtonum -#define INVALID 1 -#define TOOSMALL 2 -#define TOOLARGE 3 - -long long -strtonum(const char *numstr, long long minval, long long maxval, - const char **errstrp) -{ - long long ll = 0; - char *ep; - int error = 0; - struct errval { - const char *errstr; - int err; - } ev[4] = { - { NULL, 0 }, - { "invalid", EINVAL }, - { "too small", ERANGE }, - { "too large", ERANGE }, - }; - - ev[0].err = errno; - errno = 0; - if (minval > maxval) - error = INVALID; - else { - ll = strtoll(numstr, &ep, 10); - if (numstr == ep || *ep != '\0') - error = INVALID; - else if ((ll == LLONG_MIN && errno == ERANGE) || ll < minval) - error = TOOSMALL; - else if ((ll == LLONG_MAX && errno == ERANGE) || ll > maxval) - error = TOOLARGE; - } - if (errstrp != NULL) - *errstrp = ev[error].errstr; - errno = ev[error].err; - if (error) - ll = 0; - - return (ll); -} -#endif