diff options
author | Jörg Frings-Fürst <debian@jff-webhosting.net> | 2024-10-20 12:21:30 +0200 |
---|---|---|
committer | Jörg Frings-Fürst <debian@jff-webhosting.net> | 2024-10-20 12:21:30 +0200 |
commit | 677e5b0b948fe62d8017c198c57049275f6fe61a (patch) | |
tree | b268760d73809ff89dcaff971602c5c57ce04a36 /src | |
parent | 2acbac8ef9d314b73fbbd68c2e70580988c063a9 (diff) |
New upstream version 4.24upstream/4.24upstream
Diffstat (limited to 'src')
-rw-r--r-- | src/Makefile.am | 2 | ||||
-rw-r--r-- | src/Makefile.in | 2 | ||||
-rw-r--r-- | src/io.c | 56 | ||||
-rw-r--r-- | src/libHX.map | 5 | ||||
-rw-r--r-- | src/tc-io.c | 12 | ||||
-rw-r--r-- | src/tc-realpath.c | 10 |
6 files changed, 79 insertions, 8 deletions
diff --git a/src/Makefile.am b/src/Makefile.am index 11a240e..f28c0a6 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -9,7 +9,7 @@ libHX_la_SOURCES = deque.c dl.c format.c io.c map.c \ mc.c misc.c opt.c proc.c \ rand.c socket.c string.c time.c libHX_la_LIBADD = ${libdl_LIBS} -lm ${libpthread_LIBS} ${librt_LIBS} ${libsocket_LIBS} -libHX_la_LDFLAGS = -no-undefined -version-info 39:0:7 +libHX_la_LDFLAGS = -no-undefined -version-info 40:0:8 if WITH_GNU_LD libHX_la_LDFLAGS += -Wl,--version-script=${srcdir}/libHX.map endif diff --git a/src/Makefile.in b/src/Makefile.in index 22766b5..0ad4cde 100644 --- a/src/Makefile.in +++ b/src/Makefile.in @@ -771,7 +771,7 @@ libHX_la_SOURCES = deque.c dl.c format.c io.c map.c mc.c misc.c opt.c \ proc.c rand.c socket.c string.c time.c $(am__append_3) libHX_la_LIBADD = ${libdl_LIBS} -lm ${libpthread_LIBS} ${librt_LIBS} \ ${libsocket_LIBS} $(am__append_4) -libHX_la_LDFLAGS = -no-undefined -version-info 39:0:7 $(am__append_1) \ +libHX_la_LDFLAGS = -no-undefined -version-info 40:0:8 $(am__append_1) \ $(am__append_2) EXTRA_libHX_la_DEPENDENCIES = libHX.map EXTRA_DIST = internal.h map_int.h libHX.map uxcompat.h analyze.sh @@ -351,12 +351,17 @@ EXPORT_SYMBOL int HX_readlink(hxmc_t **target, const char *path) size_t linkbuf_size; if (allocate) { - linkbuf_size = 32; - *target = HXmc_meminit(NULL, 32); + linkbuf_size = 128; + *target = HXmc_meminit(nullptr, 128); if (*target == NULL) return -errno; } else { linkbuf_size = HXmc_length(*target); + if (linkbuf_size < 128) { + linkbuf_size = 128; + if (HXmc_setlen(target, 128) == nullptr) + return -errno; + } } while (true) { ssize_t ret = readlink(path, *target, linkbuf_size); @@ -453,6 +458,45 @@ HX_realpath_symres(struct HX_realpath_state *state, const char *path) return 1; } +EXPORT_SYMBOL int HX_getcwd(hxmc_t **target) +{ + bool allocate = *target == nullptr; + size_t linkbuf_size; + + if (allocate) { + linkbuf_size = 128; + *target = HXmc_meminit(nullptr, linkbuf_size); + if (*target == nullptr) + return -errno; + } else { + linkbuf_size = HXmc_length(*target); + if (linkbuf_size < 128) { + linkbuf_size = 128; + if (HXmc_setlen(target, linkbuf_size) == nullptr) + return -errno; + } + } + while (true) { + const char *ret = getcwd(*target, linkbuf_size); + if (ret != nullptr) { + HXmc_setlen(target, strlen(ret)); /* shrink to fit */ + return 1; + } + if (errno == ERANGE) { + if (HXmc_setlen(target, linkbuf_size *= 2) != nullptr) + continue; + /* errno already set by realloc, fall into next if block */ + } + int saved_errno = errno; + if (allocate) { + HXmc_free(*target); + *target = nullptr; + } + return -(errno = saved_errno); + } + return -EINVAL; +} + EXPORT_SYMBOL int HX_realpath(hxmc_t **dest_pptr, const char *path, unsigned int flags) { @@ -462,7 +506,7 @@ EXPORT_SYMBOL int HX_realpath(hxmc_t **dest_pptr, const char *path, int ret = 0; if (dnull) { - state.dest = HXmc_meminit(NULL, PATH_MAX); + state.dest = HXmc_meminit(NULL, 256); if (state.dest == NULL) goto err; } @@ -470,11 +514,9 @@ EXPORT_SYMBOL int HX_realpath(hxmc_t **dest_pptr, const char *path, if (*path == '/') { rq_slash = true; } else if (flags & HX_REALPATH_ABSOLUTE) { - if (getcwd(state.dest, PATH_MAX) == NULL) + if (HX_getcwd(&state.dest) < 0) goto err; rq_slash = true; - if (HXmc_setlen(&state.dest, strlen(state.dest)) == NULL) - goto err; } while (*path != '\0') { @@ -541,6 +583,8 @@ EXPORT_SYMBOL int HX_realpath(hxmc_t **dest_pptr, const char *path, /* If caller supplied a buffer, do not take it away. */ HXmc_free(state.dest); *dest_pptr = NULL; + } else { + *dest_pptr = state.dest; } HXmc_free(state.link_target); HXmc_free(state.new_path); diff --git a/src/libHX.map b/src/libHX.map index 374a881..922cc3c 100644 --- a/src/libHX.map +++ b/src/libHX.map @@ -183,3 +183,8 @@ LIBHX_4.18 { global: HX_getopt5; } LIBHX_4.16; + +LIBHX_4.24 { +global: + HX_getcwd; +} LIBHX_4.18; diff --git a/src/tc-io.c b/src/tc-io.c index 77baf01..024a46a 100644 --- a/src/tc-io.c +++ b/src/tc-io.c @@ -28,6 +28,16 @@ static void sf(void) close(src); } +static void t_getcwd(void) +{ + hxmc_t *s = nullptr; + if (HX_getcwd(&s) > 0) + printf("cwd1: >%s<\n", s); + HXmc_setlen(&s, 0); + if (HX_getcwd(&s) > 0) + printf("cwd2: >%s<\n", s); +} + int main(void) { size_t z; @@ -55,5 +65,7 @@ int main(void) fprintf(stderr, "copy_file ok\n"); unlink("tciocopy.txt"); } + + t_getcwd(); return 0; } diff --git a/src/tc-realpath.c b/src/tc-realpath.c index b71c127..4d6b79f 100644 --- a/src/tc-realpath.c +++ b/src/tc-realpath.c @@ -48,6 +48,15 @@ static void t_1(void) HXmc_free(tmp); } +static void t_2(void) +{ + hxmc_t *tmp = HXmc_strinit(""); + int ret = HX_realpath(&tmp, "../../../../dev/tty", HX_REALPATH_ABSOLUTE | HX_REALPATH_DEFAULT); + if (ret > 0) + printf("t_2: %s\n", tmp); + HXmc_free(tmp); +} + int main(int argc, char **oargv) { char **argv = nullptr; @@ -57,6 +66,7 @@ int main(int argc, char **oargv) if (!rp_get_options(oargv, &argc, &argv)) return EXIT_FAILURE; t_1(); + t_2(); res = NULL; for (int i = 1; i < argc; ++i) { |