summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJörg Frings-Fürst <debian@jff-webhosting.net>2024-10-20 12:21:30 +0200
committerJörg Frings-Fürst <debian@jff-webhosting.net>2024-10-20 12:21:30 +0200
commit677e5b0b948fe62d8017c198c57049275f6fe61a (patch)
treeb268760d73809ff89dcaff971602c5c57ce04a36 /src
parent2acbac8ef9d314b73fbbd68c2e70580988c063a9 (diff)
New upstream version 4.24upstream/4.24upstream
Diffstat (limited to 'src')
-rw-r--r--src/Makefile.am2
-rw-r--r--src/Makefile.in2
-rw-r--r--src/io.c56
-rw-r--r--src/libHX.map5
-rw-r--r--src/tc-io.c12
-rw-r--r--src/tc-realpath.c10
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
diff --git a/src/io.c b/src/io.c
index 9199d03..b9041e0 100644
--- a/src/io.c
+++ b/src/io.c
@@ -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) {