diff options
author | Tim Kientzle <kientzle@gmail.com> | 2009-02-21 01:13:58 -0500 |
---|---|---|
committer | Tim Kientzle <kientzle@gmail.com> | 2009-02-21 01:13:58 -0500 |
commit | a6712bb4fb8c916dc051bc4a3aa56cf6f427cf06 (patch) | |
tree | 254e69c7627ae4d85d77d9d1041c05bca28630b5 /tar/util.c | |
parent | decf07064cbfc4235aeb8e94a1fc0e37893ef1a2 (diff) | |
download | libarchive-a6712bb4fb8c916dc051bc4a3aa56cf6f427cf06.tar.gz |
Partial fix for Issue 5: If -P is not specified, strip Windows drive
letters as well as leading '/' characters.
SVN-Revision: 682
Diffstat (limited to 'tar/util.c')
-rw-r--r-- | tar/util.c | 45 |
1 files changed, 34 insertions, 11 deletions
@@ -517,18 +517,41 @@ edit_pathname(struct bsdtar *bsdtar, struct archive_entry *entry) while (name[0] == '/' && name[1] == '/') name++; - /* Strip leading '/' unless user has asked us not to. */ - if (name[0] == '/' && !bsdtar->option_absolute_paths) { - /* Generate a warning the first time this happens. */ - if (!bsdtar->warned_lead_slash) { - bsdtar_warnc(bsdtar, 0, - "Removing leading '/' from member names"); - bsdtar->warned_lead_slash = 1; + /* By default, don't write or restore absolute pathnames. */ + if (!bsdtar->option_absolute_paths) { + /* Strip Windows drive letters. */ + if (((name[0] >= 'A' && name[0] <= 'Z') + || (name[0] >= 'a' && name[0] <= 'z')) + && name[1] == ':' + && (name[2] == '/' || name[2] == '\\')) + { + /* Generate a warning the first time this happens. */ + if (!bsdtar->warned_lead_slash) { + bsdtar_warnc(bsdtar, 0, + "Removing leading drive letter from member names"); + bsdtar->warned_lead_slash = 1; + } + name += 3; + while (*name == '/' || *name == '\\') + ++name; + /* Special case: Stripping everything yields ".". */ + if (*name == '\0') + name = "."; + } + + /* Strip leading '/'. */ + if (name[0] == '/') { + /* Generate a warning the first time this happens. */ + if (!bsdtar->warned_lead_slash) { + bsdtar_warnc(bsdtar, 0, + "Removing leading '/' from member names"); + bsdtar->warned_lead_slash = 1; + } + name++; + /* Special case: Stripping everything yields ".". */ + if (*name == '\0') + name = "."; } - name++; - /* Special case: Stripping leading '/' from "/" yields ".". */ - if (*name == '\0') - name = "."; } /* Safely replace name in archive_entry. */ |