summaryrefslogtreecommitdiff
path: root/networking/inetd.c
diff options
context:
space:
mode:
authorDenis Vlasenko <vda.linux@googlemail.com>2006-09-06 18:36:50 +0000
committerDenis Vlasenko <vda.linux@googlemail.com>2006-09-06 18:36:50 +0000
commit3538b9a8822421b7c8596a33a917dcf2f99c92b7 (patch)
tree768c23fe79bb81583de7376a4d744632d888d303 /networking/inetd.c
parent5d725462d44268f9a86030daaa6f6396d32f796c (diff)
downloadbusybox-w32-3538b9a8822421b7c8596a33a917dcf2f99c92b7.tar.gz
busybox-w32-3538b9a8822421b7c8596a33a917dcf2f99c92b7.tar.bz2
busybox-w32-3538b9a8822421b7c8596a33a917dcf2f99c92b7.zip
Implement optional syslog logging using ordinary
bb_xx_msg calls, and convert networking/* to it. The rest of bbox will be converted gradually.
Diffstat (limited to 'networking/inetd.c')
-rw-r--r--networking/inetd.c141
1 files changed, 66 insertions, 75 deletions
diff --git a/networking/inetd.c b/networking/inetd.c
index 9947f01ae..e47022350 100644
--- a/networking/inetd.c
+++ b/networking/inetd.c
@@ -311,18 +311,19 @@ static FILE *fconfig;
311static char line[1024]; 311static char line[1024];
312static char *defhost; 312static char *defhost;
313 313
314static char *newstr (char *cp) 314/* xstrdup(NULL) returns NULL, but this one
315 * will return newly-allocated "" if called with NULL arg
316 * TODO: audit whether this makes any real difference
317 */
318static char *xxstrdup (char *cp)
315{ 319{
316 if ((cp = strdup (cp ? cp : ""))) 320 return xstrdup (cp ? cp : "");
317 return (cp);
318 syslog (LOG_ERR, "strdup: %m");
319 exit (1);
320} 321}
321 322
322static int setconfig (void) 323static int setconfig (void)
323{ 324{
324 free (defhost); 325 free (defhost);
325 defhost = newstr ("*"); 326 defhost = xstrdup ("*");
326 if (fconfig != NULL) { 327 if (fconfig != NULL) {
327 fseek (fconfig, 0L, SEEK_SET); 328 fseek (fconfig, 0L, SEEK_SET);
328 return (1); 329 return (1);
@@ -350,12 +351,12 @@ static void register_rpc (servtab_t *sep)
350 socklen_t size; 351 socklen_t size;
351 352
352 if ((pp = getprotobyname (sep->se_proto + 4)) == NULL) { 353 if ((pp = getprotobyname (sep->se_proto + 4)) == NULL) {
353 syslog (LOG_ERR, "%s: getproto: %m", sep->se_proto); 354 bb_perror_msg ("%s: getproto", sep->se_proto);
354 return; 355 return;
355 } 356 }
356 size = sizeof ir_sin; 357 size = sizeof ir_sin;
357 if (getsockname (sep->se_fd, (struct sockaddr *) &ir_sin, &size) < 0) { 358 if (getsockname (sep->se_fd, (struct sockaddr *) &ir_sin, &size) < 0) {
358 syslog (LOG_ERR, "%s/%s: getsockname: %m", 359 bb_perror_msg ("%s/%s: getsockname",
359 sep->se_service, sep->se_proto); 360 sep->se_service, sep->se_proto);
360 return; 361 return;
361 } 362 }
@@ -363,7 +364,7 @@ static void register_rpc (servtab_t *sep)
363 for (n = sep->se_rpcversl; n <= sep->se_rpcversh; n++) { 364 for (n = sep->se_rpcversl; n <= sep->se_rpcversh; n++) {
364 (void) pmap_unset (sep->se_rpcprog, n); 365 (void) pmap_unset (sep->se_rpcprog, n);
365 if (!pmap_set (sep->se_rpcprog, n, pp->p_proto, ntohs (ir_sin.sin_port))) 366 if (!pmap_set (sep->se_rpcprog, n, pp->p_proto, ntohs (ir_sin.sin_port)))
366 syslog (LOG_ERR, "%s %s: pmap_set: %u %u %u %u: %m", 367 bb_perror_msg ("%s %s: pmap_set: %u %u %u %u",
367 sep->se_service, sep->se_proto, 368 sep->se_service, sep->se_proto,
368 sep->se_rpcprog, n, pp->p_proto, ntohs (ir_sin.sin_port)); 369 sep->se_rpcprog, n, pp->p_proto, ntohs (ir_sin.sin_port));
369 } 370 }
@@ -375,7 +376,7 @@ static void unregister_rpc (servtab_t *sep)
375 376
376 for (n = sep->se_rpcversl; n <= sep->se_rpcversh; n++) { 377 for (n = sep->se_rpcversl; n <= sep->se_rpcversh; n++) {
377 if (!pmap_unset (sep->se_rpcprog, n)) 378 if (!pmap_unset (sep->se_rpcprog, n))
378 syslog (LOG_ERR, "pmap_unset(%u, %u)", sep->se_rpcprog, n); 379 bb_error_msg ("pmap_unset(%u, %u)", sep->se_rpcprog, n);
379 } 380 }
380} 381}
381#endif /* CONFIG_FEATURE_INETD_RPC */ 382#endif /* CONFIG_FEATURE_INETD_RPC */
@@ -401,19 +402,19 @@ static int bump_nofile (void)
401 struct rlimit rl; 402 struct rlimit rl;
402 403
403 if (getrlimit (RLIMIT_NOFILE, &rl) < 0) { 404 if (getrlimit (RLIMIT_NOFILE, &rl) < 0) {
404 syslog (LOG_ERR, "getrlimit: %m"); 405 bb_perror_msg ("getrlimit");
405 return -1; 406 return -1;
406 } 407 }
407 rl.rlim_cur = MIN (rl.rlim_max, rl.rlim_cur + FD_CHUNK); 408 rl.rlim_cur = MIN (rl.rlim_max, rl.rlim_cur + FD_CHUNK);
408 rl.rlim_cur = MIN (FD_SETSIZE, rl.rlim_cur + FD_CHUNK); 409 rl.rlim_cur = MIN (FD_SETSIZE, rl.rlim_cur + FD_CHUNK);
409 if (rl.rlim_cur <= rlim_ofile_cur) { 410 if (rl.rlim_cur <= rlim_ofile_cur) {
410 syslog (LOG_ERR, "bump_nofile: cannot extend file limit, max = %d", 411 bb_error_msg ("bump_nofile: cannot extend file limit, max = %d",
411 (int) rl.rlim_cur); 412 (int) rl.rlim_cur);
412 return -1; 413 return -1;
413 } 414 }
414 415
415 if (setrlimit (RLIMIT_NOFILE, &rl) < 0) { 416 if (setrlimit (RLIMIT_NOFILE, &rl) < 0) {
416 syslog (LOG_ERR, "setrlimit: %m"); 417 bb_perror_msg ("setrlimit");
417 return -1; 418 return -1;
418 } 419 }
419 420
@@ -427,13 +428,13 @@ static void setup (servtab_t *sep)
427 int r; 428 int r;
428 429
429 if ((sep->se_fd = socket (sep->se_family, sep->se_socktype, 0)) < 0) { 430 if ((sep->se_fd = socket (sep->se_family, sep->se_socktype, 0)) < 0) {
430 syslog (LOG_ERR, "%s/%s: socket: %m", sep->se_service, sep->se_proto); 431 bb_perror_msg ("%s/%s: socket", sep->se_service, sep->se_proto);
431 return; 432 return;
432 } 433 }
433#define turnon(fd, opt) \ 434#define turnon(fd, opt) \
434setsockopt(fd, SOL_SOCKET, opt, (char *)&on, sizeof (on)) 435setsockopt(fd, SOL_SOCKET, opt, (char *)&on, sizeof (on))
435 if (turnon (sep->se_fd, SO_REUSEADDR) < 0) 436 if (turnon (sep->se_fd, SO_REUSEADDR) < 0)
436 syslog (LOG_ERR, "setsockopt (SO_REUSEADDR): %m"); 437 bb_perror_msg ("setsockopt (SO_REUSEADDR)");
437#undef turnon 438#undef turnon
438 439
439#ifdef CONFIG_FEATURE_INETD_RPC 440#ifdef CONFIG_FEATURE_INETD_RPC
@@ -467,7 +468,7 @@ setsockopt(fd, SOL_SOCKET, opt, (char *)&on, sizeof (on))
467#endif 468#endif
468 r = bind (sep->se_fd, &sep->se_ctrladdr, sep->se_ctrladdr_size); 469 r = bind (sep->se_fd, &sep->se_ctrladdr, sep->se_ctrladdr_size);
469 if (r < 0) { 470 if (r < 0) {
470 syslog (LOG_ERR, "%s/%s (%d): bind: %m", 471 bb_perror_msg ("%s/%s (%d): bind",
471 sep->se_service, sep->se_proto, sep->se_ctrladdr.sa_family); 472 sep->se_service, sep->se_proto, sep->se_ctrladdr.sa_family);
472 close (sep->se_fd); 473 close (sep->se_fd);
473 sep->se_fd = -1; 474 sep->se_fd = -1;
@@ -510,7 +511,7 @@ static char *skip (char **cpp) /* int report; */
510/* erp: */ 511/* erp: */
511 if (*cpp == NULL) { 512 if (*cpp == NULL) {
512 /* if (report) */ 513 /* if (report) */
513 /* syslog(LOG_ERR, "syntax error in inetd config file"); */ 514 /* bb_error_msg ("syntax error in inetd config file"); */
514 return (NULL); 515 return (NULL);
515 } 516 }
516 517
@@ -543,14 +544,7 @@ again:
543 544
544static servtab_t *new_servtab(void) 545static servtab_t *new_servtab(void)
545{ 546{
546 servtab_t *sep; 547 return xmalloc (sizeof (servtab_t));
547
548 sep = (servtab_t *) malloc (sizeof (servtab_t));
549 if (sep == NULL) {
550 syslog (LOG_ERR, bb_msg_memory_exhausted);
551 exit (1);
552 }
553 return sep;
554} 548}
555 549
556static servtab_t *dupconfig (servtab_t *sep) 550static servtab_t *dupconfig (servtab_t *sep)
@@ -560,26 +554,25 @@ static servtab_t *dupconfig (servtab_t *sep)
560 554
561 newtab = new_servtab(); 555 newtab = new_servtab();
562 memset (newtab, 0, sizeof (servtab_t)); 556 memset (newtab, 0, sizeof (servtab_t));
563 newtab->se_service = sep->se_service ? newstr (sep->se_service) : NULL; 557 newtab->se_service = xstrdup (sep->se_service);
564 newtab->se_socktype = sep->se_socktype; 558 newtab->se_socktype = sep->se_socktype;
565 newtab->se_family = sep->se_family; 559 newtab->se_family = sep->se_family;
566 newtab->se_proto = sep->se_proto ? newstr (sep->se_proto) : NULL; 560 newtab->se_proto = xstrdup (sep->se_proto);
567#ifdef CONFIG_FEATURE_INETD_RPC 561#ifdef CONFIG_FEATURE_INETD_RPC
568 newtab->se_rpcprog = sep->se_rpcprog; 562 newtab->se_rpcprog = sep->se_rpcprog;
569 newtab->se_rpcversl = sep->se_rpcversl; 563 newtab->se_rpcversl = sep->se_rpcversl;
570 newtab->se_rpcversh = sep->se_rpcversh; 564 newtab->se_rpcversh = sep->se_rpcversh;
571#endif 565#endif
572 newtab->se_wait = sep->se_wait; 566 newtab->se_wait = sep->se_wait;
573 newtab->se_user = sep->se_user ? newstr (sep->se_user) : NULL; 567 newtab->se_user = xstrdup (sep->se_user);
574 newtab->se_group = sep->se_group ? newstr (sep->se_group) : NULL; 568 newtab->se_group = xstrdup (sep->se_group);
575#ifdef INETD_FEATURE_ENABLED 569#ifdef INETD_FEATURE_ENABLED
576 newtab->se_bi = sep->se_bi; 570 newtab->se_bi = sep->se_bi;
577#endif 571#endif
578 newtab->se_server = sep->se_server ? newstr (sep->se_server) : 0; 572 newtab->se_server = xstrdup (sep->se_server);
579 573
580 for (argc = 0; argc <= MAXARGV; argc++) 574 for (argc = 0; argc <= MAXARGV; argc++)
581 newtab->se_argv[argc] = sep->se_argv[argc] ? 575 newtab->se_argv[argc] = xstrdup (sep->se_argv[argc]);
582 newstr (sep->se_argv[argc]) : NULL;
583 newtab->se_max = sep->se_max; 576 newtab->se_max = sep->se_max;
584 577
585 return (newtab); 578 return (newtab);
@@ -617,7 +610,7 @@ more:
617 hostdelim = strrchr (arg, ':'); 610 hostdelim = strrchr (arg, ':');
618 if (hostdelim) { 611 if (hostdelim) {
619 *hostdelim = '\0'; 612 *hostdelim = '\0';
620 sep->se_hostaddr = newstr (arg); 613 sep->se_hostaddr = xstrdup (arg);
621 arg = hostdelim + 1; 614 arg = hostdelim + 1;
622 /* 615 /*
623 * If the line is of the form `host:', then just change the 616 * If the line is of the form `host:', then just change the
@@ -632,9 +625,9 @@ more:
632 } 625 }
633 } 626 }
634 } else 627 } else
635 sep->se_hostaddr = newstr (defhost); 628 sep->se_hostaddr = xxstrdup (defhost);
636 629
637 sep->se_service = newstr (arg); 630 sep->se_service = xxstrdup (arg);
638 arg = skip (&cp); 631 arg = skip (&cp);
639 632
640 if (strcmp (arg, "stream") == 0) 633 if (strcmp (arg, "stream") == 0)
@@ -650,7 +643,7 @@ more:
650 else 643 else
651 sep->se_socktype = -1; 644 sep->se_socktype = -1;
652 645
653 sep->se_proto = newstr (skip (&cp)); 646 sep->se_proto = xxstrdup (skip (&cp));
654 647
655 if (strcmp (sep->se_proto, "unix") == 0) { 648 if (strcmp (sep->se_proto, "unix") == 0) {
656 sep->se_family = AF_UNIX; 649 sep->se_family = AF_UNIX;
@@ -660,7 +653,7 @@ more:
660#ifdef CONFIG_FEATURE_IPV6 653#ifdef CONFIG_FEATURE_IPV6
661 sep->se_family = AF_INET6; 654 sep->se_family = AF_INET6;
662#else 655#else
663 syslog (LOG_ERR, "%s: IPV6 not supported", sep->se_proto); 656 bb_error_msg ("%s: IPV6 not supported", sep->se_proto);
664#endif 657#endif
665 if (strncmp (sep->se_proto, "rpc/", 4) == 0) { 658 if (strncmp (sep->se_proto, "rpc/", 4) == 0) {
666#ifdef CONFIG_FEATURE_INETD_RPC 659#ifdef CONFIG_FEATURE_INETD_RPC
@@ -669,14 +662,14 @@ more:
669 662
670 p = strchr (sep->se_service, '/'); 663 p = strchr (sep->se_service, '/');
671 if (p == 0) { 664 if (p == 0) {
672 syslog (LOG_ERR, "%s: no rpc version", sep->se_service); 665 bb_error_msg ("%s: no rpc version", sep->se_service);
673 goto more; 666 goto more;
674 } 667 }
675 *p++ = '\0'; 668 *p++ = '\0';
676 l = strtol (p, &ccp, 0); 669 l = strtol (p, &ccp, 0);
677 if (ccp == p || l < 0 || l > INT_MAX) { 670 if (ccp == p || l < 0 || l > INT_MAX) {
678 badafterall: 671 badafterall:
679 syslog (LOG_ERR, "%s/%s: bad rpc version", sep->se_service, p); 672 bb_error_msg ("%s/%s: bad rpc version", sep->se_service, p);
680 goto more; 673 goto more;
681 } 674 }
682 sep->se_rpcversl = sep->se_rpcversh = l; 675 sep->se_rpcversl = sep->se_rpcversh = l;
@@ -689,7 +682,7 @@ more:
689 } else if (*ccp != '\0') 682 } else if (*ccp != '\0')
690 goto badafterall; 683 goto badafterall;
691#else 684#else
692 syslog (LOG_ERR, "%s: rpc services not supported", sep->se_service); 685 bb_error_msg ("%s: rpc services not supported", sep->se_service);
693#endif 686#endif
694 } 687 }
695 } 688 }
@@ -708,18 +701,18 @@ more:
708 sep->se_wait = strcmp (arg, "wait") == 0; 701 sep->se_wait = strcmp (arg, "wait") == 0;
709 /* if ((arg = skip(&cp, 1)) == NULL) */ 702 /* if ((arg = skip(&cp, 1)) == NULL) */
710 /* goto more; */ 703 /* goto more; */
711 sep->se_user = newstr (skip (&cp)); 704 sep->se_user = xxstrdup (skip (&cp));
712 arg = strchr (sep->se_user, '.'); 705 arg = strchr (sep->se_user, '.');
713 if (arg == NULL) 706 if (arg == NULL)
714 arg = strchr (sep->se_user, ':'); 707 arg = strchr (sep->se_user, ':');
715 if (arg) { 708 if (arg) {
716 *arg++ = '\0'; 709 *arg++ = '\0';
717 sep->se_group = newstr (arg); 710 sep->se_group = xstrdup (arg);
718 } 711 }
719 /* if ((arg = skip(&cp, 1)) == NULL) */ 712 /* if ((arg = skip(&cp, 1)) == NULL) */
720 /* goto more; */ 713 /* goto more; */
721 714
722 sep->se_server = newstr (skip (&cp)); 715 sep->se_server = xxstrdup (skip (&cp));
723 if (strcmp (sep->se_server, "internal") == 0) { 716 if (strcmp (sep->se_server, "internal") == 0) {
724#ifdef INETD_FEATURE_ENABLED 717#ifdef INETD_FEATURE_ENABLED
725 const struct builtin *bi; 718 const struct builtin *bi;
@@ -729,13 +722,13 @@ more:
729 strcmp (bi->bi_service, sep->se_service) == 0) 722 strcmp (bi->bi_service, sep->se_service) == 0)
730 break; 723 break;
731 if (bi->bi_service == 0) { 724 if (bi->bi_service == 0) {
732 syslog (LOG_ERR, "internal service %s unknown", sep->se_service); 725 bb_error_msg ("internal service %s unknown", sep->se_service);
733 goto more; 726 goto more;
734 } 727 }
735 sep->se_bi = bi; 728 sep->se_bi = bi;
736 sep->se_wait = bi->bi_wait; 729 sep->se_wait = bi->bi_wait;
737#else 730#else
738 syslog (LOG_ERR, "internal service %s unknown", sep->se_service); 731 bb_perror_msg ("internal service %s unknown", sep->se_service);
739 goto more; 732 goto more;
740#endif 733#endif
741 } 734 }
@@ -746,7 +739,7 @@ more:
746 argc = 0; 739 argc = 0;
747 for (arg = skip (&cp); cp; arg = skip (&cp)) { 740 for (arg = skip (&cp); cp; arg = skip (&cp)) {
748 if (argc < MAXARGV) 741 if (argc < MAXARGV)
749 sep->se_argv[argc++] = newstr (arg); 742 sep->se_argv[argc++] = xxstrdup (arg);
750 } 743 }
751 while (argc <= MAXARGV) 744 while (argc <= MAXARGV)
752 sep->se_argv[argc++] = NULL; 745 sep->se_argv[argc++] = NULL;
@@ -764,7 +757,7 @@ more:
764 * and make a dup for the new entry. 757 * and make a dup for the new entry.
765 */ 758 */
766 *hostdelim++ = '\0'; 759 *hostdelim++ = '\0';
767 nsep->se_hostaddr = newstr (hostdelim); 760 nsep->se_hostaddr = xstrdup (hostdelim);
768 761
769 nsep->se_next = sep->se_next; 762 nsep->se_next = sep->se_next;
770 sep->se_next = nsep; 763 sep->se_next = nsep;
@@ -781,12 +774,11 @@ more:
781 774
782 hp = gethostbyname (nsep->se_hostaddr); 775 hp = gethostbyname (nsep->se_hostaddr);
783 if (hp == 0) { 776 if (hp == 0) {
784 syslog (LOG_ERR, "%s: unknown host", nsep->se_hostaddr); 777 bb_error_msg ("%s: unknown host", nsep->se_hostaddr);
785 nsep->se_checked = 0; 778 nsep->se_checked = 0;
786 goto skip; 779 goto skip;
787 } else if (hp->h_addrtype != AF_INET) { 780 } else if (hp->h_addrtype != AF_INET) {
788 syslog (LOG_ERR, 781 bb_error_msg ("%s: address isn't an Internet "
789 "%s: address isn't an Internet "
790 "address", nsep->se_hostaddr); 782 "address", nsep->se_hostaddr);
791 nsep->se_checked = 0; 783 nsep->se_checked = 0;
792 goto skip; 784 goto skip;
@@ -797,7 +789,7 @@ more:
797 hp->h_addr_list[0], sizeof (struct in_addr)); 789 hp->h_addr_list[0], sizeof (struct in_addr));
798 while (hp->h_addr_list[i] != NULL) { 790 while (hp->h_addr_list[i] != NULL) {
799 psep = dupconfig (nsep); 791 psep = dupconfig (nsep);
800 psep->se_hostaddr = newstr (nsep->se_hostaddr); 792 psep->se_hostaddr = xxstrdup (nsep->se_hostaddr);
801 psep->se_checked = 1; 793 psep->se_checked = 1;
802 memmove (&psep->se_ctrladdr_in.sin_addr, 794 memmove (&psep->se_ctrladdr_in.sin_addr,
803 hp->h_addr_list[i], sizeof (struct in_addr)); 795 hp->h_addr_list[i], sizeof (struct in_addr));
@@ -913,7 +905,7 @@ static void config (int sig ATTRIBUTE_UNUSED)
913 char protoname[10]; 905 char protoname[10];
914 906
915 if (!setconfig ()) { 907 if (!setconfig ()) {
916 syslog (LOG_ERR, "%s: %m", CONFIG); 908 bb_perror_msg ("%s", CONFIG);
917 return; 909 return;
918 } 910 }
919 for (sep = servtab; sep; sep = sep->se_next) 911 for (sep = servtab; sep; sep = sep->se_next)
@@ -989,7 +981,7 @@ static void config (int sig ATTRIBUTE_UNUSED)
989 if (sep->se_rpcprog == 0) { 981 if (sep->se_rpcprog == 0) {
990 rp = getrpcbyname (sep->se_service); 982 rp = getrpcbyname (sep->se_service);
991 if (rp == 0) { 983 if (rp == 0) {
992 syslog (LOG_ERR, "%s: unknown rpc service", sep->se_service); 984 bb_error_msg ("%s: unknown rpc service", sep->se_service);
993 goto serv_unknown; 985 goto serv_unknown;
994 } 986 }
995 sep->se_rpcprog = rp->r_number; 987 sep->se_rpcprog = rp->r_number;
@@ -1009,8 +1001,8 @@ static void config (int sig ATTRIBUTE_UNUSED)
1009 protoname[strlen (protoname) - 1] = '\0'; 1001 protoname[strlen (protoname) - 1] = '\0';
1010 sp = getservbyname (sep->se_service, protoname); 1002 sp = getservbyname (sep->se_service, protoname);
1011 if (sp == 0) { 1003 if (sp == 0) {
1012 syslog (LOG_ERR, 1004 bb_error_msg ("%s/%s: unknown service",
1013 "%s/%s: unknown service", sep->se_service, sep->se_proto); 1005 sep->se_service, sep->se_proto);
1014 goto serv_unknown; 1006 goto serv_unknown;
1015 } 1007 }
1016 port = sp->s_port; 1008 port = sp->s_port;
@@ -1042,7 +1034,7 @@ static void config (int sig ATTRIBUTE_UNUSED)
1042 if (sep->se_rpcprog == 0) { 1034 if (sep->se_rpcprog == 0) {
1043 rp = getrpcbyname (sep->se_service); 1035 rp = getrpcbyname (sep->se_service);
1044 if (rp == 0) { 1036 if (rp == 0) {
1045 syslog (LOG_ERR, "%s: unknown rpc service", sep->se_service); 1037 bb_error_msg ("%s: unknown rpc service", sep->se_service);
1046 goto serv_unknown; 1038 goto serv_unknown;
1047 } 1039 }
1048 sep->se_rpcprog = rp->r_number; 1040 sep->se_rpcprog = rp->r_number;
@@ -1062,8 +1054,8 @@ static void config (int sig ATTRIBUTE_UNUSED)
1062 protoname[strlen (protoname) - 1] = '\0'; 1054 protoname[strlen (protoname) - 1] = '\0';
1063 sp = getservbyname (sep->se_service, protoname); 1055 sp = getservbyname (sep->se_service, protoname);
1064 if (sp == 0) { 1056 if (sp == 0) {
1065 syslog (LOG_ERR, 1057 bb_error_msg ("%s/%s: unknown service",
1066 "%s/%s: unknown service", sep->se_service, sep->se_proto); 1058 sep->se_service, sep->se_proto);
1067 goto serv_unknown; 1059 goto serv_unknown;
1068 } 1060 }
1069 port = sp->s_port; 1061 port = sp->s_port;
@@ -1137,12 +1129,11 @@ static void reapchild (int sig ATTRIBUTE_UNUSED)
1137 for (sep = servtab; sep; sep = sep->se_next) 1129 for (sep = servtab; sep; sep = sep->se_next)
1138 if (sep->se_wait == pid) { 1130 if (sep->se_wait == pid) {
1139 if (WIFEXITED (status) && WEXITSTATUS (status)) 1131 if (WIFEXITED (status) && WEXITSTATUS (status))
1140 syslog (LOG_WARNING, 1132 bb_error_msg("%s: exit status 0x%x",
1141 "%s: exit status 0x%x",
1142 sep->se_server, WEXITSTATUS (status)); 1133 sep->se_server, WEXITSTATUS (status));
1143 else if (WIFSIGNALED (status)) 1134 else if (WIFSIGNALED (status))
1144 syslog (LOG_WARNING, 1135 bb_error_msg("%s: exit signal 0x%x",
1145 "%s: exit signal 0x%x", sep->se_server, WTERMSIG (status)); 1136 sep->se_server, WTERMSIG (status));
1146 sep->se_wait = 1; 1137 sep->se_wait = 1;
1147 FD_SET (sep->se_fd, &allsock); 1138 FD_SET (sep->se_fd, &allsock);
1148 nsock++; 1139 nsock++;
@@ -1271,7 +1262,7 @@ inetd_main (int argc, char *argv[])
1271 toomany = strtoul (stoomany, &e, 0); 1262 toomany = strtoul (stoomany, &e, 0);
1272 if (!(toomany >= 0 && *e == '\0')) { 1263 if (!(toomany >= 0 && *e == '\0')) {
1273 toomany = TOOMANY; 1264 toomany = TOOMANY;
1274 syslog (LOG_ERR, "-R %s: bad value for service invocation rate", stoomany); 1265 bb_perror_msg ("-R %s: bad value for service invocation rate", stoomany);
1275 } 1266 }
1276 } 1267 }
1277 argc -= optind; 1268 argc -= optind;
@@ -1295,6 +1286,7 @@ inetd_main (int argc, char *argv[])
1295 } else { 1286 } else {
1296 setsid (); 1287 setsid ();
1297 } 1288 }
1289 logmode = LOGMODE_SYSLOG;
1298 1290
1299 if (uid == 0) { 1291 if (uid == 0) {
1300 gid_t gid = getgid (); 1292 gid_t gid = getgid ();
@@ -1313,7 +1305,7 @@ inetd_main (int argc, char *argv[])
1313 } 1305 }
1314 1306
1315 if (getrlimit (RLIMIT_NOFILE, &rlim_ofile) < 0) { 1307 if (getrlimit (RLIMIT_NOFILE, &rlim_ofile) < 0) {
1316 syslog (LOG_ERR, "getrlimit: %m"); 1308 bb_perror_msg ("getrlimit");
1317 } else { 1309 } else {
1318 rlim_ofile_cur = rlim_ofile.rlim_cur; 1310 rlim_ofile_cur = rlim_ofile.rlim_cur;
1319 if (rlim_ofile_cur == RLIM_INFINITY) /* ! */ 1311 if (rlim_ofile_cur == RLIM_INFINITY) /* ! */
@@ -1365,7 +1357,7 @@ inetd_main (int argc, char *argv[])
1365 readable = allsock; 1357 readable = allsock;
1366 if ((n = select (maxsock + 1, &readable, NULL, NULL, NULL)) <= 0) { 1358 if ((n = select (maxsock + 1, &readable, NULL, NULL, NULL)) <= 0) {
1367 if (n < 0 && errno != EINTR) { 1359 if (n < 0 && errno != EINTR) {
1368 syslog (LOG_WARNING, "select: %m"); 1360 bb_perror_msg("select");
1369 sleep (1); 1361 sleep (1);
1370 } 1362 }
1371 continue; 1363 continue;
@@ -1378,7 +1370,7 @@ inetd_main (int argc, char *argv[])
1378 if (ctrl < 0) { 1370 if (ctrl < 0) {
1379 if (errno == EINTR) 1371 if (errno == EINTR)
1380 continue; 1372 continue;
1381 syslog (LOG_WARNING, "accept (for %s): %m", sep->se_service); 1373 bb_perror_msg("accept (for %s)", sep->se_service);
1382 continue; 1374 continue;
1383 } 1375 }
1384 if (sep->se_family == AF_INET && sep->se_socktype == SOCK_STREAM) { 1376 if (sep->se_family == AF_INET && sep->se_socktype == SOCK_STREAM) {
@@ -1386,7 +1378,7 @@ inetd_main (int argc, char *argv[])
1386 socklen_t plen = sizeof (peer); 1378 socklen_t plen = sizeof (peer);
1387 1379
1388 if (getpeername (ctrl, (struct sockaddr *) &peer, &plen) < 0) { 1380 if (getpeername (ctrl, (struct sockaddr *) &peer, &plen) < 0) {
1389 syslog (LOG_WARNING, "could not getpeername"); 1381 bb_error_msg("could not getpeername");
1390 close (ctrl); 1382 close (ctrl);
1391 continue; 1383 continue;
1392 } 1384 }
@@ -1426,8 +1418,7 @@ inetd_main (int argc, char *argv[])
1426 --sep->se_count; 1418 --sep->se_count;
1427 continue; 1419 continue;
1428 } 1420 }
1429 syslog (LOG_ERR, 1421 bb_error_msg ("%s/%s server failing (looping), service terminated",
1430 "%s/%s server failing (looping), service terminated",
1431 sep->se_service, sep->se_proto); 1422 sep->se_service, sep->se_proto);
1432 if (!sep->se_wait && sep->se_socktype == SOCK_STREAM) 1423 if (!sep->se_wait && sep->se_socktype == SOCK_STREAM)
1433 close (ctrl); 1424 close (ctrl);
@@ -1447,7 +1438,7 @@ inetd_main (int argc, char *argv[])
1447 pid = fork (); 1438 pid = fork ();
1448 } 1439 }
1449 if (pid < 0) { 1440 if (pid < 0) {
1450 syslog (LOG_ERR, "fork: %m"); 1441 bb_perror_msg ("fork");
1451 if (!sep->se_wait && sep->se_socktype == SOCK_STREAM) 1442 if (!sep->se_wait && sep->se_socktype == SOCK_STREAM)
1452 close (ctrl); 1443 close (ctrl);
1453 sigprocmask(SIG_UNBLOCK, &omask, NULL); 1444 sigprocmask(SIG_UNBLOCK, &omask, NULL);
@@ -1468,15 +1459,15 @@ inetd_main (int argc, char *argv[])
1468#endif 1459#endif
1469 { 1460 {
1470 if ((pwd = getpwnam (sep->se_user)) == NULL) { 1461 if ((pwd = getpwnam (sep->se_user)) == NULL) {
1471 syslog (LOG_ERR, "getpwnam: %s: No such user", sep->se_user); 1462 bb_error_msg ("getpwnam: %s: no such user", sep->se_user);
1472 if (sep->se_socktype != SOCK_STREAM) 1463 if (sep->se_socktype != SOCK_STREAM)
1473 recv (0, buf, sizeof (buf), 0); 1464 recv (0, buf, sizeof (buf), 0);
1474 _exit (1); 1465 _exit (1);
1475 } 1466 }
1476 if (setsid () < 0) 1467 if (setsid () < 0)
1477 syslog (LOG_ERR, "%s: setsid: %m", sep->se_service); 1468 bb_perror_msg ("%s: setsid", sep->se_service);
1478 if (sep->se_group && (grp = getgrnam (sep->se_group)) == NULL) { 1469 if (sep->se_group && (grp = getgrnam (sep->se_group)) == NULL) {
1479 syslog (LOG_ERR, "getgrnam: %s: No such group", sep->se_group); 1470 bb_error_msg ("getgrnam: %s: no such group", sep->se_group);
1480 if (sep->se_socktype != SOCK_STREAM) 1471 if (sep->se_socktype != SOCK_STREAM)
1481 recv (0, buf, sizeof (buf), 0); 1472 recv (0, buf, sizeof (buf), 0);
1482 _exit (1); 1473 _exit (1);
@@ -1502,7 +1493,7 @@ inetd_main (int argc, char *argv[])
1502 dup2 (0, 2); 1493 dup2 (0, 2);
1503 if (rlim_ofile.rlim_cur != rlim_ofile_cur) 1494 if (rlim_ofile.rlim_cur != rlim_ofile_cur)
1504 if (setrlimit (RLIMIT_NOFILE, &rlim_ofile) < 0) 1495 if (setrlimit (RLIMIT_NOFILE, &rlim_ofile) < 0)
1505 syslog (LOG_ERR, "setrlimit: %m"); 1496 bb_perror_msg ("setrlimit");
1506 closelog (); 1497 closelog ();
1507 for (tmpint = rlim_ofile_cur - 1; --tmpint > 2;) 1498 for (tmpint = rlim_ofile_cur - 1; --tmpint > 2;)
1508 (void) close (tmpint); 1499 (void) close (tmpint);
@@ -1510,7 +1501,7 @@ inetd_main (int argc, char *argv[])
1510 execv (sep->se_server, sep->se_argv); 1501 execv (sep->se_server, sep->se_argv);
1511 if (sep->se_socktype != SOCK_STREAM) 1502 if (sep->se_socktype != SOCK_STREAM)
1512 recv (0, buf, sizeof (buf), 0); 1503 recv (0, buf, sizeof (buf), 0);
1513 syslog (LOG_ERR, "execv %s: %m", sep->se_server); 1504 bb_perror_msg ("execv %s", sep->se_server);
1514 _exit (1); 1505 _exit (1);
1515 } 1506 }
1516 } 1507 }