diff options
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) { | 
