X-Git-Url: https://git.ozlabs.org/?p=ccan;a=blobdiff_plain;f=ccan%2Fnfs%2Fportmap.c;fp=ccan%2Fnfs%2Fportmap.c;h=269aded6781464c9938fa5d7a3fe18e4691edcf9;hp=0000000000000000000000000000000000000000;hb=f91748e6a99dfd3b6565aed4e98e84b4365eb9c2;hpb=b581c2380721e6bd2079a80adcb28b0ed0f3552c diff --git a/ccan/nfs/portmap.c b/ccan/nfs/portmap.c new file mode 100644 index 00000000..269aded6 --- /dev/null +++ b/ccan/nfs/portmap.c @@ -0,0 +1,73 @@ +/* + Copyright (C) by Ronnie Sahlberg 2010 + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, see . +*/ + +#include +#include +#include "libnfs.h" +#include "libnfs-raw.h" +#include "libnfs-private.h" +#include "libnfs-raw-portmap.h" + + +int rpc_pmap_null_async(struct rpc_context *rpc, rpc_cb cb, void *private_data) +{ + struct rpc_pdu *pdu; + + pdu = rpc_allocate_pdu(rpc, PMAP_PROGRAM, PMAP_V2, PMAP_NULL, cb, private_data, (xdrproc_t)xdr_void, 0); + if (pdu == NULL) { + rpc_set_error(rpc, "Out of memory. Failed to allocate pdu for portmap/null call"); + return -1; + } + + if (rpc_queue_pdu(rpc, pdu) != 0) { + rpc_set_error(rpc, "Out of memory. Failed to queue pdu for portmap/null call"); + rpc_free_pdu(rpc, pdu); + return -2; + } + + return 0; +} + +int rpc_pmap_getport_async(struct rpc_context *rpc, int program, int version, rpc_cb cb, void *private_data) +{ + struct rpc_pdu *pdu; + struct mapping m; + + pdu = rpc_allocate_pdu(rpc, PMAP_PROGRAM, PMAP_V2, PMAP_GETPORT, cb, private_data, (xdrproc_t)xdr_int, sizeof(uint32_t)); + if (pdu == NULL) { + rpc_set_error(rpc, "Out of memory. Failed to allocate pdu for portmap/getport call"); + return -1; + } + + m.prog = program; + m.vers = version; + m.prot = IPPROTO_TCP; + m.port = 0; + if (xdr_mapping(&pdu->xdr, &m) == 0) { + rpc_set_error(rpc, "XDR error: Failed to encode data for portmap/getport call"); + rpc_free_pdu(rpc, pdu); + return -2; + } + + if (rpc_queue_pdu(rpc, pdu) != 0) { + printf("Failed to queue portmap/getport pdu\n"); + rpc_free_pdu(rpc, pdu); + return -2; + } + + return 0; +}