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} |