works here and I like it. but probably for after unlock On Sun, Oct 7, 2018 at 22:11 Mischa Peters <obs...@high5.nl> wrote:
> No idea if the code works yet. > Hopefully I can try later. But love the idea. > > Mischa > > > On 8 Oct 2018, at 04:31, Ori Bernstein <o...@eigenstate.org> wrote: > > > > Keep a list of known vms, and reuse the VM IDs. This means that when > using > > '-L', the IP addresses of the VMs are stable. > > > > diff --git usr.sbin/vmd/config.c usr.sbin/vmd/config.c > > index af12b790002..522bae32501 100644 > > --- usr.sbin/vmd/config.c > > +++ usr.sbin/vmd/config.c > > @@ -61,7 +61,10 @@ config_init(struct vmd *env) > > if (what & CONFIG_VMS) { > > if ((env->vmd_vms = calloc(1, sizeof(*env->vmd_vms))) == NULL) > > return (-1); > > + if ((env->vmd_known = calloc(1, sizeof(*env->vmd_known))) == > NULL) > > + return (-1); > > TAILQ_INIT(env->vmd_vms); > > + TAILQ_INIT(env->vmd_known); > > } > > if (what & CONFIG_SWITCHES) { > > if ((env->vmd_switches = calloc(1, > > diff --git usr.sbin/vmd/vmd.c usr.sbin/vmd/vmd.c > > index 18a5e0d3d5d..732691b4381 100644 > > --- usr.sbin/vmd/vmd.c > > +++ usr.sbin/vmd/vmd.c > > @@ -1169,6 +1169,27 @@ vm_remove(struct vmd_vm *vm, const char *caller) > > free(vm); > > } > > > > +static uint32_t > > +claim_vmid(const char *name) > > +{ > > + struct name2id *n2i = NULL; > > + > > + TAILQ_FOREACH(n2i, env->vmd_known, entry) > > + if (strcmp(n2i->name, name) == 0) > > + return n2i->id; > > + > > + if (++env->vmd_nvm == 0) > > + fatalx("too many vms"); > > + if ((n2i = calloc(1, sizeof(struct name2id))) == NULL) > > + fatalx("could not alloc vm name"); > > + n2i->id = env->vmd_nvm; > > + if (strlcpy(n2i->name, name, sizeof(n2i->name)) >= > sizeof(n2i->name)) > > + fatalx("overlong vm name"); > > + TAILQ_INSERT_TAIL(env->vmd_known, n2i, entry); > > + > > + return n2i->id; > > +} > > + > > int > > vm_register(struct privsep *ps, struct vmop_create_params *vmc, > > struct vmd_vm **ret_vm, uint32_t id, uid_t uid) > > @@ -1300,11 +1321,8 @@ vm_register(struct privsep *ps, struct > vmop_create_params *vmc, > > vm->vm_cdrom = -1; > > vm->vm_iev.ibuf.fd = -1; > > > > - if (++env->vmd_nvm == 0) > > - fatalx("too many vms"); > > - > > /* Assign a new internal Id if not specified */ > > - vm->vm_vmid = id == 0 ? env->vmd_nvm : id; > > + vm->vm_vmid = (id == 0) ? claim_vmid(vcp->vcp_name) : id; > > > > log_debug("%s: registering vm %d", __func__, vm->vm_vmid); > > TAILQ_INSERT_TAIL(env->vmd_vms, vm, vm_entry); > > diff --git usr.sbin/vmd/vmd.h usr.sbin/vmd/vmd.h > > index b7c012854e8..86fad536e59 100644 > > --- usr.sbin/vmd/vmd.h > > +++ usr.sbin/vmd/vmd.h > > @@ -276,6 +276,13 @@ struct vmd_user { > > }; > > TAILQ_HEAD(userlist, vmd_user); > > > > +struct name2id { > > + char name[VMM_MAX_NAME_LEN]; > > + int32_t id; > > + TAILQ_ENTRY(name2id) entry; > > +}; > > +TAILQ_HEAD(name2idlist, name2id); > > + > > struct address { > > struct sockaddr_storage ss; > > int prefixlen; > > @@ -300,6 +307,7 @@ struct vmd { > > > > uint32_t vmd_nvm; > > struct vmlist *vmd_vms; > > + struct name2idlist *vmd_known; > > uint32_t vmd_nswitches; > > struct switchlist *vmd_switches; > > struct userlist *vmd_users; > > > > -- > > Ori Bernstein > > > >