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