[libvirt] [PATCH] hypervisor driver for Jailhouse
Christian Loehle
cloehle at linutronix.de
Fri Nov 13 09:28:02 UTC 2015
On 11/11/2015 10:17 AM, Daniel P. Berrange wrote:
>> + virCommandSetOutputBuffer(cmd, &output);
>> + size_t count = -1; // Don't count table header line
>> + size_t i = 0;
>> + if (virCommandRun(cmd, NULL) < 0)
>> + goto error;
>> + while (output[i] != '\0') {
>> + if (output[i] == '\n') count++;
>> + i++;
>> + }
>> + if (VIR_ALLOC_N(*parsedOutput, count)) {
>> + virReportError(VIR_ERR_INTERNAL_ERROR,
>> + _("Failed to allocate jailhouse_cell array of size %zu"), count);
>
> Again no need to report error. You need to check
>
> VIR_ALLOC_N(...) < 0
>
> too - this error check is inverted right now
I removed the report, but I don't quite understand why this check would be inverted.
VIR_ALLOC_N returns 0 on success, in which case it won't enter the if block and -1 on failure(OOM) in which case the if block will be entered.
Care to elaborate?
>> + i = 0;
>> + size_t j;
>> + while (output[i++] != '\n'); // Skip table header line
>> + for (j = 0; j < count; j++) {
>> + size_t k;
>> + for (k = 0; k <= IDLENGTH; k++) // char after number needs to be NUL for virStrToLong
>> + if (output[i+k] == ' ') {
>> + output[i+k] = '\0';
>> + break;
>> + }
>> + char c = output[i+IDLENGTH];
>> + output[i+IDLENGTH] = '\0'; // in case ID is 8 chars long, so beginning of name won't get parsed
>> + if (virStrToLong_i(output+i, NULL, 0, &(*parsedOutput)[j].id))
>> + virReportError(VIR_ERR_INTERNAL_ERROR,
>> + _("Failed to parse id to long: %s"), output+i);
>> + output[i+IDLENGTH] = c;
>> + i += IDLENGTH;
>> + if (virStrncpy((*parsedOutput)[j].name, output+i, NAMELENGTH, NAMELENGTH+1) == NULL)
>> + // should never happen
>> + goto error;
>> + (*parsedOutput)[j].name[NAMELENGTH] = '\0';
>> + for (k = 0; k < NAMELENGTH; k++)
>> + if ((*parsedOutput)[j].name[k] == ' ')
>> + break;
>> + (*parsedOutput)[j].name[k] = '\0';
>> + i += NAMELENGTH;
>> + if (STREQLEN(output+i, STATERUNNINGSTRING, STATELENGTH)) (*parsedOutput)[j].state = STATERUNNING;
>> + else if (STREQLEN(output+i, STATESHUTDOWNSTRING, STATELENGTH)) (*parsedOutput)[j].state = STATESHUTDOWN;
>> + else if (STREQLEN(output+i, STATEFAILEDSTRING, STATELENGTH)) (*parsedOutput)[j].state = STATEFAILED;
>> + else if (STREQLEN(output+i, STATERUNNINGLOCKEDSTRING, STATELENGTH)) (*parsedOutput)[j].state = STATERUNNINGLOCKED;
>> + i += STATELENGTH;
>> + (*parsedOutput)[j].assignedCPUsLength = parseCPUs(output+i, &((*parsedOutput)[j].assignedCPUs));
>> + i += CPULENGTH;
>> + (*parsedOutput)[j].failedCPUsLength = parseCPUs(output+i, &((*parsedOutput)[j].failedCPUs));
>> + i += CPULENGTH;
>> + i++; // skip \n
>> + }
>
> It would be nice to include an example of the 'cell list' output to understand
> what this code is trying to parse. Then i migth be able to suggest a way
> to do this more simply.
ID Name State Assigned CPUs Failed CPUs
0 QEMU-VM running 0-3
More information about the libvir-list
mailing list