[BusyBox-cvs] busybox/shell ash.c,1.87,1.88 cmdedit.c,1.87,1.88

Glenn McGrath bug1 at busybox.net
Wed Feb 4 08:24:42 UTC 2004


Update of /var/cvs/busybox/shell
In directory nail:/tmp/cvs-serv15012/shell

Modified Files:
	ash.c cmdedit.c 
Log Message:
Vodz last_patch_125_2, this patch have:
- synced with dash 0.4.21
- better handle trap "cmds..." SIGINT (strange, i make bad hack for ash 
  and cmdedit, but this work only with this...)
- may be haven`t problem with Ctrl-D



Index: ash.c
===================================================================
RCS file: /var/cvs/busybox/shell/ash.c,v
retrieving revision 1.87
retrieving revision 1.88
diff -u -d -r1.87 -r1.88
--- ash.c	25 Jan 2004 08:46:10 -0000	1.87
+++ ash.c	4 Feb 2004 08:24:39 -0000	1.88
@@ -3476,10 +3476,17 @@
 }
 
 
+static inline int
+goodname(const char *p)
+{
+	return !*endofname(p);
+}
+
 /*
  * Search for a command.  This is called before we fork so that the
  * location of the command will be available in the parent as well as
- * the child.
+ * the child.  The check for "goodname" is an overly conservative
+ * check that the name will not be subject to expansion.
  */
 
 static void
@@ -3488,7 +3495,9 @@
 	struct cmdentry entry;
 
 	if (n->type == NCMD && n->ncmd.args)
-		find_command(n->ncmd.args->narg.text, &entry, 0, pathval());
+		if (goodname(n->ncmd.args->narg.text))
+			find_command(n->ncmd.args->narg.text, &entry, 0,
+				     pathval());
 }
 
 
@@ -6020,7 +6029,12 @@
 		nr = cmdedit_read_input((char *) cmdedit_prompt, buf);
 		if(nr == 0) {
 			/* Ctrl+C presend */
-			raise(SIGINT);
+			if(trap[SIGINT]) {
+				buf[0] = '\n';
+				buf[1] = 0;
+				raise(SIGINT);
+				return 1;
+			}
 			goto retry;
 		}
 		if(nr < 0) {
@@ -7425,6 +7439,8 @@
 	const char *p;
 	char s[2];
 
+	if (!n)
+		return;
 	switch (n->type) {
 	default:
 #if DEBUG
@@ -9295,11 +9311,6 @@
 static void setprompt(int);
 
 
-static inline int
-goodname(const char *p)
-{
-	return !*endofname(p);
-}
 
 static inline int
 isassignment(const char *p)
@@ -10755,7 +10766,7 @@
  * more letters, underscores, and digits).
  */
 
-char *
+static char *
 endofname(const char *name)
 {
 	char *p;
@@ -11835,12 +11846,13 @@
 	struct jmploc loc;
 	char *p;
 	int status;
+	int jmp;
 
+	jmp = setjmp(loc.loc);
 	status = exitstatus;
 	TRACE(("pid %d, exitshell(%d)\n", getpid(), status));
-	if (setjmp(loc.loc)) {
+	if (jmp)
 		goto out;
-	}
 	handler = &loc;
 	if ((p = trap[0]) != NULL && *p != '\0') {
 		trap[0] = NULL;
@@ -12713,7 +12725,41 @@
 	struct rlimit   limit;
 
 	what = 'f';
-	while ((optc = nextopt("HSatfdsmcnplvw")) != '\0')
+	while ((optc = nextopt("HSa"
+#ifdef RLIMIT_CPU
+				"t"
+#endif
+#ifdef RLIMIT_FSIZE
+				"f"
+#endif
+#ifdef RLIMIT_DATA
+				"d"
+#endif
+#ifdef RLIMIT_STACK
+				"s"
+#endif
+#ifdef RLIMIT_CORE
+				"c"
+#endif
+#ifdef RLIMIT_RSS
+				"m"
+#endif
+#ifdef RLIMIT_MEMLOCK
+				"l"
+#endif
+#ifdef RLIMIT_NPROC
+				"p"
+#endif
+#ifdef RLIMIT_NOFILE
+				"n"
+#endif
+#ifdef RLIMIT_AS
+				"v"
+#endif
+#ifdef RLIMIT_LOCKS
+				"w"
+#endif
+						)) != '\0')
 		switch (optc) {
 		case 'H':
 			how = HARD;

Index: cmdedit.c
===================================================================
RCS file: /var/cvs/busybox/shell/cmdedit.c,v
retrieving revision 1.87
retrieving revision 1.88
diff -u -d -r1.87 -r1.88
--- cmdedit.c	22 Jan 2004 12:42:23 -0000	1.87
+++ cmdedit.c	4 Feb 2004 08:24:39 -0000	1.88
@@ -1283,10 +1283,15 @@
 		case 3:
 			/* Control-c -- stop gathering input */
 			goto_new_line();
+#ifndef CONFIG_ASH
 			command[0] = 0;
 			len = 0;
 			lastWasTab = FALSE;
 			put_prompt();
+#else
+			len = 0;
+			break_out = -1; /* for control traps */
+#endif
 			break;
 		case 4:
 			/* Control-d -- Delete one character, or exit
@@ -1299,7 +1304,7 @@
 				/* cmdedit_reset_term() called in atexit */
 				exit(EXIT_SUCCESS);
 #else
-				break_out = -1; /* for control stoped jobs */
+				len = break_out = -1; /* for control stoped jobs */
 				break;
 #endif
 			} else {
@@ -1493,7 +1498,7 @@
 	/* cleanup may be saved current command line */
 	free(history[MAX_HISTORY]);
 	history[MAX_HISTORY] = 0;
-	if (len) {                                      /* no put empty line */
+	if (len> 0) {                                      /* no put empty line */
 		int i = n_history;
 			/* After max history, remove the oldest command */
 		if (i >= MAX_HISTORY) {
@@ -1510,7 +1515,7 @@
 	}
 #else  /* MAX_HISTORY < 1 */
 #if defined(CONFIG_FEATURE_SH_FANCY_PROMPT)
-	if (len) {              /* no put empty line */
+	if (len > 0) {              /* no put empty line */
 		num_ok_lines++;
 	}
 #endif




More information about the busybox-cvs mailing list