Commit Diff


commit - c4071243a591037f159e15618364521133b8d7ec
commit + 72f66c2d3ca556d35b818158e9de578c4bfa153e
blob - 74abfe17cb8fb17f73d1f321517bff13c7de83b5
blob + 549b1966ec94316d25abeb1d12047d64d9fc9ac8
--- src/cmd/rc/havefork.c
+++ src/cmd/rc/havefork.c
@@ -112,13 +112,14 @@ Xbackq(void)
 {
 	struct thread *p = runq;
 	char wd[8193];
-	int c;
-	char *s, *ewd=&wd[8192], *stop;
+	int c, n;
+	char *s, *ewd=&wd[8192], *stop, *q;
 	struct io *f;
 	var *ifs = vlook("ifs");
 	word *v, *nextv;
 	int pfd[2];
 	int pid;
+	Rune r;
 	stop = ifs->val?ifs->val->word:"";
 	if(pipe(pfd)<0){
 		Xerror("can't make pipe");
@@ -143,14 +144,21 @@ Xbackq(void)
 		s = wd;
 		v = 0;
 		while((c = rchr(f))!=EOF){
-			if(strchr(stop, c) || s==ewd){
-				if(s!=wd){
-					*s='\0';
-					v = newword(wd, v);
-					s = wd;
+			if(s != ewd) {
+				*s++ = c;
+				for(q=stop; *q; q+=n) {
+					n = chartorune(&r, q);
+					if(s-wd >= n && memcmp(s-n, q, n) == 0) {
+						s -= n;
+						goto stop;
+					}
 				}
+				continue;
 			}
-			else *s++=c;
+		stop:
+			*s = '\0';
+			v = newword(wd, v);
+			s = wd;
 		}
 		if(s!=wd){
 			*s='\0';