int main(int argc, char * argv[]) { int sg_fd, res, c; int allow = 0; int prevent = -1; int verbose = 0; const char * device_name = NULL; int ret = 0; while (1) { int option_index = 0; c = getopt_long(argc, argv, "ahp:vV", long_options, &option_index); if (c == -1) break; switch (c) { case 'a': allow = 1; break; case 'h': case '?': usage(); return 0; case 'p': prevent = sg_get_num(optarg); if ((prevent < 0) || (prevent > 3)) { fprintf(stderr, "bad argument to '--prevent'\n"); return SG_LIB_SYNTAX_ERROR; } break; case 'v': ++verbose; break; case 'V': fprintf(stderr, ME "version: %s\n", version_str); return 0; default: fprintf(stderr, "unrecognised option code 0x%x ??\n", c); usage(); return SG_LIB_SYNTAX_ERROR; } } if (optind < argc) { if (NULL == device_name) { device_name = argv[optind]; ++optind; } if (optind < argc) { for (; optind < argc; ++optind) fprintf(stderr, "Unexpected extra argument: %s\n", argv[optind]); usage(); return SG_LIB_SYNTAX_ERROR; } } if (NULL == device_name) { fprintf(stderr, "missing device name!\n"); usage(); return SG_LIB_SYNTAX_ERROR; } if (allow && (prevent >= 0)) { fprintf(stderr, "can't give both '--allow' and '--prevent='\n"); usage(); return SG_LIB_SYNTAX_ERROR; } if (allow) prevent = 0; else if (prevent < 0) prevent = 1; /* default is to prevent, as utility name suggests */ sg_fd = sg_cmds_open_device(device_name, 0 /* rw */, verbose); if (sg_fd < 0) { fprintf(stderr, ME "open error: %s: %s\n", device_name, safe_strerror(-sg_fd)); return SG_LIB_FILE_ERROR; } res = sg_ll_prevent_allow(sg_fd, prevent, 1, verbose); ret = res; if (0 == res) ; else if (SG_LIB_CAT_NOT_READY == res) fprintf(stderr, "Device not ready\n"); else if (SG_LIB_CAT_UNIT_ATTENTION == res) fprintf(stderr, "Unit attention\n"); else if (SG_LIB_CAT_ABORTED_COMMAND == res) fprintf(stderr, "Aborted command\n"); else if (SG_LIB_CAT_INVALID_OP == res) fprintf(stderr, "Prevent allow medium removal command not " "supported\n"); else if (SG_LIB_CAT_ILLEGAL_REQ == res) fprintf(stderr, "Prevent allow medium removal, bad field in " "command\n"); else fprintf(stderr, "Prevent allow medium removal command failed\n"); res = sg_cmds_close_device(sg_fd); if (res < 0) { fprintf(stderr, "close error: %s\n", safe_strerror(-res)); if (0 == ret) return SG_LIB_FILE_ERROR; } return (ret >= 0) ? ret : SG_LIB_CAT_OTHER; }
/* Returns 0 if successful */ int sdp_process_cmd(int sg_fd, const struct sdparm_command * scmdp, int pdt, const struct sdparm_opt_coll * opts) { int res, progress; if (! (opts->flexible || (CMD_READY == scmdp->cmd_num) || (CMD_SENSE == scmdp->cmd_num) || (0 == pdt) || (5 == pdt)) ) { fprintf(stderr, "this command only valid on a disk or cd/dvd; " "use '--flexible' to override\n"); return SG_LIB_SYNTAX_ERROR; } switch (scmdp->cmd_num) { case CMD_CAPACITY: res = do_cmd_read_capacity(sg_fd, opts->verbose); break; case CMD_EJECT: res = sg_ll_start_stop_unit(sg_fd, 0 /* immed */, 0 /* fl_num */, 0 /* power cond. */, 0 /* fl */, 1 /*loej */, 0 /* start */, 1 /* noisy */, opts->verbose); break; case CMD_LOAD: res = sg_ll_start_stop_unit(sg_fd, 0, 0, 0, 0, 1, 1, 1, opts->verbose); break; case CMD_READY: progress = -1; res = sg_ll_test_unit_ready_progress(sg_fd, 0, &progress, 0, opts->verbose); if (0 == res) printf("Ready\n"); else { if (progress >= 0) printf("Not ready, progress indication: %d%% done\n", (progress * 100) / 65536); else printf("Not ready\n"); } break; case CMD_SENSE: res = do_cmd_sense(sg_fd, opts->hex, opts->quiet, opts->verbose); break; case CMD_START: res = sg_ll_start_stop_unit(sg_fd, 0, 0, 0, 0, 0, 1, 1, opts->verbose); break; case CMD_STOP: res = sg_ll_start_stop_unit(sg_fd, 0, 0, 0, 0, 0, 0, 1, opts->verbose); break; case CMD_SYNC: res = sg_ll_sync_cache_10(sg_fd, 0, 0, 0, 0, 0, 1, opts->verbose); break; case CMD_UNLOCK: res = sg_ll_prevent_allow(sg_fd, 0, 1, opts->verbose); break; default: fprintf(stderr, "unknown cmd number [%d]\n", scmdp->cmd_num); return SG_LIB_SYNTAX_ERROR; } return res; }
int main(int argc, char * argv[]) { bool allow = false; bool verbose_given = false; bool version_given = false; int sg_fd, res, c; int prevent = -1; int verbose = 0; const char * device_name = NULL; int ret = 0; while (1) { int option_index = 0; c = getopt_long(argc, argv, "ahp:vV", long_options, &option_index); if (c == -1) break; switch (c) { case 'a': allow = true; break; case 'h': case '?': usage(); return 0; case 'p': prevent = sg_get_num(optarg); if ((prevent < 0) || (prevent > 3)) { pr2serr("bad argument to '--prevent'\n"); return SG_LIB_SYNTAX_ERROR; } break; case 'v': verbose_given = true; ++verbose; break; case 'V': version_given = true; break; default: pr2serr("unrecognised option code 0x%x ??\n", c); usage(); return SG_LIB_SYNTAX_ERROR; } } if (optind < argc) { if (NULL == device_name) { device_name = argv[optind]; ++optind; } if (optind < argc) { for (; optind < argc; ++optind) pr2serr("Unexpected extra argument: %s\n", argv[optind]); usage(); return SG_LIB_SYNTAX_ERROR; } } #ifdef DEBUG pr2serr("In DEBUG mode, "); if (verbose_given && version_given) { pr2serr("but override: '-vV' given, zero verbose and continue\n"); verbose_given = false; version_given = false; verbose = 0; } else if (! verbose_given) { pr2serr("set '-vv'\n"); verbose = 2; } else pr2serr("keep verbose=%d\n", verbose); #else if (verbose_given && version_given) pr2serr("Not in DEBUG mode, so '-vV' has no special action\n"); #endif if (version_given) { pr2serr(ME "version: %s\n", version_str); return 0; } if (NULL == device_name) { pr2serr("missing device name!\n"); usage(); return SG_LIB_SYNTAX_ERROR; } if (allow && (prevent >= 0)) { pr2serr("can't give both '--allow' and '--prevent='\n"); usage(); return SG_LIB_CONTRADICT; } if (allow) prevent = 0; else if (prevent < 0) prevent = 1; /* default is to prevent, as utility name suggests */ sg_fd = sg_cmds_open_device(device_name, false /* rw */, verbose); if (sg_fd < 0) { if (verbose) pr2serr(ME "open error: %s: %s\n", device_name, safe_strerror(-sg_fd)); ret = sg_convert_errno(-sg_fd); goto fini; } res = sg_ll_prevent_allow(sg_fd, prevent, true, verbose); ret = res; if (res) { char b[80]; sg_get_category_sense_str(res, sizeof(b), b, verbose); pr2serr("Prevent allow medium removal: %s\n", b); } res = sg_cmds_close_device(sg_fd); if (res < 0) { pr2serr("close error: %s\n", safe_strerror(-res)); if (0 == ret) ret = sg_convert_errno(-res); } fini: if (0 == verbose) { if (! sg_if_can2stderr("sg_prevent failed: ", ret)) pr2serr("Some error occurred, try again with '-v' " "or '-vv' for more information\n"); } return (ret >= 0) ? ret : SG_LIB_CAT_OTHER; }