tar won't restore permissions

Ivan Dobrianov id11@cornell.edu
Mon Apr 8 18:09:00 GMT 2002


Ok, I posted this question more than a year ago ... and the problem is 
still present in the latest Cygwin builds:

tar xpvf myArchive.tar

will not restore read-only permissions, i.e. files with r-- perms will 
get rw- permission when restored!!! I am seeing this on Win NT, 2000, 
and XP on FAT32 and NTFS with and without setting $CYGWIN to ntea or 
ntfs. This used to work right in the days of B20.

I. To see the bug:
1) copy the follwing text to a file called "demo"
-----------------------------------------------------
echo " "

[ -d tar_bug ] || mkdir tar_bug
cd tar_bug
rm -rf *

cat > myFile<<EOF
qwerty
EOF

chmod 444 myFile
ls -l myFile

tar cvf myArchive.tar myFile
tar tvf myArchive.tar

sleep 2

mkdir untarred
cd untarred
tar xpvf ../myArchive.tar -U

ls -l
--------------------------------------------------------
2) Do:
sh demo

3) I get the follwing output:
--------------------------------------------------------
-r--r--r--   1 administ None            8 Jan 20 11:55 myFile
myFile
-r--r--r-- administrator/None 8 2001-01-20 11:55:14 myFile
myFile
total 0
-rw-r--r--   1 administ None            8 Jan 20 11:55 myFile
--------------------------------------------------------

*** Note that myFile is writable in the end! ***

NOTE: Yes, if you "CYGWIN=ntea" under NTFS, the problem _SEEMS_ to get 
fixed, but upon inspection, with say Explorer, it turns out the file is 
still writable - the problem is just being masked!

II. The fix.

Well, I have a tweaked version of tar-1.13.19-1 which seems to work 
fine. Here is the hacky patch of extract.c that does the trick
--------------------------------------------------------
~/tar_fix > diff extract.c_DUP_00 extract.c
125a126,127
 >   /* printf ("File: %s\n", file_name); */
 >
135c137,139
<       if (permstatus == ARCHIVED_PERMSTATUS
---
 >       /* Ivan says: for whatever reason the caller THINKS the mode is ok,
 >          but it is not, at least under Win NT w/ cygwin */
 >       if (0 && permstatus == ARCHIVED_PERMSTATUS
158a163,164
 >
 >   /* printf ("File: %s -> mode: %o\n", file_name, mode); */
~/tar_fix >
--------------------------------------------------------

I don't know if this is the "right" way to fix the problem - probably it 
is not!  I'll leave it to more knowledgeable people to do the real thing 
  ... or point the workaround that has been eluding me for that past 
year and more :-)


--
Unsubscribe info:      http://cygwin.com/ml/#unsubscribe-simple
Bug reporting:         http://cygwin.com/bugs.html
Documentation:         http://cygwin.com/docs.html
FAQ:                   http://cygwin.com/faq/



More information about the Cygwin mailing list