X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=src%2Fextract.c;h=ff86642673b3a3575e5057e85875b0081287fbad;hb=5b394b2c7eb52752e8ccb0ba36f580c46c6c8baa;hp=8b40c57e34fe4d46f807ca2c97d21773cec6fd64;hpb=9f97e2257e83cb894801cb2ef1a76fbea6842d09;p=chaz%2Ftar diff --git a/src/extract.c b/src/extract.c index 8b40c57..ff86642 100644 --- a/src/extract.c +++ b/src/extract.c @@ -100,7 +100,7 @@ struct saved_dir_info int mode; int atime; int mtime; - struct saved_dir_info *next; + saved_dir_info *next; }; struct saved_dir_info *saved_dir_info_head; @@ -146,10 +146,8 @@ extract_archive() struct saved_dir_info *tmp; /* int end_nulls; */ char **longp; - char *bp; static char *longname; static char *longlink; - int bumplongs; saverec(&head); /* Make sure it sticks around */ userec(head); /* And go past it in the archive */ @@ -176,8 +174,7 @@ extract_archive() * the header record. */ skipcrud = 0; - while (!f_absolute_paths - && '/' == (longname ? longname : head->header.name)[skipcrud]) { + while (!f_absolute_paths && '/' == head->header.name[skipcrud]) { static int warned_once = 0; skipcrud++; /* Force relative path */ @@ -186,9 +183,6 @@ extract_archive() } } - bumplongs = (head->header.linkflag != LF_LONGNAME - && head->header.linkflag != LF_LONGLINK); - switch (head->header.linkflag) { default: @@ -305,10 +299,8 @@ extract_archive() * the size in the open call that creates them. */ if (head->header.linkflag == LF_CONTIG) - fd = open((longname ? longname : head->header.name) - + skipcrud, - openflag | O_CTG, - hstat.st_mode, hstat.st_size); + fd = open(skipcrud+head->header.name, openflag | O_CTG, + hstat.st_mode, hstat.st_size); else #endif { @@ -317,29 +309,21 @@ extract_archive() * On raw V7 we won't let them specify -k (f_keep), but * we just bull ahead and create the files. */ - fd = creat((longname - ? longname - : head->header.name) + skipcrud, - hstat.st_mode); + fd = creat(skipcrud+head->header.name, + hstat.st_mode); #else /* * With 3-arg open(), we can do this up right. */ - fd = open((longname - ? longname - : head->header.name) + skipcrud, - openflag, hstat.st_mode); + fd = open(skipcrud+head->header.name, openflag, + hstat.st_mode); #endif } if (fd < 0) { - if (make_dirs(longname - ? longname - : head->header.name) + skipcrud) + if (make_dirs(skipcrud+head->header.name)) goto again_file; - msg_perror("Could not create file %s", - skipcrud - +(longname ? longname : head->header.name)); + msg_perror("Could not create file %s",skipcrud+head->header.name); if (head->header.isextended) skip_extended_headers(); skip_file((long)hstat.st_size); @@ -364,7 +348,7 @@ extract_archive() bcopy(skipcrud+head->header.name, name, namelen); size = hstat.st_size; extract_sparse_file(fd, &size, hstat.st_size, - longname ? longname : name); + name); } else for (size = hstat.st_size; @@ -375,9 +359,7 @@ extract_archive() numbytes;*/ if(f_multivol) { - save_name=(longname - ? longname - : head->header.name); + save_name=head->header.name; save_totsize=hstat.st_size; save_sizeleft=size; } @@ -423,15 +405,9 @@ extract_archive() * Print it, skip to next file in archive. */ if(check<0) - msg_perror("couldn't write to file %s", - (longname - ? longname - : head->header.name) + skipcrud); + msg_perror("couldn't write to file %s",skipcrud+head->header.name); else - msg("could only write %d of %d bytes to file %s", - written,check,(longname - ? longname - : head->header.name) + skipcrud); + msg("could only write %d of %d bytes to file %s",written,check,skipcrud+head->header.name); skip_file((long)(size - written)); break; /* Still do the close, mod time, chmod, etc */ } @@ -468,10 +444,7 @@ extract_archive() }*/ check = close(fd); if (check < 0) { - msg_perror("Error while closing %s", - (longname - ? longname - : head->header.name) + skipcrud); + msg_perror("Error while closing %s",skipcrud+head->header.name); } @@ -484,15 +457,9 @@ extract_archive() * user; if running as root, we extract as the original owner. */ if (we_are_root || f_do_chown) { - if (chown((longname - ? longname - : head->header.name) + skipcrud, - hstat.st_uid, hstat.st_gid) < 0) { - msg_perror("cannot chown file %s to uid %d gid %d", - (longname - ? longname - : head->header.name) + skipcrud, - hstat.st_uid,hstat.st_gid); + if (chown(skipcrud+head->header.name, hstat.st_uid, + hstat.st_gid) < 0) { + msg_perror("cannot chown file %s to uid %d gid %d",skipcrud+head->header.name,hstat.st_uid,hstat.st_gid); } } @@ -509,11 +476,9 @@ extract_archive() acc_upd_times[0]=hstat.st_atime; else acc_upd_times[0] = now; /* Accessed now */ acc_upd_times[1] = hstat.st_mtime; /* Mod'd */ - if (utime((longname - ? longname - : head->header.name) + skipcrud, - acc_upd_times) < 0) { - msg_perror("couldn't change access and modification times of %s",(longname ? longname : head->header.name) + skipcrud); + if (utime(skipcrud+head->header.name, + acc_upd_times) < 0) { + msg_perror("couldn't change access and modification times of %s",skipcrud+head->header.name); } } /* We do the utime before the chmod because some versions of @@ -535,11 +500,9 @@ extract_archive() */ if ((!f_keep) || (hstat.st_mode & (S_ISUID|S_ISGID|S_ISVTX))) { - if (chmod((longname ? longname : head->header.name) + skipcrud, + if (chmod(skipcrud+head->header.name, notumask & (int)hstat.st_mode) < 0) { - msg_perror("cannot change mode of file %s to %ld", - (longname ? longname : head->header.name) + skipcrud, - notumask & (int)hstat.st_mode); + msg_perror("cannot change mode of file %s to %ld",skipcrud+head->header.name,notumask & (int)hstat.st_mode); } } @@ -551,38 +514,35 @@ extract_archive() { struct stat st1,st2; - check = link (longlink ? longlink : head->header.linkname, - (longname ? longname : head->header.name) + skipcrud); + check = link (head->header.linkname, + skipcrud+head->header.name); if (check == 0) break; - if (make_dirs((longname ? longname : head->header.name) + skipcrud)) + if (make_dirs(skipcrud+head->header.name)) goto again_link; if(f_gnudump && errno==EEXIST) break; - if(stat(longlink ? longlink : head->header.linkname, &st1) == 0 - && stat((longname ? longname : head->header.name) + skipcrud, &st2)==0 + if( stat(head->header.linkname, &st1) == 0 + && stat(skipcrud+head->header.name, &st2)==0 && st1.st_dev==st2.st_dev && st1.st_ino==st2.st_ino) break; msg_perror("Could not link %s to %s", - (longname ? longname : head->header.name) + skipcrud, - longlink ? longlink : longlink, - head->header.linkname); + skipcrud+head->header.name,head->header.linkname); } break; #ifdef S_ISLNK case LF_SYMLINK: again_symlink: - check = symlink(longlink ? longlink : head->header.linkname, - (longname ? longname : head->header.name) + skipcrud); + check = symlink(head->header.linkname, + skipcrud+head->header.name); /* FIXME, don't worry uid, gid, etc... */ if (check == 0) break; - if (make_dirs((longname ? longname : head->header.name) + skipcrud) + if (make_dirs(skipcrud+head->header.name)) goto again_symlink; - msg_perror("Could not create symlink to %s", - longlink ? longlink : head->header.linkname); + msg_perror("Could not create symlink to %s",head->header.linkname); break; #endif @@ -598,16 +558,12 @@ extract_archive() #endif #if defined(S_IFCHR) || defined(S_IFBLK) make_node: - check = mknod((longname ? longname: head->header.name) + skipcrud, + check = mknod(skipcrud+head->header.name, (int) hstat.st_mode, (int) hstat.st_rdev); if (check != 0) { - if (make_dirs((longname - ? longname - : head->header.name) + skipcrud)) + if (make_dirs(skipcrud+head->header.name)) goto make_node; - msg_perror("Could not make %s", - (longname ? longname : head->header.name) - + skipcrud); + msg_perror("Could not make %s",skipcrud+head->header.name); break; }; goto set_filestat; @@ -617,29 +573,24 @@ extract_archive() /* If local system doesn't support FIFOs, use default case */ case LF_FIFO: make_fifo: - check = mkfifo((longname ? longname : head->header.name) + skipcrud, + check = mkfifo(skipcrud+head->header.name, (int) hstat.st_mode); if (check != 0) { - if (make_dirs((longname ? longname : head->header.name) + skipcrud)) - goto make_fifo; - msg_perror("Could not make %s", - (longname ? longname : head->header.name) + skipcrud); - break; + if (make_dirs(skipcrud+head->header.name)) + goto make_fifo; + msg_perror("Could not make %s",skipcrud+head->header.name); + break; }; - goto set_filestat; + goto set_filestat; #endif case LF_DIR: case LF_DUMPDIR: - namelen = strlen(longname ? longname : head->header.name) - + skipcrud - 1; + namelen = strlen(skipcrud+head->header.name)-1; really_dir: /* Check for trailing /, and zap as many as we find. */ - while (namelen - && (longname - ? longname - : head->header.name)[skipcrud+namelen] == '/') - (longname ? longname : head->header.name)[skipcrud+namelen--] = '\0'; + while (namelen && head->header.name[skipcrud+namelen] == '/') + head->header.name[skipcrud+namelen--] = '\0'; if(f_gnudump) { /* Read the entry and delete files that aren't listed in the archive */ gnu_restore(skipcrud); @@ -649,23 +600,23 @@ extract_archive() again_dir: - check = mkdir(skipcrud+(longname ? longname : head->header.name), + check = mkdir(skipcrud+head->header.name, (we_are_root ? 0 : 0300) | (int)hstat.st_mode); if (check != 0) { struct stat st1; - if (make_dirs(skipcrud+(longname ? longname : head->header.name))) + if (make_dirs(skipcrud+head->header.name)) goto again_dir; /* If we're trying to create '.', let it be. */ - if ((longname ? longname : head->header.name)[skipcrud+namelen] == '.' && + if (head->header.name[skipcrud+namelen] == '.' && (namelen==0 || - (longname ? longname : head->header.name)[skipcrud+namelen-1]=='/')) + head->header.name[skipcrud+namelen-1]=='/')) goto check_perms; if( errno==EEXIST - && stat(skipcrud+(longname ? longname : head->header.name),&st1)==0 + && stat(skipcrud+head->header.name,&st1)==0 && (S_ISDIR(st1.st_mode))) break; - msg_perror("Could not create directory %s",skipcrud+(longname ? longname : head->header.name)); + msg_perror("Could not create directory %s",skipcrud+head->header.name); break; } @@ -673,14 +624,14 @@ extract_archive() if (!we_are_root && 0300 != (0300 & (int) hstat.st_mode)) { hstat.st_mode |= 0300; msg("Added write and execute permission to directory %s", - skipcrud+(longname ? longname : head->header.name)); + skipcrud+head->header.name); } if (f_modified) goto set_filestat; tmp = malloc (sizeof (struct saved_dir_info)); - tmp->path = malloc (strlen (skipcrud + (longname ? longname : head->header.name)) + 1); - strcpy (tmp->path, skipcrud + (longname ? longname : head->header.name)); + tmp->path = malloc (strlen (skipcrud + head->header.name) + 1); + strcpy (tmp->path, skipcrud + head->header.name); tmp->mode = hstat.st_mode; tmp->atime = hstat.st_atime; tmp->mtime = hstat.st_mtime; @@ -688,7 +639,7 @@ extract_archive() saved_dir_info_head = tmp; case LF_VOLHDR: if(f_verbose) { - printf("Reading %s\n",longname ? longname head->header.name); + printf("Reading %s\n",head->header.name); } break; @@ -711,33 +662,19 @@ extract_archive() if (*longp) free (*longp); - bp = *longp = ck_malloc (hstat.st_size); - + *longp = ck_malloc (hstat.st_size); + + /* This loop is copied from the extract_file label above; + as a result, some of the variable names (like `written') + might be confusing. */ for (size = hstat.st_size; size > 0; size -= written) { - data = findrec ()->charptr; - if (data == NULL) - { - msg ("Unexpected EOF on archive file"); - break; - } - written = endofrecs () ->charptr - data; - if (written > size) - written = size; - bcopy (data, bp, written); - bp += written; - userec ((union record *) (data + written - 1)); - } - } - - if (bumplongs) - { - longname = 0; - longlink = 0; - } + + + } /* We don't need to save it any longer. */ saverec((union record **) 0); /* Unsave it */