summaryrefslogtreecommitdiff
path: root/tar/util.c
diff options
context:
space:
mode:
authorTim Kientzle <kientzle@gmail.com>2009-02-21 01:13:58 -0500
committerTim Kientzle <kientzle@gmail.com>2009-02-21 01:13:58 -0500
commita6712bb4fb8c916dc051bc4a3aa56cf6f427cf06 (patch)
tree254e69c7627ae4d85d77d9d1041c05bca28630b5 /tar/util.c
parentdecf07064cbfc4235aeb8e94a1fc0e37893ef1a2 (diff)
downloadlibarchive-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.c45
1 files changed, 34 insertions, 11 deletions
diff --git a/tar/util.c b/tar/util.c
index e251bc18..8e5db331 100644
--- a/tar/util.c
+++ b/tar/util.c
@@ -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. */