shithub: gemnine

Download patch

ref: a194837a08fbac1792c9db77f5298a9a999ef6fb
parent: 7eb61c82c8f04b7f4a93ecbed287b48b51583620
author: Sigrid Solveig Haflínudóttir <ftrvxmtrx@gmail.com>
date: Wed Dec 9 11:33:46 EST 2020

OCEXEC, open page in the same window

--- a/main.c
+++ b/main.c
@@ -10,9 +10,13 @@
 {
 	if(rfork(RFPROC|RFFDG|RFNOTEG|RFNOWAIT) == 0){
 		char tmp[32] = "/tmp/gem9XXXXXXXXXXX", *cmd;
+		int f;
 		mktemp(tmp);
-		cmd = smprint("cat >%s >[2]/dev/null; page -w %s; rm %s", tmp, tmp, tmp);
+		cmd = smprint("cat >%s; page %s; rm %s", tmp, tmp, tmp);
 		dup(r->fd, 0); close(r->fd);
+		dup((f = open("/dev/null", OWRITE)), 1);
+		dup(f, 2);
+		close(f);
 		execl("/bin/rc", "rc", "-c", cmd, nil);
 	}
 }
@@ -20,19 +24,20 @@
 void
 play(Response *r)
 {
-	int wfd;
-	char *wsys, tmp[64];
-
 	if(rfork(RFPROC|RFFDG|RFNOTEG|RFNOWAIT) == 0){
+		int wfd, f;
+		char *wsys, tmp[64];
 		snprint(tmp, sizeof(tmp), "new -pid %d -dx %d -dy %d", getpid(), 640, 480);
 		if ((wsys = getenv("wsys")) == nil)
 			exits("no wsys");
-		if ((wfd = open(wsys, ORDWR)) < 0 ||
+		if ((wfd = open(wsys, ORDWR|OCEXEC)) < 0 ||
 		    mount(wfd, -1, "/mnt/wsys", MREPL, tmp) < 0 ||
 		    bind("/mnt/wsys", "/dev", MBEFORE) < 0){
 			exits("wsys: %r");
 		}
 		dup(r->fd, 0); close(r->fd);
+		dup((f = open("/dev/null", OWRITE)), 1);
+		dup(f, 2);
 		execl("/bin/play", "play", nil);
 	}
 }
@@ -98,8 +103,8 @@
 				fprint(2, "unsupported MIME %q\n", r->mime);
 		}else if(r->prompt != nil){
 			if(wait)
-				close(open("/dev/text", OWRITE|OTRUNC));
-			if((fd = open("/dev/consctl", OWRITE)) >= 0){
+				close(open("/dev/text", OWRITE|OTRUNC|OCEXEC));
+			if((fd = open("/dev/consctl", OWRITE|OCEXEC)) >= 0){
 				write(fd, "holdon", 6);
 				print("%s\n", r->prompt);
 				Binit(&body, 0, OREAD);
@@ -123,7 +128,7 @@
 			}
 		}else{
 			if(wait)
-				close(open("/dev/text", OWRITE|OTRUNC));
+				close(open("/dev/text", OWRITE|OTRUNC|OCEXEC));
 			if(r->code < 20 || r->code >= 30){
 				if(r->code > 0)
 					fprint(2, "%U: %d %s\n", url, r->code, (r->meta && r->meta[0]) ? r->meta : r->status);