/* Rename a VM instance */ static int cmd_rename(hypervisor_conn_t *conn,int argc,char *argv[]) { vm_instance_t *vm; if (!(vm = hypervisor_find_object(conn,argv[0],OBJ_TYPE_VM))) return(-1); if (registry_exists(argv[1],OBJ_TYPE_VM)) { vm_release(vm); hypervisor_send_reply(conn,HSC_ERR_RENAME,1, "unable to rename VM instance '%s', '%s' already exists", argv[0],argv[1]); return(-1); } if (vm_rename_instance(vm,argv[1])) { hypervisor_send_reply(conn,HSC_ERR_RENAME,1, "unable to rename VM instance '%s'", argv[0]); return(-1); } vm_release(vm); hypervisor_send_reply(conn,HSC_INFO_OK,1,"VM '%s' renamed to '%s'",argv[0],argv[1]); return(0); }
/* Remove a NetIO descriptor from a virtual ethernet switch */ int ethsw_remove_netio(ethsw_table_t *t,char *nio_name) { netio_desc_t *nio; int i; ETHSW_LOCK(t); if (!(nio = registry_exists(nio_name,OBJ_TYPE_NIO))) goto error; /* Try to find the NIO in the NIO array */ for(i=0;i<ETHSW_MAX_NIO;i++) if (t->nio[i] == nio) break; if (i == ETHSW_MAX_NIO) goto error; /* Invalidate this port in the MAC address table */ ethsw_invalidate_port(t,nio); t->nio[i] = NULL; ETHSW_UNLOCK(t); /* Remove the NIO from the RX multiplexer */ ethsw_free_nio(nio); return(0); error: ETHSW_UNLOCK(t); return(-1); }
/* Rename a VM instance */ int vm_rename_instance(vm_instance_t *vm, char *name) { char *old_name; char *old_lock_file = NULL; FILE *old_lock_fd = NULL; glob_t globbuf; size_t i; char *pattern = NULL; char *filename; int do_rename = 0; if (name == NULL || vm == NULL) goto err_invalid; /* invalid argument */ if (vm->status != VM_STATUS_HALTED) goto err_not_stopped; /* VM is not stopped */ if (strcmp(vm->name, name) == 0) return(0); /* same name, done */ if (registry_exists(name,OBJ_TYPE_VM)) goto err_exists; /* name already exists */ old_name = vm->name; vm->name = NULL; if(!(vm->name = strdup(name))) goto err_strdup; /* out of memory */ /* get new lock */ do_rename = ( vm_file_naming_type != 1 ); if (do_rename) { old_lock_file = vm->lock_file; old_lock_fd = vm->lock_fd; vm->lock_file = NULL; vm->lock_fd = NULL; if (vm_get_lock(vm) == -1) goto err_lock; } if (registry_rename(old_name,name,OBJ_TYPE_VM)) goto err_registry; /* failed to rename */ vm_log(vm,"VM","renamed from '%s' to '%s'",old_name,vm->name); /* rename files (best effort) */ if (do_rename) { fclose(old_lock_fd); unlink(old_lock_file); free(old_lock_file); vm_close_log(vm); if ((pattern = dyn_sprintf("%s_%s_*",vm_get_type(vm),old_name)) == NULL) goto skip_rename; if (glob(pattern, GLOB_NOSORT, NULL, &globbuf) != 0) goto skip_rename; for (i = 0; i < globbuf.gl_pathc; i++) { if ((filename = dyn_sprintf("%s_%s_%s",vm_get_type(vm),vm->name,globbuf.gl_pathv[i] + strlen(pattern) - 1)) == NULL) break; /* out of memory */ rename(globbuf.gl_pathv[i], filename); free(filename); } globfree(&globbuf); skip_rename: free(pattern); vm_reopen_log(vm); } free(old_name); return(0); // done err_registry: err_lock: err_strdup: free(vm->name); vm->name = old_name; if (do_rename) { vm_release_lock(vm,TRUE); vm->lock_file = old_lock_file; vm->lock_fd = old_lock_fd; } err_exists: err_not_stopped: err_invalid: return(-1); }