summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Config.h3
-rw-r--r--Config.h.Hurd3
-rw-r--r--applets/usage.h6
-rw-r--r--busybox.h4
-rw-r--r--coreutils/rm.c25
-rw-r--r--docs/busybox.sgml1
-rw-r--r--include/busybox.h4
-rw-r--r--include/usage.h6
-rw-r--r--rm.c25
-rw-r--r--usage.h6
-rw-r--r--utility.c18
11 files changed, 101 insertions, 0 deletions
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 @@
<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"
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: