extern int rm_main(int argc, char **argv) { int status = 0; int flags = 0; unsigned long opt; bb_opt_complementaly = "f-i:i-f"; opt = bb_getopt_ulflags(argc, argv, "fiRr"); if(opt & 1) flags |= FILEUTILS_FORCE; if(opt & 2) flags |= FILEUTILS_INTERACTIVE; if(opt & 12) flags |= FILEUTILS_RECUR; if (*(argv += optind) != NULL) { do { const char *base = bb_get_last_path_component(*argv); if ((base[0] == '.') && (!base[1] || ((base[1] == '.') && !base[2]))) { bb_error_msg("cannot remove `.' or `..'"); } else if (remove_file(*argv, flags) >= 0) { continue; } status = 1; } while (*++argv); } else if (!(flags & FILEUTILS_FORCE)) { bb_show_usage(); } return status; }
int basename_main(int argc, char **argv) { size_t m, n; char *s; if (((unsigned int)(argc-2)) >= 2) { bb_show_usage(); } s = bb_get_last_path_component(*++argv); if (*++argv) { n = strlen(*argv); m = strlen(s); if ((m > n) && ((strcmp)(s+m-n, *argv) == 0)) { s[m-n] = '\0'; } } puts(s); fflush_stdout_and_exit(EXIT_SUCCESS); }
int cp_main(int argc, char **argv) { struct stat source_stat; struct stat dest_stat; const char *last; const char *dest; int s_flags; int d_flags; int flags; int status = 0; enum { OPT_a = 1 << (sizeof(FILEUTILS_CP_OPTSTR)-1), OPT_r = 1 << (sizeof(FILEUTILS_CP_OPTSTR)), OPT_P = 1 << (sizeof(FILEUTILS_CP_OPTSTR)+1), OPT_H = 1 << (sizeof(FILEUTILS_CP_OPTSTR)+2), OPT_L = 1 << (sizeof(FILEUTILS_CP_OPTSTR)+3), }; // Soft- and hardlinking don't mix // -P and -d are the same (-P is POSIX, -d is GNU) // -r and -R are the same // -a = -pdR opt_complementary = "?:l--s:s--l:Pd:rR:apdR"; flags = getopt32(argc, argv, FILEUTILS_CP_OPTSTR "arPHL"); /* Default behavior of cp is to dereference, so we don't have to do * anything special when we are given -L. * The behavior of -H is *almost* like -L, but not quite, so let's * just ignore it too for fun. if (flags & OPT_L) ... if (flags & OPT_H) ... // deref command-line params only */ #if ENABLE_SELINUX if (flags & FILEUTILS_PRESERVE_SECURITY_CONTEXT) { selinux_or_die(); } #endif flags ^= FILEUTILS_DEREFERENCE; /* The sense of this flag was reversed. */ if (optind + 2 > argc) { bb_show_usage(); } last = argv[argc - 1]; argv += optind; /* If there are only two arguments and... */ if (optind + 2 == argc) { s_flags = cp_mv_stat2(*argv, &source_stat, (flags & FILEUTILS_DEREFERENCE) ? stat : lstat); if (s_flags < 0) return EXIT_FAILURE; d_flags = cp_mv_stat(last, &dest_stat); if (d_flags < 0) return EXIT_FAILURE; /* ...if neither is a directory or... */ if ( !((s_flags | d_flags) & 2) || /* ...recursing, the 1st is a directory, and the 2nd doesn't exist... */ ((flags & FILEUTILS_RECUR) && (s_flags & 2) && !d_flags) ) { /* ...do a simple copy. */ dest = xstrdup(last); goto DO_COPY; /* Note: optind+2==argc implies argv[1]==last below. */ } } do { dest = concat_path_file(last, bb_get_last_path_component(*argv)); DO_COPY: if (copy_file(*argv, dest, flags) < 0) { status = 1; } free((void*)dest); } while (*++argv != last); return status; }
int ln_main(int argc, char **argv) { int status = EXIT_SUCCESS; int flag; char *last; char *src_name; char *src; char *suffix = (char*)"~"; struct stat statbuf; int (*link_func)(const char *, const char *); flag = getopt32(argc, argv, "sfnbS:", &suffix); if (argc == optind) { bb_show_usage(); } last = argv[argc - 1]; argv += optind; if (argc == optind + 1) { *--argv = last; last = bb_get_last_path_component(xstrdup(last)); } do { src_name = NULL; src = last; if (is_directory(src, (flag & LN_NODEREFERENCE) ^ LN_NODEREFERENCE, NULL)) { src_name = xstrdup(*argv); src = concat_path_file(src, bb_get_last_path_component(src_name)); free(src_name); src_name = src; } if (!(flag & LN_SYMLINK) && stat(*argv, &statbuf)) { // coreutils: "ln dangling_symlink new_hardlink" works if (lstat(*argv, &statbuf) || !S_ISLNK(statbuf.st_mode)) { bb_perror_msg("%s", *argv); status = EXIT_FAILURE; free(src_name); continue; } } if (flag & LN_BACKUP) { char *backup; backup = xasprintf("%s%s", src, suffix); if (rename(src, backup) < 0 && errno != ENOENT) { bb_perror_msg("%s", src); status = EXIT_FAILURE; free(backup); continue; } free(backup); /* * When the source and dest are both hard links to the same * inode, a rename may succeed even though nothing happened. * Therefore, always unlink(). */ unlink(src); } else if (flag & LN_FORCE) { unlink(src); } link_func = link; if (flag & LN_SYMLINK) { link_func = symlink; } if (link_func(*argv, src) != 0) { bb_perror_msg("%s", src); status = EXIT_FAILURE; } free(src_name); } while ((++argv)[1]); return status; }
extern int mv_main(int argc, char **argv) { struct stat source_stat; struct stat dest_stat; const char *last; const char *dest; int dest_exists; int source_exists; unsigned long flags; int status = 0; bb_applet_long_options = mv_long_options; bb_opt_complementaly = "f-i:i-f"; flags = bb_getopt_ulflags(argc, argv, mv_getopt_short_option); if (optind + 2 > argc) bb_show_usage(); last = argv[argc - 1]; argv += optind; if (optind + 2 == argc) { if ((dest_exists = cp_mv_stat(last, &dest_stat)) < 0) { return 1; } if (!(dest_exists & 2)) { dest = last; goto DO_MOVE; } } do { dest = concat_path_file(last, bb_get_last_path_component(*argv)); if ((dest_exists = cp_mv_stat(dest, &dest_stat)) < 0) { goto RET_1; } DO_MOVE: if (dest_exists && !(flags & OPT_FILEUTILS_FORCE) && ((access(dest, W_OK) < 0 && isatty(0)) || (flags & OPT_FILEUTILS_INTERACTIVE))) { if (fprintf(stderr, "mv: overwrite `%s'? ", dest) < 0) { goto RET_1; /* Ouch! fprintf failed! */ } if (!bb_ask_confirmation()) goto RET_0; } if (rename(*argv, dest) < 0) { if (errno != EXDEV) { bb_perror_msg("unable to rename `%s'", *argv); } else if ((source_exists = cp_mv_stat(*argv, &source_stat)) >= 0) { if (dest_exists) { if (dest_exists & 2) { if (!(source_exists & 2)) { bb_error_msg(fmt, "", "non-"); goto RET_1; } } else { if (source_exists & 2) { bb_error_msg(fmt, "non-", ""); goto RET_1; } } if (unlink(dest) < 0) { bb_perror_msg("cannot remove `%s'", dest); goto RET_1; } } if ((copy_file(*argv, dest, FILEUTILS_RECUR | FILEUTILS_PRESERVE_STATUS) >= 0) && (remove_file(*argv, FILEUTILS_RECUR | FILEUTILS_FORCE) >= 0) ) { goto RET_0; } } RET_1: status = 1; } RET_0: if (dest != last) { free((void *) dest); } } while (*++argv != last); exit(status); }
static int ftp_recieve(FILE *control_stream, const char *host, const char *local_path, char *server_path) { char *filename; char *local_file; char buf[512]; off_t filesize = 0; int fd_data; int fd_local; off_t beg_range = 0; filename = bb_get_last_path_component(server_path); local_file = concat_path_file(local_path, filename); /* Connect to the data socket */ if (ftpcmd("PASV", NULL, control_stream, buf) != 227) { bb_error_msg_and_die("PASV error: %s", buf + 4); } fd_data = xconnect_ftpdata(host, buf); if (ftpcmd("SIZE ", server_path, control_stream, buf) == 213) { filesize = atol(buf + 4); } if (do_continue) { struct stat sbuf; if (lstat(local_file, &sbuf) < 0) { bb_perror_msg_and_die("fstat()"); } if (sbuf.st_size > 0) { beg_range = sbuf.st_size; } else { do_continue = 0; } } if (do_continue) { sprintf(buf, "REST %ld", (long)beg_range); if (ftpcmd(buf, NULL, control_stream, buf) != 350) { do_continue = 0; } else { filesize -= beg_range; } } if (ftpcmd("RETR ", server_path, control_stream, buf) > 150) { bb_error_msg_and_die("RETR error: %s", buf + 4); } /* only make a local file if we know that one exists on the remote server */ if (do_continue) { fd_local = bb_xopen(local_file, O_APPEND | O_WRONLY); } else { fd_local = bb_xopen(local_file, O_CREAT | O_TRUNC | O_WRONLY); } /* Copy the file */ if (bb_copyfd(fd_data, fd_local, filesize) == -1) { exit(EXIT_FAILURE); } /* close it all down */ close(fd_data); if (ftpcmd(NULL, NULL, control_stream, buf) != 226) { bb_error_msg_and_die("ftp error: %s", buf + 4); } ftpcmd("QUIT", NULL, control_stream, buf); return(EXIT_SUCCESS); }
int mv_main(int argc, char **argv) { struct stat dest_stat; const char *last; const char *dest; unsigned long flags; int dest_exists; int status = 0; int copy_flag = 0; #if ENABLE_FEATURE_MV_LONG_OPTIONS applet_long_options = mv_longopts; #endif opt_complementary = "f-i:i-f"; flags = getopt32(argv, "fi"); if (optind + 2 > argc) { bb_show_usage(); } last = argv[argc - 1]; argv += optind; if (optind + 2 == argc) { dest_exists = cp_mv_stat(last, &dest_stat); if (dest_exists < 0) { return 1; } if (!(dest_exists & 2)) { dest = last; goto DO_MOVE; } } do { dest = concat_path_file(last, bb_get_last_path_component(*argv)); dest_exists = cp_mv_stat(dest, &dest_stat); if (dest_exists < 0) { goto RET_1; } DO_MOVE: if (dest_exists && !(flags & OPT_FILEUTILS_FORCE) && ((access(dest, W_OK) < 0 && isatty(0)) || (flags & OPT_FILEUTILS_INTERACTIVE))) { if (fprintf(stderr, "mv: overwrite '%s'? ", dest) < 0) { goto RET_1; /* Ouch! fprintf failed! */ } if (!bb_ask_confirmation()) { goto RET_0; } } if (rename(*argv, dest) < 0) { struct stat source_stat; int source_exists; if (errno != EXDEV || (source_exists = cp_mv_stat(*argv, &source_stat)) < 1) { bb_perror_msg("cannot rename '%s'", *argv); } else { if (dest_exists) { if (dest_exists == 3) { if (source_exists != 3) { bb_error_msg(fmt, "", "non-"); goto RET_1; } } else { if (source_exists == 3) { bb_error_msg(fmt, "non-", ""); goto RET_1; } } if (unlink(dest) < 0) { bb_perror_msg("cannot remove '%s'", dest); goto RET_1; } } copy_flag = FILEUTILS_RECUR | FILEUTILS_PRESERVE_STATUS; #if ENABLE_SELINUX copy_flag |= FILEUTILS_PRESERVE_SECURITY_CONTEXT; #endif if ((copy_file(*argv, dest, copy_flag) >= 0) && (remove_file(*argv, FILEUTILS_RECUR | FILEUTILS_FORCE) >= 0)) { goto RET_0; } } RET_1: status = 1; } RET_0: if (dest != last) { free((void *) dest); } } while (*++argv != last); return status; }