Deleted Added
full compact
ypbind.c (79953) ypbind.c (90297)
1/*
2 * Copyright (c) 1992/3 Theo de Raadt <deraadt@fsa.ca>
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright

--- 15 unchanged lines hidden (view full) ---

24 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27 * SUCH DAMAGE.
28 */
29
30#ifndef lint
31static const char rcsid[] =
1/*
2 * Copyright (c) 1992/3 Theo de Raadt <deraadt@fsa.ca>
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright

--- 15 unchanged lines hidden (view full) ---

24 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27 * SUCH DAMAGE.
28 */
29
30#ifndef lint
31static const char rcsid[] =
32 "$FreeBSD: head/usr.sbin/ypbind/ypbind.c 79953 2001-07-19 11:33:24Z dd $";
32 "$FreeBSD: head/usr.sbin/ypbind/ypbind.c 90297 2002-02-06 13:30:31Z des $";
33#endif /* not lint */
34
35#include <sys/param.h>
36#include <sys/types.h>
37#include <sys/wait.h>
38#include <sys/ioctl.h>
39#include <sys/signal.h>
40#include <sys/socket.h>

--- 49 unchanged lines hidden (view full) ---

90#define READFD ypdb->dom_pipe_fds[0]
91#define WRITEFD ypdb->dom_pipe_fds[1]
92#define BROADFD broad_domain->dom_pipe_fds[1]
93
94extern bool_t xdr_domainname(), xdr_ypbind_resp();
95extern bool_t xdr_ypreq_key(), xdr_ypresp_val();
96extern bool_t xdr_ypbind_setdom();
97
33#endif /* not lint */
34
35#include <sys/param.h>
36#include <sys/types.h>
37#include <sys/wait.h>
38#include <sys/ioctl.h>
39#include <sys/signal.h>
40#include <sys/socket.h>

--- 49 unchanged lines hidden (view full) ---

90#define READFD ypdb->dom_pipe_fds[0]
91#define WRITEFD ypdb->dom_pipe_fds[1]
92#define BROADFD broad_domain->dom_pipe_fds[1]
93
94extern bool_t xdr_domainname(), xdr_ypbind_resp();
95extern bool_t xdr_ypreq_key(), xdr_ypresp_val();
96extern bool_t xdr_ypbind_setdom();
97
98void checkwork __P((void));
99void *ypbindproc_null_2_yp __P((SVCXPRT *, void *, CLIENT *));
100void *ypbindproc_setdom_2_yp __P((SVCXPRT *, struct ypbind_setdom *, CLIENT *));
101void rpc_received __P((char *, struct sockaddr_in *, int ));
102void broadcast __P((struct _dom_binding *));
103int ping __P((struct _dom_binding *));
104int tell_parent __P((char *, struct sockaddr_in *));
105void handle_children __P(( struct _dom_binding * ));
106void reaper __P((int));
107void terminate __P((int));
108void yp_restricted_mode __P((char *));
109int verify __P((struct in_addr));
98void checkwork(void);
99void *ypbindproc_null_2_yp(SVCXPRT *, void *, CLIENT *);
100void *ypbindproc_setdom_2_yp(SVCXPRT *, struct ypbind_setdom *, CLIENT *);
101void rpc_received(char *, struct sockaddr_in *, int);
102void broadcast(struct _dom_binding *);
103int ping(struct _dom_binding *);
104int tell_parent(char *, struct sockaddr_in *);
105void handle_children(struct _dom_binding *);
106void reaper(int);
107void terminate(int);
108void yp_restricted_mode(char *);
109int verify(struct in_addr);
110
111char *domain_name;
112struct _dom_binding *ypbindlist;
113static struct _dom_binding *broad_domain;
114
115#define YPSET_NO 0
116#define YPSET_LOCAL 1
117#define YPSET_ALL 2

--- 64 unchanged lines hidden (view full) ---

182 res.ypbind_resp_u.ypbind_error = YPBIND_ERR_NOSERV;
183
184 if (strchr(*argp, '/')) {
185 syslog(LOG_WARNING, "Domain name '%s' has embedded slash -- \
186rejecting.", *argp);
187 return(&res);
188 }
189
110
111char *domain_name;
112struct _dom_binding *ypbindlist;
113static struct _dom_binding *broad_domain;
114
115#define YPSET_NO 0
116#define YPSET_LOCAL 1
117#define YPSET_ALL 2

--- 64 unchanged lines hidden (view full) ---

182 res.ypbind_resp_u.ypbind_error = YPBIND_ERR_NOSERV;
183
184 if (strchr(*argp, '/')) {
185 syslog(LOG_WARNING, "Domain name '%s' has embedded slash -- \
186rejecting.", *argp);
187 return(&res);
188 }
189
190 for(ypdb=ypbindlist; ypdb; ypdb=ypdb->dom_pnext) {
191 if( strcmp(ypdb->dom_domain, *argp) == 0)
190 for (ypdb = ypbindlist; ypdb; ypdb = ypdb->dom_pnext) {
191 if (strcmp(ypdb->dom_domain, *argp) == 0)
192 break;
193 }
194
192 break;
193 }
194
195 if(ypdb==NULL) {
195 if (ypdb == NULL) {
196 if (yp_restricted) {
197 syslog(LOG_NOTICE, "Running in restricted mode -- request to bind domain \"%s\" rejected.\n", *argp);
196 if (yp_restricted) {
197 syslog(LOG_NOTICE, "Running in restricted mode -- request to bind domain \"%s\" rejected.\n", *argp);
198 return &res;
198 return (&res);
199 }
200
201 if (domains >= MAX_DOMAINS) {
202 syslog(LOG_WARNING, "domain limit (%d) exceeded",
203 MAX_DOMAINS);
204 res.ypbind_resp_u.ypbind_error = YPBIND_ERR_RESC;
199 }
200
201 if (domains >= MAX_DOMAINS) {
202 syslog(LOG_WARNING, "domain limit (%d) exceeded",
203 MAX_DOMAINS);
204 res.ypbind_resp_u.ypbind_error = YPBIND_ERR_RESC;
205 return &res;
205 return (&res);
206 }
207 ypdb = (struct _dom_binding *)malloc(sizeof *ypdb);
208 if (ypdb == NULL) {
209 syslog(LOG_WARNING, "malloc: %m");
210 res.ypbind_resp_u.ypbind_error = YPBIND_ERR_RESC;
206 }
207 ypdb = (struct _dom_binding *)malloc(sizeof *ypdb);
208 if (ypdb == NULL) {
209 syslog(LOG_WARNING, "malloc: %m");
210 res.ypbind_resp_u.ypbind_error = YPBIND_ERR_RESC;
211 return &res;
211 return (&res);
212 }
213 bzero((char *)ypdb, sizeof *ypdb);
214 strncpy(ypdb->dom_domain, *argp, sizeof ypdb->dom_domain);
215 ypdb->dom_vers = YPVERS;
216 ypdb->dom_alive = 0;
217 ypdb->dom_default = 0;
218 ypdb->dom_lockfd = -1;
219 sprintf(path, "%s/%s.%ld", BINDINGDIR,
220 ypdb->dom_domain, ypdb->dom_vers);
221 unlink(path);
222 ypdb->dom_pnext = ypbindlist;
223 ypbindlist = ypdb;
224 domains++;
225 }
226
227 if (ping(ypdb)) {
212 }
213 bzero((char *)ypdb, sizeof *ypdb);
214 strncpy(ypdb->dom_domain, *argp, sizeof ypdb->dom_domain);
215 ypdb->dom_vers = YPVERS;
216 ypdb->dom_alive = 0;
217 ypdb->dom_default = 0;
218 ypdb->dom_lockfd = -1;
219 sprintf(path, "%s/%s.%ld", BINDINGDIR,
220 ypdb->dom_domain, ypdb->dom_vers);
221 unlink(path);
222 ypdb->dom_pnext = ypbindlist;
223 ypbindlist = ypdb;
224 domains++;
225 }
226
227 if (ping(ypdb)) {
228 return &res;
228 return (&res);
229 }
230
231 res.ypbind_status = YPBIND_SUCC_VAL;
232 res.ypbind_resp_u.ypbind_error = 0; /* Success */
233 *(u_int32_t *)&res.ypbind_resp_u.ypbind_bindinfo.ypbind_binding_addr =
234 ypdb->dom_server_addr.sin_addr.s_addr;
235 *(u_short *)&res.ypbind_resp_u.ypbind_bindinfo.ypbind_binding_port =
236 ypdb->dom_server_addr.sin_port;
237 /*printf("domain %s at %s/%d\n", ypdb->dom_domain,
238 inet_ntoa(ypdb->dom_server_addr.sin_addr),
239 ntohs(ypdb->dom_server_addr.sin_port));*/
229 }
230
231 res.ypbind_status = YPBIND_SUCC_VAL;
232 res.ypbind_resp_u.ypbind_error = 0; /* Success */
233 *(u_int32_t *)&res.ypbind_resp_u.ypbind_bindinfo.ypbind_binding_addr =
234 ypdb->dom_server_addr.sin_addr.s_addr;
235 *(u_short *)&res.ypbind_resp_u.ypbind_bindinfo.ypbind_binding_port =
236 ypdb->dom_server_addr.sin_port;
237 /*printf("domain %s at %s/%d\n", ypdb->dom_domain,
238 inet_ntoa(ypdb->dom_server_addr.sin_addr),
239 ntohs(ypdb->dom_server_addr.sin_port));*/
240 return &res;
240 return (&res);
241}
242
243void *
244ypbindproc_setdom_2_yp(transp, argp, clnt)
245SVCXPRT *transp;
246ypbind_setdom *argp;
247CLIENT *clnt;
248{
249 struct sockaddr_in *fromsin, bindsin;
250 static char *result = NULL;
251
252 if (strchr(argp->ypsetdom_domain, '/')) {
253 syslog(LOG_WARNING, "Domain name '%s' has embedded slash -- \
254rejecting.", argp->ypsetdom_domain);
255 return(NULL);
256 }
257 fromsin = svc_getcaller(transp);
258
241}
242
243void *
244ypbindproc_setdom_2_yp(transp, argp, clnt)
245SVCXPRT *transp;
246ypbind_setdom *argp;
247CLIENT *clnt;
248{
249 struct sockaddr_in *fromsin, bindsin;
250 static char *result = NULL;
251
252 if (strchr(argp->ypsetdom_domain, '/')) {
253 syslog(LOG_WARNING, "Domain name '%s' has embedded slash -- \
254rejecting.", argp->ypsetdom_domain);
255 return(NULL);
256 }
257 fromsin = svc_getcaller(transp);
258
259 switch(ypsetmode) {
259 switch (ypsetmode) {
260 case YPSET_LOCAL:
260 case YPSET_LOCAL:
261 if( fromsin->sin_addr.s_addr != htonl(INADDR_LOOPBACK)) {
261 if (fromsin->sin_addr.s_addr != htonl(INADDR_LOOPBACK)) {
262 svcerr_noprog(transp);
263 return(NULL);
264 }
265 break;
266 case YPSET_ALL:
267 break;
268 case YPSET_NO:
269 default:
270 svcerr_noprog(transp);
271 return(NULL);
272 }
273
262 svcerr_noprog(transp);
263 return(NULL);
264 }
265 break;
266 case YPSET_ALL:
267 break;
268 case YPSET_NO:
269 default:
270 svcerr_noprog(transp);
271 return(NULL);
272 }
273
274 if(ntohs(fromsin->sin_port) >= IPPORT_RESERVED) {
274 if (ntohs(fromsin->sin_port) >= IPPORT_RESERVED) {
275 svcerr_noprog(transp);
276 return(NULL);
277 }
278
275 svcerr_noprog(transp);
276 return(NULL);
277 }
278
279 if(argp->ypsetdom_vers != YPVERS) {
279 if (argp->ypsetdom_vers != YPVERS) {
280 svcerr_noprog(transp);
281 return(NULL);
282 }
283
284 bzero((char *)&bindsin, sizeof bindsin);
285 bindsin.sin_family = AF_INET;
286 bindsin.sin_addr.s_addr = *(u_int32_t *)argp->ypsetdom_binding.ypbind_binding_addr;
287 bindsin.sin_port = *(u_short *)argp->ypsetdom_binding.ypbind_binding_port;

--- 25 unchanged lines hidden (view full) ---

313
314 case YPBINDPROC_DOMAIN:
315 xdr_argument = xdr_domainname;
316 xdr_result = xdr_ypbind_resp;
317 local = (char *(*)()) ypbindproc_domain_2_yp;
318 break;
319
320 case YPBINDPROC_SETDOM:
280 svcerr_noprog(transp);
281 return(NULL);
282 }
283
284 bzero((char *)&bindsin, sizeof bindsin);
285 bindsin.sin_family = AF_INET;
286 bindsin.sin_addr.s_addr = *(u_int32_t *)argp->ypsetdom_binding.ypbind_binding_addr;
287 bindsin.sin_port = *(u_short *)argp->ypsetdom_binding.ypbind_binding_port;

--- 25 unchanged lines hidden (view full) ---

313
314 case YPBINDPROC_DOMAIN:
315 xdr_argument = xdr_domainname;
316 xdr_result = xdr_ypbind_resp;
317 local = (char *(*)()) ypbindproc_domain_2_yp;
318 break;
319
320 case YPBINDPROC_SETDOM:
321 switch(rqstp->rq_cred.oa_flavor) {
321 switch (rqstp->rq_cred.oa_flavor) {
322 case AUTH_UNIX:
323 creds = (struct authunix_parms *)rqstp->rq_clntcred;
322 case AUTH_UNIX:
323 creds = (struct authunix_parms *)rqstp->rq_clntcred;
324 if( creds->aup_uid != 0) {
324 if (creds->aup_uid != 0) {
325 svcerr_auth(transp, AUTH_BADCRED);
326 return;
327 }
328 break;
329 default:
330 svcerr_auth(transp, AUTH_TOOWEAK);
331 return;
332 }

--- 20 unchanged lines hidden (view full) ---

353}
354
355/* Jack the reaper */
356void reaper(sig)
357int sig;
358{
359 int st;
360
325 svcerr_auth(transp, AUTH_BADCRED);
326 return;
327 }
328 break;
329 default:
330 svcerr_auth(transp, AUTH_TOOWEAK);
331 return;
332 }

--- 20 unchanged lines hidden (view full) ---

353}
354
355/* Jack the reaper */
356void reaper(sig)
357int sig;
358{
359 int st;
360
361 while(wait3(&st, WNOHANG, NULL) > 0)
361 while (wait3(&st, WNOHANG, NULL) > 0)
362 children--;
363}
364
365void terminate(sig)
366int sig;
367{
368 struct _dom_binding *ypdb;
369 char path[MAXPATHLEN];
370
371 if (ppid != getpid())
372 exit(0);
373
362 children--;
363}
364
365void terminate(sig)
366int sig;
367{
368 struct _dom_binding *ypdb;
369 char path[MAXPATHLEN];
370
371 if (ppid != getpid())
372 exit(0);
373
374 for(ypdb=ypbindlist; ypdb; ypdb=ypdb->dom_pnext) {
374 for (ypdb = ypbindlist; ypdb; ypdb = ypdb->dom_pnext) {
375 close(ypdb->dom_lockfd);
376 if (ypdb->dom_broadcast_pid)
377 kill(ypdb->dom_broadcast_pid, SIGINT);
378 sprintf(path, "%s/%s.%ld", BINDINGDIR,
379 ypdb->dom_domain, ypdb->dom_vers);
380 unlink(path);
381 }
382 close(yplockfd);

--- 12 unchanged lines hidden (view full) ---

395 DIR *dird;
396 struct dirent *dirp;
397 struct _dom_binding *ypdb, *next;
398
399 /* Check that another ypbind isn't already running. */
400 if ((yplockfd = (open(YPBINDLOCK, O_RDONLY|O_CREAT, 0444))) == -1)
401 err(1, "%s", YPBINDLOCK);
402
375 close(ypdb->dom_lockfd);
376 if (ypdb->dom_broadcast_pid)
377 kill(ypdb->dom_broadcast_pid, SIGINT);
378 sprintf(path, "%s/%s.%ld", BINDINGDIR,
379 ypdb->dom_domain, ypdb->dom_vers);
380 unlink(path);
381 }
382 close(yplockfd);

--- 12 unchanged lines hidden (view full) ---

395 DIR *dird;
396 struct dirent *dirp;
397 struct _dom_binding *ypdb, *next;
398
399 /* Check that another ypbind isn't already running. */
400 if ((yplockfd = (open(YPBINDLOCK, O_RDONLY|O_CREAT, 0444))) == -1)
401 err(1, "%s", YPBINDLOCK);
402
403 if(flock(yplockfd, LOCK_EX|LOCK_NB) == -1 && errno == EWOULDBLOCK)
403 if (flock(yplockfd, LOCK_EX|LOCK_NB) == -1 && errno == EWOULDBLOCK)
404 errx(1, "another ypbind is already running. Aborting");
405
406 /* XXX domainname will be overriden if we use restricted mode */
407 yp_get_default_domain(&domain_name);
404 errx(1, "another ypbind is already running. Aborting");
405
406 /* XXX domainname will be overriden if we use restricted mode */
407 yp_get_default_domain(&domain_name);
408 if( domain_name[0] == '\0')
408 if (domain_name[0] == '\0')
409 errx(1, "domainname not set. Aborting");
410
409 errx(1, "domainname not set. Aborting");
410
411 for(i=1; i<argc; i++) {
412 if( strcmp("-ypset", argv[i]) == 0)
411 for (i = 1; i<argc; i++) {
412 if (strcmp("-ypset", argv[i]) == 0)
413 ypsetmode = YPSET_ALL;
414 else if (strcmp("-ypsetme", argv[i]) == 0)
415 ypsetmode = YPSET_LOCAL;
416 else if (strcmp("-s", argv[i]) == 0)
417 ypsecuremode++;
418 else if (strcmp("-S", argv[i]) == 0 && argc > i)
419 yp_restricted_mode(argv[++i]);
420 else if (strcmp("-m", argv[i]) == 0)

--- 54 unchanged lines hidden (view full) ---

475
476 ppid = getpid(); /* Remember who we are. */
477
478 openlog(argv[0], LOG_PID, LOG_DAEMON);
479
480 /* Kick off the default domain */
481 broadcast(ypbindlist);
482
413 ypsetmode = YPSET_ALL;
414 else if (strcmp("-ypsetme", argv[i]) == 0)
415 ypsetmode = YPSET_LOCAL;
416 else if (strcmp("-s", argv[i]) == 0)
417 ypsecuremode++;
418 else if (strcmp("-S", argv[i]) == 0 && argc > i)
419 yp_restricted_mode(argv[++i]);
420 else if (strcmp("-m", argv[i]) == 0)

--- 54 unchanged lines hidden (view full) ---

475
476 ppid = getpid(); /* Remember who we are. */
477
478 openlog(argv[0], LOG_PID, LOG_DAEMON);
479
480 /* Kick off the default domain */
481 broadcast(ypbindlist);
482
483 while(1) {
483 while (1) {
484 fdsr = svc_fdset;
485
486 tv.tv_sec = 60;
487 tv.tv_usec = 0;
488
484 fdsr = svc_fdset;
485
486 tv.tv_sec = 60;
487 tv.tv_usec = 0;
488
489 switch(select(_rpc_dtablesize(), &fdsr, NULL, NULL, &tv)) {
489 switch (select(_rpc_dtablesize(), &fdsr, NULL, NULL, &tv)) {
490 case 0:
491 checkwork();
492 break;
493 case -1:
494 if (errno != EINTR)
495 syslog(LOG_WARNING, "select: %m");
496 break;
497 default:
490 case 0:
491 checkwork();
492 break;
493 case -1:
494 if (errno != EINTR)
495 syslog(LOG_WARNING, "select: %m");
496 break;
497 default:
498 for(ypdb=ypbindlist; ypdb; ypdb=next) {
498 for (ypdb = ypbindlist; ypdb; ypdb = next) {
499 next = ypdb->dom_pnext;
500 if (READFD > 0 && FD_ISSET(READFD, &fdsr)) {
501 handle_children(ypdb);
502 if (children == (MAX_CHILDREN - 1))
503 checkwork();
504 }
505 }
506 svc_getreqset(&fdsr);

--- 5 unchanged lines hidden (view full) ---

512 exit(1);
513}
514
515void
516checkwork()
517{
518 struct _dom_binding *ypdb;
519
499 next = ypdb->dom_pnext;
500 if (READFD > 0 && FD_ISSET(READFD, &fdsr)) {
501 handle_children(ypdb);
502 if (children == (MAX_CHILDREN - 1))
503 checkwork();
504 }
505 }
506 svc_getreqset(&fdsr);

--- 5 unchanged lines hidden (view full) ---

512 exit(1);
513}
514
515void
516checkwork()
517{
518 struct _dom_binding *ypdb;
519
520 for(ypdb=ypbindlist; ypdb; ypdb=ypdb->dom_pnext)
520 for (ypdb = ypbindlist; ypdb; ypdb = ypdb->dom_pnext)
521 ping(ypdb);
522}
523
524/* The clnt_broadcast() callback mechanism sucks. */
525
526/*
527 * Receive results from broadcaster. Don't worry about passing
528 * bogus info to rpc_received() -- it can handle it. Note that we

--- 21 unchanged lines hidden (view full) ---

550
551 close(READFD);
552 FD_CLR(READFD, &fdsr);
553 FD_CLR(READFD, &svc_fdset);
554 READFD = WRITEFD = -1;
555 if (d > 0 && a > 0)
556 rpc_received((char *)&buf, &addr, 0);
557 else {
521 ping(ypdb);
522}
523
524/* The clnt_broadcast() callback mechanism sucks. */
525
526/*
527 * Receive results from broadcaster. Don't worry about passing
528 * bogus info to rpc_received() -- it can handle it. Note that we

--- 21 unchanged lines hidden (view full) ---

550
551 close(READFD);
552 FD_CLR(READFD, &fdsr);
553 FD_CLR(READFD, &svc_fdset);
554 READFD = WRITEFD = -1;
555 if (d > 0 && a > 0)
556 rpc_received((char *)&buf, &addr, 0);
557 else {
558 for(y=ypbindlist; y; y=y->dom_pnext) {
558 for (y = ypbindlist; y; y = y->dom_pnext) {
559 if (y == ypdb)
560 break;
561 prev = y;
562 }
559 if (y == ypdb)
560 break;
561 prev = y;
562 }
563 switch(ypdb->dom_default) {
563 switch (ypdb->dom_default) {
564 case 0:
565 if (prev == NULL)
566 ypbindlist = y->dom_pnext;
567 else
568 prev->dom_pnext = y->dom_pnext;
569 sprintf(path, "%s/%s.%ld", BINDINGDIR,
570 ypdb->dom_domain, YPVERS);
571 close(ypdb->dom_lockfd);

--- 56 unchanged lines hidden (view full) ---

628bool_t broadcast_result(out, addr)
629bool_t *out;
630struct sockaddr_in *addr;
631{
632 if (retries >= MAX_RETRIES) {
633 bzero((char *)addr, sizeof(struct sockaddr_in));
634 if (tell_parent(broad_domain->dom_domain, addr))
635 syslog(LOG_WARNING, "lost connection to parent");
564 case 0:
565 if (prev == NULL)
566 ypbindlist = y->dom_pnext;
567 else
568 prev->dom_pnext = y->dom_pnext;
569 sprintf(path, "%s/%s.%ld", BINDINGDIR,
570 ypdb->dom_domain, YPVERS);
571 close(ypdb->dom_lockfd);

--- 56 unchanged lines hidden (view full) ---

628bool_t broadcast_result(out, addr)
629bool_t *out;
630struct sockaddr_in *addr;
631{
632 if (retries >= MAX_RETRIES) {
633 bzero((char *)addr, sizeof(struct sockaddr_in));
634 if (tell_parent(broad_domain->dom_domain, addr))
635 syslog(LOG_WARNING, "lost connection to parent");
636 return TRUE;
636 return (TRUE);
637 }
638
639 if (yp_restricted && verify(addr->sin_addr)) {
640 retries++;
641 syslog(LOG_NOTICE, "NIS server at %s not in restricted mode access list -- rejecting.\n",inet_ntoa(addr->sin_addr));
637 }
638
639 if (yp_restricted && verify(addr->sin_addr)) {
640 retries++;
641 syslog(LOG_NOTICE, "NIS server at %s not in restricted mode access list -- rejecting.\n",inet_ntoa(addr->sin_addr));
642 return FALSE;
642 return (FALSE);
643 } else {
644 if (tell_parent(broad_domain->dom_domain, addr))
645 syslog(LOG_WARNING, "lost connection to parent");
643 } else {
644 if (tell_parent(broad_domain->dom_domain, addr))
645 syslog(LOG_WARNING, "lost connection to parent");
646 return TRUE;
646 return (TRUE);
647 }
648}
649
650/*
651 * The right way to send RPC broadcasts.
652 * Use the clnt_broadcast() RPC service. Unfortunately, clnt_broadcast()
653 * blocks while waiting for replies, so we have to fork off separate
654 * broadcaster processes that do the waiting and then transmit their

--- 19 unchanged lines hidden (view full) ---

674
675 if (ypdb->dom_vers == -1 && (long)ypdb->dom_server_addr.sin_addr.s_addr)
676 syslog(LOG_WARNING, "NIS server [%s] for domain \"%s\" not responding",
677 inet_ntoa(ypdb->dom_server_addr.sin_addr), ypdb->dom_domain);
678
679 broad_domain = ypdb;
680 flock(ypdb->dom_lockfd, LOCK_UN);
681
647 }
648}
649
650/*
651 * The right way to send RPC broadcasts.
652 * Use the clnt_broadcast() RPC service. Unfortunately, clnt_broadcast()
653 * blocks while waiting for replies, so we have to fork off separate
654 * broadcaster processes that do the waiting and then transmit their

--- 19 unchanged lines hidden (view full) ---

674
675 if (ypdb->dom_vers == -1 && (long)ypdb->dom_server_addr.sin_addr.s_addr)
676 syslog(LOG_WARNING, "NIS server [%s] for domain \"%s\" not responding",
677 inet_ntoa(ypdb->dom_server_addr.sin_addr), ypdb->dom_domain);
678
679 broad_domain = ypdb;
680 flock(ypdb->dom_lockfd, LOCK_UN);
681
682 switch((ypdb->dom_broadcast_pid = fork())) {
682 switch ((ypdb->dom_broadcast_pid = fork())) {
683 case 0:
684 close(READFD);
685 signal(SIGCHLD, SIG_DFL);
686 signal(SIGTERM, SIG_DFL);
687 break;
688 case -1:
689 syslog(LOG_WARNING, "fork: %m");
690 close(READFD);
691 close(WRITEFD);
692 return;
693 default:
694 close(WRITEFD);
695 FD_SET(READFD, &svc_fdset);
696 children++;
697 return;
698 }
699
700 /* Release all locks before doing anything else. */
683 case 0:
684 close(READFD);
685 signal(SIGCHLD, SIG_DFL);
686 signal(SIGTERM, SIG_DFL);
687 break;
688 case -1:
689 syslog(LOG_WARNING, "fork: %m");
690 close(READFD);
691 close(WRITEFD);
692 return;
693 default:
694 close(WRITEFD);
695 FD_SET(READFD, &svc_fdset);
696 children++;
697 return;
698 }
699
700 /* Release all locks before doing anything else. */
701 while(ypbindlist) {
701 while (ypbindlist) {
702 close(ypbindlist->dom_lockfd);
703 ypbindlist = ypbindlist->dom_pnext;
704 }
705 close(yplockfd);
706
707 /*
708 * Special 'many-cast' behavior. If we're in restricted mode,
709 * we have a list of possible server addresses to try. What

--- 118 unchanged lines hidden (view full) ---

828 struct iovec iov[2];
829 struct ypbind_resp ybr;
830 char path[MAXPATHLEN];
831 int fd;
832
833 /*printf("returned from %s/%d about %s\n", inet_ntoa(raddrp->sin_addr),
834 ntohs(raddrp->sin_port), dom);*/
835
702 close(ypbindlist->dom_lockfd);
703 ypbindlist = ypbindlist->dom_pnext;
704 }
705 close(yplockfd);
706
707 /*
708 * Special 'many-cast' behavior. If we're in restricted mode,
709 * we have a list of possible server addresses to try. What

--- 118 unchanged lines hidden (view full) ---

828 struct iovec iov[2];
829 struct ypbind_resp ybr;
830 char path[MAXPATHLEN];
831 int fd;
832
833 /*printf("returned from %s/%d about %s\n", inet_ntoa(raddrp->sin_addr),
834 ntohs(raddrp->sin_port), dom);*/
835
836 if(dom==NULL)
836 if (dom == NULL)
837 return;
838
837 return;
838
839 for(ypdb=ypbindlist; ypdb; ypdb=ypdb->dom_pnext) {
840 if( strcmp(ypdb->dom_domain, dom) == 0)
839 for (ypdb = ypbindlist; ypdb; ypdb = ypdb->dom_pnext) {
840 if (strcmp(ypdb->dom_domain, dom) == 0)
841 break;
842 prev = ypdb;
843 }
844
845 if (ypdb && force) {
846 if (ypdb->dom_broadcast_pid) {
847 kill(ypdb->dom_broadcast_pid, SIGINT);
848 close(READFD);

--- 11 unchanged lines hidden (view full) ---

860 if (ypdb != NULL) {
861 ypdb->dom_broadcast_pid = 0;
862 ypdb->dom_alive = 0;
863 }
864 return;
865 }
866
867 if (raddrp->sin_addr.s_addr == (long)0) {
841 break;
842 prev = ypdb;
843 }
844
845 if (ypdb && force) {
846 if (ypdb->dom_broadcast_pid) {
847 kill(ypdb->dom_broadcast_pid, SIGINT);
848 close(READFD);

--- 11 unchanged lines hidden (view full) ---

860 if (ypdb != NULL) {
861 ypdb->dom_broadcast_pid = 0;
862 ypdb->dom_alive = 0;
863 }
864 return;
865 }
866
867 if (raddrp->sin_addr.s_addr == (long)0) {
868 switch(ypdb->dom_default) {
868 switch (ypdb->dom_default) {
869 case 0:
870 if (prev == NULL)
871 ypbindlist = ypdb->dom_pnext;
872 else
873 prev->dom_pnext = ypdb->dom_pnext;
874 sprintf(path, "%s/%s.%ld", BINDINGDIR,
875 ypdb->dom_domain, YPVERS);
876 close(ypdb->dom_lockfd);

--- 6 unchanged lines hidden (view full) ---

883 ypdb->dom_alive = 0;
884 broadcast(ypdb);
885 return;
886 default:
887 break;
888 }
889 }
890
869 case 0:
870 if (prev == NULL)
871 ypbindlist = ypdb->dom_pnext;
872 else
873 prev->dom_pnext = ypdb->dom_pnext;
874 sprintf(path, "%s/%s.%ld", BINDINGDIR,
875 ypdb->dom_domain, YPVERS);
876 close(ypdb->dom_lockfd);

--- 6 unchanged lines hidden (view full) ---

883 ypdb->dom_alive = 0;
884 broadcast(ypdb);
885 return;
886 default:
887 break;
888 }
889 }
890
891 if(ypdb==NULL) {
891 if (ypdb == NULL) {
892 if (force == 0)
893 return;
894 ypdb = (struct _dom_binding *)malloc(sizeof *ypdb);
895 if (ypdb == NULL) {
896 syslog(LOG_WARNING, "malloc: %m");
897 return;
898 }
899 bzero((char *)ypdb, sizeof *ypdb);

--- 11 unchanged lines hidden (view full) ---

911
912 bcopy((char *)raddrp, (char *)&ypdb->dom_server_addr,
913 sizeof ypdb->dom_server_addr);
914
915 ypdb->dom_vers = YPVERS;
916 ypdb->dom_alive = 1;
917 ypdb->dom_broadcast_pid = 0;
918
892 if (force == 0)
893 return;
894 ypdb = (struct _dom_binding *)malloc(sizeof *ypdb);
895 if (ypdb == NULL) {
896 syslog(LOG_WARNING, "malloc: %m");
897 return;
898 }
899 bzero((char *)ypdb, sizeof *ypdb);

--- 11 unchanged lines hidden (view full) ---

911
912 bcopy((char *)raddrp, (char *)&ypdb->dom_server_addr,
913 sizeof ypdb->dom_server_addr);
914
915 ypdb->dom_vers = YPVERS;
916 ypdb->dom_alive = 1;
917 ypdb->dom_broadcast_pid = 0;
918
919 if(ypdb->dom_lockfd != -1)
919 if (ypdb->dom_lockfd != -1)
920 close(ypdb->dom_lockfd);
921
922 sprintf(path, "%s/%s.%ld", BINDINGDIR,
923 ypdb->dom_domain, ypdb->dom_vers);
924#ifdef O_SHLOCK
920 close(ypdb->dom_lockfd);
921
922 sprintf(path, "%s/%s.%ld", BINDINGDIR,
923 ypdb->dom_domain, ypdb->dom_vers);
924#ifdef O_SHLOCK
925 if( (fd=open(path, O_CREAT|O_SHLOCK|O_RDWR|O_TRUNC, 0644)) == -1) {
925 if ((fd = open(path, O_CREAT|O_SHLOCK|O_RDWR|O_TRUNC, 0644)) == -1) {
926 (void)mkdir(BINDINGDIR, 0755);
926 (void)mkdir(BINDINGDIR, 0755);
927 if( (fd=open(path, O_CREAT|O_SHLOCK|O_RDWR|O_TRUNC, 0644)) == -1)
927 if ((fd = open(path, O_CREAT|O_SHLOCK|O_RDWR|O_TRUNC, 0644)) == -1)
928 return;
929 }
930#else
928 return;
929 }
930#else
931 if( (fd=open(path, O_CREAT|O_RDWR|O_TRUNC, 0644)) == -1) {
931 if ((fd = open(path, O_CREAT|O_RDWR|O_TRUNC, 0644)) == -1) {
932 (void)mkdir(BINDINGDIR, 0755);
932 (void)mkdir(BINDINGDIR, 0755);
933 if( (fd=open(path, O_CREAT|O_RDWR|O_TRUNC, 0644)) == -1)
933 if ((fd = open(path, O_CREAT|O_RDWR|O_TRUNC, 0644)) == -1)
934 return;
935 }
936 flock(fd, LOCK_SH);
937#endif
938
939 /*
940 * ok, if BINDINGDIR exists, and we can create the binding file,
941 * then write to it..

--- 5 unchanged lines hidden (view full) ---

947 iov[1].iov_base = (caddr_t)&ybr;
948 iov[1].iov_len = sizeof ybr;
949
950 bzero(&ybr, sizeof ybr);
951 ybr.ypbind_status = YPBIND_SUCC_VAL;
952 *(u_int32_t *)&ybr.ypbind_resp_u.ypbind_bindinfo.ypbind_binding_addr = raddrp->sin_addr.s_addr;
953 *(u_short *)&ybr.ypbind_resp_u.ypbind_bindinfo.ypbind_binding_port = raddrp->sin_port;
954
934 return;
935 }
936 flock(fd, LOCK_SH);
937#endif
938
939 /*
940 * ok, if BINDINGDIR exists, and we can create the binding file,
941 * then write to it..

--- 5 unchanged lines hidden (view full) ---

947 iov[1].iov_base = (caddr_t)&ybr;
948 iov[1].iov_len = sizeof ybr;
949
950 bzero(&ybr, sizeof ybr);
951 ybr.ypbind_status = YPBIND_SUCC_VAL;
952 *(u_int32_t *)&ybr.ypbind_resp_u.ypbind_bindinfo.ypbind_binding_addr = raddrp->sin_addr.s_addr;
953 *(u_short *)&ybr.ypbind_resp_u.ypbind_bindinfo.ypbind_binding_port = raddrp->sin_port;
954
955 if( writev(ypdb->dom_lockfd, iov, 2) != iov[0].iov_len + iov[1].iov_len) {
955 if (writev(ypdb->dom_lockfd, iov, 2) != iov[0].iov_len + iov[1].iov_len) {
956 syslog(LOG_WARNING, "write: %m");
957 close(ypdb->dom_lockfd);
958 ypdb->dom_lockfd = -1;
959 return;
960 }
961}
962
963/*

--- 37 unchanged lines hidden (view full) ---

1001 return;
1002 bcopy ((char *)h->h_addr_list[0], (char *)&restricted_addrs[i],
1003 sizeof(struct in_addr));
1004 i++;
1005 }
1006
1007 /* ypset and ypsetme not allowed with restricted mode */
1008 ypsetmode = YPSET_NO;
956 syslog(LOG_WARNING, "write: %m");
957 close(ypdb->dom_lockfd);
958 ypdb->dom_lockfd = -1;
959 return;
960 }
961}
962
963/*

--- 37 unchanged lines hidden (view full) ---

1001 return;
1002 bcopy ((char *)h->h_addr_list[0], (char *)&restricted_addrs[i],
1003 sizeof(struct in_addr));
1004 i++;
1005 }
1006
1007 /* ypset and ypsetme not allowed with restricted mode */
1008 ypsetmode = YPSET_NO;
1009
1009
1010 yp_restricted = i;
1011 return;
1012}
1010 yp_restricted = i;
1011 return;
1012}