diff options
| author | markw <markw@69ca8d6d-28ef-0310-b511-8ec308f3f277> | 2001-04-30 18:17:00 +0000 |
|---|---|---|
| committer | markw <markw@69ca8d6d-28ef-0310-b511-8ec308f3f277> | 2001-04-30 18:17:00 +0000 |
| commit | db1ea6ee76a5106c45398bdc17c2db04da99ecf7 (patch) | |
| tree | a90a2bc3c3815f7f0e70f009b9b175736902a848 | |
| parent | c9a51e8d05d64580a0f9ccce5b77c5b4ad990541 (diff) | |
| download | busybox-w32-db1ea6ee76a5106c45398bdc17c2db04da99ecf7.tar.gz busybox-w32-db1ea6ee76a5106c45398bdc17c2db04da99ecf7.tar.bz2 busybox-w32-db1ea6ee76a5106c45398bdc17c2db04da99ecf7.zip | |
Made new xreadlink function for libbb and changed applets to use it instead of
readlink(2).
git-svn-id: svn://busybox.net/trunk/busybox@2495 69ca8d6d-28ef-0310-b511-8ec308f3f277
| -rw-r--r-- | Makefile | 4 | ||||
| -rw-r--r-- | applets/busybox.c | 17 | ||||
| -rw-r--r-- | archival/tar.c | 12 | ||||
| -rw-r--r-- | busybox.c | 17 | ||||
| -rw-r--r-- | coreutils/ls.c | 12 | ||||
| -rw-r--r-- | include/libbb.h | 1 | ||||
| -rw-r--r-- | libbb/copy_file.c | 13 | ||||
| -rw-r--r-- | libbb/libbb.h | 1 | ||||
| -rw-r--r-- | libbb/xreadlink.c | 34 | ||||
| -rw-r--r-- | ls.c | 12 | ||||
| -rw-r--r-- | miscutils/readlink.c | 16 | ||||
| -rw-r--r-- | readlink.c | 16 | ||||
| -rw-r--r-- | tar.c | 12 |
13 files changed, 77 insertions, 90 deletions
| @@ -247,8 +247,8 @@ parse_mode.c parse_number.c perror_msg.c perror_msg_and_die.c print_file.c \ | |||
| 247 | process_escape_sequence.c read_package_field.c read_text_file_to_buffer.c \ | 247 | process_escape_sequence.c read_package_field.c read_text_file_to_buffer.c \ |
| 248 | recursive_action.c safe_read.c safe_strncpy.c seek_ared_file.c syscalls.c \ | 248 | recursive_action.c safe_read.c safe_strncpy.c seek_ared_file.c syscalls.c \ |
| 249 | syslog_msg_with_name.c time_string.c trim.c untar.c unzip.c vdprintf.c \ | 249 | syslog_msg_with_name.c time_string.c trim.c untar.c unzip.c vdprintf.c \ |
| 250 | verror_msg.c vperror_msg.c wfopen.c xfuncs.c xgetcwd.c xregcomp.c interface.c \ | 250 | verror_msg.c vperror_msg.c wfopen.c xfuncs.c xgetcwd.c xreadlink.c\ |
| 251 | remove_file.c last_char_is.c | 251 | xregcomp.c interface.c remove_file.c last_char_is.c |
| 252 | LIBBB_OBJS=$(patsubst %.c,$(LIBBB)/%.o, $(LIBBB_CSRC)) | 252 | LIBBB_OBJS=$(patsubst %.c,$(LIBBB)/%.o, $(LIBBB_CSRC)) |
| 253 | LIBBB_CFLAGS = -I$(LIBBB) | 253 | LIBBB_CFLAGS = -I$(LIBBB) |
| 254 | ifneq ($(strip $(BB_SRC_DIR)),) | 254 | ifneq ($(strip $(BB_SRC_DIR)),) |
diff --git a/applets/busybox.c b/applets/busybox.c index b4939e19d..badd53d79 100644 --- a/applets/busybox.c +++ b/applets/busybox.c | |||
| @@ -37,21 +37,10 @@ typedef int (*__link_f)(const char *, const char *); | |||
| 37 | */ | 37 | */ |
| 38 | static char *busybox_fullpath() | 38 | static char *busybox_fullpath() |
| 39 | { | 39 | { |
| 40 | pid_t pid; | ||
| 41 | char path[256]; | ||
| 42 | char proc[256]; | 40 | char proc[256]; |
| 43 | int len; | 41 | |
| 44 | 42 | sprintf(proc, "/proc/%d/exe", getpid()); | |
| 45 | pid = getpid(); | 43 | return xreadlink(proc); |
| 46 | sprintf(proc, "/proc/%d/exe", pid); | ||
| 47 | len = readlink(proc, path, 256); | ||
| 48 | if (len != -1) { | ||
| 49 | path[len] = 0; | ||
| 50 | } else { | ||
| 51 | perror_msg("%s", proc); | ||
| 52 | return NULL; | ||
| 53 | } | ||
| 54 | return strdup(path); | ||
| 55 | } | 44 | } |
| 56 | 45 | ||
| 57 | /* create (sym)links for each applet */ | 46 | /* create (sym)links for each applet */ |
diff --git a/archival/tar.c b/archival/tar.c index c168564ca..4bf8004ea 100644 --- a/archival/tar.c +++ b/archival/tar.c | |||
| @@ -921,16 +921,10 @@ writeTarHeader(struct TarBallInfo *tbInfo, const char *header_name, | |||
| 921 | header.typeflag = LNKTYPE; | 921 | header.typeflag = LNKTYPE; |
| 922 | strncpy(header.linkname, tbInfo->hlInfo->name, sizeof(header.linkname)); | 922 | strncpy(header.linkname, tbInfo->hlInfo->name, sizeof(header.linkname)); |
| 923 | } else if (S_ISLNK(statbuf->st_mode)) { | 923 | } else if (S_ISLNK(statbuf->st_mode)) { |
| 924 | int link_size=0; | 924 | char *lpath = xreadlink(real_name); |
| 925 | char buffer[BUFSIZ]; | ||
| 926 | header.typeflag = SYMTYPE; | 925 | header.typeflag = SYMTYPE; |
| 927 | link_size = readlink(real_name, buffer, sizeof(buffer) - 1); | 926 | strncpy(header.linkname, lpath, sizeof(header.linkname)); |
| 928 | if ( link_size < 0) { | 927 | free(lpath); |
| 929 | perror_msg("Error reading symlink '%s'", header.name); | ||
| 930 | return ( FALSE); | ||
| 931 | } | ||
| 932 | buffer[link_size] = '\0'; | ||
| 933 | strncpy(header.linkname, buffer, sizeof(header.linkname)); | ||
| 934 | } else if (S_ISDIR(statbuf->st_mode)) { | 928 | } else if (S_ISDIR(statbuf->st_mode)) { |
| 935 | header.typeflag = DIRTYPE; | 929 | header.typeflag = DIRTYPE; |
| 936 | strncat(header.name, "/", sizeof(header.name)); | 930 | strncat(header.name, "/", sizeof(header.name)); |
| @@ -37,21 +37,10 @@ typedef int (*__link_f)(const char *, const char *); | |||
| 37 | */ | 37 | */ |
| 38 | static char *busybox_fullpath() | 38 | static char *busybox_fullpath() |
| 39 | { | 39 | { |
| 40 | pid_t pid; | ||
| 41 | char path[256]; | ||
| 42 | char proc[256]; | 40 | char proc[256]; |
| 43 | int len; | 41 | |
| 44 | 42 | sprintf(proc, "/proc/%d/exe", getpid()); | |
| 45 | pid = getpid(); | 43 | return xreadlink(proc); |
| 46 | sprintf(proc, "/proc/%d/exe", pid); | ||
| 47 | len = readlink(proc, path, 256); | ||
| 48 | if (len != -1) { | ||
| 49 | path[len] = 0; | ||
| 50 | } else { | ||
| 51 | perror_msg("%s", proc); | ||
| 52 | return NULL; | ||
| 53 | } | ||
| 54 | return strdup(path); | ||
| 55 | } | 44 | } |
| 56 | 45 | ||
| 57 | /* create (sym)links for each applet */ | 46 | /* create (sym)links for each applet */ |
diff --git a/coreutils/ls.c b/coreutils/ls.c index d24ba9866..c13b225fa 100644 --- a/coreutils/ls.c +++ b/coreutils/ls.c | |||
| @@ -577,7 +577,7 @@ static struct dnode **list_dir(char *path) | |||
| 577 | /*----------------------------------------------------------------------*/ | 577 | /*----------------------------------------------------------------------*/ |
| 578 | static int list_single(struct dnode *dn) | 578 | static int list_single(struct dnode *dn) |
| 579 | { | 579 | { |
| 580 | int i, len; | 580 | int i; |
| 581 | char scratch[BUFSIZ + 1]; | 581 | char scratch[BUFSIZ + 1]; |
| 582 | #ifdef BB_FEATURE_LS_TIMESTAMPS | 582 | #ifdef BB_FEATURE_LS_TIMESTAMPS |
| 583 | char *filetime; | 583 | char *filetime; |
| @@ -688,16 +688,16 @@ static int list_single(struct dnode *dn) | |||
| 688 | break; | 688 | break; |
| 689 | case LIST_SYMLINK: | 689 | case LIST_SYMLINK: |
| 690 | if (S_ISLNK(dn->dstat.st_mode)) { | 690 | if (S_ISLNK(dn->dstat.st_mode)) { |
| 691 | len= readlink(dn->fullname, scratch, (sizeof scratch)-1); | 691 | char *lpath = xreadlink(dn->fullname); |
| 692 | if (len > 0) { | 692 | if (lpath) { |
| 693 | scratch[len]= '\0'; | 693 | printf(" -> %s", lpath); |
| 694 | printf(" -> %s", scratch); | ||
| 695 | #ifdef BB_FEATURE_LS_FILETYPES | 694 | #ifdef BB_FEATURE_LS_FILETYPES |
| 696 | if (!stat(dn->fullname, &info)) { | 695 | if (!stat(dn->fullname, &info)) { |
| 697 | append = append_char(info.st_mode); | 696 | append = append_char(info.st_mode); |
| 698 | } | 697 | } |
| 699 | #endif | 698 | #endif |
| 700 | column += len+4; | 699 | column += strlen(lpath) + 4; |
| 700 | free(lpath); | ||
| 701 | } | 701 | } |
| 702 | } | 702 | } |
| 703 | break; | 703 | break; |
diff --git a/include/libbb.h b/include/libbb.h index a53e647d3..d2f9a9567 100644 --- a/include/libbb.h +++ b/include/libbb.h | |||
| @@ -217,6 +217,7 @@ int ask_confirmation(void); | |||
| 217 | int klogctl(int type, char * b, int len); | 217 | int klogctl(int type, char * b, int len); |
| 218 | 218 | ||
| 219 | char *xgetcwd(char *cwd); | 219 | char *xgetcwd(char *cwd); |
| 220 | char *xreadlink(const char *path); | ||
| 220 | char *concat_path_file(const char *path, const char *filename); | 221 | char *concat_path_file(const char *path, const char *filename); |
| 221 | int last_char_is(const char *s, const int c); | 222 | int last_char_is(const char *s, const int c); |
| 222 | 223 | ||
diff --git a/libbb/copy_file.c b/libbb/copy_file.c index 2d18b6087..22684be74 100644 --- a/libbb/copy_file.c +++ b/libbb/copy_file.c | |||
| @@ -196,19 +196,12 @@ int copy_file(const char *source, const char *dest, int flags) | |||
| 196 | return -1; | 196 | return -1; |
| 197 | } | 197 | } |
| 198 | } else if (S_ISLNK(source_stat.st_mode)) { | 198 | } else if (S_ISLNK(source_stat.st_mode)) { |
| 199 | int size; | 199 | char *lpath = xreadlink(source); |
| 200 | char buf[BUFSIZ + 1]; | 200 | if (symlink(lpath, dest) < 0) { |
| 201 | |||
| 202 | if ((size = readlink(source, buf, BUFSIZ)) < 0) { | ||
| 203 | perror_msg("cannot read `%s'", source); | ||
| 204 | return -1; | ||
| 205 | } | ||
| 206 | buf[size] = '\0'; | ||
| 207 | |||
| 208 | if (symlink(buf, dest) < 0) { | ||
| 209 | perror_msg("cannot create symlink `%s'", dest); | 201 | perror_msg("cannot create symlink `%s'", dest); |
| 210 | return -1; | 202 | return -1; |
| 211 | } | 203 | } |
| 204 | free(lpath); | ||
| 212 | 205 | ||
| 213 | #if (__GLIBC__ >= 2) && (__GLIBC_MINOR__ >= 1) | 206 | #if (__GLIBC__ >= 2) && (__GLIBC_MINOR__ >= 1) |
| 214 | if (flags & FILEUTILS_PRESERVE_STATUS) | 207 | if (flags & FILEUTILS_PRESERVE_STATUS) |
diff --git a/libbb/libbb.h b/libbb/libbb.h index a53e647d3..d2f9a9567 100644 --- a/libbb/libbb.h +++ b/libbb/libbb.h | |||
| @@ -217,6 +217,7 @@ int ask_confirmation(void); | |||
| 217 | int klogctl(int type, char * b, int len); | 217 | int klogctl(int type, char * b, int len); |
| 218 | 218 | ||
| 219 | char *xgetcwd(char *cwd); | 219 | char *xgetcwd(char *cwd); |
| 220 | char *xreadlink(const char *path); | ||
| 220 | char *concat_path_file(const char *path, const char *filename); | 221 | char *concat_path_file(const char *path, const char *filename); |
| 221 | int last_char_is(const char *s, const int c); | 222 | int last_char_is(const char *s, const int c); |
| 222 | 223 | ||
diff --git a/libbb/xreadlink.c b/libbb/xreadlink.c new file mode 100644 index 000000000..66f63b883 --- /dev/null +++ b/libbb/xreadlink.c | |||
| @@ -0,0 +1,34 @@ | |||
| 1 | /* | ||
| 2 | * xreadlink.c - safe implementation of readlink | ||
| 3 | */ | ||
| 4 | |||
| 5 | #include <stdio.h> | ||
| 6 | |||
| 7 | /* | ||
| 8 | * NOTE: This function returns a malloced char* that you will have to free | ||
| 9 | * yourself. You have been warned. | ||
| 10 | */ | ||
| 11 | |||
| 12 | #include <unistd.h> | ||
| 13 | #include "libbb.h" | ||
| 14 | |||
| 15 | extern char *xreadlink(const char *path) | ||
| 16 | { | ||
| 17 | static const int GROWBY = 80; /* how large we will grow strings by */ | ||
| 18 | |||
| 19 | char *buf = NULL; | ||
| 20 | int bufsize = 0, readsize = 0; | ||
| 21 | |||
| 22 | do { | ||
| 23 | buf = xrealloc(buf, bufsize += GROWBY); | ||
| 24 | readsize = readlink(path, buf, bufsize); /* 1st try */ | ||
| 25 | if (readsize == -1) | ||
| 26 | perror_msg("%s:%s", applet_name, path); | ||
| 27 | } | ||
| 28 | while (bufsize < readsize + 1); | ||
| 29 | |||
| 30 | buf[readsize] = '\0'; | ||
| 31 | |||
| 32 | return buf; | ||
| 33 | } | ||
| 34 | |||
| @@ -577,7 +577,7 @@ static struct dnode **list_dir(char *path) | |||
| 577 | /*----------------------------------------------------------------------*/ | 577 | /*----------------------------------------------------------------------*/ |
| 578 | static int list_single(struct dnode *dn) | 578 | static int list_single(struct dnode *dn) |
| 579 | { | 579 | { |
| 580 | int i, len; | 580 | int i; |
| 581 | char scratch[BUFSIZ + 1]; | 581 | char scratch[BUFSIZ + 1]; |
| 582 | #ifdef BB_FEATURE_LS_TIMESTAMPS | 582 | #ifdef BB_FEATURE_LS_TIMESTAMPS |
| 583 | char *filetime; | 583 | char *filetime; |
| @@ -688,16 +688,16 @@ static int list_single(struct dnode *dn) | |||
| 688 | break; | 688 | break; |
| 689 | case LIST_SYMLINK: | 689 | case LIST_SYMLINK: |
| 690 | if (S_ISLNK(dn->dstat.st_mode)) { | 690 | if (S_ISLNK(dn->dstat.st_mode)) { |
| 691 | len= readlink(dn->fullname, scratch, (sizeof scratch)-1); | 691 | char *lpath = xreadlink(dn->fullname); |
| 692 | if (len > 0) { | 692 | if (lpath) { |
| 693 | scratch[len]= '\0'; | 693 | printf(" -> %s", lpath); |
| 694 | printf(" -> %s", scratch); | ||
| 695 | #ifdef BB_FEATURE_LS_FILETYPES | 694 | #ifdef BB_FEATURE_LS_FILETYPES |
| 696 | if (!stat(dn->fullname, &info)) { | 695 | if (!stat(dn->fullname, &info)) { |
| 697 | append = append_char(info.st_mode); | 696 | append = append_char(info.st_mode); |
| 698 | } | 697 | } |
| 699 | #endif | 698 | #endif |
| 700 | column += len+4; | 699 | column += strlen(lpath) + 4; |
| 700 | free(lpath); | ||
| 701 | } | 701 | } |
| 702 | } | 702 | } |
| 703 | break; | 703 | break; |
diff --git a/miscutils/readlink.c b/miscutils/readlink.c index 74196e11d..226649544 100644 --- a/miscutils/readlink.c +++ b/miscutils/readlink.c | |||
| @@ -30,21 +30,17 @@ | |||
| 30 | int readlink_main(int argc, char **argv) | 30 | int readlink_main(int argc, char **argv) |
| 31 | { | 31 | { |
| 32 | char *buf = NULL; | 32 | char *buf = NULL; |
| 33 | int bufsize = 128, size = 128; | 33 | |
| 34 | /* no options, no getopt */ | ||
| 34 | 35 | ||
| 35 | if (argc != 2) | 36 | if (argc != 2) |
| 36 | show_usage(); | 37 | show_usage(); |
| 37 | 38 | ||
| 38 | while (bufsize < size + 1) { | 39 | buf = xreadlink(argv[1]); |
| 39 | bufsize *= 2; | ||
| 40 | buf = xrealloc(buf, bufsize); | ||
| 41 | size = readlink(argv[1], buf, bufsize); | ||
| 42 | if (size == -1) | ||
| 43 | perror_msg_and_die("%s", argv[1]); | ||
| 44 | } | ||
| 45 | |||
| 46 | buf[size] = '\0'; | ||
| 47 | puts(buf); | 40 | puts(buf); |
| 41 | #ifdef BB_FEATURE_CLEAN_UP | ||
| 42 | free(buf); | ||
| 43 | #endif | ||
| 48 | 44 | ||
| 49 | return EXIT_SUCCESS; | 45 | return EXIT_SUCCESS; |
| 50 | } | 46 | } |
diff --git a/readlink.c b/readlink.c index 74196e11d..226649544 100644 --- a/readlink.c +++ b/readlink.c | |||
| @@ -30,21 +30,17 @@ | |||
| 30 | int readlink_main(int argc, char **argv) | 30 | int readlink_main(int argc, char **argv) |
| 31 | { | 31 | { |
| 32 | char *buf = NULL; | 32 | char *buf = NULL; |
| 33 | int bufsize = 128, size = 128; | 33 | |
| 34 | /* no options, no getopt */ | ||
| 34 | 35 | ||
| 35 | if (argc != 2) | 36 | if (argc != 2) |
| 36 | show_usage(); | 37 | show_usage(); |
| 37 | 38 | ||
| 38 | while (bufsize < size + 1) { | 39 | buf = xreadlink(argv[1]); |
| 39 | bufsize *= 2; | ||
| 40 | buf = xrealloc(buf, bufsize); | ||
| 41 | size = readlink(argv[1], buf, bufsize); | ||
| 42 | if (size == -1) | ||
| 43 | perror_msg_and_die("%s", argv[1]); | ||
| 44 | } | ||
| 45 | |||
| 46 | buf[size] = '\0'; | ||
| 47 | puts(buf); | 40 | puts(buf); |
| 41 | #ifdef BB_FEATURE_CLEAN_UP | ||
| 42 | free(buf); | ||
| 43 | #endif | ||
| 48 | 44 | ||
| 49 | return EXIT_SUCCESS; | 45 | return EXIT_SUCCESS; |
| 50 | } | 46 | } |
| @@ -921,16 +921,10 @@ writeTarHeader(struct TarBallInfo *tbInfo, const char *header_name, | |||
| 921 | header.typeflag = LNKTYPE; | 921 | header.typeflag = LNKTYPE; |
| 922 | strncpy(header.linkname, tbInfo->hlInfo->name, sizeof(header.linkname)); | 922 | strncpy(header.linkname, tbInfo->hlInfo->name, sizeof(header.linkname)); |
| 923 | } else if (S_ISLNK(statbuf->st_mode)) { | 923 | } else if (S_ISLNK(statbuf->st_mode)) { |
| 924 | int link_size=0; | 924 | char *lpath = xreadlink(real_name); |
| 925 | char buffer[BUFSIZ]; | ||
| 926 | header.typeflag = SYMTYPE; | 925 | header.typeflag = SYMTYPE; |
| 927 | link_size = readlink(real_name, buffer, sizeof(buffer) - 1); | 926 | strncpy(header.linkname, lpath, sizeof(header.linkname)); |
| 928 | if ( link_size < 0) { | 927 | free(lpath); |
| 929 | perror_msg("Error reading symlink '%s'", header.name); | ||
| 930 | return ( FALSE); | ||
| 931 | } | ||
| 932 | buffer[link_size] = '\0'; | ||
| 933 | strncpy(header.linkname, buffer, sizeof(header.linkname)); | ||
| 934 | } else if (S_ISDIR(statbuf->st_mode)) { | 928 | } else if (S_ISDIR(statbuf->st_mode)) { |
| 935 | header.typeflag = DIRTYPE; | 929 | header.typeflag = DIRTYPE; |
| 936 | strncat(header.name, "/", sizeof(header.name)); | 930 | strncat(header.name, "/", sizeof(header.name)); |
