static void mode_pass(struct cpio *cpio, const char *destdir) { unsigned long blocks; struct line_reader *lr; const char *p; int r; /* Ensure target dir has a trailing '/' to simplify path surgery. */ cpio->destdir = malloc(strlen(destdir) + 8); strcpy(cpio->destdir, destdir); if (destdir[strlen(destdir) - 1] != '/') strcat(cpio->destdir, "/"); cpio->archive = archive_write_disk_new(); if (cpio->archive == NULL) cpio_errc(1, 0, "Failed to allocate archive object"); r = archive_write_disk_set_options(cpio->archive, cpio->extract_flags); if (r != ARCHIVE_OK) cpio_errc(1, 0, archive_error_string(cpio->archive)); cpio->linkresolver = archive_entry_linkresolver_new(); archive_write_disk_set_standard_lookup(cpio->archive); lr = process_lines_init("-", cpio->line_separator); while ((p = process_lines_next(lr)) != NULL) file_to_archive(cpio, p); process_lines_free(lr); archive_entry_linkresolver_free(cpio->linkresolver); r = archive_write_close(cpio->archive); if (r != ARCHIVE_OK) cpio_errc(1, 0, archive_error_string(cpio->archive)); if (!cpio->quiet) { blocks = (archive_position_uncompressed(cpio->archive) + 511) / 512; fprintf(stderr, "%lu %s\n", blocks, blocks == 1 ? "block" : "blocks"); } archive_write_finish(cpio->archive); }
/** * Hash lines from stdin to files given on command line. */ int main(int argc, char * argv[]) { int append = 0; int first_filename_arg = 1; process_lines_context ctx; struct fileinfo fileinfo; if (argc >= 2 && (strcmp(argv[1], "--help") == 0 || strcmp(argv[1], "-h") == 0)) { printusage(); exit(0); } if (argc > 1 && ((strcmp(argv[1], "-a") == 0) || (strcmp(argv[1], "--append") == 0))) { append = 1; first_filename_arg = 2; } fileinfo.numfiles = argc - first_filename_arg; if (fileinfo.numfiles == 0 && append) { fprintf(stderr, "Can only use --append with files."); exit(1); } fileinfo.files = calloc(fileinfo.numfiles, sizeof (FILE *)); if (fileinfo.numfiles > 0 && fileinfo.files == NULL) { perror("hsplit: Error allocating memory"); exit(1); } /* Open files. */ for (unsigned int f = 0 ; f < fileinfo.numfiles ; f++) { const char * filename = argv[first_filename_arg + f]; fileinfo.files[f] = fopen(filename, append ? "a" : "w"); if (fileinfo.files[f] == NULL) { fprintf(stderr, "hsplit: error opening \"%s\"", filename); perror(""); exit(1); } } if (process_lines_init(&ctx, fileno(stdin), split_lines_to_files, &fileinfo) != 0) { perror("hsplit"); exit(1); } /* Loop: read a line, hash to get file number, write. */ // TODO: If our hash function had an incremental interface, we could probably do this faster, without buffering. int result; do { result = process_lines(&ctx); } while (result == 0); if (result > 0) { perror("hsplit"); exit(1); } /* Close files and clean up. */ process_lines_cleanup(&ctx); for (unsigned int f = 0 ; f < fileinfo.numfiles ; f++) { if (fclose(fileinfo.files[f]) != 0) { perror("hsplit: Error closing file"); exit(1); } } free(fileinfo.files); return 0; }
static void mode_out(struct cpio *cpio) { unsigned long blocks; struct archive_entry *entry, *spare; struct line_reader *lr; const char *p; int r; if (cpio->option_append) cpio_errc(1, 0, "Append mode not yet supported."); cpio->archive = archive_write_new(); if (cpio->archive == NULL) cpio_errc(1, 0, "Failed to allocate archive object"); switch (cpio->compress) { #ifdef HAVE_BZLIB_H case 'j': case 'y': archive_write_set_compression_bzip2(cpio->archive); break; #endif #ifdef HAVE_ZLIB_H case 'z': archive_write_set_compression_gzip(cpio->archive); break; #endif case 'Z': archive_write_set_compression_compress(cpio->archive); break; default: archive_write_set_compression_none(cpio->archive); break; } r = archive_write_set_format_by_name(cpio->archive, cpio->format); if (r != ARCHIVE_OK) cpio_errc(1, 0, archive_error_string(cpio->archive)); archive_write_set_bytes_per_block(cpio->archive, cpio->bytes_per_block); cpio->linkresolver = archive_entry_linkresolver_new(); archive_entry_linkresolver_set_strategy(cpio->linkresolver, archive_format(cpio->archive)); r = archive_write_open_file(cpio->archive, cpio->filename); if (r != ARCHIVE_OK) cpio_errc(1, 0, archive_error_string(cpio->archive)); lr = process_lines_init("-", cpio->line_separator); while ((p = process_lines_next(lr)) != NULL) file_to_archive(cpio, p); process_lines_free(lr); /* * The hardlink detection may have queued up a couple of entries * that can now be flushed. */ entry = NULL; archive_entry_linkify(cpio->linkresolver, &entry, &spare); while (entry != NULL) { entry_to_archive(cpio, entry); archive_entry_free(entry); entry = NULL; archive_entry_linkify(cpio->linkresolver, &entry, &spare); } r = archive_write_close(cpio->archive); if (r != ARCHIVE_OK) cpio_errc(1, 0, archive_error_string(cpio->archive)); if (!cpio->quiet) { blocks = (archive_position_uncompressed(cpio->archive) + 511) / 512; fprintf(stderr, "%lu %s\n", blocks, blocks == 1 ? "block" : "blocks"); } archive_write_finish(cpio->archive); }