static int fileAction(const char *fileName, struct stat *statbuf, void* param, int depth) { mode_t newmode; /* match coreutils behavior */ if (depth == 0) { /* statbuf holds lstat result, but we need stat (follow link) */ if (stat(fileName, statbuf)) goto err; } else { /* depth > 0: skip links */ if (S_ISLNK(statbuf->st_mode)) return TRUE; } newmode = statbuf->st_mode; if (!bb_parse_mode((char *)param, &newmode)) bb_error_msg_and_die("invalid mode: %s", (char *)param); if (chmod(fileName, newmode) == 0) { if (OPT_VERBOSE || (OPT_CHANGED && statbuf->st_mode != newmode) ) { printf("mode of '%s' changed to %04o (%s)\n", fileName, newmode & 07777, bb_mode_string(newmode)+1); } return TRUE; } err: if (!OPT_QUIET) bb_simple_perror_msg(fileName); return FALSE; }
static int fileAction(const char *fileName, struct stat *statbuf, void* junk) { if (!bb_parse_mode((char *)junk, &(statbuf->st_mode))) bb_error_msg_and_die( "invalid mode: %s", (char *)junk); if (chmod(fileName, statbuf->st_mode) == 0) return (TRUE); bb_perror_msg("%s", fileName); /* Avoid multibyte problems. */ return (FALSE); }
int mkdir_main (int argc, char **argv) { mode_t mode = (mode_t)(-1); int status = EXIT_SUCCESS; int flags = 0; unsigned long opt; char *smode; #ifdef CONFIG_SELINUX security_context_t scontext = NULL; #endif #if ENABLE_FEATURE_MKDIR_LONG_OPTIONS bb_applet_long_options = mkdir_long_options; #endif #ifdef CONFIG_SELINUX opt = bb_getopt_ulflags(argc, argv, "m:pZ:", &smode, &scontext); #else opt = bb_getopt_ulflags(argc, argv, "m:p", &smode); #endif if(opt & 1) { mode = 0777; if (!bb_parse_mode (smode, &mode)) { bb_error_msg_and_die ("invalid mode `%s'", smode); } } if(opt & 2) flags |= FILEUTILS_RECUR; #ifdef CONFIG_SELINUX if(opt & 4) { if(!is_selinux_enabled()) { bb_error_msg_and_die ("Sorry, --context (-Z) can be used only on " "a selinux-enabled kernel.\n" ); } if (setfscreatecon(scontext)) { bb_error_msg_and_die ("Sorry, cannot set default context " "to %s.\n", scontext); } } #endif if (optind == argc) { bb_show_usage(); } argv += optind; do { if (bb_make_directory(*argv, mode, flags)) { status = EXIT_FAILURE; } } while (*++argv); return status; }
mode_t getopt_mk_fifo_nod(int argc, char **argv) { mode_t mode = 0666; char *smode = NULL; bb_getopt_ulflags(argc, argv, "m:", &smode); if(smode) { if (bb_parse_mode(smode, &mode)) umask(0); } return mode; }
int mkdir_main(int argc UNUSED_PARAM, char **argv) { long mode = -1; int status = EXIT_SUCCESS; int flags = 0; unsigned opt; char *smode; #if ENABLE_SELINUX security_context_t scontext; #endif #if ENABLE_FEATURE_MKDIR_LONG_OPTIONS applet_long_options = mkdir_longopts; #endif opt = getopt32(argv, "m:pv" IF_SELINUX("Z:"), &smode IF_SELINUX(,&scontext)); if (opt & 1) { mode_t mmode = bb_parse_mode(smode, 0777); if (mmode == (mode_t)-1) { bb_error_msg_and_die("invalid mode '%s'", smode); } mode = mmode; } if (opt & 2) flags |= FILEUTILS_RECUR; if ((opt & 4) && FILEUTILS_VERBOSE) flags |= FILEUTILS_VERBOSE; #if ENABLE_SELINUX if (opt & 8) { selinux_or_die(); setfscreatecon_or_die(scontext); } #endif argv += optind; if (!argv[0]) bb_show_usage(); do { if (bb_make_directory(*argv, mode, flags)) { status = EXIT_FAILURE; } } while (*++argv); return status; }
int mkdir_main(int argc, char **argv) { mode_t mode = (mode_t)(-1); int status = EXIT_SUCCESS; int flags = 0; unsigned opt; char *smode; #if ENABLE_SELINUX security_context_t scontext; #endif #if ENABLE_FEATURE_MKDIR_LONG_OPTIONS applet_long_options = mkdir_longopts; #endif opt = getopt32(argv, "m:p" USE_SELINUX("Z:"), &smode USE_SELINUX(,&scontext)); if (opt & 1) { mode = 0777; if (!bb_parse_mode(smode, &mode)) { bb_error_msg_and_die("invalid mode '%s'", smode); } } if (opt & 2) flags |= FILEUTILS_RECUR; #if ENABLE_SELINUX if (opt & 4) { selinux_or_die(); setfscreatecon_or_die(scontext); } #endif if (optind == argc) { bb_show_usage(); } argv += optind; do { if (bb_make_directory(*argv, mode, flags)) { status = EXIT_FAILURE; } } while (*++argv); return status; }
mode_t getopt_mk_fifo_nod(int argc, char **argv) { mode_t mode = 0666; char *smode = NULL; #if ENABLE_SELINUX security_context_t scontext; #endif int opt; opt = getopt32(argc, argv, "m:" USE_SELINUX("Z:"), &smode USE_SELINUX(,&scontext)); if (opt & 1) { if (bb_parse_mode(smode, &mode)) umask(0); } #if ENABLE_SELINUX if (opt & 2) { selinux_or_die(); setfscreatecon_or_die(scontext); } #endif return mode; }
int install_main(int argc, char **argv) { struct stat statbuf; mode_t mode; uid_t uid; gid_t gid; char *arg, *last; const char *gid_str; const char *uid_str; const char *mode_str; int copy_flags = FILEUTILS_DEREFERENCE | FILEUTILS_FORCE; int opts; int min_args = 1; int ret = EXIT_SUCCESS; int isdir = 0; #if ENABLE_SELINUX security_context_t scontext; bool use_default_selinux_context = 1; #endif enum { OPT_c = 1 << 0, OPT_v = 1 << 1, OPT_b = 1 << 2, OPT_MKDIR_LEADING = 1 << 3, OPT_DIRECTORY = 1 << 4, OPT_PRESERVE_TIME = 1 << 5, OPT_STRIP = 1 << 6, OPT_GROUP = 1 << 7, OPT_MODE = 1 << 8, OPT_OWNER = 1 << 9, #if ENABLE_SELINUX OPT_SET_SECURITY_CONTEXT = 1 << 10, OPT_PRESERVE_SECURITY_CONTEXT = 1 << 11, #endif }; #if ENABLE_FEATURE_INSTALL_LONG_OPTIONS applet_long_options = install_longopts; #endif opt_complementary = "s--d:d--s" IF_FEATURE_INSTALL_LONG_OPTIONS(IF_SELINUX(":Z--\xff:\xff--Z")); /* -c exists for backwards compatibility, it's needed */ /* -v is ignored ("print name of each created directory") */ /* -b is ignored ("make a backup of each existing destination file") */ opts = getopt32(argv, "cvb" "Ddpsg:m:o:" IF_SELINUX("Z:"), &gid_str, &mode_str, &uid_str IF_SELINUX(, &scontext)); argc -= optind; argv += optind; #if ENABLE_SELINUX if (opts & (OPT_PRESERVE_SECURITY_CONTEXT|OPT_SET_SECURITY_CONTEXT)) { selinux_or_die(); use_default_selinux_context = 0; if (opts & OPT_PRESERVE_SECURITY_CONTEXT) { copy_flags |= FILEUTILS_PRESERVE_SECURITY_CONTEXT; } if (opts & OPT_SET_SECURITY_CONTEXT) { setfscreatecon_or_die(scontext); copy_flags |= FILEUTILS_SET_SECURITY_CONTEXT; } } #endif /* preserve access and modification time, this is GNU behaviour, * BSD only preserves modification time */ if (opts & OPT_PRESERVE_TIME) { copy_flags |= FILEUTILS_PRESERVE_STATUS; } mode = 0755; /* GNU coreutils 6.10 compat */ if (opts & OPT_MODE) bb_parse_mode(mode_str, &mode); uid = (opts & OPT_OWNER) ? get_ug_id(uid_str, xuname2uid) : getuid(); gid = (opts & OPT_GROUP) ? get_ug_id(gid_str, xgroup2gid) : getgid(); last = argv[argc - 1]; if (!(opts & OPT_DIRECTORY)) { argv[argc - 1] = NULL; min_args++; /* coreutils install resolves link in this case, don't use lstat */ isdir = stat(last, &statbuf) < 0 ? 0 : S_ISDIR(statbuf.st_mode); } if (argc < min_args) bb_show_usage(); while ((arg = *argv++) != NULL) { char *dest = last; if (opts & OPT_DIRECTORY) { dest = arg; /* GNU coreutils 6.9 does not set uid:gid * on intermediate created directories * (only on last one) */ if (bb_make_directory(dest, 0755, FILEUTILS_RECUR)) { ret = EXIT_FAILURE; goto next; } } else { if (opts & OPT_MKDIR_LEADING) { char *ddir = xstrdup(dest); bb_make_directory(dirname(ddir), 0755, FILEUTILS_RECUR); /* errors are not checked. copy_file * will fail if dir is not created. */ free(ddir); } if (isdir) dest = concat_path_file(last, bb_basename(arg)); if (copy_file(arg, dest, copy_flags) != 0) { /* copy is not made */ ret = EXIT_FAILURE; goto next; } if (opts & OPT_STRIP) { char *args[4]; args[0] = (char*)"strip"; args[1] = (char*)"-p"; /* -p --preserve-dates */ args[2] = dest; args[3] = NULL; if (spawn_and_wait(args)) { bb_perror_msg("strip"); ret = EXIT_FAILURE; } } } /* Set the file mode (always, not only with -m). * GNU coreutils 6.10 is not affected by umask. */ if (chmod(dest, mode) == -1) { bb_perror_msg("can't change %s of %s", "permissions", dest); ret = EXIT_FAILURE; } #if ENABLE_SELINUX if (use_default_selinux_context) setdefaultfilecon(dest); #endif /* Set the user and group id */ if ((opts & (OPT_OWNER|OPT_GROUP)) && lchown(dest, uid, gid) == -1 ) { bb_perror_msg("can't change %s of %s", "ownership", dest); ret = EXIT_FAILURE; } next: if (ENABLE_FEATURE_CLEAN_UP && isdir) free(dest); } return ret; }
extern int install_main(int argc, char **argv) { struct stat statbuf; mode_t mode; uid_t uid; gid_t gid; char *gid_str = "-1"; char *uid_str = "-1"; char *mode_str = "0755"; int copy_flags = FILEUTILS_DEREFERENCE | FILEUTILS_FORCE; int ret = EXIT_SUCCESS; int flags; int i; bb_applet_long_options = install_long_options; bb_opt_complementaly = "s~d:d~s"; /* -c exists for backwards compatability, its needed */ flags = bb_getopt_ulflags(argc, argv, "cdpsg:m:o:", &gid_str, &mode_str, &uid_str); /* 'a' must be 2nd */ /* Check valid options were given */ if(flags & 0x80000000UL) { bb_show_usage(); } /* preserve access and modification time, this is GNU behaviour, BSD only preserves modification time */ if (flags & INSTALL_OPT_PRESERVE_TIME) { 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); umask(0); /* Create directories * dont use bb_make_directory() as it cant change uid or gid * perhaps bb_make_directory() should be improved. */ if (flags & INSTALL_OPT_DIRECTORY) { for (argv += optind; *argv; argv++) { char *old_argv_ptr = *argv + 1; char *argv_ptr; do { argv_ptr = strchr(old_argv_ptr, '/'); old_argv_ptr = argv_ptr; if (argv_ptr) { *argv_ptr = '\0'; old_argv_ptr++; } if (mkdir(*argv, mode) == -1) { if (errno != EEXIST) { bb_perror_msg("coulnt create %s", *argv); ret = EXIT_FAILURE; break; } } else if (lchown(*argv, uid, gid) == -1) { bb_perror_msg("cannot change ownership of %s", *argv); ret = EXIT_FAILURE; break; } if (argv_ptr) { *argv_ptr = '/'; } } while (old_argv_ptr); } return(ret); } cp_mv_stat2(argv[argc - 1], &statbuf, lstat); for (i = optind; i < argc - 1; i++) { unsigned char *dest; if (S_ISDIR(statbuf.st_mode)) { dest = concat_path_file(argv[argc - 1], basename(argv[i])); } else { dest = argv[argc - 1]; } ret |= copy_file(argv[i], dest, copy_flags); /* Set the file mode */ if (chmod(dest, mode) == -1) { bb_perror_msg("cannot change permissions of %s", dest); ret = EXIT_FAILURE; } /* Set the user and group id */ if (lchown(dest, uid, gid) == -1) { bb_perror_msg("cannot change ownership of %s", dest); ret = EXIT_FAILURE; } if (flags & INSTALL_OPT_STRIP) { if (execlp("strip", "strip", dest, NULL) == -1) { bb_error_msg("strip failed"); ret = EXIT_FAILURE; } } } return(ret); }
int install_main(int argc, char **argv) { struct stat statbuf; mode_t mode; uid_t uid; gid_t gid; const char *gid_str; const char *uid_str; const char *mode_str; int copy_flags = FILEUTILS_DEREFERENCE | FILEUTILS_FORCE; int ret = EXIT_SUCCESS, flags, i, isdir; enum { OPT_CMD = 0x1, OPT_DIRECTORY = 0x2, OPT_PRESERVE_TIME = 0x4, OPT_STRIP = 0x8, OPT_GROUP = 0x10, OPT_MODE = 0x20, OPT_OWNER = 0x40, }; #if ENABLE_FEATURE_INSTALL_LONG_OPTIONS applet_long_options = install_long_options; #endif opt_complementary = "?:s--d:d--s"; /* -c exists for backwards compatibility, its needed */ flags = getopt32(argc, argv, "cdpsg:m:o:", &gid_str, &mode_str, &uid_str); /* preserve access and modification time, this is GNU behaviour, BSD only preserves modification time */ if (flags & OPT_PRESERVE_TIME) { copy_flags |= FILEUTILS_PRESERVE_STATUS; } mode = 0666; if (flags & OPT_MODE) bb_parse_mode(mode_str, &mode); uid = (flags & OPT_OWNER) ? get_ug_id(uid_str, xuname2uid) : getuid(); gid = (flags & OPT_GROUP) ? get_ug_id(gid_str, xgroup2gid) : getgid(); if (flags & (OPT_OWNER|OPT_GROUP)) umask(0); /* Create directories * don't use bb_make_directory() as it can't change uid or gid * perhaps bb_make_directory() should be improved. */ if (flags & OPT_DIRECTORY) { for (argv += optind; *argv; argv++) { char *old_argv_ptr = *argv + 1; char *argv_ptr; do { argv_ptr = strchr(old_argv_ptr, '/'); old_argv_ptr = argv_ptr; if (argv_ptr) { *argv_ptr = '\0'; old_argv_ptr++; } if (mkdir(*argv, mode | 0111) == -1) { if (errno != EEXIST) { bb_perror_msg("cannot create %s", *argv); ret = EXIT_FAILURE; break; } } if ((flags & (OPT_OWNER|OPT_GROUP)) && lchown(*argv, uid, gid) == -1 ) { bb_perror_msg("cannot change ownership of %s", *argv); ret = EXIT_FAILURE; break; } if (argv_ptr) { *argv_ptr = '/'; } } while (old_argv_ptr); } return ret; } isdir = lstat(argv[argc - 1], &statbuf) < 0 ? 0 : S_ISDIR(statbuf.st_mode); for (i = optind; i < argc - 1; i++) { char *dest; 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 */ if ((flags & OPT_MODE) && chmod(dest, mode) == -1) { bb_perror_msg("cannot change permissions of %s", dest); ret = EXIT_FAILURE; } /* Set the user and group id */ if ((flags & (OPT_OWNER|OPT_GROUP)) && lchown(dest, uid, gid) == -1 ) { bb_perror_msg("cannot change ownership of %s", dest); ret = EXIT_FAILURE; } if (flags & OPT_STRIP) { if (execlp("strip", "strip", dest, NULL) == -1) { bb_perror_msg("strip"); ret = EXIT_FAILURE; } } if (ENABLE_FEATURE_CLEAN_UP && isdir) free(dest); } return ret; }