diff options
| author | Ron Yorston <rmy@pobox.com> | 2023-04-28 14:05:59 +0100 |
|---|---|---|
| committer | Ron Yorston <rmy@pobox.com> | 2023-04-28 14:05:59 +0100 |
| commit | 5d417695bcd5af331acf69690312deff61b233d0 (patch) | |
| tree | 71f632f40cc05e9ac1f3dea798c34c887b6a8bba | |
| parent | e790046619f539356b950a5b07cba2f477401b4b (diff) | |
| download | busybox-w32-5d417695bcd5af331acf69690312deff61b233d0.tar.gz busybox-w32-5d417695bcd5af331acf69690312deff61b233d0.tar.bz2 busybox-w32-5d417695bcd5af331acf69690312deff61b233d0.zip | |
win32: code shrink copying of argv
There are two places where a copy of an argv array is made with
extra space at the start. Move this code into a function.
Saves 56-64 bytes.
| -rw-r--r-- | include/mingw.h | 1 | ||||
| -rw-r--r-- | networking/httpd.c | 10 | ||||
| -rw-r--r-- | win32/process.c | 18 |
3 files changed, 19 insertions, 10 deletions
diff --git a/include/mingw.h b/include/mingw.h index c2c37ba48..6204ded6d 100644 --- a/include/mingw.h +++ b/include/mingw.h | |||
| @@ -526,6 +526,7 @@ int utimes(const char *file_name, const struct timeval times[2]); | |||
| 526 | #define is_unc_path(x) (strlen(x) > 4 && is_dir_sep(x[0]) && \ | 526 | #define is_unc_path(x) (strlen(x) > 4 && is_dir_sep(x[0]) && \ |
| 527 | is_dir_sep(x[1]) && !is_dir_sep(x[2])) | 527 | is_dir_sep(x[1]) && !is_dir_sep(x[2])) |
| 528 | 528 | ||
| 529 | char ** FAST_FUNC grow_argv(char **argv, int n); | ||
| 529 | pid_t FAST_FUNC mingw_spawn(char **argv); | 530 | pid_t FAST_FUNC mingw_spawn(char **argv); |
| 530 | pid_t FAST_FUNC mingw_spawn_detach(char **argv); | 531 | pid_t FAST_FUNC mingw_spawn_detach(char **argv); |
| 531 | intptr_t FAST_FUNC mingw_spawn_proc(const char **argv); | 532 | intptr_t FAST_FUNC mingw_spawn_proc(const char **argv); |
diff --git a/networking/httpd.c b/networking/httpd.c index 302d1611d..2b2d14076 100644 --- a/networking/httpd.c +++ b/networking/httpd.c | |||
| @@ -2804,7 +2804,7 @@ static void mini_httpd_win32(int fg, int sock, int argc, char **argv) | |||
| 2804 | 2804 | ||
| 2805 | argv_copy[0] = (char *)bb_busybox_exec_path; | 2805 | argv_copy[0] = (char *)bb_busybox_exec_path; |
| 2806 | argv_copy[1] = (char *)"--busybox"; | 2806 | argv_copy[1] = (char *)"--busybox"; |
| 2807 | argv_copy[2] = (char *)"httpd"; | 2807 | argv_copy[2] = (char *)"-httpd" + 1; // skip '-' |
| 2808 | argv_copy[3] = (char *)"-I"; | 2808 | argv_copy[3] = (char *)"-I"; |
| 2809 | memcpy(&argv_copy[5], &argv[1], argc * sizeof(argv[0])); | 2809 | memcpy(&argv_copy[5], &argv[1], argc * sizeof(argv[0])); |
| 2810 | 2810 | ||
| @@ -2850,14 +2850,12 @@ static void mini_httpd_inetd(void) | |||
| 2850 | static void mingw_daemonize(char **argv) | 2850 | static void mingw_daemonize(char **argv) |
| 2851 | { | 2851 | { |
| 2852 | char **new_argv; | 2852 | char **new_argv; |
| 2853 | int argc, fd; | 2853 | int fd; |
| 2854 | 2854 | ||
| 2855 | argc = string_array_len((char **)argv); | 2855 | new_argv = grow_argv(argv + 1, 3); |
| 2856 | new_argv = xmalloc(sizeof(*argv)*(argc+3)); | ||
| 2857 | new_argv[0] = (char *)bb_busybox_exec_path; | 2856 | new_argv[0] = (char *)bb_busybox_exec_path; |
| 2858 | new_argv[1] = (char *)"--busybox"; | 2857 | new_argv[1] = (char *)"--busybox"; |
| 2859 | new_argv[2] = (char *)"-httpd"; | 2858 | new_argv[2] = (char *)"-httpd"; // '-' marks the daemonised process |
| 2860 | memcpy(&new_argv[3], &argv[1], sizeof(*argv)*argc); | ||
| 2861 | 2859 | ||
| 2862 | fd = xopen(bb_dev_null, O_RDWR); | 2860 | fd = xopen(bb_dev_null, O_RDWR); |
| 2863 | xdup2(fd, 0); | 2861 | xdup2(fd, 0); |
diff --git a/win32/process.c b/win32/process.c index 5c818a3c0..e93efa103 100644 --- a/win32/process.c +++ b/win32/process.c | |||
| @@ -259,6 +259,19 @@ mingw_spawn_applet(int mode, | |||
| 259 | } | 259 | } |
| 260 | #endif | 260 | #endif |
| 261 | 261 | ||
| 262 | /* Make a copy of an argv array with n extra slots at the start */ | ||
| 263 | char ** FAST_FUNC | ||
| 264 | grow_argv(char **argv, int n) | ||
| 265 | { | ||
| 266 | char **new_argv; | ||
| 267 | int argc; | ||
| 268 | |||
| 269 | argc = string_array_len(argv) + 1; | ||
| 270 | new_argv = xmalloc(sizeof(*argv) * (argc + n)); | ||
| 271 | memcpy(new_argv + n, argv, sizeof(*argv) * argc); | ||
| 272 | return new_argv; | ||
| 273 | } | ||
| 274 | |||
| 262 | static intptr_t | 275 | static intptr_t |
| 263 | mingw_spawn_interpreter(int mode, const char *prog, char *const *argv, | 276 | mingw_spawn_interpreter(int mode, const char *prog, char *const *argv, |
| 264 | char *const *envp, int level) | 277 | char *const *envp, int level) |
| @@ -267,7 +280,6 @@ mingw_spawn_interpreter(int mode, const char *prog, char *const *argv, | |||
| 267 | int nopts; | 280 | int nopts; |
| 268 | interp_t interp; | 281 | interp_t interp; |
| 269 | char **new_argv; | 282 | char **new_argv; |
| 270 | int argc; | ||
| 271 | char *path = NULL; | 283 | char *path = NULL; |
| 272 | 284 | ||
| 273 | if (!parse_interpreter(prog, &interp)) | 285 | if (!parse_interpreter(prog, &interp)) |
| @@ -279,11 +291,9 @@ mingw_spawn_interpreter(int mode, const char *prog, char *const *argv, | |||
| 279 | } | 291 | } |
| 280 | 292 | ||
| 281 | nopts = interp.opts != NULL; | 293 | nopts = interp.opts != NULL; |
| 282 | argc = string_array_len((char **)argv); | 294 | new_argv = grow_argv((char **)(argv + 1), nopts + 2); |
| 283 | new_argv = xmalloc(sizeof(*argv)*(argc+nopts+2)); | ||
| 284 | new_argv[1] = interp.opts; | 295 | new_argv[1] = interp.opts; |
| 285 | new_argv[nopts+1] = (char *)prog; /* pass absolute path */ | 296 | new_argv[nopts+1] = (char *)prog; /* pass absolute path */ |
| 286 | memcpy(new_argv+nopts+2, argv+1, sizeof(*argv)*argc); | ||
| 287 | 297 | ||
| 288 | #if ENABLE_FEATURE_PREFER_APPLETS && NUM_APPLETS > 1 | 298 | #if ENABLE_FEATURE_PREFER_APPLETS && NUM_APPLETS > 1 |
| 289 | if (unix_path(interp.path) && find_applet_by_name(interp.name) >= 0) { | 299 | if (unix_path(interp.path) && find_applet_by_name(interp.name) >= 0) { |
