switch (e)
{
case ELOOP:
+
+ /* With open ("symlink", O_NOFOLLOW|...), POSIX says errno == ELOOP,
+ but some operating systems do not conform to the standard. */
+#ifdef EFTYPE
+ /* NetBSD uses errno == EFTYPE; see <http://gnats.netbsd.org/43154>. */
+ case EFTYPE:
+#endif
+ /* FreeBSD 8.1 uses errno == EMLINK. */
+ case EMLINK:
+ /* Tru64 5.1B uses errno == ENOTSUP. */
+ case ENOTSUP:
+
if (! regular
|| old_files_option != OVERWRITE_OLD_FILES || dereference_option)
break;
extract_node (char *file_name, int typeflag)
{
bool interdir_made = false;
- mode_t mode = (current_stat_info.stat.st_mode & MODE_RWX
+ mode_t mode = (current_stat_info.stat.st_mode & (MODE_RWX | S_IFBLK | S_IFCHR)
& ~ (0 < same_owner_option ? S_IRWXG | S_IRWXO : 0));
while (mknodat (chdir_fd, file_name, mode, current_stat_info.stat.st_rdev)