Header cleanup on two more networking files (move libbb.h to the top and
[oweals/busybox.git] / coreutils / install.c
index e22dda6f9d7f8a14c014779e6853239b19beb109..90b3ef31b688272c13ec0cda3b9a8fece562a6b6 100644 (file)
 #include <sys/stat.h>
 #include <sys/types.h>
 #include <errno.h>
-#include <getopt.h>
 #include <stdlib.h>
 #include <string.h>
 #include <unistd.h>
+#include <getopt.h> /* struct option */
 
 #include "busybox.h"
 #include "libcoreutils/coreutils.h"
 #define INSTALL_OPT_MODE  32
 #define INSTALL_OPT_OWNER  64
 
+#if ENABLE_FEATURE_INSTALL_LONG_OPTIONS
 static const struct option install_long_options[] = {
        { "directory",  0,      NULL,   'd' },
        { "preserve-timestamps",        0,      NULL,   'p' },
        { "strip",      0,      NULL,   's' },
        { "group",      0,      NULL,   'g' },
-       { "mode",       0,      NULL,   'm' },
+       { "mode",       0,      NULL,   'm' },
        { "owner",      0,      NULL,   'o' },
        { 0,    0,      0,      0 }
 };
+#endif
 
-extern int install_main(int argc, char **argv)
+int install_main(int argc, char **argv)
 {
-       struct stat statbuf;
        mode_t mode;
        uid_t uid;
        gid_t gid;
@@ -59,13 +60,13 @@ extern int install_main(int argc, char **argv)
        char *uid_str = "-1";
        char *mode_str = "0755";
        int copy_flags = FILEUTILS_DEREFERENCE | FILEUTILS_FORCE;
-       int ret = EXIT_SUCCESS;
-       int flags;
-       int i;
+       int ret = EXIT_SUCCESS, flags, i, isdir;
 
+#if ENABLE_FEATURE_INSTALL_LONG_OPTIONS
        bb_applet_long_options = install_long_options;
-       bb_opt_complementally = "!s~d:d~s";
-       /* -c exists for backwards compatability, its needed */
+#endif
+       bb_opt_complementally = "?:s--d:d--s";
+       /* -c exists for backwards compatibility, its needed */
        flags = bb_getopt_ulflags(argc, argv, "cdpsg:m:o:", &gid_str, &mode_str, &uid_str);     /* 'a' must be 2nd */
 
        /* preserve access and modification time, this is GNU behaviour, BSD only preserves modification time */
@@ -73,8 +74,8 @@ extern int install_main(int argc, char **argv)
                copy_flags |= FILEUTILS_PRESERVE_STATUS;
        }
        bb_parse_mode(mode_str, &mode);
-       gid = get_ug_id(gid_str, my_getgrnam);
-       uid = get_ug_id(uid_str, my_getpwnam);
+       gid = get_ug_id(gid_str, bb_xgetgrnam);
+       uid = get_ug_id(uid_str, bb_xgetpwnam);
        umask(0);
 
        /* Create directories
@@ -112,15 +113,16 @@ extern int install_main(int argc, char **argv)
                return(ret);
        }
 
-       cp_mv_stat2(argv[argc - 1], &statbuf, lstat);
+       {
+               struct stat statbuf;
+               isdir = lstat(argv[argc - 1], &statbuf)<0
+                                       ? 0 : S_ISDIR(statbuf.st_mode);
+       }
        for (i = optind; i < argc - 1; i++) {
-               unsigned char *dest;
+               char *dest;
 
-               if (S_ISDIR(statbuf.st_mode)) {
-                       dest = concat_path_file(argv[argc - 1], basename(argv[i]));
-               } else {
-                       dest = argv[argc - 1];
-               }
+               dest = argv[argc - 1];
+               if (isdir) dest = concat_path_file(argv[argc - 1], basename(argv[i]));
                ret |= copy_file(argv[i], dest, copy_flags);
 
                /* Set the file mode */
@@ -140,6 +142,7 @@ extern int install_main(int argc, char **argv)
                                ret = EXIT_FAILURE;
                        }
                }
+               if(ENABLE_FEATURE_CLEAN_UP && isdir) free(dest);
        }
 
        return(ret);