Dave Voutila writes:
> The conclusion of my previous fixes to vmd(8) [1] changes the event > handling in vmctl(8) to support receiving IMSG_VMDOP_TERMINATE_VM_EVENTs > from the control process. (This removes a XXX comment from vmd.) > > For clarity, the messaging logic was changed previously: > > - ...TERMINATE_VM_RESPONSE conveying success/failure of the request to > terminate a guest regardless of waiting for termination > - ...TERMINATE_VM_EVENT conveying the actual termination of a guest > > This diff finishes bringing that logic from vmd(8) to vmctl(8). > > OK? Ping. Looking to close this gap. Note: this diff does preserve some errno abuse in vmd & vmctl that I'm working on separately. > > -dv > > > Index: usr.sbin/vmd/control.c > =================================================================== > RCS file: /cvs/src/usr.sbin/vmd/control.c,v > retrieving revision 1.35 > diff -u -p -r1.35 control.c > --- usr.sbin/vmd/control.c 26 Apr 2021 22:58:27 -0000 1.35 > +++ usr.sbin/vmd/control.c 30 Apr 2021 12:31:22 -0000 > @@ -154,9 +154,8 @@ control_dispatch_vmd(int fd, struct priv > if (notify->ctl_vmid != vmr.vmr_id) > continue; > if ((c = control_connbyfd(notify->ctl_fd)) != NULL) { > - /* XXX vmctl expects *_RESPONSE, not *_EVENT */ > - imsg_compose_event(&c->iev, > - IMSG_VMDOP_TERMINATE_VM_RESPONSE, > + /* Forward to the vmctl(8) client */ > + imsg_compose_event(&c->iev, imsg->hdr.type, > 0, 0, -1, imsg->data, IMSG_DATA_SIZE(imsg)); > TAILQ_REMOVE(&ctl_notify_q, notify, entry); > free(notify); > Index: usr.sbin/vmctl/vmctl.c > =================================================================== > RCS file: /cvs/src/usr.sbin/vmctl/vmctl.c,v > retrieving revision 1.77 > diff -u -p -r1.77 vmctl.c > --- usr.sbin/vmctl/vmctl.c 22 Mar 2021 18:50:11 -0000 1.77 > +++ usr.sbin/vmctl/vmctl.c 30 Apr 2021 12:31:22 -0000 > @@ -461,7 +461,7 @@ terminate_vm(uint32_t terminate_id, cons > * terminate_vm_complete > * > * Callback function invoked when we are expecting an > - * IMSG_VMDOP_TERMINATE_VM_RESPONSE message indicating the completion of > + * IMSG_VMDOP_TERMINATE_VM_EVENT message indicating the completion of > * a terminate vm operation. > * > * Parameters: > @@ -484,41 +484,50 @@ terminate_vm_complete(struct imsg *imsg, > struct vmop_result *vmr; > int res; > > - if (imsg->hdr.type == IMSG_VMDOP_TERMINATE_VM_RESPONSE) { > + switch (imsg->hdr.type) { > + case IMSG_VMDOP_TERMINATE_VM_RESPONSE: > + IMSG_SIZE_CHECK(imsg, &vmr); > vmr = (struct vmop_result *)imsg->data; > res = vmr->vmr_result; > - if (res) { > - switch (res) { > - case VMD_VM_STOP_INVALID: > - fprintf(stderr, > - "cannot stop vm that is not running\n"); > - *ret = EINVAL; > - break; > - case ENOENT: > - fprintf(stderr, "vm not found\n"); > - *ret = EIO; > - break; > - case EINTR: > - fprintf(stderr, "interrupted call\n"); > - *ret = EIO; > - break; > - default: > - errno = res; > - fprintf(stderr, "failed: %s\n", > - strerror(res)); > - *ret = EIO; > - } > - } else if (flags & VMOP_WAIT) { > + > + switch (res) { > + case 0: > + fprintf(stderr, "requested to shutdown vm %d\n", > + vmr->vmr_id); > + *ret = 0; > + break; > + case VMD_VM_STOP_INVALID: > + fprintf(stderr, > + "cannot stop vm that is not running\n"); > + *ret = EINVAL; > + break; > + case ENOENT: > + fprintf(stderr, "vm not found\n"); > + *ret = EIO; > + break; > + case EINTR: > + fprintf(stderr, "interrupted call\n"); > + *ret = EIO; > + break; > + default: > + errno = res; > + fprintf(stderr, "failed: %s\n", > + strerror(res)); > + *ret = EIO; > + } > + break; > + case IMSG_VMDOP_TERMINATE_VM_EVENT: > + IMSG_SIZE_CHECK(imsg, &vmr); > + vmr = (struct vmop_result *)imsg->data; > + if (flags & VMOP_WAIT) { > fprintf(stderr, "terminated vm %d\n", vmr->vmr_id); > } else if (flags & VMOP_FORCE) { > fprintf(stderr, "forced to terminate vm %d\n", > vmr->vmr_id); > - } else { > - fprintf(stderr, "requested to shutdown vm %d\n", > - vmr->vmr_id); > - *ret = 0; > } > - } else { > + *ret = 0; > + break; > + default: > fprintf(stderr, "unexpected response received from vmd\n"); > *ret = EINVAL; > } > @@ -951,4 +960,3 @@ create_imagefile(int type, const char *i > > return (ret); > } > - -- -Dave Voutila