|
Lines 52-57
Link Here
|
| 52 |
#include <sys/syslog.h> |
52 |
#include <sys/syslog.h> |
| 53 |
#include <sys/wait.h> |
53 |
#include <sys/wait.h> |
| 54 |
#include <sys/mount.h> |
54 |
#include <sys/mount.h> |
|
|
55 |
#include <sys/sysctl.h> |
| 55 |
|
56 |
|
| 56 |
#include <rpc/rpc.h> |
57 |
#include <rpc/rpc.h> |
| 57 |
#include <rpc/pmap_clnt.h> |
58 |
#include <rpc/pmap_clnt.h> |
|
Lines 62-67
Link Here
|
| 62 |
#include <nfs/rpcv2.h> |
63 |
#include <nfs/rpcv2.h> |
| 63 |
#include <nfs/nfsproto.h> |
64 |
#include <nfs/nfsproto.h> |
| 64 |
#include <nfs/nfs.h> |
65 |
#include <nfs/nfs.h> |
|
|
66 |
#include <net/if.h> |
| 67 |
#include <net/route.h> |
| 68 |
#include <arpa/inet.h> |
| 65 |
|
69 |
|
| 66 |
#ifdef NFSKERB |
70 |
#ifdef NFSKERB |
| 67 |
#include <kerberosIV/des.h> |
71 |
#include <kerberosIV/des.h> |
|
Lines 110-115
Link Here
|
| 110 |
#endif |
114 |
#endif |
| 111 |
#endif |
115 |
#endif |
| 112 |
void usage __P((void)); |
116 |
void usage __P((void)); |
|
|
117 |
int get_ifaddrs __P((struct in_addr **)); |
| 113 |
|
118 |
|
| 114 |
/* |
119 |
/* |
| 115 |
* Nfs server daemon mostly just a user context for nfssvc() |
120 |
* Nfs server daemon mostly just a user context for nfssvc() |
|
Lines 143-149
Link Here
|
| 143 |
#endif |
148 |
#endif |
| 144 |
fd_set ready, sockbits; |
149 |
fd_set ready, sockbits; |
| 145 |
int ch, cltpflag, connect_type_cnt, i, len, maxsock, msgsock; |
150 |
int ch, cltpflag, connect_type_cnt, i, len, maxsock, msgsock; |
| 146 |
int nfsdcnt, nfssvc_flag, on, reregister, sock, tcpflag, tcpsock; |
151 |
int nfsdcnt, nfssvc_flag, on, reregister, tcpflag, tcpsock; |
| 147 |
int tp4cnt, tp4flag, tpipcnt, tpipflag, udpflag; |
152 |
int tp4cnt, tp4flag, tpipcnt, tpipflag, udpflag; |
| 148 |
#ifdef notyet |
153 |
#ifdef notyet |
| 149 |
int tp4sock, tpipsock; |
154 |
int tp4sock, tpipsock; |
|
Lines 375-406
Link Here
|
| 375 |
|
380 |
|
| 376 |
/* If we are serving udp, set up the socket. */ |
381 |
/* If we are serving udp, set up the socket. */ |
| 377 |
if (udpflag) { |
382 |
if (udpflag) { |
| 378 |
if ((sock = socket(AF_INET, SOCK_DGRAM, 0)) < 0) { |
383 |
struct in_addr *ifaddr_list; |
| 379 |
syslog(LOG_ERR, "can't create udp socket"); |
384 |
int i; |
| 380 |
exit(1); |
385 |
int ifaddr_count; |
| 381 |
} |
386 |
|
| 382 |
inetaddr.sin_family = AF_INET; |
387 |
|
| 383 |
inetaddr.sin_addr.s_addr = INADDR_ANY; |
388 |
ifaddr_count = get_ifaddrs(&ifaddr_list); |
| 384 |
inetaddr.sin_port = htons(NFS_PORT); |
389 |
|
| 385 |
inetaddr.sin_len = sizeof(inetaddr); |
390 |
for (i = 0; i < ifaddr_count; i++) { |
| 386 |
if (bind(sock, |
391 |
int on = 1; |
| 387 |
(struct sockaddr *)&inetaddr, sizeof(inetaddr)) < 0) { |
392 |
int sock; |
| 388 |
syslog(LOG_ERR, "can't bind udp addr"); |
393 |
|
| 389 |
exit(1); |
394 |
if ((sock = socket(AF_INET, SOCK_DGRAM, 0)) < 0) { |
|
|
395 |
syslog(LOG_ERR, "can't create udp socket: %m"); |
| 396 |
exit(1); |
| 397 |
} |
| 398 |
if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &on, |
| 399 |
sizeof(on)) != 0) { |
| 400 |
syslog(LOG_ERR, "setsockopt failed: %m"); |
| 401 |
exit(1); |
| 402 |
} |
| 403 |
bzero(&inetaddr, sizeof(inetaddr)); |
| 404 |
inetaddr.sin_family = AF_INET; |
| 405 |
inetaddr.sin_addr.s_addr = ifaddr_list[i].s_addr; |
| 406 |
inetaddr.sin_port = htons(NFS_PORT); |
| 407 |
inetaddr.sin_len = sizeof(inetaddr); |
| 408 |
if (bind(sock, (struct sockaddr *)&inetaddr, |
| 409 |
sizeof(inetaddr)) < 0) { |
| 410 |
syslog(LOG_ERR, "can't bind udp addr %s: %m", |
| 411 |
ifaddr_list[i].s_addr == INADDR_ANY ? |
| 412 |
"INADDR_ANY" : inet_ntoa(ifaddr_list[i])); |
| 413 |
exit(1); |
| 414 |
} |
| 415 |
|
| 416 |
nfsdargs.sock = sock; |
| 417 |
nfsdargs.name = NULL; |
| 418 |
nfsdargs.namelen = 0; |
| 419 |
if (nfssvc(NFSSVC_ADDSOCK, &nfsdargs) < 0) { |
| 420 |
syslog(LOG_ERR, "can't add UDP socket: %m"); |
| 421 |
exit(1); |
| 422 |
} |
| 423 |
(void)close(sock); |
| 390 |
} |
424 |
} |
|
|
425 |
|
| 426 |
free(ifaddr_list); |
| 427 |
|
| 391 |
if (!pmap_set(RPCPROG_NFS, 2, IPPROTO_UDP, NFS_PORT) || |
428 |
if (!pmap_set(RPCPROG_NFS, 2, IPPROTO_UDP, NFS_PORT) || |
| 392 |
!pmap_set(RPCPROG_NFS, 3, IPPROTO_UDP, NFS_PORT)) { |
429 |
!pmap_set(RPCPROG_NFS, 3, IPPROTO_UDP, NFS_PORT)) { |
| 393 |
syslog(LOG_ERR, "can't register with udp portmap"); |
430 |
syslog(LOG_ERR, "can't register with udp portmap"); |
| 394 |
exit(1); |
431 |
exit(1); |
| 395 |
} |
432 |
} |
| 396 |
nfsdargs.sock = sock; |
|
|
| 397 |
nfsdargs.name = NULL; |
| 398 |
nfsdargs.namelen = 0; |
| 399 |
if (nfssvc(NFSSVC_ADDSOCK, &nfsdargs) < 0) { |
| 400 |
syslog(LOG_ERR, "can't Add UDP socket"); |
| 401 |
exit(1); |
| 402 |
} |
| 403 |
(void)close(sock); |
| 404 |
} |
433 |
} |
| 405 |
|
434 |
|
| 406 |
#ifdef ISO |
435 |
#ifdef ISO |
|
Lines 671-673
Link Here
|
| 671 |
} |
700 |
} |
| 672 |
#endif /* __FreeBSD__ */ |
701 |
#endif /* __FreeBSD__ */ |
| 673 |
#endif |
702 |
#endif |
|
|
703 |
|
| 704 |
|
| 705 |
#define ROUNDUP(a) \ |
| 706 |
((a) > 0 ? (1 + (((a) - 1) | (sizeof(long) - 1))) : sizeof(long)) |
| 707 |
#define ADVANCE(x) (x += ROUNDUP(((struct sockaddr *)(x))->sa_len)) |
| 708 |
|
| 709 |
/* |
| 710 |
* Get a list of local IP addresses, and store a pointer to the malloc'd |
| 711 |
* list in *ifaddrp. The first address will be INADDR_ANY as a fallback entry. |
| 712 |
* The number of entries in the list is returned. |
| 713 |
*/ |
| 714 |
int get_ifaddrs(struct in_addr **ifaddrp) { |
| 715 |
register struct if_msghdr *ifm; |
| 716 |
register struct ifa_msghdr *ifam; |
| 717 |
struct in_addr *ifaddr; |
| 718 |
size_t needed; |
| 719 |
int mib[6], flags = 0; |
| 720 |
int adr_count; |
| 721 |
char *buf, *lim, *next; |
| 722 |
|
| 723 |
/* Create first address as wildcard */ |
| 724 |
ifaddr = malloc(sizeof(*ifaddr)); |
| 725 |
if (ifaddr == NULL) { |
| 726 |
syslog(LOG_ERR, "malloc failed"); |
| 727 |
exit(1); |
| 728 |
} |
| 729 |
ifaddr->s_addr = INADDR_ANY; |
| 730 |
adr_count = 1; |
| 731 |
|
| 732 |
mib[0] = CTL_NET; |
| 733 |
mib[1] = PF_ROUTE; |
| 734 |
mib[2] = 0; |
| 735 |
mib[3] = AF_INET; |
| 736 |
mib[4] = NET_RT_IFLIST; |
| 737 |
mib[5] = 0; |
| 738 |
if (sysctl(mib, 6, NULL, &needed, NULL, 0) < 0) { |
| 739 |
syslog(LOG_ERR, "route-sysctl-estimate failed: %m"); |
| 740 |
exit(1); |
| 741 |
} |
| 742 |
if ((buf = malloc(needed)) == NULL) { |
| 743 |
syslog(LOG_ERR, "malloc failed"); |
| 744 |
exit(1); |
| 745 |
} |
| 746 |
if (sysctl(mib, 6, buf, &needed, NULL, 0) < 0) { |
| 747 |
syslog(LOG_ERR, "retrieval of interface table failed: %m"); |
| 748 |
exit(1); |
| 749 |
} |
| 750 |
lim = buf + needed; |
| 751 |
|
| 752 |
for (next = buf; next < lim; next += ifm->ifm_msglen) { |
| 753 |
int i; |
| 754 |
char *cp, *cplim; |
| 755 |
struct sockaddr *sa; |
| 756 |
struct sockaddr_in *sin; |
| 757 |
|
| 758 |
ifm = (struct if_msghdr *)next; |
| 759 |
if (ifm->ifm_type == RTM_IFINFO) { |
| 760 |
flags = ifm->ifm_flags; |
| 761 |
continue; |
| 762 |
} |
| 763 |
if ((flags & IFF_UP) == 0) |
| 764 |
continue; |
| 765 |
if (ifm->ifm_type != RTM_NEWADDR) |
| 766 |
errx(1, "out of sync parsing NET_RT_IFLIST"); |
| 767 |
ifam = (struct ifa_msghdr *)ifm; |
| 768 |
cp = (char *)(ifam + 1); |
| 769 |
cplim = ifam->ifam_msglen + (char *)ifam; |
| 770 |
|
| 771 |
/* Find the RTAX_IFA entry */ |
| 772 |
for (i = 0; i < RTAX_IFA && cp < cplim; i++) |
| 773 |
if (ifam->ifam_addrs & (1 << i)) |
| 774 |
ADVANCE(cp); |
| 775 |
|
| 776 |
if (i != RTAX_IFA || (ifam->ifam_addrs & (1 << RTAX_IFA)) == 0) |
| 777 |
continue; |
| 778 |
|
| 779 |
sa = (struct sockaddr *)cp; |
| 780 |
if (sa->sa_family != AF_INET) |
| 781 |
continue; |
| 782 |
|
| 783 |
sin = (struct sockaddr_in *)sa; |
| 784 |
|
| 785 |
/* Check if we've seen this address before */ |
| 786 |
for (i = 0; i < adr_count; i++) |
| 787 |
if (ifaddr[i].s_addr == sin->sin_addr.s_addr) |
| 788 |
break; |
| 789 |
|
| 790 |
if (i < adr_count) |
| 791 |
continue; |
| 792 |
|
| 793 |
adr_count++; |
| 794 |
ifaddr = realloc(ifaddr, sizeof(*ifaddr) * adr_count); |
| 795 |
if (ifaddr == NULL) { |
| 796 |
syslog(LOG_ERR, "realloc failed"); |
| 797 |
exit(1); |
| 798 |
} |
| 799 |
ifaddr[adr_count - 1] = sin->sin_addr; |
| 800 |
} |
| 801 |
free(buf); |
| 802 |
|
| 803 |
*ifaddrp = ifaddr; |
| 804 |
return adr_count; |
| 805 |
} |