- pdu->xdr_decode_fn = xdr_decode_fn;
- pdu->xdr_decode_bufsize = xdr_decode_bufsize;
-
- xdrmem_create(&pdu->xdr, rpc->encodebuf, rpc->encodebuflen, XDR_ENCODE);
- xdr_setpos(&pdu->xdr, 4); /* skip past the record marker */
-
- bzero(&msg, sizeof(struct rpc_msg));
- msg.rm_xid = pdu->xid;
- msg.rm_direction = CALL;
- msg.rm_call.cb_rpcvers = RPC_MSG_VERSION;
- msg.rm_call.cb_prog = program;
- msg.rm_call.cb_vers = version;
- msg.rm_call.cb_proc = procedure;
- msg.rm_call.cb_cred = rpc->auth->ah_cred;
- msg.rm_call.cb_verf = rpc->auth->ah_verf;
-
- if (xdr_callmsg(&pdu->xdr, &msg) == 0) {
- rpc_set_error(rpc, "xdr_callmsg failed");
- xdr_destroy(&pdu->xdr);
+ pdu->zdr_decode_fn = zdr_decode_fn;
+ pdu->zdr_decode_bufsize = zdr_decode_bufsize;
+
+ zdrmem_create(&pdu->zdr, rpc->encodebuf, rpc->encodebuflen, ZDR_ENCODE);
+ if (rpc->is_udp == 0) {
+ zdr_setpos(&pdu->zdr, 4); /* skip past the record marker */
+ }
+
+ memset(&msg, 0, sizeof(struct rpc_msg));
+ msg.xid = pdu->xid;
+ msg.direction = CALL;
+ msg.body.cbody.rpcvers = RPC_MSG_VERSION;
+ msg.body.cbody.prog = program;
+ msg.body.cbody.vers = version;
+ msg.body.cbody.proc = procedure;
+ msg.body.cbody.cred = rpc->auth->ah_cred;
+ msg.body.cbody.verf = rpc->auth->ah_verf;
+
+ if (zdr_callmsg(rpc, &pdu->zdr, &msg) == 0) {
+ rpc_set_error(rpc, "zdr_callmsg failed with %s",
+ rpc_get_error(rpc));
+ zdr_destroy(&pdu->zdr);