5e4ede | 1996-11-12 | Per Hedbor | | string popen(string s, void|mapping env)
{
object p,p2
p2 = File()
p=p2->pipe()
if(!p) error("Popen failed. (couldn't create pipe)\n")
if(!fork())
{
array (int) olduid
catch {
if(p->query_fd() < 0)
{
perror("File to dup2 to closed!\n")
exit(99)
}
p->dup2(File("stdout"))
olduid = ({ geteuid(), getegid() })
seteuid(0)
#if efun(setegid)
setegid(getgid())
#endif
setgid(olduid[1])
setuid(olduid[0])
catch(exece("/bin/sh", ({ "-c", s }), (env||environment)))
}
exit(69)
}else{
string t
destruct(p)
t=p2->read(6553555)
destruct(p2)
return t
}
}
|
3ee80f | 1996-11-12 | Per Hedbor | | mapping make_mapping(string *f)
{
mapping foo=([ ])
string s, a, b
foreach(f, s)
{
sscanf(s, "%s=%s", a, b)
foo[a]=b
}
return foo
}
int low_spawne(string s,string *args, mapping|array env, object stdin,
object stdout, object stderr, void|string wd)
{
object p
int pid
string t
if(arrayp(env))
env = make_mapping(env)
if(!mappingp(env))
env=([])
stdin->dup2(File("stdin"))
stdout->dup2(File("stdout"))
stderr->dup2(File("stderr"))
if(stringp(wd) && sizeof(wd))
cd(wd)
exece(s, args, env)
perror(sprintf("Spawne: Failed to exece %s\n", s))
exit(0)
}
int spawne(string s,string *args, mapping|array env, object stdin,
object stdout, object stderr, void|string wd, void|array (int) uid)
{
int pid, *olduid = allocate(2, "int")
if(pid=fork())
return pid
if(arrayp(uid) && sizeof(uid) == 2)
{
#if efun(seteuid)
olduid = ({ geteuid(), getegid() })
seteuid(0)
#endif
#if efun(setegid)
setegid(getgid())
#endif
setgid(uid[1])
setuid(uid[0])
if(!getuid())
{
#if efun(seteuid)
setgid(olduid[1])
setuid(olduid[0])
#else
setgid(-1)
setuid(-1)
#endif
} else {
olduid = ({ geteuid(), getegid() })
#if efun(seteuid)
seteuid(0)
#endif
#if efun(setegid)
setegid(getgid())
#endif
setgid(olduid[1])
setuid(olduid[0])
}
}
catch(low_spawne(s, args, env, stdin, stdout, stderr, wd))
exit(0)
}
void create()
{
add_constant("spawne",spawne)
add_constant("perror",werror)
|