diff options
Diffstat (limited to 'net/sunrpc/pmap_clnt.c')
-rw-r--r-- | net/sunrpc/pmap_clnt.c | 34 |
1 files changed, 22 insertions, 12 deletions
diff --git a/net/sunrpc/pmap_clnt.c b/net/sunrpc/pmap_clnt.c index efa00bd9ff9e..d25b054ec921 100644 --- a/net/sunrpc/pmap_clnt.c +++ b/net/sunrpc/pmap_clnt.c | |||
@@ -104,6 +104,11 @@ rpc_getport_external(struct sockaddr_in *sin, __u32 prog, __u32 vers, int prot) | |||
104 | .pm_prot = prot, | 104 | .pm_prot = prot, |
105 | .pm_port = 0 | 105 | .pm_port = 0 |
106 | }; | 106 | }; |
107 | struct rpc_message msg = { | ||
108 | .rpc_proc = &pmap_procedures[PMAP_GETPORT], | ||
109 | .rpc_argp = &map, | ||
110 | .rpc_resp = &map.pm_port, | ||
111 | }; | ||
107 | struct rpc_clnt *pmap_clnt; | 112 | struct rpc_clnt *pmap_clnt; |
108 | char hostname[32]; | 113 | char hostname[32]; |
109 | int status; | 114 | int status; |
@@ -117,7 +122,7 @@ rpc_getport_external(struct sockaddr_in *sin, __u32 prog, __u32 vers, int prot) | |||
117 | return PTR_ERR(pmap_clnt); | 122 | return PTR_ERR(pmap_clnt); |
118 | 123 | ||
119 | /* Setup the call info struct */ | 124 | /* Setup the call info struct */ |
120 | status = rpc_call(pmap_clnt, PMAP_GETPORT, &map, &map.pm_port, 0); | 125 | status = rpc_call_sync(pmap_clnt, &msg, 0); |
121 | 126 | ||
122 | if (status >= 0) { | 127 | if (status >= 0) { |
123 | if (map.pm_port != 0) | 128 | if (map.pm_port != 0) |
@@ -162,16 +167,27 @@ pmap_getport_done(struct rpc_task *task) | |||
162 | int | 167 | int |
163 | rpc_register(u32 prog, u32 vers, int prot, unsigned short port, int *okay) | 168 | rpc_register(u32 prog, u32 vers, int prot, unsigned short port, int *okay) |
164 | { | 169 | { |
165 | struct sockaddr_in sin; | 170 | struct sockaddr_in sin = { |
166 | struct rpc_portmap map; | 171 | .sin_family = AF_INET, |
172 | .sin_addr.s_addr = htonl(INADDR_LOOPBACK), | ||
173 | }; | ||
174 | struct rpc_portmap map = { | ||
175 | .pm_prog = prog, | ||
176 | .pm_vers = vers, | ||
177 | .pm_prot = prot, | ||
178 | .pm_port = port, | ||
179 | }; | ||
180 | struct rpc_message msg = { | ||
181 | .rpc_proc = &pmap_procedures[port ? PMAP_SET : PMAP_UNSET], | ||
182 | .rpc_argp = &map, | ||
183 | .rpc_resp = okay, | ||
184 | }; | ||
167 | struct rpc_clnt *pmap_clnt; | 185 | struct rpc_clnt *pmap_clnt; |
168 | int error = 0; | 186 | int error = 0; |
169 | 187 | ||
170 | dprintk("RPC: registering (%d, %d, %d, %d) with portmapper.\n", | 188 | dprintk("RPC: registering (%d, %d, %d, %d) with portmapper.\n", |
171 | prog, vers, prot, port); | 189 | prog, vers, prot, port); |
172 | 190 | ||
173 | sin.sin_family = AF_INET; | ||
174 | sin.sin_addr.s_addr = htonl(INADDR_LOOPBACK); | ||
175 | pmap_clnt = pmap_create("localhost", &sin, IPPROTO_UDP, 1); | 191 | pmap_clnt = pmap_create("localhost", &sin, IPPROTO_UDP, 1); |
176 | if (IS_ERR(pmap_clnt)) { | 192 | if (IS_ERR(pmap_clnt)) { |
177 | error = PTR_ERR(pmap_clnt); | 193 | error = PTR_ERR(pmap_clnt); |
@@ -179,13 +195,7 @@ rpc_register(u32 prog, u32 vers, int prot, unsigned short port, int *okay) | |||
179 | return error; | 195 | return error; |
180 | } | 196 | } |
181 | 197 | ||
182 | map.pm_prog = prog; | 198 | error = rpc_call_sync(pmap_clnt, &msg, 0); |
183 | map.pm_vers = vers; | ||
184 | map.pm_prot = prot; | ||
185 | map.pm_port = port; | ||
186 | |||
187 | error = rpc_call(pmap_clnt, port? PMAP_SET : PMAP_UNSET, | ||
188 | &map, okay, 0); | ||
189 | 199 | ||
190 | if (error < 0) { | 200 | if (error < 0) { |
191 | printk(KERN_WARNING | 201 | printk(KERN_WARNING |