acme: use threadspawnd to avoid changing "." of current process

R=rsc
http://codereview.appspot.com/6736060
This commit is contained in:
Russ Cox 2012-10-22 12:32:31 -04:00
parent 9e4b56e764
commit 9ca6e21f3d

View file

@ -1352,7 +1352,6 @@ runproc(void *argvp)
int sfd[3]; int sfd[3];
int pipechar; int pipechar;
char buf[512]; char buf[512];
int olddir;
int ret; int ret;
/*static void *parg[2]; */ /*static void *parg[2]; */
char *rcarg[4]; char *rcarg[4];
@ -1507,24 +1506,11 @@ runproc(void *argvp)
av[ac] = nil; av[ac] = nil;
c->av = av; c->av = av;
/* dir = nil;
* clumsy -- we're not running in a separate thread if(rdir != nil)
* 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 = runetobyte(rdir, ndir); dir = runetobyte(rdir, ndir);
chdir(dir); /* ignore error: probably app. window */ ret = threadspawnd(sfd, av[0], av, dir);
free(dir); free(dir);
}
ret = threadspawn(sfd, av[0], av);
if(olddir >= 0){
fchdir(olddir);
close(olddir);
}
if(ret >= 0){ if(ret >= 0){
if(cpid) if(cpid)
sendul(cpid, ret); sendul(cpid, ret);
@ -1572,13 +1558,9 @@ Hard:
c->text = news; c->text = news;
} }
} }
olddir = -1; dir = nil;
if(rdir != nil){ if(rdir != nil)
olddir = open(".", OREAD);
dir = runetobyte(rdir, ndir); dir = runetobyte(rdir, ndir);
chdir(dir); /* ignore error: probably app. window */
free(dir);
}
shell = acmeshell; shell = acmeshell;
if(shell == nil) if(shell == nil)
shell = "rc"; shell = "rc";
@ -1586,11 +1568,8 @@ Hard:
rcarg[1] = "-c"; rcarg[1] = "-c";
rcarg[2] = t; rcarg[2] = t;
rcarg[3] = nil; rcarg[3] = nil;
ret = threadspawn(sfd, rcarg[0], rcarg); ret = threadspawnd(sfd, rcarg[0], rcarg, dir);
if(olddir >= 0){ free(dir);
fchdir(olddir);
close(olddir);
}
if(ret >= 0){ if(ret >= 0){
if(cpid) if(cpid)
sendul(cpid, ret); sendul(cpid, ret);