コード例 #1
0
ファイル: cpio.c プロジェクト: marccodes/lfl
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);
}
コード例 #2
0
ファイル: hsplit.c プロジェクト: jkleint/paralleltext
/**
 * 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;
}
コード例 #3
0
ファイル: cpio.c プロジェクト: marccodes/lfl
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);
}