Hi,
below some comments regarding the vmctl disk image creation code.
Index: main.c
===================================================================
RCS file: /cvs/src/usr.sbin/vmctl/main.c,v
retrieving revision 1.13
diff -u -p -u -r1.13 main.c
--- main.c 5 Jan 2016 16:25:34 -0000 1.13
+++ main.c 10 Jan 2016 15:30:55 -0000
@@ -421,9 +421,6 @@ ctl_create(struct parse_result *res, int
fprintf(stderr, "missing size argument\n");
ctl_usage(res->ctl);
}
- res->size /= 1024 / 1024;
- if (res->size < 1)
- errx(1, "specified image size too small");
ret = create_imagefile(paths[0], res->size);
if (ret != 0) {
errno = ret;
The division is a no-op: 1024 / 1024 is evaluated first, resulting in
res->size /= 1. At that point res->size has already been converted to
megabytes by parse_size().
The condition (res->size < 1) can never be true, because in that case
parse_size() would have returned non-zero, triggering the
errx(1, "invalid size: %s", optarg) in ctl_create().
Index: vmctl.c
===================================================================
RCS file: /cvs/src/usr.sbin/vmctl/vmctl.c,v
retrieving revision 1.10
diff -u -p -u -r1.10 vmctl.c
--- vmctl.c 14 Dec 2015 06:59:07 -0000 1.10
+++ vmctl.c 10 Jan 2016 15:30:55 -0000
@@ -376,7 +376,7 @@ vm_console(struct vmop_info_result *list
*
* Parameters:
* imgfile_path: path to the image file to create
- * imgsize : size of the image file to create
+ * imgsize : size of the image file to create (in MB)
*
* Return:
* EEXIST: The requested image file already exists
@@ -387,8 +387,6 @@ int
create_imagefile(const char *imgfile_path, long imgsize)
{
int fd, ret;
- off_t ofs;
- char ch = '\0';
/* Refuse to overwrite an existing image */
fd = open(imgfile_path, O_RDWR | O_CREAT | O_TRUNC | O_EXCL,
@@ -396,19 +394,11 @@ create_imagefile(const char *imgfile_pat
if (fd == -1)
return (errno);
- ofs = (imgsize * 1024 * 1024) - 1;
-
- /* Set fd pos at desired size */
- if (lseek(fd, ofs, SEEK_SET) == -1) {
- ret = errno;
- close(fd);
- return (ret);
- }
-
- /* Write one byte to fill out the extent */
- if (write(fd, &ch, 1) == -1) {
+ /* Extend to desired size */
+ if (ftruncate(fd, (off_t)imgsize * 1024 * 1024) == -1) {
ret = errno;
close(fd);
+ unlink(imgfile_path);
return (ret);
}
lseek() + write() can be replaced by a slightly shorter ftruncate()
call. Note that using ftruncate() to extend a file is not portable
(Posix allows either zero-filling until the given size is reached, or
alternatively erroring out.), but that shouldn't be a proble as vmm
isn't cross-platform either.
I think it would be nice to unlink() the image file when extending it
fails for consistency with the other error case (the file can't be
created).
cheers,
natano