}
if (!prog) {
- VIR_DEBUG("Cannot find program %d version %d",
- job->msg->header.prog,
- job->msg->header.vers);
- goto error;
+ if (virNetServerProgramUnknownError(job->client,
+ job->msg,
+ &job->msg->header) < 0)
+ goto error;
+ else
+ goto cleanup;
}
virNetServerProgramRef(prog);
goto error;
virNetServerLock(srv);
+
+cleanup:
virNetServerProgramFree(prog);
virNetServerUnlock(srv);
virNetServerClientFree(job->client);
-
VIR_FREE(job);
return;
error:
- virNetServerUnlock(srv);
- virNetServerProgramFree(prog);
virNetMessageFree(job->msg);
virNetServerClientClose(job->client);
- virNetServerClientFree(job->client);
- VIR_FREE(job);
+ goto cleanup;
}
static int
-virNetServerProgramSendError(virNetServerProgramPtr prog,
+virNetServerProgramSendError(unsigned program,
+ unsigned version,
virNetServerClientPtr client,
virNetMessagePtr msg,
virNetMessageErrorPtr rerr,
int serial)
{
VIR_DEBUG("prog=%d ver=%d proc=%d type=%d serial=%d msg=%p rerr=%p",
- prog->program, prog->version, procedure, type, serial, msg, rerr);
+ program, version, procedure, type, serial, msg, rerr);
virNetMessageSaveError(rerr);
/* Return header. */
- msg->header.prog = prog->program;
- msg->header.vers = prog->version;
+ msg->header.prog = program;
+ msg->header.vers = version;
msg->header.proc = procedure;
msg->header.type = type;
msg->header.serial = serial;
* For data streams, errors are sent back as data streams
* For method calls, errors are sent back as method replies
*/
- return virNetServerProgramSendError(prog,
+ return virNetServerProgramSendError(prog->program,
+ prog->version,
client,
msg,
rerr,
int procedure,
int serial)
{
- return virNetServerProgramSendError(prog,
+ return virNetServerProgramSendError(prog->program,
+ prog->version,
client,
msg,
rerr,
}
+int virNetServerProgramUnknownError(virNetServerClientPtr client,
+ virNetMessagePtr msg,
+ virNetMessageHeaderPtr req)
+{
+ virNetMessageError rerr;
+
+ virNetError(VIR_ERR_RPC,
+ _("Cannot find program %d version %d"), req->prog, req->vers);
+
+ memset(&rerr, 0, sizeof(rerr));
+ return virNetServerProgramSendError(req->prog,
+ req->vers,
+ client,
+ msg,
+ &rerr,
+ req->proc,
+ VIR_NET_REPLY,
+ req->serial);
+}
+
+
static int
virNetServerProgramDispatchCall(virNetServerProgramPtr prog,
virNetServerPtr server,