From a734f141de5a42cdf1a98d6b5eea5bf04c91d4fb Mon Sep 17 00:00:00 2001 From: sisungo Date: Tue, 7 Jul 2026 10:50:02 +0800 Subject: [PATCH] feat: add compatibility with linux Signed-off-by: sisungo --- backupfile.c | 6 ++-- compat.h | 88 +++++++++++++++++++++++++++++++++++++++++++++++++--- inp.c | 8 ++--- pch.c | 7 +++-- 4 files changed, 94 insertions(+), 15 deletions(-) diff --git a/backupfile.c b/backupfile.c index 6307330..b4b196e 100644 --- a/backupfile.c +++ b/backupfile.c @@ -1,9 +1,9 @@ /*- * Copyright (C) 1990 Free Software Foundation, Inc. - * + * * This program is free software; you can redistribute it and/or modify it * without restriction. - * + * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. @@ -104,7 +104,7 @@ max_backup_version(const char *file, const char *dir) file_name_length = strlen(file); while ((dp = readdir(dirp)) != NULL) { - if (dp->d_namlen <= file_name_length) + if (strlen(dp->d_name) <= file_name_length) continue; this_version = version_number(file, dp->d_name, file_name_length); diff --git a/compat.h b/compat.h index f1961c4..f9fa661 100644 --- a/compat.h +++ b/compat.h @@ -1,9 +1,87 @@ #include +#include +#include +#include -static inline void *reallocarray(void *p, size_t n, size_t size) { - if (n && size > (size_t)-1 / n) { - errno = ENOMEM; - return NULL; +static inline long long strtonum(const char *nptr, long long minval, + long long maxval, const char **errstr) { + const char *p = nptr; + char *endptr; + long long result; + int saved_errno; + + if (errstr != NULL) + *errstr = NULL; + + if (nptr == NULL || *nptr == '\0') { + if (errstr != NULL) + *errstr = "invalid"; + errno = EINVAL; + return 0; } - return realloc(p, n * size); + + if (minval > maxval) { + if (errstr != NULL) + *errstr = "invalid"; + errno = EINVAL; + return 0; + } + + while (isspace((unsigned char)*p)) + p++; + + saved_errno = errno; + errno = 0; + + result = strtoll(p, &endptr, 10); + + if (errno == ERANGE) { + if (errstr != NULL) { + *errstr = (result == LLONG_MIN || result < minval) ? + "too small" : "too large"; + } + errno = ERANGE; + return 0; + } + + if (endptr == p) { + if (errstr != NULL) + *errstr = "invalid"; + errno = EINVAL; + return 0; + } + + while (isspace((unsigned char)*endptr)) + endptr++; + if (*endptr != '\0') { + if (errstr != NULL) + *errstr = "invalid"; + errno = EINVAL; + return 0; + } + + if (result < minval) { + if (errstr != NULL) + *errstr = "too small"; + errno = ERANGE; + return 0; + } + if (result > maxval) { + if (errstr != NULL) + *errstr = "too large"; + errno = ERANGE; + return 0; + } + + if (errstr != NULL) + *errstr = NULL; + return result; +} + +static inline void *reallocf(void *ptr, size_t size) { + void *new_ptr = realloc(ptr, size); + if (new_ptr == NULL && size != 0) { + free(ptr); + } + return new_ptr; } diff --git a/inp.c b/inp.c index b07eebd..e51476b 100644 --- a/inp.c +++ b/inp.c @@ -1,11 +1,11 @@ /*- * Copyright 1986, Larry Wall - * + * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following condition is met: * 1. Redistributions of source code must retain the above copyright notice, * this condition and the following disclaimer. - * + * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``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 @@ -17,7 +17,7 @@ * 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. - * + * * patch - a program to apply diffs to original files * * -C option added in 1998, original code by Marc Espie, based on FreeBSD @@ -43,12 +43,12 @@ #include #include #include +#include #include "common.h" #include "util.h" #include "pch.h" #include "inp.h" -#include "compat.h" /* Input-file-with-indexable-lines abstract type */ diff --git a/pch.c b/pch.c index 71f7312..ca0c420 100644 --- a/pch.c +++ b/pch.c @@ -1,11 +1,11 @@ /*- * Copyright 1986, Larry Wall - * + * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following condition is met: * 1. Redistributions of source code must retain the above copyright notice, * this condition and the following disclaimer. - * + * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``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 @@ -17,7 +17,7 @@ * 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. - * + * * patch - a program to apply diffs to original files * * -C option added in 1998, original code by Marc Espie, based on FreeBSD @@ -42,6 +42,7 @@ #include "util.h" #include "pch.h" #include "pathnames.h" +#include "compat.h" /* Patch (diff listing) abstract type. */