diff options
author | Denis Vlasenko <vda.linux@googlemail.com> | 2007-11-10 01:28:19 +0000 |
---|---|---|
committer | Denis Vlasenko <vda.linux@googlemail.com> | 2007-11-10 01:28:19 +0000 |
commit | d031b203c7ea7f5fe7ba8dfb16693bc91b3feaea (patch) | |
tree | 2cbc5fb25bea68cda0a90bf39cbe89d483a20b0c | |
parent | 9bd8d0c23e867238bad53b04a029f71db9b88c3f (diff) | |
download | busybox-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.c | 2 | ||||
-rw-r--r-- | sysklogd/syslogd.c | 60 |
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); |
68 | free_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 | ||
470 | static void do_syslogd(void) ATTRIBUTE_NORETURN; | 470 | /* Don't inline: prevent struct sockaddr_un to take up space on stack |
471 | static void do_syslogd(void) | 471 | * permanently */ |
472 | static 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 | |||
498 | static void do_syslogd(void) ATTRIBUTE_NORETURN; | ||
499 | static 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 | } |