aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDenis Vlasenko <vda.linux@googlemail.com>2007-11-10 01:28:19 +0000
committerDenis Vlasenko <vda.linux@googlemail.com>2007-11-10 01:28:19 +0000
commitd031b203c7ea7f5fe7ba8dfb16693bc91b3feaea (patch)
tree2cbc5fb25bea68cda0a90bf39cbe89d483a20b0c
parent9bd8d0c23e867238bad53b04a029f71db9b88c3f (diff)
downloadbusybox-w32-d031b203c7ea7f5fe7ba8dfb16693bc91b3feaea.tar.gz
busybox-w32-d031b203c7ea7f5fe7ba8dfb16693bc91b3feaea.tar.bz2
busybox-w32-d031b203c7ea7f5fe7ba8dfb16693bc91b3feaea.zip
syslogd: support "symlink to symlink" for /dev/log; reduce stack usage
function old new delta create_socket - 134 +134 syslogd_main 1132 865 -267 ------------------------------------------------------------------------------ (add/remove: 1/0 grow/shrink: 0/1 up/down: 134/-267) Total: -133 bytes text data bss dec hex filename 775603 974 9420 785997 bfe4d busybox_old 775445 974 9420 785839 bfdaf busybox_unstripped
-rw-r--r--libbb/xreadlink.c2
-rw-r--r--sysklogd/syslogd.c60
2 files changed, 30 insertions, 32 deletions
diff --git a/libbb/xreadlink.c b/libbb/xreadlink.c
index 0b6eb05f3..706a3d9ff 100644
--- a/libbb/xreadlink.c
+++ b/libbb/xreadlink.c
@@ -65,7 +65,7 @@ char *xmalloc_follow_symlinks(const char *path)
65 65
66 if (!--looping) { 66 if (!--looping) {
67 free(linkpath); 67 free(linkpath);
68free_buf_ret_null: 68 free_buf_ret_null:
69 free(buf); 69 free(buf);
70 return NULL; 70 return NULL;
71 } 71 }
diff --git a/sysklogd/syslogd.c b/sysklogd/syslogd.c
index da63ced42..e3abcc7cb 100644
--- a/sysklogd/syslogd.c
+++ b/sysklogd/syslogd.c
@@ -467,13 +467,39 @@ static void do_mark(int sig)
467} 467}
468#endif 468#endif
469 469
470static void do_syslogd(void) ATTRIBUTE_NORETURN; 470/* Don't inline: prevent struct sockaddr_un to take up space on stack
471static void do_syslogd(void) 471 * permanently */
472static NOINLINE int create_socket(void)
472{ 473{
473 struct sockaddr_un sunx; 474 struct sockaddr_un sunx;
474 int sock_fd; 475 int sock_fd;
475 char *dev_log_name; 476 char *dev_log_name;
476 477
478 memset(&sunx, 0, sizeof(sunx));
479 sunx.sun_family = AF_UNIX;
480
481 /* Unlink old /dev/log or object it points to. */
482 /* (if it exists, bind will fail) */
483 strcpy(sunx.sun_path, "/dev/log");
484 dev_log_name = xmalloc_follow_symlinks("/dev/log");
485 if (dev_log_name) {
486 safe_strncpy(sunx.sun_path, dev_log_name, sizeof(sunx.sun_path));
487 free(dev_log_name);
488 }
489 unlink(sunx.sun_path);
490
491 sock_fd = xsocket(AF_UNIX, SOCK_DGRAM, 0);
492 xbind(sock_fd, (struct sockaddr *) &sunx, sizeof(sunx));
493 chmod("/dev/log", 0666);
494
495 return sock_fd;
496}
497
498static void do_syslogd(void) ATTRIBUTE_NORETURN;
499static void do_syslogd(void)
500{
501 int sock_fd;
502
477 /* Set up signal handlers */ 503 /* Set up signal handlers */
478 signal(SIGINT, quit_signal); 504 signal(SIGINT, quit_signal);
479 signal(SIGTERM, quit_signal); 505 signal(SIGTERM, quit_signal);
@@ -487,36 +513,8 @@ static void do_syslogd(void)
487 signal(SIGALRM, do_mark); 513 signal(SIGALRM, do_mark);
488 alarm(G.markInterval); 514 alarm(G.markInterval);
489#endif 515#endif
490 remove_pidfile("/var/run/syslogd.pid"); 516 sock_fd = create_socket();
491
492 memset(&sunx, 0, sizeof(sunx));
493 sunx.sun_family = AF_UNIX;
494 strcpy(sunx.sun_path, "/dev/log");
495 517
496 /* Unlink old /dev/log or object it points to. */
497 /* (if it exists, bind will fail) */
498 logmode = LOGMODE_NONE;
499 dev_log_name = xmalloc_readlink_or_warn("/dev/log");
500 logmode = LOGMODE_STDIO;
501 if (dev_log_name) {
502 int fd = xopen(".", O_NONBLOCK);
503 xchdir("/dev");
504 /* we do not check whether this is a link also */
505 unlink(dev_log_name);
506 fchdir(fd);
507 close(fd);
508 safe_strncpy(sunx.sun_path, dev_log_name, sizeof(sunx.sun_path));
509 free(dev_log_name);
510 } else {
511 unlink("/dev/log");
512 }
513
514 sock_fd = xsocket(AF_UNIX, SOCK_DGRAM, 0);
515 xbind(sock_fd, (struct sockaddr *) &sunx, sizeof(sunx));
516
517 if (chmod("/dev/log", 0666) < 0) {
518 bb_perror_msg_and_die("cannot set permission on /dev/log");
519 }
520 if (ENABLE_FEATURE_IPC_SYSLOG && (option_mask32 & OPT_circularlog)) { 518 if (ENABLE_FEATURE_IPC_SYSLOG && (option_mask32 & OPT_circularlog)) {
521 ipcsyslog_init(); 519 ipcsyslog_init();
522 } 520 }