PORTMAP: Rename the functions in PMAP to PMAP2 to desribe the version of PMAP we...
[deb_libnfs.git] / portmap / portmap.c
CommitLineData
84004dbf
RS
1/*
2 Copyright (C) 2010 by Ronnie Sahlberg <ronniesahlberg@gmail.com>
3
4 This program is free software; you can redistribute it and/or modify
5 it under the terms of the GNU Lesser General Public License as published by
6 the Free Software Foundation; either version 2.1 of the License, or
7 (at your option) any later version.
8
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU Lesser General Public License for more details.
13
14 You should have received a copy of the GNU Lesser General Public License
15 along with this program; if not, see <http://www.gnu.org/licenses/>.
16*/
a8a1b858
M
17#ifdef WIN32
18#include "win32_compat.h"
19#endif/*WIN32*/
84004dbf
RS
20
21#include <stdio.h>
763cd6e3 22#include "libnfs-zdr.h"
84004dbf
RS
23#include "libnfs.h"
24#include "libnfs-raw.h"
25#include "libnfs-private.h"
26#include "libnfs-raw-portmap.h"
27
28
0f0e352f 29int rpc_pmap2_null_async(struct rpc_context *rpc, rpc_cb cb, void *private_data)
84004dbf
RS
30{
31 struct rpc_pdu *pdu;
32
0f0e352f 33 pdu = rpc_allocate_pdu(rpc, PMAP_PROGRAM, PMAP_V2, PMAP2_NULL, cb, private_data, (zdrproc_t)zdr_void, 0);
84004dbf 34 if (pdu == NULL) {
0f0e352f 35 rpc_set_error(rpc, "Out of memory. Failed to allocate pdu for PORTMAP2/NULL call");
84004dbf
RS
36 return -1;
37 }
38
39 if (rpc_queue_pdu(rpc, pdu) != 0) {
0f0e352f 40 rpc_set_error(rpc, "Out of memory. Failed to queue pdu for PORTMAP2/NULL call");
84004dbf 41 rpc_free_pdu(rpc, pdu);
1896d37b 42 return -1;
84004dbf
RS
43 }
44
45 return 0;
46}
47
0f0e352f 48int rpc_pmap2_getport_async(struct rpc_context *rpc, int program, int version, int protocol, rpc_cb cb, void *private_data)
84004dbf
RS
49{
50 struct rpc_pdu *pdu;
870b3764 51 struct pmap_mapping m;
84004dbf 52
0f0e352f 53 pdu = rpc_allocate_pdu(rpc, PMAP_PROGRAM, PMAP_V2, PMAP2_GETPORT, cb, private_data, (zdrproc_t)zdr_int, sizeof(uint32_t));
84004dbf 54 if (pdu == NULL) {
0f0e352f 55 rpc_set_error(rpc, "Out of memory. Failed to allocate pdu for PORTMAP2/GETPORT call");
84004dbf
RS
56 return -1;
57 }
58
59 m.prog = program;
60 m.vers = version;
5c6b1176 61 m.prot = protocol;
84004dbf 62 m.port = 0;
763cd6e3 63 if (zdr_pmap_mapping(&pdu->zdr, &m) == 0) {
0f0e352f 64 rpc_set_error(rpc, "ZDR error: Failed to encode data for PORTMAP2/GETPORT call");
84004dbf 65 rpc_free_pdu(rpc, pdu);
1896d37b 66 return -1;
84004dbf
RS
67 }
68
69 if (rpc_queue_pdu(rpc, pdu) != 0) {
0f0e352f 70 rpc_set_error(rpc, "Failed to queue PORTMAP2/GETPORT pdu");
84004dbf 71 rpc_free_pdu(rpc, pdu);
1896d37b 72 return -1;
84004dbf
RS
73 }
74
75 return 0;
76}
fd59fd0d 77
0f0e352f 78int rpc_pmap2_set_async(struct rpc_context *rpc, int program, int version, int protocol, int port, rpc_cb cb, void *private_data)
1fbe4080
RS
79{
80 struct rpc_pdu *pdu;
81 struct pmap_mapping m;
82
0f0e352f 83 pdu = rpc_allocate_pdu(rpc, PMAP_PROGRAM, PMAP_V2, PMAP2_SET, cb, private_data, (zdrproc_t)zdr_int, sizeof(uint32_t));
1fbe4080 84 if (pdu == NULL) {
0f0e352f 85 rpc_set_error(rpc, "Out of memory. Failed to allocate pdu for PORTMAP2/SET call");
1fbe4080
RS
86 return -1;
87 }
88
89 m.prog = program;
90 m.vers = version;
91 m.prot = protocol;
92 m.port = port;
763cd6e3 93 if (zdr_pmap_mapping(&pdu->zdr, &m) == 0) {
0f0e352f 94 rpc_set_error(rpc, "ZDR error: Failed to encode data for PORTMAP2/SET call");
1fbe4080
RS
95 rpc_free_pdu(rpc, pdu);
96 return -1;
97 }
98
99 if (rpc_queue_pdu(rpc, pdu) != 0) {
0f0e352f 100 rpc_set_error(rpc, "Failed to queue PORTMAP2/SET pdu");
1fbe4080
RS
101 rpc_free_pdu(rpc, pdu);
102 return -1;
103 }
104
105 return 0;
106}
107
0f0e352f 108int rpc_pmap2_unset_async(struct rpc_context *rpc, int program, int version, int protocol, int port, rpc_cb cb, void *private_data)
1fbe4080
RS
109{
110 struct rpc_pdu *pdu;
111 struct pmap_mapping m;
112
0f0e352f 113 pdu = rpc_allocate_pdu(rpc, PMAP_PROGRAM, PMAP_V2, PMAP2_UNSET, cb, private_data, (zdrproc_t)zdr_int, sizeof(uint32_t));
1fbe4080 114 if (pdu == NULL) {
0f0e352f 115 rpc_set_error(rpc, "Out of memory. Failed to allocate pdu for PORTMAP2/UNSET call");
1fbe4080
RS
116 return -1;
117 }
118
119 m.prog = program;
120 m.vers = version;
121 m.prot = protocol;
122 m.port = port;
763cd6e3 123 if (zdr_pmap_mapping(&pdu->zdr, &m) == 0) {
0f0e352f 124 rpc_set_error(rpc, "ZDR error: Failed to encode data for PORTMAP2/UNSET call");
1fbe4080
RS
125 rpc_free_pdu(rpc, pdu);
126 return -1;
127 }
128
129 if (rpc_queue_pdu(rpc, pdu) != 0) {
0f0e352f 130 rpc_set_error(rpc, "Failed to queue PORTMAP2/UNSET pdu");
1fbe4080
RS
131 rpc_free_pdu(rpc, pdu);
132 return -1;
133 }
134
135 return 0;
136}
137
0f0e352f 138int rpc_pmap2_dump_async(struct rpc_context *rpc, rpc_cb cb, void *private_data)
8ae943f6
RS
139{
140 struct rpc_pdu *pdu;
141
0f0e352f 142 pdu = rpc_allocate_pdu(rpc, PMAP_PROGRAM, PMAP_V2, PMAP2_DUMP, cb, private_data, (zdrproc_t)zdr_pmap_dump_result, sizeof(pmap_dump_result));
8ae943f6 143 if (pdu == NULL) {
0f0e352f 144 rpc_set_error(rpc, "Out of memory. Failed to allocate pdu for PORTMAP2/DUMP call");
8ae943f6
RS
145 return -1;
146 }
147
148 if (rpc_queue_pdu(rpc, pdu) != 0) {
0f0e352f 149 rpc_set_error(rpc, "Failed to queue PORTMAP2/DUMP pdu");
8ae943f6
RS
150 rpc_free_pdu(rpc, pdu);
151 return -1;
152 }
153
154 return 0;
155}
156
0f0e352f 157int rpc_pmap2_callit_async(struct rpc_context *rpc, int program, int version, int procedure, char *data, int datalen, rpc_cb cb, void *private_data)
fd59fd0d
RS
158{
159 struct rpc_pdu *pdu;
160 struct pmap_call_args ca;
161
0f0e352f 162 pdu = rpc_allocate_pdu(rpc, PMAP_PROGRAM, PMAP_V2, PMAP2_CALLIT, cb, private_data, (zdrproc_t)zdr_pmap_call_result, sizeof(pmap_call_result));
fd59fd0d 163 if (pdu == NULL) {
0f0e352f 164 rpc_set_error(rpc, "Out of memory. Failed to allocate pdu for PORTMAP2/CALLIT call");
fd59fd0d
RS
165 return -1;
166 }
167
168 ca.prog = program;
169 ca.vers = version;
170 ca.proc = procedure;
171 ca.args.args_len = datalen;
172 ca.args.args_val = data;
173
763cd6e3 174 if (zdr_pmap_call_args(&pdu->zdr, &ca) == 0) {
0f0e352f 175 rpc_set_error(rpc, "ZDR error: Failed to encode data for PORTMAP2/CALLIT call");
fd59fd0d
RS
176 rpc_free_pdu(rpc, pdu);
177 return -1;
178 }
179
180 if (rpc_queue_pdu(rpc, pdu) != 0) {
0f0e352f 181 rpc_set_error(rpc, "Failed to queue PORTMAP2/CALLIT pdu: %s", rpc_get_error(rpc));
fd59fd0d
RS
182 return -1;
183 }
184
185 return 0;
186}