ape: allow exporting rc functions in environ[]
This commit is contained in:
parent
3ec59c7b70
commit
b34fc2a9cf
2 changed files with 68 additions and 36 deletions
|
@ -45,7 +45,7 @@ _envsetup(void)
|
||||||
nohandle = 0;
|
nohandle = 0;
|
||||||
fdinited = 0;
|
fdinited = 0;
|
||||||
cnt = 0;
|
cnt = 0;
|
||||||
dfd = _OPEN("/env", OREAD);
|
dfd = _OPEN("/env", OREAD|OCEXEC);
|
||||||
if(dfd < 0)
|
if(dfd < 0)
|
||||||
goto done;
|
goto done;
|
||||||
psize = Envhunk;
|
psize = Envhunk;
|
||||||
|
@ -62,21 +62,36 @@ _envsetup(void)
|
||||||
ps = realloc(ps, psize);
|
ps = realloc(ps, psize);
|
||||||
p = ps + i;
|
p = ps + i;
|
||||||
}
|
}
|
||||||
strcpy(p, "/env/");
|
memcpy(p, "/env/", 5);
|
||||||
memcpy(p+5, d9->name, n+1);
|
memcpy(p+5, d9->name, n+1);
|
||||||
f = _OPEN(p, OREAD);
|
f = _OPEN(p, OREAD|OCEXEC);
|
||||||
memset(p, 0, n+6);
|
if(f < 0)
|
||||||
|
continue;
|
||||||
|
if(n > 3 && memcmp(d9->name, "fn#", 3)==0){
|
||||||
|
if(m > 3
|
||||||
|
&& _READ(f, p+3, m) == m
|
||||||
|
&& memcmp(p+3, "fn ", 3) == 0
|
||||||
|
&& memcmp(p+3+3, d9->name+3, n-3) == 0
|
||||||
|
&& memchr(p+3+n, '{', m-n) != 0){
|
||||||
|
memcpy(p, "#()", 3);
|
||||||
|
p[3+m] = '\0';
|
||||||
|
p += m+4;
|
||||||
|
cnt++;
|
||||||
|
}
|
||||||
|
_CLOSE(f);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
memcpy(p, d9->name, n);
|
memcpy(p, d9->name, n);
|
||||||
p[n] = '=';
|
p[n] = '=';
|
||||||
if(f < 0 || _READ(f, p+n+1, m) != m)
|
if(_READ(f, p+n+1, m) != m)
|
||||||
m = 0;
|
m = 0;
|
||||||
_CLOSE(f);
|
_CLOSE(f);
|
||||||
if(p[n+m] == 0)
|
if(p[n+m]=='\0')
|
||||||
m--;
|
m--;
|
||||||
for(i=0; i<m; i++)
|
for(i=0; i<m; i++)
|
||||||
if(p[n+1+i] == 0)
|
if(p[n+1+i]=='\0')
|
||||||
p[n+1+i] = 1;
|
p[n+1+i] = '\1';
|
||||||
p[n+1+m] = 0;
|
p[n+1+m] = '\0';
|
||||||
if(strcmp(d9->name, "_fdinfo") == 0) {
|
if(strcmp(d9->name, "_fdinfo") == 0) {
|
||||||
_fdinit(p+n+1, p+n+1+m);
|
_fdinit(p+n+1, p+n+1+m);
|
||||||
fdinited = 1;
|
fdinited = 1;
|
||||||
|
|
|
@ -23,7 +23,7 @@ execve(const char *name, const char *argv[], const char *envp[])
|
||||||
* in $_fdinfo (for open fd's)
|
* in $_fdinfo (for open fd's)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
f = _CREATE("/env/_fdinfo", OWRITE, 0666);
|
f = _CREATE("/env/_fdinfo", OWRITE|OCEXEC, 0666);
|
||||||
ss = buf;
|
ss = buf;
|
||||||
for(i = 0; i<OPEN_MAX; i++){
|
for(i = 0; i<OPEN_MAX; i++){
|
||||||
if(i == f)
|
if(i == f)
|
||||||
|
@ -65,7 +65,7 @@ execve(const char *name, const char *argv[], const char *envp[])
|
||||||
* are ignored, in case the current value of the
|
* are ignored, in case the current value of the
|
||||||
* variable ignored some.
|
* variable ignored some.
|
||||||
*/
|
*/
|
||||||
f = _CREATE("/env/_sighdlr", OWRITE, 0666);
|
f = _CREATE("/env/_sighdlr", OWRITE|OCEXEC, 0666);
|
||||||
if(f >= 0){
|
if(f >= 0){
|
||||||
ss = buf;
|
ss = buf;
|
||||||
for(i = 0; i <=MAXSIG; i++) {
|
for(i = 0; i <=MAXSIG; i++) {
|
||||||
|
@ -86,20 +86,36 @@ execve(const char *name, const char *argv[], const char *envp[])
|
||||||
}
|
}
|
||||||
if(envp){
|
if(envp){
|
||||||
for(e = (char**)envp; (ss = *e); e++) {
|
for(e = (char**)envp; (ss = *e); e++) {
|
||||||
se = strchr(ss, '=');
|
if(strncmp(ss, "#()fn ", 6)==0){
|
||||||
if(!se || ss==se)
|
if((se = strchr(ss+6, '{'))==0)
|
||||||
continue; /* what is name? value? */
|
continue;
|
||||||
n = se-ss;
|
while(se[-1]==' ') se--;
|
||||||
if(n >= sizeof(buf)-5)
|
n = se-(ss+6);
|
||||||
|
if(n <= 0 || n >= sizeof(buf)-8)
|
||||||
continue; /* name too long */
|
continue; /* name too long */
|
||||||
strcpy(buf, "/env/");
|
memcpy(buf, "/env/fn#", 8);
|
||||||
|
memcpy(buf+8, ss+6, n);
|
||||||
|
buf[8+n] = '\0';
|
||||||
|
f = _CREATE(buf, OWRITE|OCEXEC, 0666);
|
||||||
|
if(f < 0)
|
||||||
|
continue;
|
||||||
|
ss += 3; /* past #() */
|
||||||
|
_WRITE(f, ss, strlen(ss));
|
||||||
|
_CLOSE(f);
|
||||||
|
} else {
|
||||||
|
if((se = strchr(ss, '='))==0)
|
||||||
|
continue;
|
||||||
|
n = se-ss;
|
||||||
|
if(n <= 0 || n >= sizeof(buf)-5)
|
||||||
|
continue; /* name too long */
|
||||||
|
memcpy(buf, "/env/", 5);
|
||||||
memcpy(buf+5, ss, n);
|
memcpy(buf+5, ss, n);
|
||||||
buf[5+n] = 0;
|
buf[5+n] = '\0';
|
||||||
f = _CREATE(buf, OWRITE, 0666);
|
f = _CREATE(buf, OWRITE|OCEXEC, 0666);
|
||||||
if(f < 0)
|
if(f < 0)
|
||||||
continue;
|
continue;
|
||||||
ss = ++se; /* past = */
|
ss = ++se; /* past = */
|
||||||
se += strlen(ss);
|
se += strlen(se);
|
||||||
while((n = (se - ss)) > 0){
|
while((n = (se - ss)) > 0){
|
||||||
if(n > sizeof(buf))
|
if(n > sizeof(buf))
|
||||||
n = sizeof(buf);
|
n = sizeof(buf);
|
||||||
|
@ -114,6 +130,7 @@ execve(const char *name, const char *argv[], const char *envp[])
|
||||||
_CLOSE(f);
|
_CLOSE(f);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
n = _EXEC(name, argv);
|
n = _EXEC(name, argv);
|
||||||
_syserrno();
|
_syserrno();
|
||||||
return n;
|
return n;
|
||||||
|
|
Loading…
Reference in a new issue