From e0bf91d7c612619526772605890538f0c3e44c05 Mon Sep 17 00:00:00 2001 From: Mark Whitley Date: Tue, 13 Mar 2001 00:40:19 +0000 Subject: Applied patch from Christophe Boyanique to add -i support to rm. --- Config.h | 3 +++ Config.h.Hurd | 3 +++ applets/usage.h | 6 ++++++ busybox.h | 4 ++++ coreutils/rm.c | 25 +++++++++++++++++++++++++ docs/busybox.sgml | 1 + include/busybox.h | 4 ++++ include/usage.h | 6 ++++++ rm.c | 25 +++++++++++++++++++++++++ usage.h | 6 ++++++ utility.c | 18 ++++++++++++++++++ 11 files changed, 101 insertions(+) diff --git a/Config.h b/Config.h index 6492b89..779064d 100644 --- a/Config.h +++ b/Config.h @@ -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" diff --git a/busybox.h b/busybox.h index abf6241..7ae6485 100644 --- a/busybox.h +++ b/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/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 @@ + -i Always prompt before removing each destinations -f Remove existing destinations, never prompt -r or -R Remove the contents of directories recursively 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" diff --git a/rm.c b/rm.c index a841632..6d92b5d 100644 --- a/rm.c +++ b/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/usage.h b/usage.h index f241d3a..f316018 100644 --- a/usage.h +++ b/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" diff --git a/utility.c b/utility.c index c557130..8e85894 100644 --- a/utility.c +++ b/utility.c @@ -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: -- cgit v1.1