static Bool VMGuestLibIoctl(const GuestLibIoctlParam *param, char **reply, size_t *replySize) { XDR xdrs; Bool ret; static const char *request = VMGUESTLIB_IOCTL_COMMAND_STRING " "; if (param == NULL || param->d >= GUESTLIB_IOCTL_MAX) { return FALSE; } if (NULL == DynXdr_Create(&xdrs)) { return FALSE; } if (!DynXdr_AppendRaw(&xdrs, request, strlen(request)) || !xdr_GuestLibIoctlParam(&xdrs, (GuestLibIoctlParam *)param)) { DynXdr_Destroy(&xdrs, TRUE); return FALSE; } ret = RpcChannel_SendOneRaw(DynXdr_Get(&xdrs), xdr_getpos(&xdrs), reply, replySize); DynXdr_Destroy(&xdrs, TRUE); return ret; }
gboolean RpcChannel_BuildXdrCommand(const char *cmd, void *xdrProc, void *xdrData, char **result, size_t *resultLen) { Bool ret = FALSE; xdrproc_t proc = xdrProc; XDR xdrs; if (DynXdr_Create(&xdrs) == NULL) { return FALSE; } if (!DynXdr_AppendRaw(&xdrs, cmd, strlen(cmd))) { goto exit; } if (!DynXdr_AppendRaw(&xdrs, " ", 1)) { goto exit; } if (!proc(&xdrs, xdrData)) { goto exit; } *result = DynXdr_Get(&xdrs); *resultLen = xdr_getpos(&xdrs); ret = TRUE; exit: DynXdr_Destroy(&xdrs, !ret); return ret; }