/* * parallels_utils.c: core driver functions for managing * Parallels Cloud Server hosts * * Copyright (C) 2012 Parallels, Inc. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; If not, see * . * */ #include #include #include "command.h" #include "virterror_internal.h" #include "memory.h" #include "json.h" #include "parallels_utils.h" #define VIR_FROM_THIS VIR_FROM_PARALLELS static int parallelsDoCmdRun(char **outbuf, const char *binary, va_list list) { virCommandPtr cmd = virCommandNewVAList(binary, list); char *scmd = NULL; int ret = -1; if (outbuf) virCommandSetOutputBuffer(cmd, outbuf); scmd = virCommandToString(cmd); if (!scmd) goto cleanup; if (virCommandRun(cmd, NULL)) goto cleanup; ret = 0; cleanup: VIR_FREE(scmd); virCommandFree(cmd); if (ret && outbuf) VIR_FREE(*outbuf); return ret; } /* * Run command and parse its JSON output, return * pointer to virJSONValue or NULL in case of error. */ virJSONValuePtr parallelsParseOutput(const char *binary, ...) { char *outbuf; virJSONValuePtr jobj = NULL; va_list list; int ret; va_start(list, binary); ret = parallelsDoCmdRun(&outbuf, binary, list); va_end(list); if (ret) return NULL; jobj = virJSONValueFromString(outbuf); if (!jobj) virReportError(VIR_ERR_INTERNAL_ERROR, _("invalid output from prlctl: %s"), outbuf); VIR_FREE(outbuf); return jobj; } /* * Run command and return its output, pointer to * buffer or NULL in case of error. Caller os responsible * for freeing the buffer. */ char * parallelsGetOutput(const char *binary, ...) { char *outbuf; va_list list; int ret; va_start(list, binary); ret = parallelsDoCmdRun(&outbuf, binary, list); va_end(list); if (ret) return NULL; return outbuf; } /* * Run prlctl command and check for errors * * Return value is 0 in case of success, else - -1 */ int parallelsCmdRun(const char *binary, ...) { int ret; va_list list; va_start(list, binary); ret = parallelsDoCmdRun(NULL, binary, list); va_end(list); return ret; } /* * Return new file path in malloced string created by * concatenating first and second function arguments. */ char * parallelsAddFileExt(const char *path, const char *ext) { char *new_path = NULL; size_t len = strlen(path) + strlen(ext) + 1; if (VIR_ALLOC_N(new_path, len) < 0) { virReportOOMError(); return NULL; } if (!virStrcpy(new_path, path, len)) return NULL; strcat(new_path, ext); return new_path; }