summaryrefslogtreecommitdiff
path: root/avr/cmd_attach.c
diff options
context:
space:
mode:
Diffstat (limited to 'avr/cmd_attach.c')
-rw-r--r--avr/cmd_attach.c126
1 files changed, 126 insertions, 0 deletions
diff --git a/avr/cmd_attach.c b/avr/cmd_attach.c
new file mode 100644
index 0000000..651404f
--- /dev/null
+++ b/avr/cmd_attach.c
@@ -0,0 +1,126 @@
+/*
+ * (C) Copyright 2016 Leo C. <erbl259-lmu@yahoo.de>
+ *
+ * SPDX-License-Identifier: GPL-2.0
+ */
+
+/*
+ * attach channels to devices
+ */
+
+#include "cmd_attach.h"
+
+#include "command.h"
+#include "z180-serv.h"
+#include "getopt-min.h"
+
+
+/*
+ * attach [[options] [unit [diskfile]]]
+ *
+ * detach unit
+ * attach -d unit
+ *
+ * attach -o reattach unit
+ * attach -o reattach unit diskfile
+ *
+ * attach unit diskfile
+ *
+ */
+
+command_ret_t do_attach(cmd_tbl_t *cmdtp, uint_fast8_t flag, int argc, char * const argv[])
+{
+ uint8_t unit = 0;
+ char *filename = NULL;
+ bool detach = false;
+ bool detach_all = false;
+ drv_opt_t options = 0;
+ int res;
+
+ (void) cmdtp; (void) flag;
+
+
+ if (argv[0][0] == 'd') {
+ /* we are called as 'detach' */
+ detach = true;
+ } else if (argc == 1) {
+ /* no arguments */
+ drv_list();
+ return CMD_RET_SUCCESS;
+ }
+
+ int opt;
+ while ((opt = getopt(argc, argv, PSTR("darwo:"))) != -1) {
+ switch (opt) {
+ case 'd':
+ detach = true;
+ break;
+ case 'a':
+ detach_all = true;
+ break;
+ case 'r':
+ options |= DRV_OPT_RO;
+ break;
+ case 'w':
+ options &= ~DRV_OPT_RO;
+ break;
+ case 'o':
+ {
+ static const FLASH char delim[] = {", "};
+ char *p = strtok_P(optarg, delim);
+ while (p != NULL) {
+ if (!strcmp_P(p, PSTR("ro")))
+ options |= DRV_OPT_RO;
+ else if (!strcmp_P(p, PSTR("rw")))
+ options &= ~DRV_OPT_RO;
+ else if (!strcmp_P(p, PSTR("debug")))
+ options |= DRV_OPT_DEBUG;
+ else if (!strcmp_P(p, PSTR("nodebug")))
+ options &= ~DRV_OPT_DEBUG;
+ else if (!strcmp_P(p, PSTR("reattach")))
+ options |= DRV_OPT_REATTATCH;
+ else
+ return CMD_RET_USAGE;
+
+ p = strtok_P(NULL, delim);
+ }
+ }
+ break;
+ default: /* '?' */
+ return CMD_RET_USAGE;
+ }
+ }
+
+ /* remaining arguments */
+ argc -= optind;
+ if ( !( (argc == 0 && detach && detach_all) ||
+ (argc == 1 && detach) ||
+ (argc == 1 && (options & DRV_OPT_REATTATCH)) ||
+ argc == 2) )
+ return CMD_RET_USAGE;
+
+ if (argc > 0 && ((strlen(argv[optind]) != 4) ||
+ strncmp_P(argv[optind], PSTR("dsk"), 3) ||
+ (unit = argv[optind][3] - '0') >= CONFIG_CPM_MAX_DRIVE)) {
+
+ cmd_error(CMD_RET_FAILURE, 0, PSTR("Invalid device: '%s'"), argv[optind]);
+ }
+
+ if (detach) {
+ if (detach_all)
+ for (uint8_t i = 0; i < CONFIG_CPM_MAX_DRIVE; i++)
+ drv_detach(i);
+ else
+ drv_detach(unit);
+ return CMD_RET_SUCCESS;
+ }
+
+ if (argc == 2)
+ filename = argv[++optind];
+
+ res = drv_attach(unit, filename, options);
+ if (res)
+ cmd_error(CMD_RET_FAILURE, res, PSTR("Attachment of '%s' to dsk%d failed"), filename, unit);
+
+ return CMD_RET_SUCCESS;
+}