6f48618259a15ec8a21c04b49ce928e0827b3a01
2 Copyright (C) by Ronnie Sahlberg <ronniesahlberg@gmail.com> 2011
4 This program is free software; you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation; either version 3 of the License, or
7 (at your option) any later version.
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 General Public License for more details.
14 You should have received a copy of the GNU General Public License
15 along with this program; if not, see <http://www.gnu.org/licenses/>.
18 /* Example program using the lowlevel raw broadcast interface.
27 #include <sys/socket.h>
28 #include <sys/ioctl.h>
33 #include "libnfs-raw.h"
34 #include "libnfs-raw-mount.h"
35 #include "libnfs-raw-portmap.h"
36 #include "libnfs-private.h"
38 void pm_cb(struct rpc_context
*rpc _U_
, int status
, void *data
, void *private_data _U_
)
40 pmap_call_result
*res
= (pmap_call_result
*)data
;
44 if (status
== RPC_STATUS_CANCEL
) {
48 printf("callback for CALLIT failed\n");
52 sin
= rpc_get_recv_sockaddr(rpc
);
54 printf("failed to get sockaddr for received pdu\n");
58 if (getnameinfo(sin
, sizeof(struct sockaddr_in
), &hostdd
[0], sizeof(hostdd
), NULL
, 0, NI_NUMERICHOST
) < 0) {
59 printf("getnameinfo failed\n");
63 printf("NFS server at %s\n", hostdd
);
66 int main(int argc _U_
, char *argv
[] _U_
)
68 struct rpc_context
*rpc
;
72 struct timeval tv_start
, tv_current
;
74 rpc
= rpc_init_udp_context();
76 printf("failed to init context\n");
80 if (rpc_bind_udp(rpc
, "0.0.0.0", 0) < 0) {
81 printf("failed to bind to udp %s\n", rpc_get_error(rpc
));
86 /* get list of all interfaces */
87 size
= sizeof(struct ifreq
);
91 while (ifc
.ifc_len
== size
) {
96 ifc
.ifc_buf
= malloc(size
);
97 if (ioctl(rpc_get_fd(rpc
), SIOCGIFCONF
, (caddr_t
)&ifc
) < 0) {
98 printf("ioctl SIOCGIFCONF failed\n");
103 for (i
=0; i
<ifc
.ifc_len
/ sizeof(struct ifconf
); i
++) {
106 if (ifc
.ifc_req
[i
].ifr_addr
.sa_family
!= AF_INET
) {
109 if (ioctl(rpc_get_fd(rpc
), SIOCGIFFLAGS
, &ifc
.ifc_req
[i
]) < 0) {
110 printf("ioctl DRBADDR failed\n");
113 if (!(ifc
.ifc_req
[i
].ifr_flags
& IFF_UP
)) {
116 if (ifc
.ifc_req
[i
].ifr_flags
& IFF_LOOPBACK
) {
119 if (!(ifc
.ifc_req
[i
].ifr_flags
& IFF_BROADCAST
)) {
122 if (ioctl(rpc_get_fd(rpc
), SIOCGIFBRDADDR
, &ifc
.ifc_req
[i
]) < 0) {
123 printf("ioctl DRBADDR failed\n");
126 if (getnameinfo(&ifc
.ifc_req
[i
].ifr_broadaddr
, sizeof(struct sockaddr_in
), &bcdd
[0], sizeof(bcdd
), NULL
, 0, NI_NUMERICHOST
) < 0) {
127 printf("getnameinfo failed\n");
130 if (rpc_set_udp_destination(rpc
, bcdd
, 111, 1) < 0) {
131 printf("failed to set udp destination %s\n", rpc_get_error(rpc
));
135 if (rpc_pmap_callit_async(rpc
, MOUNT_PROGRAM
, 2, 0, NULL
, 0, pm_cb
, NULL
) < 0) {
136 printf("Failed to set up callit function\n");
142 gettimeofday(&tv_start
, NULL
);
146 pfd
.fd
= rpc_get_fd(rpc
);
147 pfd
.events
= rpc_which_events(rpc
);
149 gettimeofday(&tv_current
, NULL
);
151 - (tv_current
.tv_sec
*1000 + tv_current
.tv_usec
/ 1000)
152 + (tv_start
.tv_sec
*1000 + tv_start
.tv_usec
/ 1000);
154 if (poll(&pfd
, 1, mpt
) < 0) {
155 printf("Poll failed");
158 if (pfd
.revents
== 0) {
162 if (rpc_service(rpc
, pfd
.revents
) < 0) {
163 printf("rpc_service failed with %s\n", rpc_get_error(rpc
));
168 rpc_destroy_context(rpc
);