X-Git-Url: https://git.piment-noir.org/?a=blobdiff_plain;f=lib%2Fpdu.c;h=5def0bc5d9041363b2bc833b5f50677750e5c517;hb=ae8168b3eb2325bd50d2a9e73717b5bf1dcb80eb;hp=7dc1ee317c6dbefcdaa5845f78efac0561be020a;hpb=f3a75078066dd8022e1e52d9cce2256b4fc323d2;p=deb_libnfs.git diff --git a/lib/pdu.c b/lib/pdu.c index 7dc1ee3..5def0bc 100644 --- a/lib/pdu.c +++ b/lib/pdu.c @@ -14,20 +14,33 @@ You should have received a copy of the GNU Lesser General Public License along with this program; if not, see . */ +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#ifdef AROS +#include "aros_compat.h" +#endif + #ifdef WIN32 #include "win32_compat.h" -#ifndef MSG_DONTWAIT -#define MSG_DONTWAIT 0 #endif -#else + +#ifdef HAVE_NETINET_IN_H +#include +#endif + +#ifdef HAVE_SYS_SOCKET_H +#include +#endif + +#ifdef HAVE_STRINGS_H #include -#endif/*WIN32*/ +#endif #include #include #include -#include -#include #include #include #include "slist.h" @@ -61,17 +74,18 @@ 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; - - if (zdr_callmsg(&pdu->zdr, &msg) == 0) { - rpc_set_error(rpc, "zdr_callmsg failed"); + 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); free(pdu); return NULL; @@ -100,6 +114,10 @@ void rpc_free_pdu(struct rpc_context *rpc, struct rpc_pdu *pdu) free(pdu); } +void rpc_set_next_xid(struct rpc_context *rpc, uint32_t xid) +{ + rpc->xid = xid; +} int rpc_queue_pdu(struct rpc_context *rpc, struct rpc_pdu *pdu) { @@ -156,36 +174,41 @@ static int rpc_process_reply(struct rpc_context *rpc, struct rpc_pdu *pdu, ZDR * 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); } pdu->zdr_decode_buf = malloc(pdu->zdr_decode_bufsize); if (pdu->zdr_decode_buf == NULL) { - rpc_set_error(rpc, "zdr_replymsg failed in portmap_getport_reply"); - pdu->cb(rpc, RPC_STATUS_ERROR, "Failed to allocate buffer for decoding of ZDR reply", pdu->private_data); + rpc_set_error(rpc, "Failed to allocate memory for " + "zdr_encode_buf in rpc_process_reply"); + pdu->cb(rpc, RPC_STATUS_ERROR, "Failed to allocate " + "buffer for decoding of ZDR reply", + pdu->private_data); return 0; } 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; - - if (zdr_replymsg(zdr, &msg) == 0) { - rpc_set_error(rpc, "zdr_replymsg failed in portmap_getport_reply"); - pdu->cb(rpc, RPC_STATUS_ERROR, "Message rejected by server", pdu->private_data); + 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(rpc, zdr, &msg) == 0) { + rpc_set_error(rpc, "zdr_replymsg failed in rpc_process_reply: " + "%s", rpc_get_error(rpc)); + pdu->cb(rpc, RPC_STATUS_ERROR, "Message rejected by server", + pdu->private_data); if (pdu->zdr_decode_buf != NULL) { free(pdu->zdr_decode_buf); pdu->zdr_decode_buf = NULL; } 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; @@ -217,7 +240,7 @@ int rpc_process_pdu(struct rpc_context *rpc, char *buf, int size) struct rpc_pdu *pdu; ZDR zdr; int pos, recordmarker = 0; - unsigned int xid; + uint32_t xid; char *reasbuf = NULL; assert(rpc->magic == RPC_CONTEXT_MAGIC);