void print_for_mkdir (char *pathname, int length, int mode) { char modes[11]; char *name; if (verbose_option > 1) { /* File type and modes. */ modes[0] = 'd'; decode_mode ((unsigned) mode, modes + 1); if (block_number_option) fprintf (stdlis, _("block %10ld: "), current_block_ordinal ()); name = quote_copy_string (pathname); if (name) { fprintf (stdlis, "%s %*s %.*s\n", modes, ugswidth + DATEWIDTH, _("Creating directory:"), length, name); free (name); } else fprintf (stdlis, "%s %*s %.*s\n", modes, ugswidth + DATEWIDTH, _("Creating directory:"), length, pathname); } }
void print_for_mkdir (char *pathname, int length, mode_t mode) { char modes[11]; char *name; if (verbose_option_count > 1) { /* File type and modes. */ modes[0] = 'd'; decode_mode (mode, modes + 1); if (checkpoint_option) flush_progress_dots (); if (block_number_option) fprintf (stdlis, _("block %10lu: "), (unsigned long) current_block_ordinal ()); if (name = quote_copy_string (pathname), name) { fprintf (stdlis, "%s %*s %.*s\n", modes, ugswidth + DATEWIDTH, _("Creating directory:"), length, name); free (name); } else fprintf (stdlis, "%s %*s %.*s\n", modes, ugswidth + DATEWIDTH, _("Creating directory:"), length, pathname); } }
off_t shfs_arch_seek_archive(shfs_arch_t *arch, off_t size) { off_t start = current_block_ordinal (); off_t offset; off_t nrec, nblk; off_t skipped = (BLOCKING_FACTOR - (current_block - record_start)) * BLOCKSIZE; if (size <= skipped) return 0; /* Compute number of records to skip */ nrec = (size - skipped) / arch->record_size; if (nrec == 0) return 0; offset = arch_buffer_seek(arch->archive, (nrec * arch->record_size), SEEK_CUR); if (offset < 0) return offset; if (offset % arch->record_size) return (0); /* Convert to number of records */ offset /= BLOCKSIZE; /* Compute number of skipped blocks */ nblk = offset - start; /* Update buffering info */ arch->records_read += nblk / BLOCKING_FACTOR; record_start_block = offset - BLOCKING_FACTOR; current_block = record_end; return nblk; }
void print_header (void) { char modes[11]; char *timestamp; char uform[11], gform[11]; /* these hold formatted ints */ char *user, *group; char size[24]; /* holds a formatted long or maj, min */ time_t longie; /* to make ctime() call portable */ int pad; char *name; if (block_number_option) fprintf (stdlis, _("block %10ld: "), current_block_ordinal ()); if (verbose_option <= 1) { /* Just the fax, mam. */ char *quoted_name = quote_copy_string (current_file_name); if (quoted_name) { fprintf (stdlis, "%s\n", quoted_name); free (quoted_name); } else fprintf (stdlis, "%s\n", current_file_name); } else { /* File type and modes. */ modes[0] = '?'; switch (current_header->header.typeflag) { case GNUTYPE_VOLHDR: modes[0] = 'V'; break; case GNUTYPE_MULTIVOL: modes[0] = 'M'; break; case GNUTYPE_NAMES: modes[0] = 'N'; break; case GNUTYPE_LONGNAME: case GNUTYPE_LONGLINK: ERROR ((0, 0, _("Visible longname error"))); break; case GNUTYPE_SPARSE: case REGTYPE: case AREGTYPE: case LNKTYPE: modes[0] = '-'; if (current_file_name[strlen (current_file_name) - 1] == '/') modes[0] = 'd'; break; case GNUTYPE_DUMPDIR: modes[0] = 'd'; break; case DIRTYPE: modes[0] = 'd'; break; case SYMTYPE: modes[0] = 'l'; break; case BLKTYPE: modes[0] = 'b'; break; case CHRTYPE: modes[0] = 'c'; break; case FIFOTYPE: modes[0] = 'p'; break; case CONTTYPE: modes[0] = 'C'; break; } decode_mode ((unsigned) current_stat.st_mode, modes + 1); /* Timestamp. */ longie = current_stat.st_mtime; #if USE_OLD_CTIME timestamp = ctime (&longie); timestamp[16] = '\0'; timestamp[24] = '\0'; #else timestamp = isotime (&longie); timestamp[16] = '\0'; #endif /* User and group names. */ if (*current_header->header.uname && current_format != V7_FORMAT) user = current_header->header.uname; else { user = uform; sprintf (uform, "%ld", from_oct (8, current_header->header.uid)); } if (*current_header->header.gname && current_format != V7_FORMAT) group = current_header->header.gname; else { group = gform; sprintf (gform, "%ld", from_oct (8, current_header->header.gid)); } /* Format the file size or major/minor device numbers. */ switch (current_header->header.typeflag) { #if defined(S_IFBLK) || defined(S_IFCHR) case CHRTYPE: case BLKTYPE: sprintf (size, "%d,%d", major (current_stat.st_rdev), minor (current_stat.st_rdev)); break; #endif case GNUTYPE_SPARSE: sprintf (size, "%lld", llfrom_oct (sizeof current_header->oldgnu_header.realsize, current_header->oldgnu_header.realsize)); break; default: sprintf (size, "%lld", (long long) current_stat.st_size); } /* Figure out padding and print the whole line. */ pad = strlen (user) + strlen (group) + strlen (size) + 1; if (pad > ugswidth) ugswidth = pad; #if USE_OLD_CTIME fprintf (stdlis, "%s %s/%s %*s%s %s %s", modes, user, group, ugswidth - pad, "", size, timestamp + 4, timestamp + 20); #else fprintf (stdlis, "%s %s/%s %*s%s %s", modes, user, group, ugswidth - pad, "", size, timestamp); #endif name = quote_copy_string (current_file_name); if (name) { fprintf (stdlis, " %s", name); free (name); } else fprintf (stdlis, " %s", current_file_name); switch (current_header->header.typeflag) { case SYMTYPE: name = quote_copy_string (current_link_name); if (name) { fprintf (stdlis, " -> %s\n", name); free (name); } else fprintf (stdlis, " -> %s\n", current_link_name); break; case LNKTYPE: name = quote_copy_string (current_link_name); if (name) { fprintf (stdlis, _(" link to %s\n"), name); free (name); } else fprintf (stdlis, _(" link to %s\n"), current_link_name); break; default: fprintf (stdlis, _(" unknown file type `%c'\n"), current_header->header.typeflag); break; case AREGTYPE: case REGTYPE: case GNUTYPE_SPARSE: case CHRTYPE: case BLKTYPE: case DIRTYPE: case FIFOTYPE: case CONTTYPE: case GNUTYPE_DUMPDIR: putc ('\n', stdlis); break; case GNUTYPE_VOLHDR: fprintf (stdlis, _("--Volume Header--\n")); break; case GNUTYPE_MULTIVOL: fprintf (stdlis, _("--Continued at byte %ld--\n"), from_oct (1 + 12, current_header->oldgnu_header.offset)); break; case GNUTYPE_NAMES: fprintf (stdlis, _("--Mangled file names--\n")); break; } } fflush (stdlis); }
void read_and (void (*do_something) ()) { enum read_header status = HEADER_STILL_UNREAD; enum read_header prev_status; char save_typeflag; name_gather (); open_archive (ACCESS_READ); while (1) { prev_status = status; status = read_header (); switch (status) { case HEADER_STILL_UNREAD: abort (); case HEADER_SUCCESS: /* Valid header. We should decode next field (mode) first. Ensure incoming names are null terminated. */ /* FIXME: This is a quick kludge before 1.12 goes out. */ current_stat.st_mtime = from_oct (1 + 12, current_header->header.mtime); if (!name_match (current_file_name) || current_stat.st_mtime < newer_mtime_option || (exclude_option && check_exclude (current_file_name))) { int isextended = 0; if (current_header->header.typeflag == GNUTYPE_VOLHDR || current_header->header.typeflag == GNUTYPE_MULTIVOL || current_header->header.typeflag == GNUTYPE_NAMES) { (*do_something) (); continue; } if (show_omitted_dirs_option && current_header->header.typeflag == DIRTYPE) WARN ((0, 0, _("Omitting %s"), current_file_name)); /* Skip past it in the archive. */ if (current_header->oldgnu_header.isextended) isextended = 1; save_typeflag = current_header->header.typeflag; set_next_block_after (current_header); if (isextended) { #if 0 union block *exhdr; while (1) { exhdr = find_next_block (); if (!exhdr->sparse_header.isextended) { set_next_block_after (exhdr); break; } } set_next_block_after (exhdr); #endif skip_extended_headers (); } /* Skip to the next header on the archive. */ if (save_typeflag != DIRTYPE) skip_file ((long long) current_stat.st_size); continue; } (*do_something) (); continue; case HEADER_ZERO_BLOCK: if (block_number_option) fprintf (stdlis, _("block %10ld: ** Block of NULs **\n"), current_block_ordinal ()); set_next_block_after (current_header); status = prev_status; if (ignore_zeros_option) continue; break; case HEADER_END_OF_FILE: if (block_number_option) fprintf (stdlis, _("block %10ld: ** End of File **\n"), current_block_ordinal ()); break; case HEADER_FAILURE: /* If the previous header was good, tell them that we are skipping bad ones. */ set_next_block_after (current_header); switch (prev_status) { case HEADER_STILL_UNREAD: WARN ((0, 0, _("Could not extract file(s); file might not be a tar archive"))); /* Fall through. */ case HEADER_ZERO_BLOCK: case HEADER_SUCCESS: WARN ((0, 0, _("Skipping to next file header"))); break; case HEADER_END_OF_FILE: case HEADER_FAILURE: /* We are in the middle of a cascade of errors. */ break; } continue; } break; } apply_delayed_set_stat (); close_archive (); names_notfound (); /* print names not found */ }
void print_header (struct tar_entry *entry) { char modes[11]; char *timestamp; char uform[11], gform[11]; /* these hold formatted ints */ char *user, *group; char size[24]; /* holds a formatted long or maj, min */ time_t longie; /* to make ctime() call portable */ int pad; char *name; if (checkpoint_option) flush_progress_dots (); if (block_number_option) fprintf (stdlis, _("block %10lu: "), (unsigned long) current_block_ordinal ()); if (verbose_option_count <= 1) if (null_option) { fputs (entry->name, stdlis); putc ('\0', stdlis); } else { char *quoted_name = quote_copy_string (entry->name); if (quoted_name) { fputs (quoted_name, stdlis); free (quoted_name); } else fputs (entry->name, stdlis); putc ('\n', stdlis); } else { /* File type and modes. */ modes[0] = '?'; switch (entry->block->header.typeflag) { case GNUTAR_VOLHDR: modes[0] = 'V'; break; case GNUTAR_MULTIVOL: modes[0] = 'M'; break; case GNUTAR_NAMES: modes[0] = 'N'; break; case GNUTAR_LONGNAME: case GNUTAR_LONGLINK: ERROR ((0, 0, _("Long name has no introducing header"))); break; case GNUTAR_SPARSE: case REGTYPE: case AREGTYPE: case LNKTYPE: modes[0] = '-'; if (entry->name[strlen (entry->name) - 1] == '/') modes[0] = 'd'; break; case GNUTAR_DUMPDIR: modes[0] = 'd'; break; case DIRTYPE: modes[0] = 'd'; break; case SYMTYPE: modes[0] = 'l'; break; case BLKTYPE: modes[0] = 'b'; break; case CHRTYPE: modes[0] = 'c'; break; case FIFOTYPE: modes[0] = 'p'; break; case CONTTYPE: modes[0] = 'C'; break; } decode_mode (entry->stat.st_mode, modes + 1); /* Timestamp. */ longie = entry->stat.st_mtime; #if USE_OLD_CTIME timestamp = ctime (&longie); timestamp[16] = '\0'; timestamp[24] = '\0'; #else timestamp = isotime (&longie); timestamp[16] = '\0'; #endif /* User and group names. */ if (*entry->block->header.uname && entry->format != V7_FORMAT) user = entry->block->header.uname; else { user = uform; sprintf (uform, "%lu", (unsigned long) get_header_uid (entry->block)); } if (*entry->block->header.gname && entry->format != V7_FORMAT) group = entry->block->header.gname; else { group = gform; sprintf (gform, "%ld", (unsigned long) get_header_gid (entry->block)); } /* Format the file size or major/minor device numbers. */ switch (entry->block->header.typeflag) { #if defined(S_IFBLK) || defined(S_IFCHR) case CHRTYPE: case BLKTYPE: sprintf (size, "%lu,%lu", (unsigned long) major (entry->stat.st_rdev), (unsigned long) minor (entry->stat.st_rdev)); break; #endif case GNUTAR_SPARSE: sprintf (size, "%lu", (unsigned long) get_header_realsize (entry->block)); break; default: sprintf (size, "%lu", (unsigned long) entry->stat.st_size); } /* Figure out padding and print the whole line. */ pad = strlen (user) + strlen (group) + strlen (size) + 1; if (pad > ugswidth) ugswidth = pad; #if USE_OLD_CTIME fprintf (stdlis, "%s %s/%s %*s%s %s %s", modes, user, group, ugswidth - pad, "", size, timestamp + 4, timestamp + 20); #else fprintf (stdlis, "%s %s/%s %*s%s %s", modes, user, group, ugswidth - pad, "", size, timestamp); #endif name = quote_copy_string (entry->name); if (name) { fprintf (stdlis, " %s", name); free (name); } else fprintf (stdlis, " %s", entry->name); switch (entry->block->header.typeflag) { case SYMTYPE: name = quote_copy_string (entry->linkname); if (name) { fprintf (stdlis, " -> %s\n", name); free (name); } else fprintf (stdlis, " -> %s\n", entry->linkname); break; case LNKTYPE: name = quote_copy_string (entry->linkname); if (name) { fprintf (stdlis, _(" link to %s\n"), name); free (name); } else fprintf (stdlis, _(" link to %s\n"), entry->linkname); break; default: fprintf (stdlis, _(" unknown file type `%c'\n"), entry->block->header.typeflag); break; case AREGTYPE: case REGTYPE: case GNUTAR_SPARSE: case CHRTYPE: case BLKTYPE: case DIRTYPE: case FIFOTYPE: case CONTTYPE: case GNUTAR_DUMPDIR: putc ('\n', stdlis); break; case GNUTAR_VOLHDR: fprintf (stdlis, _("--Volume Header--\n")); break; case GNUTAR_MULTIVOL: fprintf (stdlis, _("--Continued at byte %lu--\n"), (unsigned long) get_header_offset (entry->block)); break; case GNUTAR_NAMES: fprintf (stdlis, _("--Mangled file names--\n")); break; } } fflush (stdlis); }