Take maintenance for libnfs
[deb_libnfs.git] / portmap / portmap.c
CommitLineData
dabf4152
AM
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*/
5670ec6e
AM
17#ifdef WIN32
18#include "win32_compat.h"
19#endif/*WIN32*/
dabf4152
AM
20
21#include <stdio.h>
ee872606 22#include "libnfs-zdr.h"
dabf4152
AM
23#include "libnfs.h"
24#include "libnfs-raw.h"
25#include "libnfs-private.h"
26#include "libnfs-raw-portmap.h"
27
28
29int rpc_pmap_null_async(struct rpc_context *rpc, rpc_cb cb, void *private_data)
30{
31 struct rpc_pdu *pdu;
32
ee872606 33 pdu = rpc_allocate_pdu(rpc, PMAP_PROGRAM, PMAP_V2, PMAP_NULL, cb, private_data, (zdrproc_t)zdr_void, 0);
dabf4152
AM
34 if (pdu == NULL) {
35 rpc_set_error(rpc, "Out of memory. Failed to allocate pdu for portmap/null call");
36 return -1;
37 }
38
39 if (rpc_queue_pdu(rpc, pdu) != 0) {
40 rpc_set_error(rpc, "Out of memory. Failed to queue pdu for portmap/null call");
41 rpc_free_pdu(rpc, pdu);
42 return -1;
43 }
44
45 return 0;
46}
47
fab61e3d 48int rpc_pmap_getport_async(struct rpc_context *rpc, int program, int version, int protocol, rpc_cb cb, void *private_data)
dabf4152
AM
49{
50 struct rpc_pdu *pdu;
51 struct pmap_mapping m;
52
ee872606 53 pdu = rpc_allocate_pdu(rpc, PMAP_PROGRAM, PMAP_V2, PMAP_GETPORT, cb, private_data, (zdrproc_t)zdr_int, sizeof(uint32_t));
dabf4152
AM
54 if (pdu == NULL) {
55 rpc_set_error(rpc, "Out of memory. Failed to allocate pdu for portmap/getport call");
56 return -1;
57 }
58
59 m.prog = program;
60 m.vers = version;
fab61e3d 61 m.prot = protocol;
dabf4152 62 m.port = 0;
ee872606
RRS
63 if (zdr_pmap_mapping(&pdu->zdr, &m) == 0) {
64 rpc_set_error(rpc, "ZDR error: Failed to encode data for portmap/getport call");
dabf4152
AM
65 rpc_free_pdu(rpc, pdu);
66 return -1;
67 }
68
69 if (rpc_queue_pdu(rpc, pdu) != 0) {
70 rpc_set_error(rpc, "Failed to queue portmap/getport pdu");
71 rpc_free_pdu(rpc, pdu);
72 return -1;
73 }
74
75 return 0;
76}
77
fab61e3d
AM
78int rpc_pmap_set_async(struct rpc_context *rpc, int program, int version, int protocol, int port, rpc_cb cb, void *private_data)
79{
80 struct rpc_pdu *pdu;
81 struct pmap_mapping m;
82
ee872606 83 pdu = rpc_allocate_pdu(rpc, PMAP_PROGRAM, PMAP_V2, PMAP_SET, cb, private_data, (zdrproc_t)zdr_int, sizeof(uint32_t));
fab61e3d
AM
84 if (pdu == NULL) {
85 rpc_set_error(rpc, "Out of memory. Failed to allocate pdu for portmap/set call");
86 return -1;
87 }
88
89 m.prog = program;
90 m.vers = version;
91 m.prot = protocol;
92 m.port = port;
ee872606
RRS
93 if (zdr_pmap_mapping(&pdu->zdr, &m) == 0) {
94 rpc_set_error(rpc, "ZDR error: Failed to encode data for portmap/set call");
fab61e3d
AM
95 rpc_free_pdu(rpc, pdu);
96 return -1;
97 }
98
99 if (rpc_queue_pdu(rpc, pdu) != 0) {
100 rpc_set_error(rpc, "Failed to queue portmap/set pdu");
101 rpc_free_pdu(rpc, pdu);
102 return -1;
103 }
104
105 return 0;
106}
107
108int rpc_pmap_unset_async(struct rpc_context *rpc, int program, int version, int protocol, int port, rpc_cb cb, void *private_data)
109{
110 struct rpc_pdu *pdu;
111 struct pmap_mapping m;
112
ee872606 113 pdu = rpc_allocate_pdu(rpc, PMAP_PROGRAM, PMAP_V2, PMAP_UNSET, cb, private_data, (zdrproc_t)zdr_int, sizeof(uint32_t));
fab61e3d
AM
114 if (pdu == NULL) {
115 rpc_set_error(rpc, "Out of memory. Failed to allocate pdu for portmap/unset call");
116 return -1;
117 }
118
119 m.prog = program;
120 m.vers = version;
121 m.prot = protocol;
122 m.port = port;
ee872606
RRS
123 if (zdr_pmap_mapping(&pdu->zdr, &m) == 0) {
124 rpc_set_error(rpc, "ZDR error: Failed to encode data for portmap/unset call");
fab61e3d
AM
125 rpc_free_pdu(rpc, pdu);
126 return -1;
127 }
128
129 if (rpc_queue_pdu(rpc, pdu) != 0) {
130 rpc_set_error(rpc, "Failed to queue portmap/unset pdu");
131 rpc_free_pdu(rpc, pdu);
132 return -1;
133 }
134
135 return 0;
136}
137
ee872606
RRS
138int rpc_pmap_dump_async(struct rpc_context *rpc, rpc_cb cb, void *private_data)
139{
140 struct rpc_pdu *pdu;
141
142 pdu = rpc_allocate_pdu(rpc, PMAP_PROGRAM, PMAP_V2, PMAP_DUMP, cb, private_data, (zdrproc_t)zdr_pmap_dump_result, sizeof(pmap_dump_result));
143 if (pdu == NULL) {
144 rpc_set_error(rpc, "Out of memory. Failed to allocate pdu for portmap/dump call");
145 return -1;
146 }
147
148 if (rpc_queue_pdu(rpc, pdu) != 0) {
149 rpc_set_error(rpc, "Failed to queue portmap/dump pdu");
150 rpc_free_pdu(rpc, pdu);
151 return -1;
152 }
153
154 return 0;
155}
156
157int rpc_pmap_callit_async(struct rpc_context *rpc, int program, int version, int procedure, char *data, int datalen, rpc_cb cb, void *private_data)
dabf4152
AM
158{
159 struct rpc_pdu *pdu;
160 struct pmap_call_args ca;
161
ee872606 162 pdu = rpc_allocate_pdu(rpc, PMAP_PROGRAM, PMAP_V2, PMAP_CALLIT, cb, private_data, (zdrproc_t)zdr_pmap_call_result, sizeof(pmap_call_result));
dabf4152
AM
163 if (pdu == NULL) {
164 rpc_set_error(rpc, "Out of memory. Failed to allocate pdu for portmap/callit call");
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
ee872606
RRS
174 if (zdr_pmap_call_args(&pdu->zdr, &ca) == 0) {
175 rpc_set_error(rpc, "ZDR error: Failed to encode data for portmap/callit call");
dabf4152
AM
176 rpc_free_pdu(rpc, pdu);
177 return -1;
178 }
179
180 if (rpc_queue_pdu(rpc, pdu) != 0) {
181 rpc_set_error(rpc, "Failed to queue portmap/callit pdu: %s", rpc_get_error(rpc));
182 return -1;
183 }
184
185 return 0;
186}