|
26 | 26 | #include <fts.h> |
27 | 27 | #include <glob.h> |
28 | 28 | #include <mach-o/dyld.h> |
| 29 | +#include <libgen.h> |
29 | 30 |
|
30 | 31 | #include "roothide.h" |
31 | 32 | #include "common.h" |
@@ -194,11 +195,25 @@ int VROOT_API_NAME(symlink)(const char *name1, const char *name2) |
194 | 195 | { |
195 | 196 | VROOT_LOG("@%s\n",__FUNCTION__); |
196 | 197 |
|
197 | | - const char* newname1 = jbroot_alloc(name1); |
| 198 | + int ret = 0; |
198 | 199 | const char* newname2 = jbroot_alloc(name2); |
199 | | - int ret = symlink(newname1, newname2); |
200 | | - if(newname1) free((void*)newname1); |
| 200 | + |
| 201 | + char dname[PATH_MAX]; |
| 202 | + int dfd = open(dirname_r(newname2, dname), O_RDONLY); |
| 203 | + if(dfd >= 0) |
| 204 | + { |
| 205 | + const char* newname1 = jbrootat_alloc(dfd, name1, 0); |
| 206 | + ret = symlink(newname1, newname2); |
| 207 | + if(newname1) free((void*)newname1); |
| 208 | + |
| 209 | + close(dfd); |
| 210 | + |
| 211 | + } else { |
| 212 | + ret = -1; |
| 213 | + } |
| 214 | + |
201 | 215 | if(newname2) free((void*)newname2); |
| 216 | + |
202 | 217 | return ret; |
203 | 218 | } |
204 | 219 |
|
@@ -229,12 +244,24 @@ VROOT_LOG("@%s\n",__FUNCTION__); |
229 | 244 |
|
230 | 245 | int VROOTAT_API_NAME(symlinkat)(const char *name1, int fd, const char *name2) |
231 | 246 | { |
232 | | -VROOT_LOG("@%s\n",__FUNCTION__); |
| 247 | +VROOT_LOG("@%s %s %d %s\n",__FUNCTION__, name1, fd, name2); |
233 | 248 |
|
234 | | - const char* newname1 = jbroot_alloc(name1); |
| 249 | + int ret = 0; |
235 | 250 | const char* newname2 = jbrootat_alloc(fd, name2, 0); //*********** |
236 | | - int ret = symlinkat(newname1, fd, newname2); |
237 | | - if(newname1) free((void*)newname1); |
| 251 | + |
| 252 | + char dname[PATH_MAX]; |
| 253 | + int dfd = openat(fd, dirname_r(newname2, dname), O_RDONLY); |
| 254 | + if(dfd >= 0) |
| 255 | + { |
| 256 | + const char* newname1 = jbrootat_alloc(dfd, name1, 0); |
| 257 | + int ret = symlinkat(newname1, fd, newname2); |
| 258 | + if(newname1) free((void*)newname1); |
| 259 | + |
| 260 | + close(dfd); |
| 261 | + } else { |
| 262 | + ret = -1; |
| 263 | + } |
| 264 | + |
238 | 265 | if(newname2) free((void*)newname2); |
239 | 266 | return ret; |
240 | 267 | } |
@@ -366,7 +393,7 @@ VROOT_LOG("@%s\n",__FUNCTION__); |
366 | 393 |
|
367 | 394 | char* VROOT_API_NAME(realpath$DARWIN_EXTSN)(const char * path, char *resolved_path) |
368 | 395 | { |
369 | | -VROOT_LOG("@%s\n",__FUNCTION__); |
| 396 | +VROOT_LOG("@%s %s\n",__FUNCTION__, path); |
370 | 397 |
|
371 | 398 | char pathbuf[PATH_MAX]={0}; |
372 | 399 | const char* newpath = jbroot_alloc(path); |
|
0 commit comments