nfsd.c (65379) | nfsd.c (74462) |
---|---|
1/* 2 * Copyright (c) 1989, 1993, 1994 3 * The Regents of the University of California. All rights reserved. 4 * 5 * This code is derived from software contributed to Berkeley by 6 * Rick Macklem at The University of Guelph. 7 * 8 * Redistribution and use in source and binary forms, with or without --- 31 unchanged lines hidden (view full) --- 40 The Regents of the University of California. All rights reserved.\n"; 41#endif not lint 42 43#ifndef lint 44#if 0 45static char sccsid[] = "@(#)nfsd.c 8.9 (Berkeley) 3/29/95"; 46#endif 47static const char rcsid[] = | 1/* 2 * Copyright (c) 1989, 1993, 1994 3 * The Regents of the University of California. All rights reserved. 4 * 5 * This code is derived from software contributed to Berkeley by 6 * Rick Macklem at The University of Guelph. 7 * 8 * Redistribution and use in source and binary forms, with or without --- 31 unchanged lines hidden (view full) --- 40 The Regents of the University of California. All rights reserved.\n"; 41#endif not lint 42 43#ifndef lint 44#if 0 45static char sccsid[] = "@(#)nfsd.c 8.9 (Berkeley) 3/29/95"; 46#endif 47static const char rcsid[] = |
48 "$FreeBSD: head/usr.sbin/nfsd/nfsd.c 65379 2000-09-02 20:52:15Z brian $"; | 48 "$FreeBSD: head/usr.sbin/nfsd/nfsd.c 74462 2001-03-19 12:50:13Z alfred $"; |
49#endif not lint 50 51#include <sys/param.h> 52#include <sys/syslog.h> 53#include <sys/wait.h> 54#include <sys/mount.h> 55 56#include <rpc/rpc.h> 57#include <rpc/pmap_clnt.h> 58 59#include <netdb.h> 60#include <arpa/inet.h> | 49#endif not lint 50 51#include <sys/param.h> 52#include <sys/syslog.h> 53#include <sys/wait.h> 54#include <sys/mount.h> 55 56#include <rpc/rpc.h> 57#include <rpc/pmap_clnt.h> 58 59#include <netdb.h> 60#include <arpa/inet.h> |
61#ifdef ISO 62#include <netiso/iso.h> 63#endif | |
64#include <nfs/rpcv2.h> 65#include <nfs/nfsproto.h> 66#include <nfs/nfs.h> 67 68#ifdef NFSKERB 69#include <kerberosIV/des.h> 70#include <kerberosIV/krb.h> 71#endif 72 73#include <err.h> 74#include <errno.h> 75#include <stdio.h> 76#include <stdlib.h> 77#include <strings.h> 78#include <unistd.h> | 61#include <nfs/rpcv2.h> 62#include <nfs/nfsproto.h> 63#include <nfs/nfs.h> 64 65#ifdef NFSKERB 66#include <kerberosIV/des.h> 67#include <kerberosIV/krb.h> 68#endif 69 70#include <err.h> 71#include <errno.h> 72#include <stdio.h> 73#include <stdlib.h> 74#include <strings.h> 75#include <unistd.h> |
76#include <netdb.h> |
|
79 80/* Global defs */ 81#ifdef DEBUG 82#define syslog(e, s) fprintf(stderr,(s)) 83int debug = 1; 84#else 85int debug = 0; 86#endif --- 11 unchanged lines hidden (view full) --- 98char inst[INST_SZ]; 99struct nfsrpc_fullblock kin, kout; 100struct nfsrpc_fullverf kverf; 101NFSKERBKEY_T kivec; 102struct timeval ktv; 103NFSKERBKEYSCHED_T kerb_keysched; 104#endif 105 | 77 78/* Global defs */ 79#ifdef DEBUG 80#define syslog(e, s) fprintf(stderr,(s)) 81int debug = 1; 82#else 83int debug = 0; 84#endif --- 11 unchanged lines hidden (view full) --- 96char inst[INST_SZ]; 97struct nfsrpc_fullblock kin, kout; 98struct nfsrpc_fullverf kverf; 99NFSKERBKEY_T kivec; 100struct timeval ktv; 101NFSKERBKEYSCHED_T kerb_keysched; 102#endif 103 |
106void nonfs __P((int)); 107void reapchild __P((int)); 108void setbindhost __P((struct sockaddr_in *ia, const char *bindhost)); | 104#define MAXNFSDCNT 20 105#define DEFNFSDCNT 4 106pid_t children[MAXNFSDCNT]; /* PIDs of children */ 107int nfsdcnt; /* number of children */ 108 109void cleanup(int); 110void killchildren(void); 111void nonfs (int); 112void reapchild (int); 113int setbindhost (struct addrinfo **ia, const char *bindhost, struct addrinfo hints); |
109#ifdef OLD_SETPROCTITLE 110#ifdef __FreeBSD__ | 114#ifdef OLD_SETPROCTITLE 115#ifdef __FreeBSD__ |
111void setproctitle __P((char *)); | 116void setproctitle (char *); |
112#endif 113#endif | 117#endif 118#endif |
114void usage __P((void)); | 119void unregistration (void); 120void usage (void); |
115 116/* 117 * Nfs server daemon mostly just a user context for nfssvc() 118 * 119 * 1 - do file descriptor and signal cleanup 120 * 2 - fork the nfsd(s) 121 * 3 - create server socket(s) | 121 122/* 123 * Nfs server daemon mostly just a user context for nfssvc() 124 * 125 * 1 - do file descriptor and signal cleanup 126 * 2 - fork the nfsd(s) 127 * 3 - create server socket(s) |
122 * 4 - register socket with portmap | 128 * 4 - register socket with rpcbind |
123 * 124 * For connectionless protocols, just pass the socket into the kernel via. 125 * nfssvc(). 126 * For connection based sockets, loop doing accepts. When you get a new 127 * socket from accept, pass the msgsock into the kernel via. nfssvc(). 128 * The arguments are: 129 * -c - support iso cltp clients | 129 * 130 * For connectionless protocols, just pass the socket into the kernel via. 131 * nfssvc(). 132 * For connection based sockets, loop doing accepts. When you get a new 133 * socket from accept, pass the msgsock into the kernel via. nfssvc(). 134 * The arguments are: 135 * -c - support iso cltp clients |
130 * -r - reregister with portmapper | 136 * -r - reregister with rpcbind 137 * -d - unregister with rpcbind |
131 * -t - support tcp nfs clients 132 * -u - support udp nfs clients 133 * followed by "n" which is the number of nfsds' to fork off 134 */ 135int 136main(argc, argv, envp) 137 int argc; 138 char *argv[], *envp[]; 139{ 140 struct nfsd_args nfsdargs; | 138 * -t - support tcp nfs clients 139 * -u - support udp nfs clients 140 * followed by "n" which is the number of nfsds' to fork off 141 */ 142int 143main(argc, argv, envp) 144 int argc; 145 char *argv[], *envp[]; 146{ 147 struct nfsd_args nfsdargs; |
141 struct sockaddr_in inetaddr, inetpeer; 142#ifdef ISO 143 struct sockaddr_iso isoaddr, isopeer; 144 char *cp; 145#endif | 148 struct addrinfo *ai_udp, *ai_tcp, *ai_udp6, *ai_tcp6, hints; 149 struct netconfig *nconf_udp, *nconf_tcp, *nconf_udp6, *nconf_tcp6; 150 struct netbuf nb_udp, nb_tcp, nb_udp6, nb_tcp6; 151 struct sockaddr_in inetpeer; 152 struct sockaddr_in6 inet6peer; |
146 fd_set ready, sockbits; | 153 fd_set ready, sockbits; |
154 fd_set v4bits, v6bits; |
|
147 int ch, cltpflag, connect_type_cnt, i, len, maxsock, msgsock; | 155 int ch, cltpflag, connect_type_cnt, i, len, maxsock, msgsock; |
148 int nfsdcnt, nfssvc_flag, on, reregister, sock, tcpflag, tcpsock; 149 int tp4cnt, tp4flag, tpipcnt, tpipflag, udpflag; 150 int bindhostc = 0, bindanyflag; | 156 int nfssvc_flag, on = 1, unregister, reregister, sock; 157 int tcp6sock, ip6flag, tcpflag, tcpsock; 158 int udpflag, ecode, s; 159 int bindhostc = 0, bindanyflag, rpcbreg, rpcbregcnt; |
151 char **bindhost = NULL; | 160 char **bindhost = NULL; |
152#ifdef notyet 153 int tp4sock, tpipsock; 154#endif | 161 pid_t pid; |
155#ifdef NFSKERB 156 struct group *grp; 157 struct passwd *pwd; 158 struct ucred *cr; 159 struct timeval ktv; 160 char **cpp; 161#endif 162#ifdef __FreeBSD__ --- 16 unchanged lines hidden (view full) --- 179 Argv = argv; 180 if (envp == 0 || *envp == 0) 181 envp = argv; 182 while (*envp) 183 envp++; 184 LastArg = envp[-1] + strlen(envp[-1]); 185#endif 186 | 162#ifdef NFSKERB 163 struct group *grp; 164 struct passwd *pwd; 165 struct ucred *cr; 166 struct timeval ktv; 167 char **cpp; 168#endif 169#ifdef __FreeBSD__ --- 16 unchanged lines hidden (view full) --- 186 Argv = argv; 187 if (envp == 0 || *envp == 0) 188 envp = argv; 189 while (*envp) 190 envp++; 191 LastArg = envp[-1] + strlen(envp[-1]); 192#endif 193 |
187#define MAXNFSDCNT 20 188#define DEFNFSDCNT 4 | |
189 nfsdcnt = DEFNFSDCNT; | 194 nfsdcnt = DEFNFSDCNT; |
190 cltpflag = reregister = tcpflag = tp4cnt = tp4flag = tpipcnt = 0; 191 bindanyflag = tpipflag = udpflag = 0; 192#ifdef ISO 193#define GETOPT "ach:n:rtu" 194#define USAGE "[-acrtu] [-n num_servers] [-h bindip]" 195#else 196#define GETOPT "ah:n:rtu" 197#define USAGE "[-artu] [-n num_servers] [-h bindip]" 198#endif | 195 cltpflag = unregister = reregister = tcpflag = 0; 196 bindanyflag = udpflag = ip6flag = 0; 197#define GETOPT "ah:n:rdtu" 198#define USAGE "[-ardtu] [-n num_servers] [-h bindip]" |
199 while ((ch = getopt(argc, argv, GETOPT)) != -1) 200 switch (ch) { 201 case 'a': 202 bindanyflag = 1; 203 break; 204 case 'n': 205 nfsdcnt = atoi(optarg); 206 if (nfsdcnt < 1 || nfsdcnt > MAXNFSDCNT) { --- 9 unchanged lines hidden (view full) --- 216 errx(1, "Out of memory"); 217 bindhost[bindhostc-1] = strdup(optarg); 218 if (bindhost[bindhostc-1] == NULL) 219 errx(1, "Out of memory"); 220 break; 221 case 'r': 222 reregister = 1; 223 break; | 199 while ((ch = getopt(argc, argv, GETOPT)) != -1) 200 switch (ch) { 201 case 'a': 202 bindanyflag = 1; 203 break; 204 case 'n': 205 nfsdcnt = atoi(optarg); 206 if (nfsdcnt < 1 || nfsdcnt > MAXNFSDCNT) { --- 9 unchanged lines hidden (view full) --- 216 errx(1, "Out of memory"); 217 bindhost[bindhostc-1] = strdup(optarg); 218 if (bindhost[bindhostc-1] == NULL) 219 errx(1, "Out of memory"); 220 break; 221 case 'r': 222 reregister = 1; 223 break; |
224 case 'd': 225 unregister = 1; 226 break; |
|
224 case 't': 225 tcpflag = 1; 226 break; 227 case 'u': 228 udpflag = 1; 229 break; | 227 case 't': 228 tcpflag = 1; 229 break; 230 case 'u': 231 udpflag = 1; 232 break; |
230#ifdef ISO 231 case 'c': 232 cltpflag = 1; 233 break; 234#ifdef notyet 235 case 'i': 236 tp4cnt = 1; 237 break; 238 case 'p': 239 tpipcnt = 1; 240 break; 241#endif /* notyet */ 242#endif /* ISO */ | |
243 default: 244 case '?': 245 usage(); 246 }; 247 if (!tcpflag && !udpflag) 248 udpflag = 1; 249 argv += optind; 250 argc -= optind; --- 7 unchanged lines hidden (view full) --- 258 if (argc == 1) { 259 nfsdcnt = atoi(argv[0]); 260 if (nfsdcnt < 1 || nfsdcnt > MAXNFSDCNT) { 261 warnx("nfsd count %d; reset to %d", nfsdcnt, 262 DEFNFSDCNT); 263 nfsdcnt = DEFNFSDCNT; 264 } 265 } | 233 default: 234 case '?': 235 usage(); 236 }; 237 if (!tcpflag && !udpflag) 238 udpflag = 1; 239 argv += optind; 240 argc -= optind; --- 7 unchanged lines hidden (view full) --- 248 if (argc == 1) { 249 nfsdcnt = atoi(argv[0]); 250 if (nfsdcnt < 1 || nfsdcnt > MAXNFSDCNT) { 251 warnx("nfsd count %d; reset to %d", nfsdcnt, 252 DEFNFSDCNT); 253 nfsdcnt = DEFNFSDCNT; 254 } 255 } |
256 ip6flag = 1; 257 s = socket(AF_INET6, SOCK_DGRAM, IPPROTO_UDP); 258 if (s < 0 && (errno == EPROTONOSUPPORT || 259 errno == EPFNOSUPPORT || errno == EAFNOSUPPORT)) 260 ip6flag = 0; 261 else 262 close(s); |
|
266 267 if (bindhostc == 0 || bindanyflag) { 268 bindhostc++; 269 bindhost = realloc(bindhost,sizeof(char *)*bindhostc); 270 if (bindhost == NULL) 271 errx(1, "Out of memory"); 272 bindhost[bindhostc-1] = strdup("*"); 273 if (bindhost[bindhostc-1] == NULL) 274 errx(1, "Out of memory"); 275 } 276 277 if (debug == 0) { 278 daemon(0, 0); 279 (void)signal(SIGHUP, SIG_IGN); 280 (void)signal(SIGINT, SIG_IGN); | 263 264 if (bindhostc == 0 || bindanyflag) { 265 bindhostc++; 266 bindhost = realloc(bindhost,sizeof(char *)*bindhostc); 267 if (bindhost == NULL) 268 errx(1, "Out of memory"); 269 bindhost[bindhostc-1] = strdup("*"); 270 if (bindhost[bindhostc-1] == NULL) 271 errx(1, "Out of memory"); 272 } 273 274 if (debug == 0) { 275 daemon(0, 0); 276 (void)signal(SIGHUP, SIG_IGN); 277 (void)signal(SIGINT, SIG_IGN); |
281 (void)signal(SIGQUIT, SIG_IGN); | |
282 (void)signal(SIGSYS, nonfs); | 278 (void)signal(SIGSYS, nonfs); |
279 (void)signal(SIGUSR1, cleanup); 280 /* 281 * nfsd sits in the kernel most of the time. It needs 282 * to ignore SIGTERM/SIGQUIT in order to stay alive as long 283 * as possible during a shutdown, otherwise loopback 284 * mounts will not be able to unmount. 285 */ |
|
283 (void)signal(SIGTERM, SIG_IGN); | 286 (void)signal(SIGTERM, SIG_IGN); |
287 (void)signal(SIGQUIT, SIG_IGN); |
|
284 } 285 (void)signal(SIGCHLD, reapchild); | 288 } 289 (void)signal(SIGCHLD, reapchild); |
286 | 290 if (unregister) { 291 unregistration(); 292 exit (0); 293 } |
287 if (reregister) { | 294 if (reregister) { |
288 if (udpflag && 289 (!pmap_set(RPCPROG_NFS, 2, IPPROTO_UDP, NFS_PORT) || 290 !pmap_set(RPCPROG_NFS, 3, IPPROTO_UDP, NFS_PORT))) 291 err(1, "can't register with portmap for UDP"); 292 if (tcpflag && 293 (!pmap_set(RPCPROG_NFS, 2, IPPROTO_TCP, NFS_PORT) || 294 !pmap_set(RPCPROG_NFS, 3, IPPROTO_TCP, NFS_PORT))) 295 err(1, "can't register with portmap for TCP"); 296 exit(0); | 295 if (udpflag) { 296 memset(&hints, 0, sizeof hints); 297 hints.ai_flags = AI_PASSIVE; 298 hints.ai_family = AF_INET; 299 hints.ai_socktype = SOCK_DGRAM; 300 hints.ai_protocol = IPPROTO_UDP; 301 ecode = getaddrinfo(NULL, "nfs", &hints, &ai_udp); 302 if (ecode != 0) { 303 syslog(LOG_ERR, "getaddrinfo udp: %s", 304 gai_strerror(ecode)); 305 exit(1); 306 } 307 nconf_udp = getnetconfigent("udp"); 308 if (nconf_udp == NULL) 309 err(1, "getnetconfigent udp failed"); 310 nb_udp.buf = ai_udp->ai_addr; 311 nb_udp.len = nb_udp.maxlen = ai_udp->ai_addrlen; 312 if ((!rpcb_set(RPCPROG_NFS, 2, nconf_udp, &nb_udp)) || 313 (!rpcb_set(RPCPROG_NFS, 3, nconf_udp, &nb_udp))) 314 err(1, "rpcb_set udp failed"); 315 freeaddrinfo(ai_udp); 316 } 317 if (udpflag && ip6flag) { 318 memset(&hints, 0, sizeof hints); 319 hints.ai_flags = AI_PASSIVE; 320 hints.ai_family = AF_INET6; 321 hints.ai_socktype = SOCK_DGRAM; 322 hints.ai_protocol = IPPROTO_UDP; 323 ecode = getaddrinfo(NULL, "nfs", &hints, &ai_udp6); 324 if (ecode != 0) { 325 syslog(LOG_ERR, "getaddrinfo udp6: %s", 326 gai_strerror(ecode)); 327 exit(1); 328 } 329 nconf_udp6 = getnetconfigent("udp6"); 330 if (nconf_udp6 == NULL) 331 err(1, "getnetconfigent udp6 failed"); 332 nb_udp6.buf = ai_udp6->ai_addr; 333 nb_udp6.len = nb_udp6.maxlen = ai_udp6->ai_addrlen; 334 if ((!rpcb_set(RPCPROG_NFS, 2, nconf_udp6, &nb_udp6)) || 335 (!rpcb_set(RPCPROG_NFS, 3, nconf_udp6, &nb_udp6))) 336 err(1, "rpcb_set udp6 failed"); 337 freeaddrinfo(ai_udp6); 338 } 339 if (tcpflag) { 340 memset(&hints, 0, sizeof hints); 341 hints.ai_flags = AI_PASSIVE; 342 hints.ai_family = AF_INET; 343 hints.ai_socktype = SOCK_STREAM; 344 hints.ai_protocol = IPPROTO_TCP; 345 ecode = getaddrinfo(NULL, "nfs", &hints, &ai_tcp); 346 if (ecode != 0) { 347 syslog(LOG_ERR, "getaddrinfo tcp: %s", 348 gai_strerror(ecode)); 349 exit(1); 350 } 351 nconf_tcp = getnetconfigent("tcp"); 352 if (nconf_tcp == NULL) 353 err(1, "getnetconfigent tcp failed"); 354 nb_tcp.buf = ai_tcp->ai_addr; 355 nb_tcp.len = nb_tcp.maxlen = ai_tcp->ai_addrlen; 356 if ((!rpcb_set(RPCPROG_NFS, 2, nconf_tcp, &nb_tcp)) || 357 (!rpcb_set(RPCPROG_NFS, 3, nconf_tcp, &nb_tcp))) 358 err(1, "rpcb_set tcp failed"); 359 freeaddrinfo(ai_tcp); 360 } 361 if (tcpflag && ip6flag) { 362 memset(&hints, 0, sizeof hints); 363 hints.ai_flags = AI_PASSIVE; 364 hints.ai_family = AF_INET6; 365 hints.ai_socktype = SOCK_STREAM; 366 hints.ai_protocol = IPPROTO_TCP; 367 ecode = getaddrinfo(NULL, "nfs", &hints, &ai_tcp6); 368 if (ecode != 0) { 369 syslog(LOG_ERR, "getaddrinfo tcp6: %s", 370 gai_strerror(ecode)); 371 exit(1); 372 } 373 nconf_tcp6 = getnetconfigent("tcp6"); 374 if (nconf_tcp6 == NULL) 375 err(1, "getnetconfigent tcp6 failed"); 376 nb_tcp6.buf = ai_tcp6->ai_addr; 377 nb_tcp6.len = nb_tcp6.maxlen = ai_tcp6->ai_addrlen; 378 if ((!rpcb_set(RPCPROG_NFS, 2, nconf_tcp6, &nb_tcp6)) || 379 (!rpcb_set(RPCPROG_NFS, 3, nconf_tcp6, &nb_tcp6))) 380 err(1, "rpcb_set tcp6 failed"); 381 freeaddrinfo(ai_tcp6); 382 } 383 exit (0); |
297 } | 384 } |
385 |
|
298 openlog("nfsd:", LOG_PID, LOG_DAEMON); 299 300 for (i = 0; i < nfsdcnt; i++) { | 386 openlog("nfsd:", LOG_PID, LOG_DAEMON); 387 388 for (i = 0; i < nfsdcnt; i++) { |
301 switch (fork()) { | 389 switch ((pid = fork())) { |
302 case -1: 303 syslog(LOG_ERR, "fork: %m"); | 390 case -1: 391 syslog(LOG_ERR, "fork: %m"); |
392 killchildren(); |
|
304 exit (1); 305 case 0: 306 break; 307 default: | 393 exit (1); 394 case 0: 395 break; 396 default: |
397 children[i] = pid; |
|
308 continue; 309 } 310 311 setproctitle("server"); 312 nfssvc_flag = NFSSVC_NFSD; 313 nsd.nsd_nfsd = NULL; 314#ifdef NFSKERB 315 if (sizeof (struct nfsrpc_fullverf) != RPCX_FULLVERF || --- 78 unchanged lines hidden (view full) --- 394 if ((nsd.nsd_ttl - 1) == ntohl(kout.w2)) 395 nfssvc_flag = NFSSVC_NFSD | NFSSVC_AUTHIN; 396 } 397#endif /* NFSKERB */ 398 } 399 exit(0); 400 } 401 | 398 continue; 399 } 400 401 setproctitle("server"); 402 nfssvc_flag = NFSSVC_NFSD; 403 nsd.nsd_nfsd = NULL; 404#ifdef NFSKERB 405 if (sizeof (struct nfsrpc_fullverf) != RPCX_FULLVERF || --- 78 unchanged lines hidden (view full) --- 484 if ((nsd.nsd_ttl - 1) == ntohl(kout.w2)) 485 nfssvc_flag = NFSSVC_NFSD | NFSSVC_AUTHIN; 486 } 487#endif /* NFSKERB */ 488 } 489 exit(0); 490 } 491 |
402 /* If we are serving udp, set up the socket. */ 403 for (i = 0; udpflag && i < bindhostc; i++) { 404 if ((sock = socket(AF_INET, SOCK_DGRAM, 0)) < 0) { 405 syslog(LOG_ERR, "can't create udp socket"); 406 exit(1); | 492 if (atexit(killchildren) == -1) { 493 syslog(LOG_ERR, "atexit: %s", strerror(errno)); 494 exit(1); 495 } 496 FD_ZERO(&v4bits); 497 FD_ZERO(&v6bits); 498 499 rpcbregcnt = 0; 500 /* Set up the socket for udp and rpcb register it. */ 501 if (udpflag) { 502 rpcbreg = 0; 503 for (i = 0; i < bindhostc; i++) { 504 memset(&hints, 0, sizeof hints); 505 hints.ai_flags = AI_PASSIVE; 506 hints.ai_family = AF_INET; 507 hints.ai_socktype = SOCK_DGRAM; 508 hints.ai_protocol = IPPROTO_UDP; 509 if (setbindhost(&ai_udp, bindhost[i], hints) == 0) { 510 rpcbreg = 1; 511 rpcbregcnt++; 512 if ((sock = socket(ai_udp->ai_family, 513 ai_udp->ai_socktype, 514 ai_udp->ai_protocol)) < 0) { 515 syslog(LOG_ERR, 516 "can't create udp socket"); 517 exit(1); 518 } 519 if (bind(sock, ai_udp->ai_addr, 520 ai_udp->ai_addrlen) < 0) { 521 syslog(LOG_ERR, 522 "can't bind udp addr %s: %m", 523 bindhost[i]); 524 exit(1); 525 } 526 freeaddrinfo(ai_udp); 527 nfsdargs.sock = sock; 528 nfsdargs.name = NULL; 529 nfsdargs.namelen = 0; 530 if (nfssvc(NFSSVC_ADDSOCK, &nfsdargs) < 0) { 531 syslog(LOG_ERR, "can't Add UDP socket"); 532 exit(1); 533 } 534 (void)close(sock); 535 } |
407 } | 536 } |
408 setbindhost(&inetaddr, bindhost[i]); 409 if (bind(sock, 410 (struct sockaddr *)&inetaddr, sizeof(inetaddr)) < 0) { 411 syslog(LOG_ERR, "can't bind udp addr %s: %m", bindhost[i]); 412 exit(1); | 537 if (rpcbreg == 1) { 538 memset(&hints, 0, sizeof hints); 539 hints.ai_flags = AI_PASSIVE; 540 hints.ai_family = AF_INET; 541 hints.ai_socktype = SOCK_DGRAM; 542 hints.ai_protocol = IPPROTO_UDP; 543 ecode = getaddrinfo(NULL, "nfs", &hints, &ai_udp); 544 if (ecode != 0) { 545 syslog(LOG_ERR, "getaddrinfo udp: %s", 546 gai_strerror(ecode)); 547 exit(1); 548 } 549 nconf_udp = getnetconfigent("udp"); 550 if (nconf_udp == NULL) 551 err(1, "getnetconfigent udp failed"); 552 nb_udp.buf = ai_udp->ai_addr; 553 nb_udp.len = nb_udp.maxlen = ai_udp->ai_addrlen; 554 if ((!rpcb_set(RPCPROG_NFS, 2, nconf_udp, &nb_udp)) || 555 (!rpcb_set(RPCPROG_NFS, 3, nconf_udp, &nb_udp))) 556 err(1, "rpcb_set udp failed"); 557 freeaddrinfo(ai_udp); |
413 } | 558 } |
414 if (!pmap_set(RPCPROG_NFS, 2, IPPROTO_UDP, NFS_PORT) || 415 !pmap_set(RPCPROG_NFS, 3, IPPROTO_UDP, NFS_PORT)) { 416 syslog(LOG_ERR, "can't register with udp portmap"); 417 exit(1); 418 } 419 nfsdargs.sock = sock; 420 nfsdargs.name = NULL; 421 nfsdargs.namelen = 0; 422 if (nfssvc(NFSSVC_ADDSOCK, &nfsdargs) < 0) { 423 syslog(LOG_ERR, "can't Add UDP socket"); 424 exit(1); 425 } 426 (void)close(sock); | |
427 } 428 | 559 } 560 |
429#ifdef ISO 430 /* If we are serving cltp, set up the socket. */ 431 if (cltpflag) { 432 if ((sock = socket(AF_ISO, SOCK_DGRAM, 0)) < 0) { 433 syslog(LOG_ERR, "can't create cltp socket"); 434 exit(1); | 561 /* Set up the socket for udp6 and rpcb register it. */ 562 if (udpflag && ip6flag) { 563 rpcbreg = 0; 564 for (i = 0; i < bindhostc; i++) { 565 memset(&hints, 0, sizeof hints); 566 hints.ai_flags = AI_PASSIVE; 567 hints.ai_family = AF_INET6; 568 hints.ai_socktype = SOCK_DGRAM; 569 hints.ai_protocol = IPPROTO_UDP; 570 if (setbindhost(&ai_udp6, bindhost[i], hints) == 0) { 571 rpcbreg = 1; 572 rpcbregcnt++; 573 if ((sock = socket(ai_udp6->ai_family, 574 ai_udp6->ai_socktype, 575 ai_udp6->ai_protocol)) < 0) { 576 syslog(LOG_ERR, 577 "can't create udp6 socket"); 578 exit(1); 579 } 580 if (setsockopt(sock, IPPROTO_IPV6, 581 IPV6_BINDV6ONLY, 582 &on, sizeof on) < 0) { 583 syslog(LOG_ERR, 584 "can't set v6-only binding for " 585 "udp6 socket: %m"); 586 exit(1); 587 } 588 if (bind(sock, ai_udp6->ai_addr, 589 ai_udp6->ai_addrlen) < 0) { 590 syslog(LOG_ERR, 591 "can't bind udp6 addr %s: %m", 592 bindhost[i]); 593 exit(1); 594 } 595 freeaddrinfo(ai_udp6); 596 nfsdargs.sock = sock; 597 nfsdargs.name = NULL; 598 nfsdargs.namelen = 0; 599 if (nfssvc(NFSSVC_ADDSOCK, &nfsdargs) < 0) { 600 syslog(LOG_ERR, 601 "can't add UDP6 socket"); 602 exit(1); 603 } 604 (void)close(sock); 605 } |
435 } | 606 } |
436 memset(&isoaddr, 0, sizeof(isoaddr)); 437 isoaddr.siso_family = AF_ISO; 438 isoaddr.siso_tlen = 2; 439 cp = TSEL(&isoaddr); 440 *cp++ = (NFS_PORT >> 8); 441 *cp = (NFS_PORT & 0xff); 442 isoaddr.siso_len = sizeof(isoaddr); 443 if (bind(sock, 444 (struct sockaddr *)&isoaddr, sizeof(isoaddr)) < 0) { 445 syslog(LOG_ERR, "can't bind cltp addr"); 446 exit(1); | 607 if (rpcbreg == 1) { 608 memset(&hints, 0, sizeof hints); 609 hints.ai_flags = AI_PASSIVE; 610 hints.ai_family = AF_INET6; 611 hints.ai_socktype = SOCK_DGRAM; 612 hints.ai_protocol = IPPROTO_UDP; 613 ecode = getaddrinfo(NULL, "nfs", &hints, &ai_udp6); 614 if (ecode != 0) { 615 syslog(LOG_ERR, "getaddrinfo udp6: %s", 616 gai_strerror(ecode)); 617 exit(1); 618 } 619 nconf_udp6 = getnetconfigent("udp6"); 620 if (nconf_udp6 == NULL) 621 err(1, "getnetconfigent udp6 failed"); 622 nb_udp6.buf = ai_udp6->ai_addr; 623 nb_udp6.len = nb_udp6.maxlen = ai_udp6->ai_addrlen; 624 if ((!rpcb_set(RPCPROG_NFS, 2, nconf_udp6, &nb_udp6)) || 625 (!rpcb_set(RPCPROG_NFS, 3, nconf_udp6, &nb_udp6))) 626 err(1, "rpcb_set udp6 failed"); 627 freeaddrinfo(ai_udp6); |
447 } | 628 } |
448#ifdef notyet 449 /* 450 * XXX 451 * Someday this should probably use "rpcbind", the son of 452 * portmap. 453 */ 454 if (!pmap_set(RPCPROG_NFS, NFS_VER2, IPPROTO_UDP, NFS_PORT)) { 455 syslog(LOG_ERR, "can't register with udp portmap"); 456 exit(1); 457 } 458#endif /* notyet */ 459 nfsdargs.sock = sock; 460 nfsdargs.name = NULL; 461 nfsdargs.namelen = 0; 462 if (nfssvc(NFSSVC_ADDSOCK, &nfsdargs) < 0) { 463 syslog(LOG_ERR, "can't add UDP socket"); 464 exit(1); 465 } 466 close(sock); | |
467 } | 629 } |
468#endif /* ISO */ | |
469 | 630 |
470 /* Now set up the master server socket waiting for tcp connections. */ 471 on = 1; 472 FD_ZERO(&sockbits); 473 connect_type_cnt = 0; 474 for (i = 0; tcpflag && i < bindhostc; i++) { 475 if ((tcpsock = socket(AF_INET, SOCK_STREAM, 0)) < 0) { 476 syslog(LOG_ERR, "can't create tcp socket"); 477 exit(1); | 631 /* Set up the socket for tcp and rpcb register it. */ 632 if (tcpflag) { 633 rpcbreg = 0; 634 for (i = 0; i < bindhostc; i++) { 635 memset(&hints, 0, sizeof hints); 636 hints.ai_flags = AI_PASSIVE; 637 hints.ai_family = AF_INET; 638 hints.ai_socktype = SOCK_STREAM; 639 hints.ai_protocol = IPPROTO_TCP; 640 if (setbindhost(&ai_tcp, bindhost[i], hints) == 0) { 641 rpcbreg = 1; 642 rpcbregcnt++; 643 if ((tcpsock = socket(AF_INET, SOCK_STREAM, 644 0)) < 0) { 645 syslog(LOG_ERR, 646 "can't create tpc socket"); 647 exit(1); 648 } 649 if (setsockopt(tcpsock, SOL_SOCKET, 650 SO_REUSEADDR, 651 (char *)&on, sizeof(on)) < 0) 652 syslog(LOG_ERR, 653 "setsockopt SO_REUSEADDR: %m"); 654 if (bind(tcpsock, ai_tcp->ai_addr, 655 ai_tcp->ai_addrlen) < 0) { 656 syslog(LOG_ERR, 657 "can't bind tcp addr %s: %m", 658 bindhost[i]); 659 exit(1); 660 } 661 if (listen(tcpsock, 5) < 0) { 662 syslog(LOG_ERR, "listen failed"); 663 exit(1); 664 } 665 freeaddrinfo(ai_tcp); 666 FD_SET(tcpsock, &sockbits); 667 FD_SET(tcpsock, &v4bits); 668 maxsock = tcpsock; 669 connect_type_cnt++; 670 } |
478 } | 671 } |
479 if (setsockopt(tcpsock, 480 SOL_SOCKET, SO_REUSEADDR, (char *)&on, sizeof(on)) < 0) 481 syslog(LOG_ERR, "setsockopt SO_REUSEADDR: %m"); 482 setbindhost(&inetaddr, bindhost[i]); 483 if (bind(tcpsock, 484 (struct sockaddr *)&inetaddr, sizeof (inetaddr)) < 0) { 485 syslog(LOG_ERR, "can't bind tcp addr %s: %m", bindhost[i]); 486 exit(1); | 672 if (rpcbreg == 1) { 673 memset(&hints, 0, sizeof hints); 674 hints.ai_flags = AI_PASSIVE; 675 hints.ai_family = AF_INET; 676 hints.ai_socktype = SOCK_STREAM; 677 hints.ai_protocol = IPPROTO_TCP; 678 ecode = getaddrinfo(NULL, "nfs", &hints, 679 &ai_tcp); 680 if (ecode != 0) { 681 syslog(LOG_ERR, "getaddrinfo tcp: %s", 682 gai_strerror(ecode)); 683 exit(1); 684 } 685 nconf_tcp = getnetconfigent("tcp"); 686 if (nconf_tcp == NULL) 687 err(1, "getnetconfigent tcp failed"); 688 nb_tcp.buf = ai_tcp->ai_addr; 689 nb_tcp.len = nb_tcp.maxlen = ai_tcp->ai_addrlen; 690 if ((!rpcb_set(RPCPROG_NFS, 2, nconf_tcp, 691 &nb_tcp)) || (!rpcb_set(RPCPROG_NFS, 3, 692 nconf_tcp, &nb_tcp))) 693 err(1, "rpcb_set tcp failed"); 694 freeaddrinfo(ai_tcp); |
487 } | 695 } |
488 if (listen(tcpsock, 5) < 0) { 489 syslog(LOG_ERR, "listen failed"); 490 exit(1); 491 } 492 if (!pmap_set(RPCPROG_NFS, 2, IPPROTO_TCP, NFS_PORT) || 493 !pmap_set(RPCPROG_NFS, 3, IPPROTO_TCP, NFS_PORT)) { 494 syslog(LOG_ERR, "can't register tcp with portmap"); 495 exit(1); 496 } 497 FD_SET(tcpsock, &sockbits); 498 maxsock = tcpsock; 499 connect_type_cnt++; | |
500 } 501 | 696 } 697 |
502#ifdef notyet 503 /* Now set up the master server socket waiting for tp4 connections. */ 504 if (tp4flag) { 505 if ((tp4sock = socket(AF_ISO, SOCK_SEQPACKET, 0)) < 0) { 506 syslog(LOG_ERR, "can't create tp4 socket"); 507 exit(1); | 698 /* Set up the socket for tcp6 and rpcb register it. */ 699 if (tcpflag && ip6flag) { 700 rpcbreg = 0; 701 for (i = 0; i < bindhostc; i++) { 702 memset(&hints, 0, sizeof hints); 703 hints.ai_flags = AI_PASSIVE; 704 hints.ai_family = AF_INET6; 705 hints.ai_socktype = SOCK_STREAM; 706 hints.ai_protocol = IPPROTO_TCP; 707 if (setbindhost(&ai_tcp6, bindhost[i], hints) == 0) { 708 rpcbreg = 1; 709 rpcbregcnt++; 710 if ((tcp6sock = socket(ai_tcp6->ai_family, 711 ai_tcp6->ai_socktype, 712 ai_tcp6->ai_protocol)) < 0) { 713 syslog(LOG_ERR, 714 "can't create tcp6 socket"); 715 exit(1); 716 } 717 if (setsockopt(tcp6sock, SOL_SOCKET, 718 SO_REUSEADDR, 719 (char *)&on, sizeof(on)) < 0) 720 syslog(LOG_ERR, 721 "setsockopt SO_REUSEADDR: %m"); 722 if (setsockopt(tcp6sock, IPPROTO_IPV6, 723 IPV6_BINDV6ONLY, &on, sizeof on) < 0) { 724 syslog(LOG_ERR, 725 "can't set v6-only binding for tcp6 " 726 "socket: %m"); 727 exit(1); 728 } 729 if (bind(tcp6sock, ai_tcp6->ai_addr, 730 ai_tcp6->ai_addrlen) < 0) { 731 syslog(LOG_ERR, 732 "can't bind tcp6 addr %s: %m", 733 bindhost[i]); 734 exit(1); 735 } 736 if (listen(tcp6sock, 5) < 0) { 737 syslog(LOG_ERR, "listen failed"); 738 exit(1); 739 } 740 freeaddrinfo(ai_tcp6); 741 FD_SET(tcp6sock, &sockbits); 742 FD_SET(tcp6sock, &v6bits); 743 if (maxsock < tcp6sock) 744 maxsock = tcp6sock; 745 connect_type_cnt++; 746 } |
508 } | 747 } |
509 if (setsockopt(tp4sock, 510 SOL_SOCKET, SO_REUSEADDR, (char *)&on, sizeof(on)) < 0) 511 syslog(LOG_ERR, "setsockopt SO_REUSEADDR: %m"); 512 memset(&isoaddr, 0, sizeof(isoaddr)); 513 isoaddr.siso_family = AF_ISO; 514 isoaddr.siso_tlen = 2; 515 cp = TSEL(&isoaddr); 516 *cp++ = (NFS_PORT >> 8); 517 *cp = (NFS_PORT & 0xff); 518 isoaddr.siso_len = sizeof(isoaddr); 519 if (bind(tp4sock, 520 (struct sockaddr *)&isoaddr, sizeof (isoaddr)) < 0) { 521 syslog(LOG_ERR, "can't bind tp4 addr"); 522 exit(1); | 748 if (rpcbreg == 1) { 749 memset(&hints, 0, sizeof hints); 750 hints.ai_flags = AI_PASSIVE; 751 hints.ai_family = AF_INET6; 752 hints.ai_socktype = SOCK_STREAM; 753 hints.ai_protocol = IPPROTO_TCP; 754 ecode = getaddrinfo(NULL, "nfs", &hints, &ai_tcp6); 755 if (ecode != 0) { 756 syslog(LOG_ERR, "getaddrinfo tcp6: %s", 757 gai_strerror(ecode)); 758 exit(1); 759 } 760 nconf_tcp6 = getnetconfigent("tcp6"); 761 if (nconf_tcp6 == NULL) 762 err(1, "getnetconfigent tcp6 failed"); 763 nb_tcp6.buf = ai_tcp6->ai_addr; 764 nb_tcp6.len = nb_tcp6.maxlen = ai_tcp6->ai_addrlen; 765 if ((!rpcb_set(RPCPROG_NFS, 2, nconf_tcp6, &nb_tcp6)) || 766 (!rpcb_set(RPCPROG_NFS, 3, nconf_tcp6, &nb_tcp6))) 767 err(1, "rpcb_set tcp6 failed"); 768 freeaddrinfo(ai_tcp6); |
523 } | 769 } |
524 if (listen(tp4sock, 5) < 0) { 525 syslog(LOG_ERR, "listen failed"); 526 exit(1); 527 } 528 /* 529 * XXX 530 * Someday this should probably use "rpcbind", the son of 531 * portmap. 532 */ 533 if (!pmap_set(RPCPROG_NFS, NFS_VER2, IPPROTO_TCP, NFS_PORT)) { 534 syslog(LOG_ERR, "can't register tcp with portmap"); 535 exit(1); 536 } 537 FD_SET(tp4sock, &sockbits); 538 maxsock = tp4sock; 539 connect_type_cnt++; | |
540 } 541 | 770 } 771 |
542 /* Now set up the master server socket waiting for tpip connections. */ 543 for (i = 0; tpipflag && i < bindhostc; i++) { 544 if ((tpipsock = socket(AF_INET, SOCK_SEQPACKET, 0)) < 0) { 545 syslog(LOG_ERR, "can't create tpip socket"); 546 exit(1); 547 } 548 if (setsockopt(tpipsock, 549 SOL_SOCKET, SO_REUSEADDR, (char *)&on, sizeof(on)) < 0) 550 syslog(LOG_ERR, "setsockopt SO_REUSEADDR: %m"); 551 setbindhost(&inetaddr, bindhost[i]); 552 if (bind(tpipsock, 553 (struct sockaddr *)&inetaddr, sizeof (inetaddr)) < 0) { 554 syslog(LOG_ERR, "can't bind tcp addr %s: %m", bindhost[i]); 555 exit(1); 556 } 557 if (listen(tpipsock, 5) < 0) { 558 syslog(LOG_ERR, "listen failed"); 559 exit(1); 560 } 561 /* 562 * XXX 563 * Someday this should probably use "rpcbind", the son of 564 * portmap. 565 */ 566 if (!pmap_set(RPCPROG_NFS, NFS_VER2, IPPROTO_TCP, NFS_PORT)) { 567 syslog(LOG_ERR, "can't register tcp with portmap"); 568 exit(1); 569 } 570 FD_SET(tpipsock, &sockbits); 571 maxsock = tpipsock; 572 connect_type_cnt++; | 772 if (rpcbregcnt == 0) { 773 syslog(LOG_ERR, "rpcb_set() failed, nothing to do: %m"); 774 exit(1); |
573 } | 775 } |
574#endif /* notyet */ | |
575 | 776 |
576 if (connect_type_cnt == 0) 577 exit(0); | 777 if ((tcpflag) && (connect_type_cnt == 0)) { 778 syslog(LOG_ERR, "tcp connects == 0, nothing to do: %m"); 779 exit(1); 780 } |
578 579 setproctitle("master"); 580 581 /* 582 * Loop forever accepting connections and passing the sockets 583 * into the kernel for the mounts. 584 */ 585 for (;;) { 586 ready = sockbits; 587 if (connect_type_cnt > 1) { 588 if (select(maxsock + 1, 589 &ready, NULL, NULL, NULL) < 1) { 590 syslog(LOG_ERR, "select failed: %m"); 591 exit(1); 592 } 593 } | 781 782 setproctitle("master"); 783 784 /* 785 * Loop forever accepting connections and passing the sockets 786 * into the kernel for the mounts. 787 */ 788 for (;;) { 789 ready = sockbits; 790 if (connect_type_cnt > 1) { 791 if (select(maxsock + 1, 792 &ready, NULL, NULL, NULL) < 1) { 793 syslog(LOG_ERR, "select failed: %m"); 794 exit(1); 795 } 796 } |
594 if (tcpflag && FD_ISSET(tcpsock, &ready)) { 595 len = sizeof(inetpeer); 596 if ((msgsock = accept(tcpsock, 597 (struct sockaddr *)&inetpeer, &len)) < 0) { 598 syslog(LOG_ERR, "accept failed: %m"); 599 exit(1); | 797 for (tcpsock = 0; tcpsock <= maxsock; tcpsock++) { 798 if (FD_ISSET(tcpsock, &ready)) { 799 if (FD_ISSET(tcpsock, &v4bits)) { 800 len = sizeof(inetpeer); 801 if ((msgsock = accept(tcpsock, 802 (struct sockaddr *)&inetpeer, &len)) < 0) { 803 syslog(LOG_ERR, "accept failed: %m"); 804 exit(1); 805 } 806 memset(inetpeer.sin_zero, 0, 807 sizeof(inetpeer.sin_zero)); 808 if (setsockopt(msgsock, SOL_SOCKET, 809 SO_KEEPALIVE, (char *)&on, sizeof(on)) < 0) 810 syslog(LOG_ERR, 811 "setsockopt SO_KEEPALIVE: %m"); 812 nfsdargs.sock = msgsock; 813 nfsdargs.name = (caddr_t)&inetpeer; 814 nfsdargs.namelen = sizeof(inetpeer); 815 nfssvc(NFSSVC_ADDSOCK, &nfsdargs); 816 (void)close(msgsock); 817 } else if (FD_ISSET(tcpsock, &v6bits)) { 818 len = sizeof(inet6peer); 819 if ((msgsock = accept(tcpsock, 820 (struct sockaddr *)&inet6peer, 821 &len)) < 0) { 822 syslog(LOG_ERR, 823 "accept failed: %m"); 824 exit(1); 825 } 826 if (setsockopt(msgsock, SOL_SOCKET, 827 SO_KEEPALIVE, (char *)&on, 828 sizeof(on)) < 0) 829 syslog(LOG_ERR, "setsockopt " 830 "SO_KEEPALIVE: %m"); 831 nfsdargs.sock = msgsock; 832 nfsdargs.name = (caddr_t)&inet6peer; 833 nfsdargs.namelen = sizeof(inet6peer); 834 nfssvc(NFSSVC_ADDSOCK, &nfsdargs); 835 (void)close(msgsock); 836 } |
600 } | 837 } |
601 memset(inetpeer.sin_zero, 0, sizeof(inetpeer.sin_zero)); 602 if (setsockopt(msgsock, SOL_SOCKET, 603 SO_KEEPALIVE, (char *)&on, sizeof(on)) < 0) 604 syslog(LOG_ERR, 605 "setsockopt SO_KEEPALIVE: %m"); 606 nfsdargs.sock = msgsock; 607 nfsdargs.name = (caddr_t)&inetpeer; 608 nfsdargs.namelen = sizeof(inetpeer); 609 nfssvc(NFSSVC_ADDSOCK, &nfsdargs); 610 (void)close(msgsock); | |
611 } | 838 } |
612#ifdef notyet 613 if (tp4flag && FD_ISSET(tp4sock, &ready)) { 614 len = sizeof(isopeer); 615 if ((msgsock = accept(tp4sock, 616 (struct sockaddr *)&isopeer, &len)) < 0) { 617 syslog(LOG_ERR, "accept failed: %m"); 618 exit(1); 619 } 620 if (setsockopt(msgsock, SOL_SOCKET, 621 SO_KEEPALIVE, (char *)&on, sizeof(on)) < 0) 622 syslog(LOG_ERR, 623 "setsockopt SO_KEEPALIVE: %m"); 624 nfsdargs.sock = msgsock; 625 nfsdargs.name = (caddr_t)&isopeer; 626 nfsdargs.namelen = len; 627 nfssvc(NFSSVC_ADDSOCK, &nfsdargs); 628 (void)close(msgsock); 629 } 630 if (tpipflag && FD_ISSET(tpipsock, &ready)) { 631 len = sizeof(inetpeer); 632 if ((msgsock = accept(tpipsock, 633 (struct sockaddr *)&inetpeer, &len)) < 0) { 634 syslog(LOG_ERR, "accept failed: %m"); 635 exit(1); 636 } 637 if (setsockopt(msgsock, SOL_SOCKET, 638 SO_KEEPALIVE, (char *)&on, sizeof(on)) < 0) 639 syslog(LOG_ERR, "setsockopt SO_KEEPALIVE: %m"); 640 nfsdargs.sock = msgsock; 641 nfsdargs.name = (caddr_t)&inetpeer; 642 nfsdargs.namelen = len; 643 nfssvc(NFSSVC_ADDSOCK, &nfsdargs); 644 (void)close(msgsock); 645 } 646#endif /* notyet */ | |
647 } 648} 649 | 839 } 840} 841 |
650void 651setbindhost(struct sockaddr_in *ia, const char *bindhost) | 842int 843setbindhost(struct addrinfo **ai, const char *bindhost, struct addrinfo hints) |
652{ | 844{ |
653 ia->sin_family = AF_INET; 654 ia->sin_port = htons(NFS_PORT); 655 ia->sin_len = sizeof(*ia); 656 if (bindhost == NULL || strcmp(bindhost,"*") == 0) { 657 ia->sin_addr.s_addr = INADDR_ANY; 658 } else { 659 if (inet_aton(bindhost, &ia->sin_addr) == 0) { 660 struct hostent *he; | 845 int ecode; 846 u_int32_t host_addr[4]; /* IPv4 or IPv6 */ 847 const char *hostptr; |
661 | 848 |
662 he = gethostbyname2(bindhost, ia->sin_family); 663 if (he == NULL) { 664 syslog(LOG_ERR, "gethostbyname of %s failed", bindhost); 665 exit(1); | 849 if (bindhost == NULL || strcmp("*", bindhost) == 0) 850 hostptr = NULL; 851 else 852 hostptr = bindhost; 853 854 if (hostptr != NULL) { 855 switch (hints.ai_family) { 856 case AF_INET: 857 if (inet_pton(AF_INET, hostptr, host_addr) == 1) { 858 hints.ai_flags = AI_NUMERICHOST; 859 } else { 860 if (inet_pton(AF_INET6, hostptr, 861 host_addr) == 1) 862 return (1); |
666 } | 863 } |
667 bcopy(he->h_addr, &ia->sin_addr, he->h_length); | 864 break; 865 case AF_INET6: 866 if (inet_pton(AF_INET6, hostptr, host_addr) == 1) { 867 hints.ai_flags = AI_NUMERICHOST; 868 } else { 869 if (inet_pton(AF_INET, hostptr, 870 host_addr) == 1) 871 return (1); 872 } 873 break; 874 default: |
668 } 669 } | 875 } 876 } |
877 878 ecode = getaddrinfo(hostptr, "nfs", &hints, ai); 879 if (ecode != 0) { 880 syslog(LOG_ERR, "getaddrinfo %s: %s", bindhost, 881 gai_strerror(ecode)); 882 return (1); 883 } 884 return (0); |
|
670} 671 672void 673usage() 674{ 675 (void)fprintf(stderr, "usage: nfsd %s\n", USAGE); 676 exit(1); 677} --- 8 unchanged lines hidden (view full) --- 686void 687reapchild(signo) 688 int signo; 689{ 690 691 while (wait3(NULL, WNOHANG, NULL) > 0); 692} 693 | 885} 886 887void 888usage() 889{ 890 (void)fprintf(stderr, "usage: nfsd %s\n", USAGE); 891 exit(1); 892} --- 8 unchanged lines hidden (view full) --- 901void 902reapchild(signo) 903 int signo; 904{ 905 906 while (wait3(NULL, WNOHANG, NULL) > 0); 907} 908 |
909void 910unregistration() 911{ 912 if ((!rpcb_unset(RPCPROG_NFS, 2, NULL)) || 913 (!rpcb_unset(RPCPROG_NFS, 3, NULL))) 914 syslog(LOG_ERR, "rpcb_unset failed"); 915} 916 917void 918killchildren() 919{ 920 int i; 921 sigset_t sigs; 922 923 sigemptyset(&sigs); 924 /* 925 * Block SIGCHLD to avoid killing a reaped process (although it is 926 * unlikely, the pid might have been reused). 927 */ 928 sigaddset(&sigs, SIGCHLD); 929 if (sigprocmask(SIG_BLOCK, &sigs, NULL) == -1) { 930 syslog(LOG_ERR, "sigprocmask: %s", 931 strerror(errno)); 932 return; 933 } 934 for (i = 0; i < nfsdcnt; i++) { 935 if (children[i] > 0) 936 kill(children[i], SIGKILL); 937 } 938 if (sigprocmask(SIG_UNBLOCK, &sigs, NULL) == -1) { 939 syslog(LOG_ERR, "sigprocmask: %s", strerror(errno)); 940 } 941 unregistration(); 942} 943 944void 945cleanup(signo) 946{ 947 killchildren(); 948 exit (0); 949} 950 |
|
694#ifdef OLD_SETPROCTITLE 695#ifdef __FreeBSD__ 696void 697setproctitle(a) 698 char *a; 699{ 700 register char *cp; 701 char buf[80]; 702 703 cp = Argv[0]; 704 (void)snprintf(buf, sizeof(buf), "nfsd-%s", a); 705 (void)strncpy(cp, buf, LastArg - cp); 706 cp += strlen(cp); 707 while (cp < LastArg) 708 *cp++ = '\0'; 709 Argv[1] = NULL; 710} 711#endif /* __FreeBSD__ */ 712#endif | 951#ifdef OLD_SETPROCTITLE 952#ifdef __FreeBSD__ 953void 954setproctitle(a) 955 char *a; 956{ 957 register char *cp; 958 char buf[80]; 959 960 cp = Argv[0]; 961 (void)snprintf(buf, sizeof(buf), "nfsd-%s", a); 962 (void)strncpy(cp, buf, LastArg - cp); 963 cp += strlen(cp); 964 while (cp < LastArg) 965 *cp++ = '\0'; 966 Argv[1] = NULL; 967} 968#endif /* __FreeBSD__ */ 969#endif |