tacme: use threadspawnd to avoid changing "." of current process - plan9port - [fork] Plan 9 from user space
(HTM) git clone git://src.adamsgaard.dk/plan9port
(DIR) Log
(DIR) Files
(DIR) Refs
(DIR) README
(DIR) LICENSE
---
(DIR) commit 9ca6e21f3d0ea9b9bab8b4661d03d30ed61fd79d
(DIR) parent 9e4b56e7645e08311590355824863ecf9f334f0c
(HTM) Author: Russ Cox <rsc@swtch.com>
Date: Mon, 22 Oct 2012 12:32:31 -0400
acme: use threadspawnd to avoid changing "." of current process
R=rsc
http://codereview.appspot.com/6736060
Diffstat:
M src/cmd/acme/exec.c | 37 +++++++------------------------
1 file changed, 8 insertions(+), 29 deletions(-)
---
(DIR) diff --git a/src/cmd/acme/exec.c b/src/cmd/acme/exec.c
t@@ -1352,7 +1352,6 @@ runproc(void *argvp)
int sfd[3];
int pipechar;
char buf[512];
- int olddir;
int ret;
/*static void *parg[2]; */
char *rcarg[4];
t@@ -1507,24 +1506,11 @@ runproc(void *argvp)
av[ac] = nil;
c->av = av;
- /*
- * clumsy -- we're not running in a separate thread
- * so we have to save the current directory and put
- * it back when we're done. if this gets to be a regular
- * thing we could change threadexec to take a directory too.
- */
- olddir = -1;
- if(rdir != nil){
- olddir = open(".", OREAD);
+ dir = nil;
+ if(rdir != nil)
dir = runetobyte(rdir, ndir);
- chdir(dir); /* ignore error: probably app. window */
- free(dir);
- }
- ret = threadspawn(sfd, av[0], av);
- if(olddir >= 0){
- fchdir(olddir);
- close(olddir);
- }
+ ret = threadspawnd(sfd, av[0], av, dir);
+ free(dir);
if(ret >= 0){
if(cpid)
sendul(cpid, ret);
t@@ -1572,13 +1558,9 @@ Hard:
c->text = news;
}
}
- olddir = -1;
- if(rdir != nil){
- olddir = open(".", OREAD);
+ dir = nil;
+ if(rdir != nil)
dir = runetobyte(rdir, ndir);
- chdir(dir); /* ignore error: probably app. window */
- free(dir);
- }
shell = acmeshell;
if(shell == nil)
shell = "rc";
t@@ -1586,11 +1568,8 @@ Hard:
rcarg[1] = "-c";
rcarg[2] = t;
rcarg[3] = nil;
- ret = threadspawn(sfd, rcarg[0], rcarg);
- if(olddir >= 0){
- fchdir(olddir);
- close(olddir);
- }
+ ret = threadspawnd(sfd, rcarg[0], rcarg, dir);
+ free(dir);
if(ret >= 0){
if(cpid)
sendul(cpid, ret);