-char *
-esxVMX_IndexToDiskName(virConnectPtr conn, int idx, const char *prefix)
-{
- char *name = NULL;
-
- if (idx < 0) {
- ESX_ERROR(conn, VIR_ERR_INTERNAL_ERROR,
- "Disk index %d is negative", idx);
- } else if (idx < 26) {
- if (virAsprintf(&name, "%s%c", prefix, 'a' + idx) < 0)
- virReportOOMError(conn);
- } else if (idx < 702) {
- if (virAsprintf(&name, "%s%c%c", prefix, 'a' + idx / 26 - 1,
- 'a' + (idx % 26)) < 0)
- virReportOOMError(conn);
- } else {
- ESX_ERROR(conn, VIR_ERR_INTERNAL_ERROR,
- "Disk index %d is too large", idx);
- }
-
- return name;
-}
-
-
-
/*
struct _virDomainDiskDef {
int type; // partly done
}
(*def)->dst =
- esxVMX_IndexToDiskName
- (conn, controller * 15 + (id < 7 ? id : id - 1), "sd");
+ virIndexToDiskName
+ (controller * 15 + (id < 7 ? id : id - 1), "sd");
if ((*def)->dst == NULL) {
goto failure;
goto failure;
}
- (*def)->dst = esxVMX_IndexToDiskName(conn, controller * 2 + id,
- "hd");
+ (*def)->dst = virIndexToDiskName(controller * 2 + id, "hd");
if ((*def)->dst == NULL) {
goto failure;
goto failure;
}
- (*def)->dst = esxVMX_IndexToDiskName(conn, controller, "fd");
+ (*def)->dst = virIndexToDiskName(controller, "fd");
if ((*def)->dst == NULL) {
goto failure;
#include "domain_conf.h"
#include "esx_vi.h"
-char *
-esxVMX_IndexToDiskName(virConnectPtr conn, int idx, const char *prefix);
-
int
esxVMX_SCSIDiskNameToControllerAndID(virConnectPtr conn, const char *name,
int *controller, int *id);
const char *absolutePath);
+
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* VMX -> Domain XML
*/
return -1;
for (i = 0; *ptr; i++) {
- idx = (idx + i) * 26;
+ idx = (idx + (i < 1 ? 0 : 1)) * 26;
if (!c_islower(*ptr))
return -1;
return idx;
}
+char *virIndexToDiskName(int idx, const char *prefix)
+{
+ char *name = NULL;
+ int i, k, offset;
+
+ if (idx < 0) {
+ ReportError(NULL, VIR_ERR_INTERNAL_ERROR,
+ _("Disk index %d is negative"), idx);
+ return NULL;
+ }
+
+ for (i = 0, k = idx; k >= 0; ++i, k = k / 26 - 1) { }
+
+ offset = strlen(prefix);
+
+ if (VIR_ALLOC_N(name, offset + i + 1)) {
+ virReportOOMError(NULL);
+ return NULL;
+ }
+
+ strcpy(name, prefix);
+ name[offset + i] = '\0';
+
+ for (i = i - 1, k = idx; k >= 0; --i, k = k / 26 - 1) {
+ name[offset + i] = 'a' + (k % 26);
+ }
+
+ return name;
+}
+
#ifndef AI_CANONIDN
#define AI_CANONIDN 0
#endif
unsigned char *addr);
int virDiskNameToIndex(const char* str);
-
+char *virIndexToDiskName(int idx, const char *prefix);
int virEnumFromString(const char *const*types,
unsigned int ntypes,
#include "internal.h"
#include "memory.h"
#include "testutils.h"
+#include "util.h"
#include "esx/esx_util.h"
-#include "esx/esx_vmx.h"
static char *progname;
for (i = 0; i < ARRAY_CARDINALITY(names); ++i) {
VIR_FREE(name);
- name = esxVMX_IndexToDiskName(NULL, i, "sd");
+ name = virIndexToDiskName(i, "sd");
if (STRNEQ(names[i], name)) {
virtTestDifference(stderr, names[i], name);
return -1;
}
+ }
+
+ VIR_FREE(name);
+
+ return 0;
+}
+
+static int
+testDiskNameToIndex(const void *data ATTRIBUTE_UNUSED)
+{
+ int i, k;
+ char *name = NULL;
+
+ for (i = 0; i < 100000; ++i) {
+ VIR_FREE(name);
+
+ name = virIndexToDiskName(i, "sd");
+ k = virDiskNameToIndex(name);
+
+ if (k != i) {
+ if (virtTestGetDebug() > 0) {
+ fprintf(stderr, "\nExpect [%d]\n", i);
+ fprintf(stderr, "Actual [%d]\n", k);
+ }
- if (virDiskNameToIndex(name) != i) {
VIR_FREE(name);
return -1;
} while (0)
DO_TEST(IndexToDiskName);
+ DO_TEST(DiskNameToIndex);
DO_TEST(ParseDatastoreRelatedPath);
return result == 0 ? EXIT_SUCCESS : EXIT_FAILURE;