Exemple #1
0
uint8_t ssc_erase(struct scsi_cmd *cmd)
{
	struct priv_lu_ssc *lu_priv;
	uint8_t *sam_stat;

	lu_priv = cmd->lu->lu_private;
	sam_stat = &cmd->dbuf_p->sam_stat;

	MHVTL_DBG(1, "Erasing (%ld) **", (long)cmd->dbuf_p->serialNo);

	current_state = MHVTL_STATE_ERASE;

	if (!lu_priv->pm->check_restrictions(cmd))
		return SAM_STAT_CHECK_CONDITION;

	if (c_pos->blk_number != 0) {
		MHVTL_LOG("Not at BOT.. Can't erase unless at BOT");
		mkSenseBuf(NOT_READY, E_INVALID_FIELD_IN_CDB, sam_stat);
		return SAM_STAT_CHECK_CONDITION;
	}

	if (OK_to_write)
		format_tape(sam_stat);
	else {
		MHVTL_LOG("Attempt to erase Write-protected media");
		mkSenseBuf(NOT_READY, E_MEDIUM_OVERWRITE_ATTEMPTED, sam_stat);
		return SAM_STAT_CHECK_CONDITION;
	}
	return SAM_STAT_GOOD;
}
Exemple #2
0
uint8_t ssc_format_media(struct scsi_cmd *cmd)
{
	struct lu_phy_attr *lu;
	struct priv_lu_ssc *lu_priv;

	lu = cmd->lu;
	lu_priv = lu->lu_private;

	MHVTL_DBG(1, "Format Medium (%ld) **", (long)cmd->dbuf_p->serialNo);

	if (!lu_priv->pm->check_restrictions(cmd))
		return SAM_STAT_CHECK_CONDITION;

	if (c_pos->blk_number != 0) {
		MHVTL_DBG(2, "Not at beginning **");
		mkSenseBuf(ILLEGAL_REQUEST, E_POSITION_PAST_BOM,
					&cmd->dbuf_p->sam_stat);
		return SAM_STAT_CHECK_CONDITION;
	}
	format_tape(&cmd->dbuf_p->sam_stat);

	return SAM_STAT_GOOD;
}
Exemple #3
0
/* Operation */
int main(int argc, char **argv)
{
	struct ltfs_volume *newvol;
	struct other_format_opts opt;
	int ret, log_level, syslog_level, i, cmd_args_len;
	char *lang, *cmd_args;
	const char *config_file = NULL;
	void *message_handle;
	char cmd_input = 0;

	int fuse_argc = argc;
	char **fuse_argv = calloc(fuse_argc, sizeof(char *));
	if (! fuse_argv) {
		return MKLTFS_OPERATIONAL_ERROR;
	}
	for (i = 0; i < fuse_argc; ++i) {
		fuse_argv[i] = strdup(argv[i]);
		if (! fuse_argv[i]) {
			return MKLTFS_OPERATIONAL_ERROR;
		}
	}
	struct fuse_args args = FUSE_ARGS_INIT(fuse_argc, fuse_argv);

#ifdef HP_mingw_BUILD
	(void) lang;
#endif /* HP_mingw_BUILD */

#ifndef HP_mingw_BUILD
	/* Check for LANG variable and set it to en_US.UTF-8 if it is unset. */
	lang = getenv("LANG");
	if (! lang) {
		fprintf(stderr, "LTFS9015W Setting the locale to 'en_US.UTF-8'. If this is wrong, please set the LANG environment variable before starting mkltfs.\n");
		ret = setenv("LANG", "en_US.UTF-8", 1);
		if (ret) {
			fprintf(stderr, "LTFS9016E Cannot set the LANG environment variable\n");
			return MKLTFS_OPERATIONAL_ERROR;
		}
	}
#endif /* HP_mingw_BUILD */

	/* Start up libltfs with the default logging level. */
#ifndef mingw_PLATFORM
	openlog("mkltfs", LOG_PID, LOG_USER);
#endif
	ret = ltfs_init(LTFS_INFO, true, false);
	if (ret < 0) {
		ltfsmsg(LTFS_ERR, "10000E", ret);
		return MKLTFS_OPERATIONAL_ERROR;
	}

	/*  Setup signal handler to terminate cleanly */
	ret = ltfs_set_signal_handlers();
	if (ret < 0) {
		ltfsmsg(LTFS_ERR, "10013E");
		return MKLTFS_OPERATIONAL_ERROR;
	}

	/* Register messages with libltfs */
	ret = ltfsprintf_load_plugin("bin_mkltfs", bin_mkltfs_dat, &message_handle);
	if (ret < 0) {
		ltfsmsg(LTFS_ERR, "10012E", ret);
		return MKLTFS_OPERATIONAL_ERROR;
	}

	/* Set up empty format options and load the configuration file. */
	memset(&opt, 0, sizeof(struct other_format_opts));
	opt.enable_compression = true;
	opt.allow_update = true;
	opt.unformat = false;
	opt.force = false;
	opt.quiet = false;
	opt.blocksize = LTFS_DEFAULT_BLOCKSIZE;
	opt.long_wipe = false;
	opt.interactive = false;

	/* Check for a config file path given on the command line */
	while (true) {
		int option_index = 0;
		int c = getopt_long(argc, argv, short_options, long_options, &option_index);
		if (c == -1)
			break;
		if (c == 'i') {
			config_file = strdup(optarg);
			break;
		}
	}

	/* Load configuration file */
	ret = config_file_load(config_file, &opt.config);
	if (ret < 0) {
		ltfsmsg(LTFS_ERR, "10008E", ret);
		return MKLTFS_OPERATIONAL_ERROR;
	}

	/* Parse all command line arguments */
	optind = 1;
	int num_of_o = 0;
	while (true) {
		int option_index = 0;
		int c = getopt_long(argc, argv, short_options, long_options, &option_index);
		if (c == -1)
			break;

		switch (c) {
			case 'i':
				break;
			case 'e':
				free(opt.backend_path);
				opt.backend_path = strdup(optarg);
				break;
			case 'd':
				opt.devname = strdup(optarg);
				break;
			case 'b':
				opt.blocksize = atoi(optarg);
				break;
			case 's':
				opt.barcode = strdup(optarg);
				break;
			case 'n':
				opt.volume_name = strdup(optarg);
				break;
			case 'r':
				opt.filterrules = strdup(optarg);
				break;
			case '-':
				opt.kmi_backend_name = strdup(optarg);
				break;
			case 'c':
				opt.enable_compression = false;
				break;
			case 'o':
				/* ignore -o here to parse them by fuse */
				++num_of_o;
				break;
			case ' ':
				opt.allow_update = false;
				break;
			case 'k':
				opt.keep_capacity = true;
				break;
			case 'w':
				opt.unformat = true;
				break;
			case 'f':
				opt.force = true;
				break;
			case '+':
				opt.unformat = true;
				opt.long_wipe = true;
				break;
			case 'q':
				opt.quiet = true;
				break;
			case 't':
				opt.trace = true;
				break;
			case '!':
				opt.syslogtrace = true;
				break;
			case 'x':
				opt.fulltrace = true;
				break;
			case 'g':
				opt.interactive = true;
				break;
			case 'h':
				show_usage(argv[0], opt.config, false);
				return 0;
			case 'p':
				show_usage(argv[0], opt.config, true);
				return 0;
			case 'V':
				ltfsresult("15059I", "mkltfs", PACKAGE_VERSION);
				ltfsresult("15059I", "LTFS Format Specification", LTFS_INDEX_VERSION_STR);
				return 0;
			case '?':
			default:
				show_usage(argv[0], opt.config, false);
				return MKLTFS_USAGE_SYNTAX_ERROR;
		}
	}

	if (optind + num_of_o < argc) {
		show_usage(argv[0], opt.config, false);
		return MKLTFS_USAGE_SYNTAX_ERROR;
	}

	/* Pick up default backend if one wasn't specified before */
	if (! opt.backend_path) {
		const char *default_backend = config_file_get_default_plugin("driver", opt.config);
		if (! default_backend) {
			ltfsmsg(LTFS_ERR, "10009E");
			return MKLTFS_OPERATIONAL_ERROR;
		}
		opt.backend_path = strdup(default_backend);
	}
	if (! opt.kmi_backend_name) {
		const char *default_backend = config_file_get_default_plugin("kmi", opt.config);
		if (default_backend)
			opt.kmi_backend_name = strdup(default_backend);
		else
			opt.kmi_backend_name = strdup("none");
	}
	if (opt.kmi_backend_name && strcmp(opt.kmi_backend_name, "none") == 0) {
		free(opt.kmi_backend_name);
		opt.kmi_backend_name = NULL;
	}

	/* Set the logging level */
	if (opt.quiet && (opt.trace || opt.fulltrace)) {
		ltfsmsg(LTFS_ERR, "9012E");
		show_usage(argv[0], opt.config, false);
		return 1;
	} else if (opt.quiet) {
		log_level = LTFS_WARN;
		syslog_level = LTFS_NONE;
	} else if (opt.trace) {
		log_level = LTFS_DEBUG;
		syslog_level = LTFS_NONE;
	} else if (opt.syslogtrace)
		log_level = syslog_level = LTFS_DEBUG;
	else if (opt.fulltrace) {
		log_level = LTFS_TRACE;
		syslog_level = LTFS_DEBUG;
	} else {
		log_level = LTFS_INFO;
		syslog_level = LTFS_NONE;
	}

	ltfs_set_log_level(log_level);
	ltfs_set_syslog_level(syslog_level);

	/* Starting mkltfs */
#ifdef GENERIC_OEM_BUILD
	ltfsmsg(LTFS_INFO, "15000I", SOFTWARE_PRODUCT_NAME, PACKAGE_VERSION, log_level);
#else
	ltfsmsg(LTFS_INFO, "15000I", LTFS_VENDOR_NAME SOFTWARE_PRODUCT_NAME, PACKAGE_VERSION, log_level);
#endif /* GENERIC_OEM_BUILD */

	/* Show command line arguments */
	for (i = 0, cmd_args_len = 0 ; i < argc; i++) {
		cmd_args_len += strlen(argv[i]) + 1;
	}
	cmd_args = calloc(1, cmd_args_len + 1);
	if (!cmd_args) {
		/* Memory allocation failed */
		ltfsmsg(LTFS_ERR, "10001E", "mkltfs (arguments)");
		return MKLTFS_OPERATIONAL_ERROR;
	}
	strcat(cmd_args, argv[0]);
	for (i = 1; i < argc; i++) {
		strcat(cmd_args, " ");
		strcat(cmd_args, argv[i]);
	}
	ltfsmsg(LTFS_INFO, "15041I", cmd_args);
	free(cmd_args);

	/* Show build time information */
	ltfsmsg(LTFS_INFO, "15042I", BUILD_SYS_FOR);
	ltfsmsg(LTFS_INFO, "15043I", BUILD_SYS_GCC);

	/* Show run time information */
	show_runtime_system_info();

	ret = ltfs_fs_init();
	if (ret)
		return MKLTFS_OPERATIONAL_ERROR;

	/* Actually mkltfs logic starts here */
	ret = ltfs_volume_alloc("mkltfs", &newvol);
	if (ret < 0) {
		ltfsmsg(LTFS_ERR, "15001E");
		return MKLTFS_OPERATIONAL_ERROR;
	}

	ret = ltfs_set_blocksize(opt.blocksize, newvol);
	if (ret < 0) {
		if (ret == -LTFS_SMALL_BLOCKSIZE)
			ltfsmsg(LTFS_ERR, "15028E", LTFS_MIN_BLOCKSIZE);
		show_usage(argv[0], opt.config, false);
		return MKLTFS_OPERATIONAL_ERROR;
	}
	ltfs_set_compression(opt.enable_compression, newvol);
	ret = ltfs_set_barcode(opt.barcode, newvol);
	if (ret < 0) {
		if (ret == -LTFS_BARCODE_LENGTH)
			ltfsmsg(LTFS_ERR, "15029E");
		else if (ret == -LTFS_BARCODE_INVALID)
			ltfsmsg(LTFS_ERR, "15030E");
		show_usage(argv[0], opt.config, false);
		return MKLTFS_USAGE_SYNTAX_ERROR;
	}

	if (_mkltfs_validate_options(argv[0], newvol, &opt)) {
		ltfsmsg(LTFS_ERR, "15002E");
		show_usage(argv[0], opt.config, false);
		return MKLTFS_USAGE_SYNTAX_ERROR;
	}

	ltfsmsg(LTFS_INFO, "15003I", opt.devname);
	ltfsmsg(LTFS_INFO, "15004I", opt.blocksize);
	ltfsmsg(LTFS_INFO, "15005I", opt.filterrules ? opt.filterrules : "None");
	if (! opt.quiet)
		fprintf(stderr, "\n");

	/* Statutory Warning before format/unformat */
	if (! opt.force && !opt.quiet && opt.interactive) {

		ltfsmsg(LTFS_INFO, "15492I");

		fflush(stdin);
		scanf("%c", &cmd_input);
		while (getchar() != '\n');

		switch (cmd_input) {
			case 'Y':
			case 'y':
				opt.force = true;
				break;
			default:
				ltfsmsg(LTFS_INFO, "15493I");
				ret = 1;
				goto out_close;
		}
	}

	if(opt.unformat)
		ret = unformat_tape(newvol, &opt, &args);
	else
		ret = format_tape(newvol, &opt, &args);

out_close:
	if (opt.backend_path)
		free(opt.backend_path);
	if (opt.kmi_backend_name)
		free(opt.kmi_backend_name);
	if (opt.devname)
		free(opt.devname);

	while (fuse_argc) {
		free(fuse_argv[--fuse_argc]);
	}
	free(fuse_argv);

	config_file_free(opt.config);
	ltfsprintf_unload_plugin(message_handle);
	ltfs_finish();

	return ret;
}