| 1358 | |
| 1359 | #ifndef _win_ |
| 1360 | static int |
| 1361 | fts_safe_changedir(FTS* sp, FTSENT* p, int fd, const char* path) |
| 1362 | { |
| 1363 | int ret, oerrno, newfd; |
| 1364 | stat_struct sb; |
| 1365 | |
| 1366 | newfd = fd; |
| 1367 | if (ISSET(FTS_NOCHDIR)) { |
| 1368 | return (0); |
| 1369 | } |
| 1370 | if (fd < 0 && (newfd = open(path, O_RDONLY, 0)) < 0) { |
| 1371 | return (-1); |
| 1372 | } |
| 1373 | if (fstat(newfd, &sb)) { |
| 1374 | ret = -1; |
| 1375 | goto bail; |
| 1376 | } |
| 1377 | if (p->fts_dev != sb.st_dev || p->fts_ino != sb.st_ino) { |
| 1378 | errno = ENOENT; /* disinformation */ |
| 1379 | ret = -1; |
| 1380 | goto bail; |
| 1381 | } |
| 1382 | ret = fchdir(newfd); |
| 1383 | bail: |
| 1384 | oerrno = errno; |
| 1385 | if (fd < 0) { |
| 1386 | (void)close(newfd); |
| 1387 | } |
| 1388 | errno = oerrno; |
| 1389 | return (ret); |
| 1390 | } |
| 1391 | #else |
| 1392 | static int |
| 1393 | fts_safe_changedir(FTS* sp, FTSENT* p, int /*fd*/, const char* path) |