diff options
-rw-r--r-- | Config.h | 3 | ||||
-rw-r--r-- | Config.h.Hurd | 3 | ||||
-rw-r--r-- | applets/usage.h | 6 | ||||
-rw-r--r-- | busybox.h | 4 | ||||
-rw-r--r-- | coreutils/rm.c | 25 | ||||
-rw-r--r-- | docs/busybox.sgml | 1 | ||||
-rw-r--r-- | include/busybox.h | 4 | ||||
-rw-r--r-- | include/usage.h | 6 | ||||
-rw-r--r-- | rm.c | 25 | ||||
-rw-r--r-- | usage.h | 6 | ||||
-rw-r--r-- | utility.c | 18 |
11 files changed, 101 insertions, 0 deletions
@@ -224,6 +224,9 @@ // (i.e. in case of an unreachable NFS system). #define BB_FEATURE_MOUNT_FORCE // +// use -i (interactive) flag for rm +//#define BB_FEATURE_RM_INTERACTIVE +// // Enable support for creation of tar files. #define BB_FEATURE_TAR_CREATE // diff --git a/Config.h.Hurd b/Config.h.Hurd index 9238761..0320f8a 100644 --- a/Config.h.Hurd +++ b/Config.h.Hurd @@ -212,6 +212,9 @@ // (i.e. in case of an unreachable NFS system). #define BB_FEATURE_MOUNT_FORCE // +// use -i (interactive) flag for rm +//#define BB_FEATURE_RM_INTERACTIVE +// // Enable support for creation of tar files. #define BB_FEATURE_TAR_CREATE // diff --git a/applets/usage.h b/applets/usage.h index f241d3a..f316018 100644 --- a/applets/usage.h +++ b/applets/usage.h @@ -821,12 +821,18 @@ #define reset_full_usage \ "Resets the screen." +#ifdef BB_FEATURE_RM_INTERACTIVE + #define USAGE_RM_INTERACTIVE(a) a +#else + #define USAGE_RM_INTERACTIVE(a) +#endif #define rm_trivial_usage \ "[OPTION]... FILE..." #define rm_full_usage \ "Remove (unlink) the FILE(s). You may use '--' to\n" \ "indicate that all following arguments are non-options.\n\n" \ "Options:\n" \ + USAGE_RM_INTERACTIVE("\t-i\t\talways prompt before removing each destinations\n") \ "\t-f\t\tremove existing destinations, never prompt\n" \ "\t-r or -R\tremove the contents of directories recursively" @@ -255,4 +255,8 @@ enum { #define RESERVE_BB_UBUFFER(buffer,len) unsigned char *buffer=xmalloc(len) #endif +#if defined(BB_FEATURE_RM_INTERACTIVE) && defined(BB_RM) +int ask_confirmation(void); +#endif + #endif /* _BB_INTERNAL_H_ */ diff --git a/coreutils/rm.c b/coreutils/rm.c index a841632..6d92b5d 100644 --- a/coreutils/rm.c +++ b/coreutils/rm.c @@ -33,11 +33,21 @@ static int recursiveFlag = FALSE; static int forceFlag = FALSE; +#ifdef BB_FEATURE_RM_INTERACTIVE + static int interactiveFlag = FALSE; +#endif static const char *srcName; static int fileAction(const char *fileName, struct stat *statbuf, void* junk) { +#ifdef BB_FEATURE_RM_INTERACTIVE + if (interactiveFlag == TRUE) { + printf("rm: remove `%s'? ", fileName); + if (ask_confirmation() == 0) + return (TRUE); + } +#endif if (unlink(fileName) < 0) { perror_msg("%s", fileName); return (FALSE); @@ -52,6 +62,13 @@ static int dirAction(const char *fileName, struct stat *statbuf, void* junk) perror_msg("%s", fileName); return (FALSE); } +#ifdef BB_FEATURE_RM_INTERACTIVE + if (interactiveFlag == TRUE) { + printf("rm: remove directory `%s'? ", fileName); + if (ask_confirmation() == 0) + return (TRUE); + } +#endif if (rmdir(fileName) < 0) { perror_msg("%s", fileName); return (FALSE); @@ -79,6 +96,14 @@ extern int rm_main(int argc, char **argv) break; case 'f': forceFlag = TRUE; +#ifdef BB_FEATURE_RM_INTERACTIVE + interactiveFlag = FALSE; +#endif + break; + case 'i': +#ifdef BB_FEATURE_RM_INTERACTIVE + interactiveFlag = TRUE; +#endif break; case '-': stopIt = TRUE; diff --git a/docs/busybox.sgml b/docs/busybox.sgml index 02d85e4..f794f89 100644 --- a/docs/busybox.sgml +++ b/docs/busybox.sgml @@ -2728,6 +2728,7 @@ <para> <screen> + -i Always prompt before removing each destinations -f Remove existing destinations, never prompt -r or -R Remove the contents of directories recursively </screen> diff --git a/include/busybox.h b/include/busybox.h index abf6241..7ae6485 100644 --- a/include/busybox.h +++ b/include/busybox.h @@ -255,4 +255,8 @@ enum { #define RESERVE_BB_UBUFFER(buffer,len) unsigned char *buffer=xmalloc(len) #endif +#if defined(BB_FEATURE_RM_INTERACTIVE) && defined(BB_RM) +int ask_confirmation(void); +#endif + #endif /* _BB_INTERNAL_H_ */ diff --git a/include/usage.h b/include/usage.h index f241d3a..f316018 100644 --- a/include/usage.h +++ b/include/usage.h @@ -821,12 +821,18 @@ #define reset_full_usage \ "Resets the screen." +#ifdef BB_FEATURE_RM_INTERACTIVE + #define USAGE_RM_INTERACTIVE(a) a +#else + #define USAGE_RM_INTERACTIVE(a) +#endif #define rm_trivial_usage \ "[OPTION]... FILE..." #define rm_full_usage \ "Remove (unlink) the FILE(s). You may use '--' to\n" \ "indicate that all following arguments are non-options.\n\n" \ "Options:\n" \ + USAGE_RM_INTERACTIVE("\t-i\t\talways prompt before removing each destinations\n") \ "\t-f\t\tremove existing destinations, never prompt\n" \ "\t-r or -R\tremove the contents of directories recursively" @@ -33,11 +33,21 @@ static int recursiveFlag = FALSE; static int forceFlag = FALSE; +#ifdef BB_FEATURE_RM_INTERACTIVE + static int interactiveFlag = FALSE; +#endif static const char *srcName; static int fileAction(const char *fileName, struct stat *statbuf, void* junk) { +#ifdef BB_FEATURE_RM_INTERACTIVE + if (interactiveFlag == TRUE) { + printf("rm: remove `%s'? ", fileName); + if (ask_confirmation() == 0) + return (TRUE); + } +#endif if (unlink(fileName) < 0) { perror_msg("%s", fileName); return (FALSE); @@ -52,6 +62,13 @@ static int dirAction(const char *fileName, struct stat *statbuf, void* junk) perror_msg("%s", fileName); return (FALSE); } +#ifdef BB_FEATURE_RM_INTERACTIVE + if (interactiveFlag == TRUE) { + printf("rm: remove directory `%s'? ", fileName); + if (ask_confirmation() == 0) + return (TRUE); + } +#endif if (rmdir(fileName) < 0) { perror_msg("%s", fileName); return (FALSE); @@ -79,6 +96,14 @@ extern int rm_main(int argc, char **argv) break; case 'f': forceFlag = TRUE; +#ifdef BB_FEATURE_RM_INTERACTIVE + interactiveFlag = FALSE; +#endif + break; + case 'i': +#ifdef BB_FEATURE_RM_INTERACTIVE + interactiveFlag = TRUE; +#endif break; case '-': stopIt = TRUE; @@ -821,12 +821,18 @@ #define reset_full_usage \ "Resets the screen." +#ifdef BB_FEATURE_RM_INTERACTIVE + #define USAGE_RM_INTERACTIVE(a) a +#else + #define USAGE_RM_INTERACTIVE(a) +#endif #define rm_trivial_usage \ "[OPTION]... FILE..." #define rm_full_usage \ "Remove (unlink) the FILE(s). You may use '--' to\n" \ "indicate that all following arguments are non-options.\n\n" \ "Options:\n" \ + USAGE_RM_INTERACTIVE("\t-i\t\talways prompt before removing each destinations\n") \ "\t-f\t\tremove existing destinations, never prompt\n" \ "\t-r or -R\tremove the contents of directories recursively" @@ -1859,6 +1859,24 @@ void trim(char *s) } #endif +#ifdef BB_FEATURE_RM_INTERACTIVE + #if defined (BB_CP_MV) || defined (BB_RM) +int ask_confirmation() +{ + int c = '\0'; + int ret = 0; + + while (c != '\n') { + c = getchar(); + if ( c != '\n' ) { + ret = ((c=='y')||(c=='Y')) ? 1 : 0; + } + } + return ret; +} + #endif +#endif + /* END CODE */ /* Local Variables: |