aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDenys Vlasenko <vda.linux@googlemail.com>2018-05-24 17:29:14 +0200
committerDenys Vlasenko <vda.linux@googlemail.com>2018-05-24 17:31:00 +0200
commit747162109fb1c891baf6aafa1ca0410bd08d04a4 (patch)
tree7215b1a5b94212e207b9c3d7c1426e65c2ce0553
parent3f91e662f21083d4febf74fa89ccc50e406cbf6c (diff)
downloadbusybox-w32-747162109fb1c891baf6aafa1ca0410bd08d04a4.tar.gz
busybox-w32-747162109fb1c891baf6aafa1ca0410bd08d04a4.tar.bz2
busybox-w32-747162109fb1c891baf6aafa1ca0410bd08d04a4.zip
realpath,readlink -f: coreutils compat, closes 11021
function old new delta xmalloc_realpath_coreutils - 121 +121 Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
-rw-r--r--coreutils/readlink.c2
-rw-r--r--coreutils/realpath.c2
-rw-r--r--include/libbb.h1
-rw-r--r--libbb/xreadlink.c30
4 files changed, 33 insertions, 2 deletions
diff --git a/coreutils/readlink.c b/coreutils/readlink.c
index b8e327d11..49361cea0 100644
--- a/coreutils/readlink.c
+++ b/coreutils/readlink.c
@@ -86,7 +86,7 @@ int readlink_main(int argc UNUSED_PARAM, char **argv)
86 86
87 /* NOFORK: only one alloc is allowed; must free */ 87 /* NOFORK: only one alloc is allowed; must free */
88 if (opt & 1) { /* -f */ 88 if (opt & 1) { /* -f */
89 buf = xmalloc_realpath(fname); 89 buf = xmalloc_realpath_coreutils(fname);
90 } else { 90 } else {
91 buf = xmalloc_readlink_or_warn(fname); 91 buf = xmalloc_readlink_or_warn(fname);
92 } 92 }
diff --git a/coreutils/realpath.c b/coreutils/realpath.c
index aa878fcd2..43923681c 100644
--- a/coreutils/realpath.c
+++ b/coreutils/realpath.c
@@ -38,7 +38,7 @@ int realpath_main(int argc UNUSED_PARAM, char **argv)
38 38
39 do { 39 do {
40 /* NOFORK: only one alloc is allowed; must free */ 40 /* NOFORK: only one alloc is allowed; must free */
41 char *resolved_path = xmalloc_realpath(*argv); 41 char *resolved_path = xmalloc_realpath_coreutils(*argv);
42 if (resolved_path != NULL) { 42 if (resolved_path != NULL) {
43 puts(resolved_path); 43 puts(resolved_path);
44 free(resolved_path); 44 free(resolved_path);
diff --git a/include/libbb.h b/include/libbb.h
index a605c7f03..d4ba031df 100644
--- a/include/libbb.h
+++ b/include/libbb.h
@@ -485,6 +485,7 @@ DIR *xopendir(const char *path) FAST_FUNC;
485DIR *warn_opendir(const char *path) FAST_FUNC; 485DIR *warn_opendir(const char *path) FAST_FUNC;
486 486
487char *xmalloc_realpath(const char *path) FAST_FUNC RETURNS_MALLOC; 487char *xmalloc_realpath(const char *path) FAST_FUNC RETURNS_MALLOC;
488char *xmalloc_realpath_coreutils(const char *path) FAST_FUNC RETURNS_MALLOC;
488char *xmalloc_readlink(const char *path) FAST_FUNC RETURNS_MALLOC; 489char *xmalloc_readlink(const char *path) FAST_FUNC RETURNS_MALLOC;
489char *xmalloc_readlink_or_warn(const char *path) FAST_FUNC RETURNS_MALLOC; 490char *xmalloc_readlink_or_warn(const char *path) FAST_FUNC RETURNS_MALLOC;
490/* !RETURNS_MALLOC: it's a realloc-like function */ 491/* !RETURNS_MALLOC: it's a realloc-like function */
diff --git a/libbb/xreadlink.c b/libbb/xreadlink.c
index 9b62bcc43..6315033bb 100644
--- a/libbb/xreadlink.c
+++ b/libbb/xreadlink.c
@@ -122,3 +122,33 @@ char* FAST_FUNC xmalloc_realpath(const char *path)
122 return xstrdup(realpath(path, buf)); 122 return xstrdup(realpath(path, buf));
123#endif 123#endif
124} 124}
125
126char* FAST_FUNC xmalloc_realpath_coreutils(const char *path)
127{
128 char *buf;
129
130 errno = 0;
131 buf = xmalloc_realpath(path);
132 /*
133 * There is one case when "readlink -f" and
134 * "realpath" from coreutils succeed,
135 * even though file does not exist, such as:
136 * /tmp/file_does_not_exist
137 * (the directory must exist).
138 */
139 if (!buf && errno == ENOENT) {
140 char *last_slash = strrchr(path, '/');
141 if (last_slash) {
142 *last_slash++ = '\0';
143 buf = xmalloc_realpath(path);
144 if (buf) {
145 unsigned len = strlen(buf);
146 buf = xrealloc(buf, len + strlen(last_slash) + 2);
147 buf[len++] = '/';
148 strcpy(buf + len, last_slash);
149 }
150 }
151 }
152
153 return buf;
154}