1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137
|
// This is a roxen module. Copyright 1996 - 1998, Idonex AB.
// Support for the FastCGI interface, using an external fast-cgi
// wrapper. This should be handled internally.
string cvs_version = "$Id: fcgi.pike,v 1.16 1998/06/09 14:12:04 grubba Exp $";
#include <module.h>
inherit "modules/scripting/cgi";
#define ipaddr(x,y) (((x)/" ")[y])
void create()
{
::create();
set("mountpoint", "/fcgi-bin/");
defvar("numsimul", 1,
"Number of simultaneous copies to run", TYPE_INT,
"This many copies will be started simultaneousy of each script. "
"This is very useful for scripts that take a long time to finish. "
"A tip is to use another extension and/or cgi-bin directory for "
"these scripts. Remember to code your scripts multi-process safe.");
defvar("ex", 1, "Handle *.fcgi", TYPE_FLAG,
"Also handle all '.fcgi' files as Fast-CGI scripts, as well "
"as files in the cgi-bin directory. This emulates the behaviour "
"of the NCSA server (the extensions to handle can be set in the "
"CGI-script extensions variable).");
set("ext", ({"fcgi"}));
if (mkdir("/tmp/.Roxen_fcgi_pipes")) {
chmod("/tmp/.Roxen_fcgi_pipes/.", 01777);
}
}
mixed *register_module()
{
if(file_stat("bin/fcgi")) {
return ({
MODULE_FIRST | MODULE_LOCATION | MODULE_FILE_EXTENSION,
"Fast-CGI executable support",
"Partial support for the "
"<a href=http://www.fastcgi.com>Fast-CGI interface</a>. "
"This module is useful, but not finished."
});
}
}
string query_name()
{
return sprintf("Fast-CGI support, mounted on "+query_location());
}
int last;
mapping stof = ([]);
string make_pipe_name(string from)
{
string s;
if(s = stof[from])
return s;
s = "/tmp/.Roxen_fcgi_pipes/"+hash(from);
while(search(stof,s))
s+=".2";
return stof[from] = s;
}
mixed low_find_file(string f, object id, string path)
{
object pipe1, pipe2;
string path_info;
if(!id->misc->path_info)
{
array tmp2;
tmp2 = ::extract_path_info(f, path);
if(!tmp2) {
array st2;
if((st2=file_stat( path + f )) && (st2[1]==-2))
return -1; // It's a directory...
return 0;
}
path_info = tmp2[0];
f = tmp2[1];
} else
path_info = id->misc->path_info;
#ifdef CGI_DEBUG
roxen_perror("FCGI: Starting '"+f+"'...\n");
#endif
pipe1=Stdio.File();
pipe2=pipe1->pipe();
array (int) uid;
if(!getuid())
{
array us;
if(QUERY(user)&&id->misc->is_user&&(us = file_stat(id->misc->is_user)))
uid = us[5..6];
else if(runuser)
uid = runuser;
if(!uid)
uid = ({ 65534, 65534 });
}
#ifdef CGI_DEBUG
roxen_perror("Starting '"+getcwd()+"/bin/fcgi -connect "+make_pipe_name(f)+" "+ f +
" "+QUERY(numsimul)+"\n");
#endif
spawne(getcwd()+"/bin/fcgi", ({"-connect", make_pipe_name(f), f,
QUERY(numsimul)+"" }),
my_build_env_vars(f, id, path_info),
pipe1, pipe1, QUERY(err)?pipe1:Stdio.stderr, dirname(f),
uid);
destruct(pipe1);
if(id->data)
pipe2->write(id->data);
return http_stream(pipe2);
}
mixed find_file(string f, object id)
{
low_find_file(f, id, ::search_path);
}
|