Annotation of /trunk/mkinitrd-magellan/klibc/usr/kinit/nfsmount/portmap.c
Parent Directory | Revision Log
Revision 1122 -
(hide annotations)
(download)
Wed Aug 18 21:11:40 2010 UTC (13 years, 8 months ago) by niro
File MIME type: text/plain
File size: 1501 byte(s)
Wed Aug 18 21:11:40 2010 UTC (13 years, 8 months ago) by niro
File MIME type: text/plain
File size: 1501 byte(s)
-updated to klibc-1.5.19
1 | niro | 532 | #include <sys/types.h> |
2 | #include <netinet/in.h> | ||
3 | #include <asm/byteorder.h> /* __constant_hton* */ | ||
4 | #include <stdio.h> | ||
5 | #include <stdlib.h> | ||
6 | |||
7 | #include "nfsmount.h" | ||
8 | #include "sunrpc.h" | ||
9 | |||
10 | struct portmap_call { | ||
11 | struct rpc_call rpc; | ||
12 | uint32_t program; | ||
13 | uint32_t version; | ||
14 | uint32_t proto; | ||
15 | uint32_t port; | ||
16 | }; | ||
17 | |||
18 | struct portmap_reply { | ||
19 | struct rpc_reply rpc; | ||
20 | uint32_t port; | ||
21 | }; | ||
22 | |||
23 | static struct portmap_call call = { | ||
24 | .rpc = { | ||
25 | .program = __constant_htonl(RPC_PMAP_PROGRAM), | ||
26 | .prog_vers = __constant_htonl(RPC_PMAP_VERSION), | ||
27 | .proc = __constant_htonl(PMAP_PROC_GETPORT), | ||
28 | } | ||
29 | }; | ||
30 | |||
31 | uint32_t portmap(uint32_t server, uint32_t program, uint32_t version, uint32_t proto) | ||
32 | { | ||
33 | struct portmap_reply reply; | ||
34 | struct client *clnt; | ||
35 | struct rpc rpc; | ||
36 | uint32_t port = 0; | ||
37 | |||
38 | if ((clnt = tcp_client(server, RPC_PMAP_PORT, 0)) == NULL) { | ||
39 | if ((clnt = udp_client(server, RPC_PMAP_PORT, 0)) == NULL) { | ||
40 | goto bail; | ||
41 | } | ||
42 | } | ||
43 | |||
44 | call.program = htonl(program); | ||
45 | call.version = htonl(version); | ||
46 | call.proto = htonl(proto); | ||
47 | |||
48 | rpc.call = (struct rpc_call *)&call; | ||
49 | rpc.call_len = sizeof(call); | ||
50 | rpc.reply = (struct rpc_reply *)&reply; | ||
51 | rpc.reply_len = sizeof(reply); | ||
52 | |||
53 | if (rpc_call(clnt, &rpc) < 0) | ||
54 | goto bail; | ||
55 | |||
56 | if (rpc.reply_len < sizeof(reply)) { | ||
57 | fprintf(stderr, "incomplete reply: %zu < %zu\n", | ||
58 | rpc.reply_len, sizeof(reply)); | ||
59 | goto bail; | ||
60 | } | ||
61 | |||
62 | port = ntohl(reply.port); | ||
63 | |||
64 | bail: | ||
65 | niro | 1122 | dprintf("Port for %d/%d[%s]: %d\n", program, version, |
66 | proto == IPPROTO_TCP ? "tcp" : "udp", port); | ||
67 | niro | 532 | |
68 | if (clnt) { | ||
69 | client_free(clnt); | ||
70 | } | ||
71 | |||
72 | return port; | ||
73 | } |