diff --git a/init/devices.cpp b/init/devices.cpp index 830b74cb2..bad04aec1 100644 --- a/init/devices.cpp +++ b/init/devices.cpp @@ -14,21 +14,23 @@ * limitations under the License. */ +#include #include +#include #include +#include #include #include #include -#include -#include - -#include -#include -#include #include - #include +#include +#include +#include #include +#include +#include + #include #include @@ -39,8 +41,6 @@ #include #include -#include -#include #include #include @@ -541,30 +541,49 @@ static char **get_block_device_symlinks(struct uevent *uevent) return links; } +static void make_link_init(const char* oldpath, const char* newpath) { + const char* slash = strrchr(newpath, '/'); + if (!slash) return; + + if (mkdir_recursive(dirname(newpath), 0755)) { + PLOG(ERROR) << "Failed to create directory " << dirname(newpath); + } + + if (symlink(oldpath, newpath) && errno != EEXIST) { + PLOG(ERROR) << "Failed to symlink " << oldpath << " to " << newpath; + } +} + +static void remove_link(const char* oldpath, const char* newpath) { + std::string path; + if (android::base::Readlink(newpath, &path) && path == oldpath) unlink(newpath); +} + static void handle_device(const char *action, const char *devpath, const char *path, int block, int major, int minor, char **links) { - int i; - if(!strcmp(action, "add")) { make_device(devpath, path, block, major, minor, (const char **)links); if (links) { - for (i = 0; links[i]; i++) + for (int i = 0; links[i]; i++) { make_link_init(devpath, links[i]); + } } } if(!strcmp(action, "remove")) { if (links) { - for (i = 0; links[i]; i++) + for (int i = 0; links[i]; i++) { remove_link(devpath, links[i]); + } } unlink(devpath); } if (links) { - for (i = 0; links[i]; i++) + for (int i = 0; links[i]; i++) { free(links[i]); + } free(links); } } diff --git a/init/util.cpp b/init/util.cpp index c1750d21e..660a66f57 100644 --- a/init/util.cpp +++ b/init/util.cpp @@ -270,40 +270,6 @@ void sanitize(char *s) } } -void make_link_init(const char *oldpath, const char *newpath) -{ - int ret; - char buf[256]; - const char *slash; - int width; - - slash = strrchr(newpath, '/'); - if (!slash) - return; - width = slash - newpath; - if (width <= 0 || width > (int)sizeof(buf) - 1) - return; - memcpy(buf, newpath, width); - buf[width] = 0; - ret = mkdir_recursive(buf, 0755); - if (ret) PLOG(ERROR) << "Failed to create directory " << buf; - - ret = symlink(oldpath, newpath); - if (ret && errno != EEXIST) PLOG(ERROR) << "Failed to symlink " << oldpath << " to " << newpath; -} - -void remove_link(const char *oldpath, const char *newpath) -{ - char path[256]; - ssize_t ret; - ret = readlink(newpath, path, sizeof(path) - 1); - if (ret <= 0) - return; - path[ret] = 0; - if (!strcmp(path, oldpath)) - unlink(newpath); -} - int wait_for_file(const char *filename, int timeout) { struct stat info; diff --git a/init/util.h b/init/util.h index 29d049727..b83b9a004 100644 --- a/init/util.h +++ b/init/util.h @@ -51,8 +51,6 @@ unsigned int decode_uid(const char *s); int mkdir_recursive(const char *pathname, mode_t mode); void sanitize(char *p); -void make_link_init(const char *oldpath, const char *newpath); -void remove_link(const char *oldpath, const char *newpath); int wait_for_file(const char *filename, int timeout); void import_kernel_cmdline(bool in_qemu, const std::function&);