vmd(8) does not support numerical names with `start' and `receive'. It never worked, the manuals are now clearer about this, but error handling can still be improved:
$ vmctl start 60 -t test -d 60.qcow2 vmctl: start vm command failed: No such file or directory That's from vm_start_complete() in vmctl.c:254 where vmd(8) unexpectedly returns EPERM after it failed to create the VM. $ vmctl receive 60 </dev/null vmctl: invalid vm name vmctl: invalid id: 60 Here, first parse_vmid(), then it's caller ctl_receive() complains. parse_vmid()'s last argument is `needname', indicating that the id to be parsed must not be numerical. The following diff makes the code check for a letter in the beginning, adjusts `start' and `receive' set this argument and print only one error. $ ./obj/vmctl start 60 -t test -d 60.qcow2 vmctl: invalid VM name $ ./obj/vmctl receive 60 </dev/null vmctl: invalid VM name "vm" -> "VM" for consistency with all other "invalid VM name" occurences throughout the sources. Feedback? OK? Index: usr.sbin/vmctl/main.c =================================================================== RCS file: /cvs/src/usr.sbin/vmctl/main.c,v retrieving revision 1.54 diff -u -p -r1.54 main.c --- usr.sbin/vmctl/main.c 1 Mar 2019 12:47:36 -0000 1.54 +++ usr.sbin/vmctl/main.c 7 Mar 2019 19:14:15 -0000 @@ -524,7 +524,7 @@ parse_vmid(struct parse_result *res, cha id = strtonum(word, 0, UINT32_MAX, &error); if (error == NULL) { if (needname) { - warnx("invalid vm name"); + warnx("invalid VM name"); return (-1); } else { res->id = id; @@ -842,8 +842,8 @@ ctl_start(struct parse_result *res, int if (argc < 2) ctl_usage(res->ctl); - if (parse_vmid(res, argv[1], 0) == -1) - errx(1, "invalid id: %s", argv[1]); + if (parse_vmid(res, argv[1], 1) == -1) + exit(1); argc--; argv++; @@ -1046,7 +1046,7 @@ ctl_receive(struct parse_result *res, in err(1, "pledge"); if (argc == 2) { if (parse_vmid(res, argv[1], 1) == -1) - errx(1, "invalid id: %s", argv[1]); + exit(1); } else if (argc != 2) ctl_usage(res->ctl); Index: usr.sbin/vmctl/vmctl.c =================================================================== RCS file: /cvs/src/usr.sbin/vmctl/vmctl.c,v retrieving revision 1.65 diff -u -p -r1.65 vmctl.c --- usr.sbin/vmctl/vmctl.c 6 Dec 2018 09:23:15 -0000 1.65 +++ usr.sbin/vmctl/vmctl.c 7 Mar 2019 19:14:15 -0000 @@ -154,12 +154,7 @@ vm_start(uint32_t start_id, const char * } } if (name != NULL) { - /* - * Allow VMs names with alphanumeric characters, dot, hyphen - * and underscore. But disallow dot, hyphen and underscore at - * the start. - */ - if (*name == '-' || *name == '.' || *name == '_') + if (!isalpha(*name)) errx(1, "invalid VM name"); for (s = name; *s != '\0'; ++s) { Index: usr.sbin/vmd/vmd.c =================================================================== RCS file: /cvs/src/usr.sbin/vmd/vmd.c,v retrieving revision 1.108 diff -u -p -r1.108 vmd.c --- usr.sbin/vmd/vmd.c 9 Dec 2018 12:26:38 -0000 1.108 +++ usr.sbin/vmd/vmd.c 7 Mar 2019 19:14:15 -0000 @@ -1257,11 +1257,7 @@ vm_register(struct privsep *ps, struct v vcp->vcp_ndisks == 0 && strlen(vcp->vcp_cdrom) == 0) { log_warnx("no kernel or disk/cdrom specified"); goto fail; - } else if (strlen(vcp->vcp_name) == 0) { - log_warnx("invalid VM name"); - goto fail; - } else if (*vcp->vcp_name == '-' || *vcp->vcp_name == '.' || - *vcp->vcp_name == '_') { + } else if (strlen(vcp->vcp_name) == 0 || !isalpha(*vcp->vcp_name)) { log_warnx("invalid VM name"); goto fail; } else { =================================================================== Stats: --- 15 lines 531 chars Stats: +++ 6 lines 185 chars Stats: -9 lines Stats: -346 chars