summaryrefslogtreecommitdiffstats
path: root/package/busybox/busybox-1.6.0-test.patch
blob: a4503a2ea5908cc1fb37e6abe8d42033ad8a91cc (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
--- busybox-1.6.0/coreutils/test.c	2007-06-01 13:48:34.000000000 +0200
+++ /tmp/busybox_1_6_stable/coreutils/test.c	2007-06-25 12:29:55.000000000 +0200
@@ -182,19 +182,23 @@
 int bb_test(int argc, char **argv)
 {
 	int res;
+	char *arg0;
+	bool _off;
 
-	if (LONE_CHAR(argv[0], '[')) {
+	arg0 = strrchr(argv[0], '/');
+	if (!arg0++) arg0 = argv[0];
+	if (arg0[0] == '[') {
 		--argc;
-		if (NOT_LONE_CHAR(argv[argc], ']')) {
-			bb_error_msg("missing ]");
-			return 2;
-		}
-		argv[argc] = NULL;
-	} else if (strcmp(argv[0], "[[") == 0) {
-		--argc;
-		if (strcmp(argv[argc], "]]")) {
-			bb_error_msg("missing ]]");
-			return 2;
+		if (!arg0[1]) { /* "[" ? */
+			if (NOT_LONE_CHAR(argv[argc], ']')) {
+				bb_error_msg("missing ]");
+				return 2;
+			}
+		} else { /* assuming "[[" */
+			if (strcmp(argv[argc], "]]") != 0) {
+				bb_error_msg("missing ]]");
+				return 2;
+			}
 		}
 		argv[argc] = NULL;
 	}
@@ -219,15 +223,19 @@
 	if (argc == 2)
 		return *argv[1] == '\0';
 //assert(argc);
-	if (LONE_CHAR(argv[1], '!')) {
-		bool _off;
+	/* remember if we saw argc==4 which wants *no* '!' test */
+	_off = argc - 4;
+	if (_off ?
+		(LONE_CHAR(argv[1], '!'))
+		: (argv[1][0] != '!' || argv[1][1] != '\0'))
+	{
 		if (argc == 3)
 			return *argv[2] != '\0';
-		_off = argc - 4;
+
 		t_lex(argv[2 + _off]);
 		if (t_wp_op && t_wp_op->op_type == BINOP) {
 			t_wp = &argv[1 + _off];
-			return binop() == 0;
+			return binop() == _off;
 		}
 	}
 	t_wp = &argv[1];
@@ -378,7 +386,7 @@
 static int filstat(char *nm, enum token mode)
 {
 	struct stat s;
-	int i;
+	int i = i; /* gcc 3.x thinks it can be used uninitialized */
 
 	if (mode == FILSYM) {
 #ifdef S_IFLNK