@@ -2892,6 +2892,75 @@ next:
closedir(dir);
}
+static int load_vmw_guest(const char *vm, char **name, int *cid)
+{
+ size_t line_len = 0;
+ char *line = NULL;
+ char *p;
+ FILE *f;
+
+ f = fopen(vm, "r");
+ if (!f)
+ return -errno;
+
+ *cid = -1;
+ *name = NULL;
+ while (getline(&line, &line_len, f) != -1) {
+ if (strncmp(line, "displayName = ", 14) == 0) {
+ p = strrchr(line, '"');
+ if (p)
+ *p = '\0';
+ *name = strdup(line + 15);
+ } else if (strncmp(line, "vmci0.id = ", 11) == 0) {
+ p = strrchr(line, '"');
+ if (p)
+ *p = '\0';
+ *cid = atoi(line + 12);
+ }
+ }
+
+ free(line);
+ fclose(f);
+ return 0;
+}
+
+static void read_vmw_guests(void)
+{
+ static bool initialized;
+ size_t line_len = 0;
+ char *line = NULL;
+ ssize_t ret;
+ FILE *f;
+
+ if (initialized)
+ return;
+
+ initialized = true;
+
+ f = popen("vmrun list", "r");
+ if (!f)
+ return;
+
+ /* Ignore the first line */
+ ret = getline(&line, &line_len, f);
+ while ((ret = getline(&line, &line_len, f)) != -1) {
+ struct guest guest = {};
+
+ if (ret > 0 && line[ret-1] == '\n')
+ line[ret-1] = '\0';
+ if (load_vmw_guest(line, &guest.name, &guest.cid))
+ continue;
+
+ guests = realloc(guests, (guests_len + 1) * sizeof(*guests));
+ if (!guests)
+ die("Can not allocate guest buffer");
+ guests[guests_len++] = guest;
+ }
+
+ free(line);
+ pclose(f);
+}
+
static char *parse_guest_name(char *guest, int *cid, int *port)
{
size_t i;
@@ -2913,6 +2982,7 @@ static char *parse_guest_name(char *guest, int *cid, int *port)
*cid = atoi(guest);
read_qemu_guests();
+ read_vmw_guests();
for (i = 0; i < guests_len; i++) {
if ((*cid > 0 && *cid == guests[i].cid) ||
strcmp(guest, guests[i].name) == 0) {