660b96 | 1996-11-30 | Niels Möller | | void perror(string format,mixed ... args);
|
19104e | 1996-12-07 | Per Hedbor | | string popen(string s, void|mapping env, int|void uid, int|void gid)
|
5e4ede | 1996-11-12 | Per Hedbor | | {
object p,p2;
p2 = File();
p=p2->pipe();
if(!p) error("Popen failed. (couldn't create pipe)\n");
if(!fork())
{
|
19104e | 1996-12-07 | Per Hedbor | | array (int) olduid = ({ -1, -1 });
|
5e4ede | 1996-11-12 | Per Hedbor | | catch {
if(p->query_fd() < 0)
{
perror("File to dup2 to closed!\n");
exit(99);
}
p->dup2(File("stdout"));
|
19104e | 1996-12-07 | Per Hedbor | | if(uid || gid)
{
object privs = ((program)"privs")("Executing script as non-www user");
olduid = ({ uid, gid });
setgid(olduid[1]);
setuid(olduid[0]);
#if efun(initgroups)
array pw = getpwuid((int)uid);
if(pw) initgroups(pw[0], (int)olduid[0]);
|
5e4ede | 1996-11-12 | Per Hedbor | | #endif
|
19104e | 1996-12-07 | Per Hedbor | | }
|
5e4ede | 1996-11-12 | Per Hedbor | | catch(exece("/bin/sh", ({ "-c", s }), (env||environment)));
};
exit(69);
}else{
string t;
destruct(p);
|
19104e | 1996-12-07 | Per Hedbor | | t=p2->read(0x7fffffff);
|
5e4ede | 1996-11-12 | Per Hedbor | | 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");
|
19104e | 1996-12-07 | Per Hedbor | | object privs;
if(pid=fork()) return pid;
|
3ee80f | 1996-11-12 | Per Hedbor | | if(arrayp(uid) && sizeof(uid) == 2)
{
|
19104e | 1996-12-07 | Per Hedbor | | privs = ((program)"privs")("Executing program as non-www user (outside roxen)");
|
3ee80f | 1996-11-12 | Per Hedbor | | setgid(uid[1]);
setuid(uid[0]);
|
19104e | 1996-12-07 | Per Hedbor | | }
catch(low_spawne(s, args, env, stdin, stdout, stderr, wd));
|
3ee80f | 1996-11-12 | Per Hedbor | | exit(0);
}
|
a68375 | 1996-11-20 | Mirar (Pontus Hagland) | | private static int perror_last_was_newline=1;
void perror(string format,mixed ... args)
{
string s;
int lwn;
s=((args==({}))?format:sprintf(format,@args));
if (s=="") return;
if ( (lwn = s[-1]=="\n") )
s=s[0..strlen(s)-2];
werror((perror_last_was_newline?getpid()+": ":"")
+replace(s,"\n","\n"+getpid()+": ")
+(lwn?"\n":""));
perror_last_was_newline=lwn;
}
|
3ee80f | 1996-11-12 | Per Hedbor | | void create()
{
add_constant("spawne",spawne);
|
a68375 | 1996-11-20 | Mirar (Pontus Hagland) | | add_constant("perror",perror);
|
5e4ede | 1996-11-12 | Per Hedbor | | add_constant("popen",popen);
}
|