virNetServerPtr virNetDaemonAddServerPostExec(virNetDaemonPtr dmn, virNetServerClientPrivNew clientPrivNew, virNetServerClientPrivNewPostExecRestart clientPrivNewPostExecRestart, virNetServerClientPrivPreExecRestart clientPrivPreExecRestart, virFreeCallback clientPrivFree, void *clientPrivOpaque) { virJSONValuePtr object = NULL; virNetServerPtr srv = NULL; virObjectLock(dmn); if (!dmn->srvObject) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("Cannot add more servers post-exec than " "there were pre-exec")); goto error; } if (virJSONValueIsArray(dmn->srvObject)) { object = virJSONValueArraySteal(dmn->srvObject, 0); if (virJSONValueArraySize(dmn->srvObject) == 0) { virJSONValueFree(dmn->srvObject); dmn->srvObject = NULL; } } else { object = dmn->srvObject; dmn->srvObject = NULL; } srv = virNetServerNewPostExecRestart(object, clientPrivNew, clientPrivNewPostExecRestart, clientPrivPreExecRestart, clientPrivFree, clientPrivOpaque); if (!srv || VIR_APPEND_ELEMENT_COPY(dmn->servers, dmn->nservers, srv) < 0) goto error; virJSONValueFree(object); virObjectUnlock(dmn); return srv; error: virObjectUnlock(dmn); virObjectUnref(srv); virJSONValueFree(object); return NULL; }
static int testExecRestart(const void *opaque) { int ret = -1; virNetServerPtr srv = NULL; const struct testExecRestartData *data = opaque; char *infile = NULL, *outfile = NULL; char *injsonstr = NULL, *outjsonstr = NULL; virJSONValuePtr injson = NULL, outjson = NULL; int fdclient[2] = { -1, -1 }, fdserver[2] = { -1, -1 }; if (socketpair(PF_UNIX, SOCK_STREAM, 0, fdclient) < 0) { virReportSystemError(errno, "%s", "Cannot create socket pair"); goto cleanup; } if (socketpair(PF_UNIX, SOCK_STREAM, 0, fdserver) < 0) { virReportSystemError(errno, "%s", "Cannot create socket pair"); goto cleanup; } /* We're blindly assuming the test case isn't using * fds 100->103 for something else, which is probably * fairly reasonable in general */ dup2(fdserver[0], 100); dup2(fdserver[1], 101); dup2(fdclient[0], 102); dup2(fdclient[1], 103); if (virAsprintf(&infile, "%s/virnetserverdata/input-data-%s.json", abs_srcdir, data->jsonfile) < 0) goto cleanup; if (virAsprintf(&outfile, "%s/virnetserverdata/output-data-%s.json", abs_srcdir, data->jsonfile) < 0) goto cleanup; if (virFileReadAll(infile, 8192, &injsonstr) < 0) goto cleanup; if (!(injson = virJSONValueFromString(injsonstr))) goto cleanup; if (!(srv = virNetServerNewPostExecRestart(injson, NULL, NULL, NULL, NULL, NULL))) goto cleanup; if (!(outjson = virNetServerPreExecRestart(srv))) goto cleanup; if (!(outjsonstr = virJSONValueToString(outjson, true))) goto cleanup; if (virtTestCompareToFile(outjsonstr, outfile) < 0) goto fail; ret = 0; cleanup: if (ret < 0) { virErrorPtr err = virGetLastError(); /* Rather be safe, we have lot of missing errors */ if (err) fprintf(stderr, "%s\n", err->message); else fprintf(stderr, "%s\n", "Unknown error"); } fail: VIR_FREE(infile); VIR_FREE(outfile); VIR_FREE(injsonstr); VIR_FREE(outjsonstr); virJSONValueFree(injson); virJSONValueFree(outjson); virObjectUnref(srv); VIR_FORCE_CLOSE(fdserver[0]); VIR_FORCE_CLOSE(fdserver[1]); VIR_FORCE_CLOSE(fdclient[0]); VIR_FORCE_CLOSE(fdclient[1]); return ret; }