static int lxcCreateConsoles(virDomainDefPtr def, virConfPtr properties) { VIR_AUTOFREE(char *) value = NULL; int nbttys = 0; virDomainChrDefPtr console; size_t i; if (virConfGetValueString(properties, "lxc.tty.max", &value) <= 0) { virResetLastError(); /* Check for pre LXC 3.0 legacy key */ if (virConfGetValueString(properties, "lxc.tty", &value) <= 0) return 0; } if (virStrToLong_i(value, NULL, 10, &nbttys) < 0) { virReportError(VIR_ERR_INTERNAL_ERROR, _("failed to parse int: '%s'"), value); return -1; } if (VIR_ALLOC_N(def->consoles, nbttys) < 0) return -1; def->nconsoles = nbttys; for (i = 0; i < nbttys; i++) { if (!(console = virDomainChrDefNew(NULL))) goto error; console->deviceType = VIR_DOMAIN_CHR_DEVICE_TYPE_CONSOLE; console->targetType = VIR_DOMAIN_CHR_CONSOLE_TARGET_TYPE_LXC; console->target.port = i; console->source->type = VIR_DOMAIN_CHR_TYPE_PTY; def->consoles[i] = console; } return 0; error: virDomainChrDefFree(console); return -1; }
static int lxcCreateConsoles(virDomainDefPtr def, virConfPtr properties) { virConfValuePtr value; int nbttys = 0; virDomainChrDefPtr console; size_t i; if (!(value = virConfGetValue(properties, "lxc.tty")) || !value->str) return 0; if (virStrToLong_i(value->str, NULL, 10, &nbttys) < 0) { virReportError(VIR_ERR_INTERNAL_ERROR, _("failed to parse int: '%s'"), value->str); return -1; } if (VIR_ALLOC_N(def->consoles, nbttys) < 0) return -1; def->nconsoles = nbttys; for (i = 0; i < nbttys; i++) { if (!(console = virDomainChrDefNew())) goto error; console->deviceType = VIR_DOMAIN_CHR_DEVICE_TYPE_CONSOLE; console->targetType = VIR_DOMAIN_CHR_CONSOLE_TARGET_TYPE_LXC; console->target.port = i; console->source.type = VIR_DOMAIN_CHR_TYPE_PTY; def->consoles[i] = console; } return 0; error: virDomainChrDefFree(console); return -1; }
static int bhyveParseBhyveLPCArg(virDomainDefPtr def, unsigned caps ATTRIBUTE_UNUSED, const char *arg) { /* -l emulation[,config] */ const char *separator = NULL; const char *param = NULL; size_t last = 0; virDomainChrDefPtr chr = NULL; char *type = NULL; separator = strchr(arg, ','); param = separator + 1; if (!separator) goto error; if (VIR_STRNDUP(type, arg, separator - arg) < 0) goto error; /* Only support com%d */ if (STRPREFIX(type, "com") && type[4] == 0) { if (!(chr = virDomainChrDefNew(NULL))) goto error; chr->source->type = VIR_DOMAIN_CHR_TYPE_NMDM; chr->source->data.nmdm.master = NULL; chr->source->data.nmdm.slave = NULL; chr->deviceType = VIR_DOMAIN_CHR_DEVICE_TYPE_SERIAL; if (!STRPREFIX(param, "/dev/nmdm")) { virReportError(VIR_ERR_OPERATION_FAILED, _("Failed to set com port %s: does not start with " "'/dev/nmdm'."), type); goto error; } if (VIR_STRDUP(chr->source->data.nmdm.master, param) < 0) { virDomainChrDefFree(chr); goto error; } if (VIR_STRDUP(chr->source->data.nmdm.slave, chr->source->data.file.path) < 0) { virDomainChrDefFree(chr); goto error; } /* If the last character of the master is 'A', the slave will be 'B' * and vice versa */ last = strlen(chr->source->data.nmdm.master) - 1; switch (chr->source->data.file.path[last]) { case 'A': chr->source->data.nmdm.slave[last] = 'B'; break; case 'B': chr->source->data.nmdm.slave[last] = 'A'; break; default: virReportError(VIR_ERR_OPERATION_FAILED, _("Failed to set slave for %s: last letter not " "'A' or 'B'"), NULLSTR(chr->source->data.nmdm.master)); goto error; } switch (type[3]-'0') { case 1: case 2: chr->target.port = type[3] - '1'; break; default: virReportError(VIR_ERR_OPERATION_FAILED, _("Failed to parse %s: only com1 and com2" " supported."), type); goto error; break; } if (VIR_APPEND_ELEMENT(def->serials, def->nserials, chr) < 0) { virDomainChrDefFree(chr); goto error; } } VIR_FREE(type); return 0; error: virDomainChrDefFree(chr); VIR_FREE(type); return -1; }