X-Git-Url: https://git.piment-noir.org/?a=blobdiff_plain;f=lib%2Fpdu.c;h=5dff51780d6b2edfe21ec5c03265c8515c810e07;hb=108c622a9561676b4df437c318959f79e42d4675;hp=1a9547f57b50ef3c92d043e6971b0e4db14b3afb;hpb=763cd6e3e2bbb6906186e7ed6a86660276b596b7;p=deb_libnfs.git diff --git a/lib/pdu.c b/lib/pdu.c index 1a9547f..5dff517 100644 --- a/lib/pdu.c +++ b/lib/pdu.c @@ -14,11 +14,12 @@ You should have received a copy of the GNU Lesser General Public License along with this program; if not, see . */ +#ifdef AROS +#include "aros_compat.h" +#endif + #ifdef WIN32 #include "win32_compat.h" -#ifndef MSG_DONTWAIT -#define MSG_DONTWAIT 0 -#endif #else #include #endif/*WIN32*/ @@ -28,6 +29,7 @@ #include #include #include +#include #include #include "slist.h" #include "libnfs-zdr.h" @@ -40,9 +42,7 @@ struct rpc_pdu *rpc_allocate_pdu(struct rpc_context *rpc, int program, int versi struct rpc_pdu *pdu; struct rpc_msg msg; - if (rpc == NULL) { - return NULL; - } + assert(rpc->magic == RPC_CONTEXT_MAGIC); pdu = malloc(sizeof(struct rpc_pdu)); if (pdu == NULL) { @@ -62,14 +62,14 @@ struct rpc_pdu *rpc_allocate_pdu(struct rpc_context *rpc, int program, int versi } memset(&msg, 0, 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; + 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(&pdu->zdr, &msg) == 0) { rpc_set_error(rpc, "zdr_callmsg failed"); @@ -81,8 +81,10 @@ struct rpc_pdu *rpc_allocate_pdu(struct rpc_context *rpc, int program, int versi return pdu; } -void rpc_free_pdu(struct rpc_context *rpc _U_, struct rpc_pdu *pdu) +void rpc_free_pdu(struct rpc_context *rpc, struct rpc_pdu *pdu) { + assert(rpc->magic == RPC_CONTEXT_MAGIC); + if (pdu->outdata.data != NULL) { free(pdu->outdata.data); pdu->outdata.data = NULL; @@ -104,6 +106,8 @@ int rpc_queue_pdu(struct rpc_context *rpc, struct rpc_pdu *pdu) { int size, recordmarker; + assert(rpc->magic == RPC_CONTEXT_MAGIC); + size = zdr_getpos(&pdu->zdr); /* for udp we dont queue, we just send it straight away */ @@ -150,8 +154,10 @@ static int rpc_process_reply(struct rpc_context *rpc, struct rpc_pdu *pdu, ZDR * { struct rpc_msg msg; + assert(rpc->magic == RPC_CONTEXT_MAGIC); + memset(&msg, 0, sizeof(struct rpc_msg)); - msg.acpted_rply.ar_verf = _null_auth; + msg.body.rbody.reply.areply.verf = _null_auth; if (pdu->zdr_decode_bufsize > 0) { if (pdu->zdr_decode_buf != NULL) { free(pdu->zdr_decode_buf); @@ -164,8 +170,8 @@ static int rpc_process_reply(struct rpc_context *rpc, struct rpc_pdu *pdu, ZDR * } memset(pdu->zdr_decode_buf, 0, pdu->zdr_decode_bufsize); } - msg.acpted_rply.ar_results.where = pdu->zdr_decode_buf; - msg.acpted_rply.ar_results.proc = pdu->zdr_decode_fn; + msg.body.rbody.reply.areply.reply_data.results.where = pdu->zdr_decode_buf; + msg.body.rbody.reply.areply.reply_data.results.proc = pdu->zdr_decode_fn; if (zdr_replymsg(zdr, &msg) == 0) { rpc_set_error(rpc, "zdr_replymsg failed in portmap_getport_reply"); @@ -176,11 +182,11 @@ static int rpc_process_reply(struct rpc_context *rpc, struct rpc_pdu *pdu, ZDR * } return 0; } - if (msg.rm_reply.rp_stat != MSG_ACCEPTED) { + if (msg.body.rbody.stat != MSG_ACCEPTED) { pdu->cb(rpc, RPC_STATUS_ERROR, "RPC Packet not accepted by the server", pdu->private_data); return 0; } - switch (msg.rm_reply.rp_acpt.ar_stat) { + switch (msg.body.rbody.reply.areply.stat) { case SUCCESS: pdu->cb(rpc, RPC_STATUS_SUCCESS, pdu->zdr_decode_buf, pdu->private_data); break; @@ -215,6 +221,8 @@ int rpc_process_pdu(struct rpc_context *rpc, char *buf, int size) unsigned int xid; char *reasbuf = NULL; + assert(rpc->magic == RPC_CONTEXT_MAGIC); + memset(&zdr, 0, sizeof(ZDR)); zdrmem_create(&zdr, buf, size, ZDR_DECODE); @@ -237,7 +245,7 @@ int rpc_process_pdu(struct rpc_context *rpc, char *buf, int size) /* reassembly */ if (recordmarker != 0 && rpc->fragments != NULL) { struct rpc_fragment *fragment; - uint64_t total = size - 4; + uint32_t total = size - 4; char *ptr; zdr_destroy(&zdr);