diff options
Diffstat (limited to 'net/sunrpc/rpcb_clnt.c')
-rw-r--r-- | net/sunrpc/rpcb_clnt.c | 42 |
1 files changed, 31 insertions, 11 deletions
diff --git a/net/sunrpc/rpcb_clnt.c b/net/sunrpc/rpcb_clnt.c index 0021fad464e0..35c1ded1fc47 100644 --- a/net/sunrpc/rpcb_clnt.c +++ b/net/sunrpc/rpcb_clnt.c | |||
@@ -116,6 +116,29 @@ static void rpcb_map_release(void *data) | |||
116 | kfree(map); | 116 | kfree(map); |
117 | } | 117 | } |
118 | 118 | ||
119 | static const struct sockaddr_in rpcb_inaddr_loopback = { | ||
120 | .sin_family = AF_INET, | ||
121 | .sin_addr.s_addr = htonl(INADDR_LOOPBACK), | ||
122 | .sin_port = htons(RPCBIND_PORT), | ||
123 | }; | ||
124 | |||
125 | static struct rpc_clnt *rpcb_create_local(struct sockaddr *addr, | ||
126 | size_t addrlen, u32 version) | ||
127 | { | ||
128 | struct rpc_create_args args = { | ||
129 | .protocol = XPRT_TRANSPORT_UDP, | ||
130 | .address = addr, | ||
131 | .addrsize = addrlen, | ||
132 | .servername = "localhost", | ||
133 | .program = &rpcb_program, | ||
134 | .version = version, | ||
135 | .authflavor = RPC_AUTH_UNIX, | ||
136 | .flags = RPC_CLNT_CREATE_NOPING, | ||
137 | }; | ||
138 | |||
139 | return rpc_create(&args); | ||
140 | } | ||
141 | |||
119 | static struct rpc_clnt *rpcb_create(char *hostname, struct sockaddr *srvaddr, | 142 | static struct rpc_clnt *rpcb_create(char *hostname, struct sockaddr *srvaddr, |
120 | size_t salen, int proto, u32 version, | 143 | size_t salen, int proto, u32 version, |
121 | int privileged) | 144 | int privileged) |
@@ -161,10 +184,6 @@ static struct rpc_clnt *rpcb_create(char *hostname, struct sockaddr *srvaddr, | |||
161 | */ | 184 | */ |
162 | int rpcb_register(u32 prog, u32 vers, int prot, unsigned short port, int *okay) | 185 | int rpcb_register(u32 prog, u32 vers, int prot, unsigned short port, int *okay) |
163 | { | 186 | { |
164 | struct sockaddr_in sin = { | ||
165 | .sin_family = AF_INET, | ||
166 | .sin_addr.s_addr = htonl(INADDR_LOOPBACK), | ||
167 | }; | ||
168 | struct rpcbind_args map = { | 187 | struct rpcbind_args map = { |
169 | .r_prog = prog, | 188 | .r_prog = prog, |
170 | .r_vers = vers, | 189 | .r_vers = vers, |
@@ -184,14 +203,15 @@ int rpcb_register(u32 prog, u32 vers, int prot, unsigned short port, int *okay) | |||
184 | "rpcbind\n", (port ? "" : "un"), | 203 | "rpcbind\n", (port ? "" : "un"), |
185 | prog, vers, prot, port); | 204 | prog, vers, prot, port); |
186 | 205 | ||
187 | rpcb_clnt = rpcb_create("localhost", (struct sockaddr *) &sin, | 206 | rpcb_clnt = rpcb_create_local((struct sockaddr *)&rpcb_inaddr_loopback, |
188 | sizeof(sin), XPRT_TRANSPORT_UDP, RPCBVERS_2, 1); | 207 | sizeof(rpcb_inaddr_loopback), |
189 | if (IS_ERR(rpcb_clnt)) | 208 | RPCBVERS_2); |
190 | return PTR_ERR(rpcb_clnt); | 209 | if (!IS_ERR(rpcb_clnt)) { |
210 | error = rpc_call_sync(rpcb_clnt, &msg, 0); | ||
211 | rpc_shutdown_client(rpcb_clnt); | ||
212 | } else | ||
213 | error = PTR_ERR(rpcb_clnt); | ||
191 | 214 | ||
192 | error = rpc_call_sync(rpcb_clnt, &msg, 0); | ||
193 | |||
194 | rpc_shutdown_client(rpcb_clnt); | ||
195 | if (error < 0) | 215 | if (error < 0) |
196 | printk(KERN_WARNING "RPC: failed to contact local rpcbind " | 216 | printk(KERN_WARNING "RPC: failed to contact local rpcbind " |
197 | "server (errno %d).\n", -error); | 217 | "server (errno %d).\n", -error); |