static status_t set_id_and_name( vmi_instance_t vmi, vmi_mode_t mode, uint64_t id, const char *name) { if (!name && id == VMI_INVALID_DOMID) { errprint("Specifying either id or name.\n"); return VMI_FAILURE; } if (name && id != VMI_INVALID_DOMID) { errprint("Specifying both id and name is undefined.\n"); return VMI_FAILURE; } if (VMI_FILE == vmi->mode) { if (name) { set_image_type_for_file(vmi, name); driver_set_name(vmi, name); goto done; } errprint("Must specify name for file mode.\n"); return VMI_FAILURE; } /* resolve and set id from name */ if (name) { if (VMI_INVALID_DOMID != (id = driver_get_id_from_name(vmi, name)) ) { dbprint(VMI_DEBUG_CORE, "--got id from name (%s --> %"PRIu64")\n", name, id); driver_set_id(vmi, id); vmi->image_type = strndup(name, 100); driver_set_name(vmi, name); goto done; } errprint("Failed to get domain id from name.\n"); return VMI_FAILURE; } /* resolve and set name from id */ if (VMI_FAILURE == driver_check_id(vmi,id)) { errprint("Invalid id.\n"); return VMI_FAILURE; } driver_set_id(vmi, id); char *tmp_name = NULL; if (VMI_SUCCESS == driver_get_name_from_id(vmi, id, &tmp_name)) { dbprint(VMI_DEBUG_CORE, "--got name from id (%"PRIu64" --> %s)\n", id, tmp_name); vmi->image_type = strndup(tmp_name, 100); driver_set_name(vmi, tmp_name); free(tmp_name); goto done; } dbprint(VMI_DEBUG_CORE, "--failed to get domain name from id!\n"); #if !defined(HAVE_XS_H) && !defined(HAVE_XENSTORE_H) // Only under Xen this is OK without Xenstore if (vmi->mode == VMI_XEN) { // create placeholder for image_type char *idstring = g_malloc0(snprintf(NULL, 0, "domid-%"PRIu64, id) + 1); sprintf(idstring, "domid-%"PRIu64, id); vmi->image_type = idstring; goto done; } #endif return VMI_FAILURE; done: dbprint(VMI_DEBUG_CORE, "**set image_type = %s\n", vmi->image_type); return VMI_SUCCESS; }
static status_t set_id_and_name( vmi_instance_t vmi, vmi_mode_t mode, unsigned long id, char *name) { if (VMI_FILE == vmi->mode) { if (name) { set_image_type_for_file(vmi, name); driver_set_name(vmi, name); } else { errprint("Must specify name for file mode.\n"); return VMI_FAILURE; } } else { /* resolve and set id and name */ if (VMI_INVALID_DOMID == id) { if (name) { if (VMI_INVALID_DOMID != (id = driver_get_id_from_name(vmi, name)) ) { dbprint("--got id from name (%s --> %lu)\n", name, id); driver_set_id(vmi, id); } else { errprint("Failed to get domain id from name.\n"); return VMI_FAILURE; } } else { errprint("Must specifiy either id or name.\n"); return VMI_FAILURE; } } else { if (name) { errprint("Specifying both id and name is undefined.\n"); return VMI_FAILURE; } if(VMI_FAILURE == driver_check_id(vmi,id)) { errprint("Invalid id.\n"); return VMI_FAILURE; } driver_set_id(vmi, id); if (VMI_FAILURE != driver_get_name_from_id(vmi, id, &name)) { dbprint("--got name from id (%lu --> %s)\n", id, name); } else { dbprint("--failed to get domain name from id!\n"); // Only under Xen this is OK if(vmi->mode != VMI_XEN) { return VMI_FAILURE; } } } if(name != NULL) { vmi->image_type = strndup(name, 100); driver_set_name(vmi, name); } else { // create placeholder for image_type char *idstring = malloc(snprintf(NULL, 0, "domid-%lu", id) + 1); sprintf(idstring, "domid-%lu", id); vmi->image_type = idstring; } } dbprint("**set image_type = %s\n", vmi->image_type); return VMI_SUCCESS; }