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 /libbb | |
| 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
Diffstat (limited to 'libbb')
| -rw-r--r-- | libbb/copy_file.c | 13 | ||||
| -rw-r--r-- | libbb/libbb.h | 1 | ||||
| -rw-r--r-- | libbb/xreadlink.c | 34 |
3 files changed, 38 insertions, 10 deletions
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 | |||
