/**
 * statstape_print(d, tapename, csv_filename):
 * Print statistics relating to a specific archive in a set.  Return 0 on
 * success, 1 if the tape does not exist, or -1 on other errors.  If
 * ${csv_filename} is not NULL, output will be written in CSV format to that
 * filename.
 */
int
statstape_print(TAPE_S * d, const char * tapename, const char * csv_filename)
{
	struct tapemetadata tmd;
	int rc = -1;	/* Presume error was not !found. */
	FILE * output = stdout;
	int csv = 0;

	/* Should we output to a CSV file? */
	if (csv_filename != NULL)
		csv = 1;

	/* Cache up to 100 bytes of blocks per chunk in the directory. */
	storage_read_cache_limit(d->SR, 100 * chunks_stats_getdirsz(d->C));

	/* Zero archive statistics. */
	chunks_stats_zeroarchive(d->C);

	/* Read the tape metadata. */
	switch (multitape_metadata_get_byname(d->SR, d->C, &tmd, tapename, 0)) {
	case 0:
		break;
	case 1:
		rc = 1;
		/* FALLTHROUGH */
	default:
		goto err0;
	}

	if (multitape_chunkiter_tmd(d->SR, d->C, &tmd,
	    callback_print, d->C, 0))
		goto err2;

	/* Free parsed metadata. */
	multitape_metadata_free(&tmd);

	/* Open CSV output file, if requested. */
	if (csv && (output = fopen(csv_filename, "a")) == NULL)
		goto err0;

	/* Print the statistics. */
	if (chunks_stats_printarchive(output, d->C, tapename, csv))
		goto err1;

	/* Close CSV output file. */
	if (csv && fclose(output))
		goto err0;

	/* Success! */
	return (0);

err2:
	multitape_metadata_free(&tmd);
err1:
	if (output != stdout)
		fclose(output);
err0:
	/* Failure! */
	return (rc);
}
Esempio n. 2
0
/**
 * statstape_print(d, tapename):
 * Print statistics relating to a specific archive in a set.
 */
int
statstape_print(TAPE_S * d, const char * tapename)
{
	struct tapemetadata tmd;

	/* Cache up to 100 bytes of blocks per chunk in the directory. */
	storage_read_cache_limit(d->SR, 100 * chunks_stats_getdirsz(d->C));

	/* Zero archive statistics. */
	chunks_stats_zeroarchive(d->C);

	/* Read the tape metadata. */
	if (multitape_metadata_get_byname(d->SR, d->C, &tmd, tapename, 0))
		goto err0;

	if (multitape_chunkiter_tmd(d->SR, d->C, &tmd,
	    callback_print, d->C, 0))
		goto err1;

	/* Free parsed metadata. */
	multitape_metadata_free(&tmd);

	/* Print the statistics. */
	if (chunks_stats_printarchive(stdout, d->C, tapename))
		goto err0;

	/* Success! */
	return (0);

err1:
	multitape_metadata_free(&tmd);
err0:
	/* Failure! */
	return (-1);
}
Esempio n. 3
0
/**
 * statstape_printall(d):
 * Print statistics relating to each of the archives in a set.
 */
int
statstape_printall(TAPE_S * d)
{
	struct tapemetadata tmd;
	uint8_t * flist;
	size_t nfiles;
	size_t file;

	/* Get a list of the metadata files. */
	if (storage_directory_read(d->machinenum, 'm', 0, &flist, &nfiles))
		goto err0;

	/* Cache up to 100 bytes of blocks per chunk in the directory. */
	storage_read_cache_limit(d->SR, 100 * chunks_stats_getdirsz(d->C));

	/* Iterate through the files. */
	for (file = 0; file < nfiles; file++) {
		/* Zero archive statistics. */
		chunks_stats_zeroarchive(d->C);

		/* Read the tape metadata. */
		if (multitape_metadata_get_byhash(d->SR, d->C, &tmd,
		    &flist[file * 32], 0))
			goto err1;

		/* Compute statistics. */
		if (multitape_chunkiter_tmd(d->SR, d->C, &tmd,
		    callback_print, d->C, 0))
			goto err2;

		/* Print the statistics. */
		if (chunks_stats_printarchive(stdout, d->C, tmd.name))
			goto err2;

		/* Free parsed metadata. */
		multitape_metadata_free(&tmd);
	};

	/* Free the list of files. */
	free(flist);

	/* Success! */
	return (0);

err2:
	multitape_metadata_free(&tmd);
err1:
	free(flist);
err0:
	/* Failure! */
	return (-1);
}
/**
 * statstape_printall(d):
 * Print statistics relating to each of the archives in a set.  If
 * ${csv_filename} is not NULL, output will be written in CSV format to that
 * filename.
 */
int
statstape_printall(TAPE_S * d, const char * csv_filename)
{
	struct tapemetadata tmd;
	uint8_t * flist;
	size_t nfiles;
	size_t file;
	FILE * output = stdout;
	int csv = 0;

	/* Should we output to a CSV file? */
	if (csv_filename != NULL)
		csv = 1;

	/* Open CSV output file, if requested. */
	if (csv && (output = fopen(csv_filename, "a")) == NULL)
		goto err0;

	/* Get a list of the metadata files. */
	if (storage_directory_read(d->machinenum, 'm', 0, &flist, &nfiles))
		goto err1;

	/* Cache up to 100 bytes of blocks per chunk in the directory. */
	storage_read_cache_limit(d->SR, 100 * chunks_stats_getdirsz(d->C));

	/* Iterate through the files. */
	for (file = 0; file < nfiles; file++) {
		/* Zero archive statistics. */
		chunks_stats_zeroarchive(d->C);

		/* Read the tape metadata. */
		if (multitape_metadata_get_byhash(d->SR, d->C, &tmd,
		    &flist[file * 32], 0))
			goto err2;

		/* Compute statistics. */
		if (multitape_chunkiter_tmd(d->SR, d->C, &tmd,
		    callback_print, d->C, 0))
			goto err3;

		/* Print the statistics. */
		if (chunks_stats_printarchive(output, d->C, tmd.name, csv))
			goto err3;

		/* Free parsed metadata. */
		multitape_metadata_free(&tmd);
	};

	/* Free the list of files. */
	free(flist);

	/* Close CSV output file, if requested. */
	if (csv && fclose(output))
		goto err0;

	/* Success! */
	return (0);

err3:
	multitape_metadata_free(&tmd);
err2:
	free(flist);
err1:
	if (output != stdout)
		fclose(output);
err0:
	/* Failure! */
	return (-1);
}