diff options
| author | Ron Yorston <rmy@pobox.com> | 2020-08-14 13:35:10 +0100 |
|---|---|---|
| committer | Ron Yorston <rmy@pobox.com> | 2020-08-14 13:35:10 +0100 |
| commit | c775e9de197afe1cc0907f559f7cab36d52c93fa (patch) | |
| tree | e54777d3dee69e72891409c945f76f5e3c95c991 | |
| parent | 41ef232fc522d91f29931ea4ee547432ca8899ee (diff) | |
| download | busybox-w32-c775e9de197afe1cc0907f559f7cab36d52c93fa.tar.gz busybox-w32-c775e9de197afe1cc0907f559f7cab36d52c93fa.tar.bz2 busybox-w32-c775e9de197afe1cc0907f559f7cab36d52c93fa.zip | |
busybox: add option to install to Unix-style paths
The command 'busybox --install -u' installs links to Unix-style
paths in the system drive.
| -rw-r--r-- | applets/applet_tables.c | 2 | ||||
| -rw-r--r-- | libbb/appletlib.c | 45 |
2 files changed, 35 insertions, 12 deletions
diff --git a/applets/applet_tables.c b/applets/applet_tables.c index 02352113f..ce2037440 100644 --- a/applets/applet_tables.c +++ b/applets/applet_tables.c | |||
| @@ -190,7 +190,7 @@ int main(int argc, char **argv) | |||
| 190 | printf("};\n\n"); | 190 | printf("};\n\n"); |
| 191 | #endif | 191 | #endif |
| 192 | 192 | ||
| 193 | #if ENABLE_FEATURE_INSTALLER && !ENABLE_PLATFORM_MINGW32 | 193 | #if ENABLE_FEATURE_INSTALLER |
| 194 | printf("const uint8_t applet_install_loc[] ALIGN1 = {\n"); | 194 | printf("const uint8_t applet_install_loc[] ALIGN1 = {\n"); |
| 195 | i = 0; | 195 | i = 0; |
| 196 | while (i < NUM_APPLETS) { | 196 | while (i < NUM_APPLETS) { |
diff --git a/libbb/appletlib.c b/libbb/appletlib.c index d2f98567e..35f577b89 100644 --- a/libbb/appletlib.c +++ b/libbb/appletlib.c | |||
| @@ -717,7 +717,6 @@ static void check_suid(int applet_no) | |||
| 717 | 717 | ||
| 718 | 718 | ||
| 719 | # if ENABLE_FEATURE_INSTALLER | 719 | # if ENABLE_FEATURE_INSTALLER |
| 720 | # if !ENABLE_PLATFORM_MINGW32 | ||
| 721 | static const char usr_bin [] ALIGN1 = "/usr/bin/"; | 720 | static const char usr_bin [] ALIGN1 = "/usr/bin/"; |
| 722 | static const char usr_sbin[] ALIGN1 = "/usr/sbin/"; | 721 | static const char usr_sbin[] ALIGN1 = "/usr/sbin/"; |
| 723 | static const char *const install_dir[] = { | 722 | static const char *const install_dir[] = { |
| @@ -730,6 +729,7 @@ static const char *const install_dir[] = { | |||
| 730 | # endif | 729 | # endif |
| 731 | }; | 730 | }; |
| 732 | 731 | ||
| 732 | # if !ENABLE_PLATFORM_MINGW32 | ||
| 733 | /* create (sym)links for each applet */ | 733 | /* create (sym)links for each applet */ |
| 734 | static void install_links(const char *busybox, int use_symbolic_links, | 734 | static void install_links(const char *busybox, int use_symbolic_links, |
| 735 | char *custom_install_dir) | 735 | char *custom_install_dir) |
| @@ -768,13 +768,24 @@ static void install_links(const char *busybox, | |||
| 768 | { | 768 | { |
| 769 | char *fpc; | 769 | char *fpc; |
| 770 | const char *appname = applet_names; | 770 | const char *appname = applet_names; |
| 771 | int rc; | 771 | const char *sd = custom_install_dir == NULL ? get_system_drive() : NULL; |
| 772 | int i, rc; | ||
| 772 | 773 | ||
| 773 | if (!is_directory(custom_install_dir, FALSE)) | 774 | if (custom_install_dir && !is_directory(custom_install_dir, FALSE)) |
| 774 | bb_error_msg_and_die("'%s' is not a directory", custom_install_dir); | 775 | bb_error_msg_and_die("'%s' is not a directory", custom_install_dir); |
| 775 | 776 | ||
| 776 | while (*appname) { | 777 | if (custom_install_dir == NULL) { |
| 777 | fpc = xasprintf("%s/%s.exe", custom_install_dir, appname); | 778 | for (i=1; i<ARRAY_SIZE(install_dir); ++i) { |
| 779 | fpc = xasprintf("%s%s", sd ?: "", install_dir[i]); | ||
| 780 | bb_make_directory(fpc, 0755, FILEUTILS_RECUR); | ||
| 781 | free(fpc); | ||
| 782 | } | ||
| 783 | } | ||
| 784 | |||
| 785 | for (i = 0; i < ARRAY_SIZE(applet_main); i++) { | ||
| 786 | fpc = xasprintf("%s%s/%s.exe", sd ?: "", | ||
| 787 | custom_install_dir ?: install_dir[APPLET_INSTALL_LOC(i)], | ||
| 788 | appname); | ||
| 778 | rc = link(busybox, fpc); | 789 | rc = link(busybox, fpc); |
| 779 | if (rc != 0 && (errno != EEXIST || | 790 | if (rc != 0 && (errno != EEXIST || |
| 780 | strcmp("busybox.exe", bb_basename(fpc)) != 0)) { | 791 | strcmp("busybox.exe", bb_basename(fpc)) != 0)) { |
| @@ -897,7 +908,7 @@ int busybox_main(int argc UNUSED_PARAM, char **argv) | |||
| 897 | " or: busybox --install [-s] [DIR]\n" | 908 | " or: busybox --install [-s] [DIR]\n" |
| 898 | ) | 909 | ) |
| 899 | IF_PLATFORM_MINGW32( | 910 | IF_PLATFORM_MINGW32( |
| 900 | " or: busybox --install [DIR]\n" | 911 | " or: busybox --install [-u|DIR]\n" |
| 901 | " or: busybox --uninstall [-n] file\n" | 912 | " or: busybox --uninstall [-n] file\n" |
| 902 | ) | 913 | ) |
| 903 | ) | 914 | ) |
| @@ -981,6 +992,7 @@ int busybox_main(int argc UNUSED_PARAM, char **argv) | |||
| 981 | else | 992 | else |
| 982 | str = " "; | 993 | str = " "; |
| 983 | full_write2_str(str); | 994 | full_write2_str(str); |
| 995 | full_write2_str(install_dir[APPLET_INSTALL_LOC(i)] + 1); | ||
| 984 | } | 996 | } |
| 985 | # endif | 997 | # endif |
| 986 | full_write2_str(a); | 998 | full_write2_str(a); |
| @@ -1015,12 +1027,23 @@ int busybox_main(int argc UNUSED_PARAM, char **argv) | |||
| 1015 | use_symbolic_links = (argv[2] && strcmp(argv[2], "-s") == 0 && ++argv); | 1027 | use_symbolic_links = (argv[2] && strcmp(argv[2], "-s") == 0 && ++argv); |
| 1016 | install_links(busybox, use_symbolic_links, argv[2]); | 1028 | install_links(busybox, use_symbolic_links, argv[2]); |
| 1017 | #else | 1029 | #else |
| 1018 | /* busybox --install [DIR] | 1030 | char *target = NULL; |
| 1019 | * where DIR is the directory to install to. If DIR is not | 1031 | |
| 1020 | * provided put the links in the same directory as busybox. | 1032 | /* busybox --install [-u|DIR] |
| 1033 | * -u: install to Unix-style directories in system drive | ||
| 1034 | * DIR: directory to install links to | ||
| 1035 | * If no argument is provided put the links in the same directory | ||
| 1036 | * as busybox. | ||
| 1021 | */ | 1037 | */ |
| 1022 | install_links(bb_busybox_exec_path, FALSE, argv[2] ? argv[2] : | 1038 | if (argv[2]) { |
| 1023 | dirname(xstrdup(bb_busybox_exec_path))); | 1039 | if (strcmp(argv[2], "-u") != 0) |
| 1040 | target = argv[2]; | ||
| 1041 | } | ||
| 1042 | else { | ||
| 1043 | target = dirname(xstrdup(bb_busybox_exec_path)); | ||
| 1044 | } | ||
| 1045 | /* NULL target -> install to Unix-style dirs */ | ||
| 1046 | install_links(bb_busybox_exec_path, FALSE, target); | ||
| 1024 | #endif | 1047 | #endif |
| 1025 | return 0; | 1048 | return 0; |
| 1026 | } | 1049 | } |
