From 95c1c1e05f290ccbcc2ff863a62bcee5d57bf5c8 Mon Sep 17 00:00:00 2001 From: Erik Andersen Date: Fri, 14 Apr 2000 21:45:29 +0000 Subject: [PATCH] Fix a tar bug: tar removed leading '/'s for symlink targets. Fix a syslogd bug: Only the first sizeof(buffer) was read from the /dev/log socket, causing (for most cases) only every other log item to be logged. -Erik --- TODO | 8 +++--- archival/tar.c | 26 ++----------------- docs/Makefile | 1 + sysklogd/syslogd.c | 64 +++++++++++++++------------------------------- syslogd.c | 64 +++++++++++++++------------------------------- tar.c | 26 ++----------------- 6 files changed, 48 insertions(+), 141 deletions(-) diff --git a/TODO b/TODO index 48c8fefea..872de4677 100644 --- a/TODO +++ b/TODO @@ -23,7 +23,9 @@ around to it some time. If you have any good ideas, please let me know. * stty * cut * expr - +* wget (or whatever I call it) +* tftp +* ftp ----------------------- @@ -31,24 +33,20 @@ around to it some time. If you have any good ideas, please let me know. Compile with debugging on, run 'nm --size-sort ./busybox' and then start with the biggest things and make them smaller... - ----------------------- - busybox.defs.h is too big and hard to follow. Perhaps I need to add a better build system (like the Linux kernel?) ----------------------- - Feature request: /bin/busybox --install -s which makes all links to commands that it can support (an optionnal -s should be used for symbolic links instead of hard links). - ----------------------- diff --git a/archival/tar.c b/archival/tar.c index 4eda4c61a..9b3cb7d81 100644 --- a/archival/tar.c +++ b/archival/tar.c @@ -493,18 +493,6 @@ readTarHeader(struct TarHeader *rawHeader, struct TarInfo *header) chksum = getOctal(rawHeader->chksum, sizeof(rawHeader->chksum)); header->type = rawHeader->typeflag; header->linkname = rawHeader->linkname; - /* Check for and relativify any absolute paths */ - if ( *(header->linkname) == '/' ) { - static int alreadyWarned=FALSE; - - while (*(header->linkname) == '/') - ++*(header->linkname); - - if (alreadyWarned == FALSE) { - errorMsg("tar: Removing leading '/' from link names\n"); - alreadyWarned = TRUE; - } - } header->devmajor = getOctal(rawHeader->devmajor, sizeof(rawHeader->devmajor)); header->devminor = getOctal(rawHeader->devminor, sizeof(rawHeader->devminor)); @@ -826,7 +814,7 @@ writeTarHeader(struct TarBallInfo *tbInfo, const char *fileName, struct stat *st if (! *header.uname) strcpy(header.uname, "root"); - // FIXME (or most likely not): I break Hard Links + /* WARNING/NOTICE: I break Hard Links */ if (S_ISLNK(statbuf->st_mode)) { char buffer[BUFSIZ]; header.typeflag = SYMTYPE; @@ -834,17 +822,7 @@ writeTarHeader(struct TarBallInfo *tbInfo, const char *fileName, struct stat *st errorMsg("Error reading symlink '%s': %s\n", header.name, strerror(errno)); return ( FALSE); } - if (*buffer=='/') { - static int alreadyWarned=FALSE; - if (alreadyWarned==FALSE) { - errorMsg("tar: Removing leading '/' from link names\n"); - alreadyWarned=TRUE; - } - strncpy(header.linkname, buffer+1, sizeof(header.linkname)); - } - else { - strncpy(header.linkname, buffer, sizeof(header.linkname)); - } + strncpy(header.linkname, buffer, sizeof(header.linkname)); } else if (S_ISDIR(statbuf->st_mode)) { header.typeflag = DIRTYPE; strncat(header.name, "/", sizeof(header.name)); diff --git a/docs/Makefile b/docs/Makefile index aebe8a847..10550f6df 100644 --- a/docs/Makefile +++ b/docs/Makefile @@ -12,6 +12,7 @@ doc: @rm pod2html-* pod2man --center=BusyBox --release="version $(VERSION)" busybox.pod > ../BusyBox.1 pod2text busybox.pod > ../BusyBox.txt + @rm -f pod2html* clean:: @rm -f ../BusyBox.html ../BusyBox.1 ../BusyBox.txt pod2html* diff --git a/sysklogd/syslogd.c b/sysklogd/syslogd.c index ec372fc56..8827265d5 100644 --- a/sysklogd/syslogd.c +++ b/sysklogd/syslogd.c @@ -81,21 +81,17 @@ static void message(char *fmt, ...) int fd; va_list arguments; - if ( - (fd = - device_open(logFilePath, - O_WRONLY | O_CREAT | O_NOCTTY | O_APPEND | - O_NONBLOCK)) >= 0) { + if ( (fd = device_open(logFilePath, + O_WRONLY | O_CREAT | O_NOCTTY | O_APPEND | + O_NONBLOCK)) >= 0) { va_start(arguments, fmt); vdprintf(fd, fmt, arguments); va_end(arguments); close(fd); } else { /* Always send console messages to /dev/console so people will see them. */ - if ( - (fd = - device_open(_PATH_CONSOLE, - O_WRONLY | O_NOCTTY | O_NONBLOCK)) >= 0) { + if ( (fd = device_open(_PATH_CONSOLE, + O_WRONLY | O_NOCTTY | O_NONBLOCK)) >= 0) { va_start(arguments, fmt); vdprintf(fd, fmt, arguments); va_end(arguments); @@ -177,14 +173,10 @@ static void doSyslogd (void) signal (SIGALRM, domark); alarm (MarkInterval); - /* create the syslog file so realpath() can work - * (the ugle close(open()) stuff is just a cheap - * touch command that avoids using system (system - * is always a bad thing to use) */ - close(open("touch " _PATH_LOG, O_RDWR | O_CREAT, 0644)); + /* create the syslog file so realpath() can work */ + close(open(_PATH_LOG, O_RDWR | O_CREAT, 0644)); if (realpath(_PATH_LOG, lfile) == NULL) { - perror("Could not resolv path to " _PATH_LOG); - exit (FALSE); + fatalError("Could not resolv path to " _PATH_LOG); } unlink (lfile); @@ -194,20 +186,17 @@ static void doSyslogd (void) sunx.sun_family = AF_UNIX; strncpy (sunx.sun_path, lfile, sizeof(sunx.sun_path)); if ((sock_fd = socket(AF_UNIX, SOCK_STREAM, 0)) < 0) { - perror ("Couldn't obtain descriptor for socket " _PATH_LOG); - exit (FALSE); + fatalError ("Couldn't obtain descriptor for socket " _PATH_LOG); } addrLength = sizeof (sunx.sun_family) + strlen (sunx.sun_path); if ((bind (sock_fd, (struct sockaddr *) &sunx, addrLength)) || (listen (sock_fd, 5))) { - perror ("Could not connect to socket " _PATH_LOG); - exit (FALSE); + fatalError ("Could not connect to socket " _PATH_LOG); } if (chmod (lfile, 0666) < 0) { - perror ("Could not set permission on " _PATH_LOG); - exit (FALSE); + fatalError ("Could not set permission on " _PATH_LOG); } FD_ZERO (&readfds); @@ -221,19 +210,17 @@ static void doSyslogd (void) if ((n_ready = select (FD_SETSIZE, &readfds, NULL, NULL, NULL)) < 0) { if (errno == EINTR) continue; /* alarm may have happened. */ - perror ("select"); - exit (FALSE); + fatalError( "select error: %s\n", strerror(errno)); } /* Skip stdin, stdout, stderr */ - for (fd = 3; fd <= FD_SETSIZE; fd++) { + for (fd = 3; fd < FD_SETSIZE; fd++) { if (FD_ISSET (fd, &readfds)) { if (fd == sock_fd) { int conn; if ((conn = accept(sock_fd, (struct sockaddr *) &sunx, &addrLength)) < 0) { - perror ("accept"); - exit (FALSE); /* #### ??? */ + fatalError( "accept error: %s\n", strerror(errno)); } FD_SET (conn, &readfds); } @@ -242,17 +229,11 @@ static void doSyslogd (void) char buf[BUFSIZE]; char *q, *p; int n_read; + char line[BUFSIZE]; + unsigned char c; - n_read = read (fd, buf, BUFSIZE); - - if (n_read < 0) { - // FIXME .. fd isn't set - perror ("read error"); - goto close_fd; - } - else if (n_read > 0) { - char line[BUFSIZE]; - unsigned char c; + /* Keep reading stuff till there is nothing else to read */ + while( (n_read = read (fd, buf, BUFSIZE)) > 0 && errno != EOF) { int pri = (LOG_USER | LOG_NOTICE); memset (line, 0, sizeof(line)); @@ -281,14 +262,9 @@ static void doSyslogd (void) /* Now log it */ logMessage(pri, line); - - close_fd: - close (fd); - FD_CLR (fd, &readfds); - } - else { /* EOF */ - goto close_fd; } + close (fd); + FD_CLR (fd, &readfds); } } } diff --git a/syslogd.c b/syslogd.c index ec372fc56..8827265d5 100644 --- a/syslogd.c +++ b/syslogd.c @@ -81,21 +81,17 @@ static void message(char *fmt, ...) int fd; va_list arguments; - if ( - (fd = - device_open(logFilePath, - O_WRONLY | O_CREAT | O_NOCTTY | O_APPEND | - O_NONBLOCK)) >= 0) { + if ( (fd = device_open(logFilePath, + O_WRONLY | O_CREAT | O_NOCTTY | O_APPEND | + O_NONBLOCK)) >= 0) { va_start(arguments, fmt); vdprintf(fd, fmt, arguments); va_end(arguments); close(fd); } else { /* Always send console messages to /dev/console so people will see them. */ - if ( - (fd = - device_open(_PATH_CONSOLE, - O_WRONLY | O_NOCTTY | O_NONBLOCK)) >= 0) { + if ( (fd = device_open(_PATH_CONSOLE, + O_WRONLY | O_NOCTTY | O_NONBLOCK)) >= 0) { va_start(arguments, fmt); vdprintf(fd, fmt, arguments); va_end(arguments); @@ -177,14 +173,10 @@ static void doSyslogd (void) signal (SIGALRM, domark); alarm (MarkInterval); - /* create the syslog file so realpath() can work - * (the ugle close(open()) stuff is just a cheap - * touch command that avoids using system (system - * is always a bad thing to use) */ - close(open("touch " _PATH_LOG, O_RDWR | O_CREAT, 0644)); + /* create the syslog file so realpath() can work */ + close(open(_PATH_LOG, O_RDWR | O_CREAT, 0644)); if (realpath(_PATH_LOG, lfile) == NULL) { - perror("Could not resolv path to " _PATH_LOG); - exit (FALSE); + fatalError("Could not resolv path to " _PATH_LOG); } unlink (lfile); @@ -194,20 +186,17 @@ static void doSyslogd (void) sunx.sun_family = AF_UNIX; strncpy (sunx.sun_path, lfile, sizeof(sunx.sun_path)); if ((sock_fd = socket(AF_UNIX, SOCK_STREAM, 0)) < 0) { - perror ("Couldn't obtain descriptor for socket " _PATH_LOG); - exit (FALSE); + fatalError ("Couldn't obtain descriptor for socket " _PATH_LOG); } addrLength = sizeof (sunx.sun_family) + strlen (sunx.sun_path); if ((bind (sock_fd, (struct sockaddr *) &sunx, addrLength)) || (listen (sock_fd, 5))) { - perror ("Could not connect to socket " _PATH_LOG); - exit (FALSE); + fatalError ("Could not connect to socket " _PATH_LOG); } if (chmod (lfile, 0666) < 0) { - perror ("Could not set permission on " _PATH_LOG); - exit (FALSE); + fatalError ("Could not set permission on " _PATH_LOG); } FD_ZERO (&readfds); @@ -221,19 +210,17 @@ static void doSyslogd (void) if ((n_ready = select (FD_SETSIZE, &readfds, NULL, NULL, NULL)) < 0) { if (errno == EINTR) continue; /* alarm may have happened. */ - perror ("select"); - exit (FALSE); + fatalError( "select error: %s\n", strerror(errno)); } /* Skip stdin, stdout, stderr */ - for (fd = 3; fd <= FD_SETSIZE; fd++) { + for (fd = 3; fd < FD_SETSIZE; fd++) { if (FD_ISSET (fd, &readfds)) { if (fd == sock_fd) { int conn; if ((conn = accept(sock_fd, (struct sockaddr *) &sunx, &addrLength)) < 0) { - perror ("accept"); - exit (FALSE); /* #### ??? */ + fatalError( "accept error: %s\n", strerror(errno)); } FD_SET (conn, &readfds); } @@ -242,17 +229,11 @@ static void doSyslogd (void) char buf[BUFSIZE]; char *q, *p; int n_read; + char line[BUFSIZE]; + unsigned char c; - n_read = read (fd, buf, BUFSIZE); - - if (n_read < 0) { - // FIXME .. fd isn't set - perror ("read error"); - goto close_fd; - } - else if (n_read > 0) { - char line[BUFSIZE]; - unsigned char c; + /* Keep reading stuff till there is nothing else to read */ + while( (n_read = read (fd, buf, BUFSIZE)) > 0 && errno != EOF) { int pri = (LOG_USER | LOG_NOTICE); memset (line, 0, sizeof(line)); @@ -281,14 +262,9 @@ static void doSyslogd (void) /* Now log it */ logMessage(pri, line); - - close_fd: - close (fd); - FD_CLR (fd, &readfds); - } - else { /* EOF */ - goto close_fd; } + close (fd); + FD_CLR (fd, &readfds); } } } diff --git a/tar.c b/tar.c index 4eda4c61a..9b3cb7d81 100644 --- a/tar.c +++ b/tar.c @@ -493,18 +493,6 @@ readTarHeader(struct TarHeader *rawHeader, struct TarInfo *header) chksum = getOctal(rawHeader->chksum, sizeof(rawHeader->chksum)); header->type = rawHeader->typeflag; header->linkname = rawHeader->linkname; - /* Check for and relativify any absolute paths */ - if ( *(header->linkname) == '/' ) { - static int alreadyWarned=FALSE; - - while (*(header->linkname) == '/') - ++*(header->linkname); - - if (alreadyWarned == FALSE) { - errorMsg("tar: Removing leading '/' from link names\n"); - alreadyWarned = TRUE; - } - } header->devmajor = getOctal(rawHeader->devmajor, sizeof(rawHeader->devmajor)); header->devminor = getOctal(rawHeader->devminor, sizeof(rawHeader->devminor)); @@ -826,7 +814,7 @@ writeTarHeader(struct TarBallInfo *tbInfo, const char *fileName, struct stat *st if (! *header.uname) strcpy(header.uname, "root"); - // FIXME (or most likely not): I break Hard Links + /* WARNING/NOTICE: I break Hard Links */ if (S_ISLNK(statbuf->st_mode)) { char buffer[BUFSIZ]; header.typeflag = SYMTYPE; @@ -834,17 +822,7 @@ writeTarHeader(struct TarBallInfo *tbInfo, const char *fileName, struct stat *st errorMsg("Error reading symlink '%s': %s\n", header.name, strerror(errno)); return ( FALSE); } - if (*buffer=='/') { - static int alreadyWarned=FALSE; - if (alreadyWarned==FALSE) { - errorMsg("tar: Removing leading '/' from link names\n"); - alreadyWarned=TRUE; - } - strncpy(header.linkname, buffer+1, sizeof(header.linkname)); - } - else { - strncpy(header.linkname, buffer, sizeof(header.linkname)); - } + strncpy(header.linkname, buffer, sizeof(header.linkname)); } else if (S_ISDIR(statbuf->st_mode)) { header.typeflag = DIRTYPE; strncat(header.name, "/", sizeof(header.name));