835c6c | 2001-06-17 | Martin Nilsson | |
|
6f669a | 2001-08-14 | Honza Petrous | | constant cvs_version = "$Id: configuration.pike,v 1.462 2001/08/14 01:47:16 hop Exp $";
|
b1fca0 | 1996-11-12 | Per Hedbor | | #include <module.h>
|
a59d25 | 2000-07-04 | Per Hedbor | | #include <module_constants.h>
|
14179b | 1997-01-29 | Per Hedbor | | #include <roxen.h>
|
c5e096 | 1999-10-04 | Per Hedbor | | #include <request_trace.h>
|
9c1900 | 2001-02-27 | Per Hedbor | | #include <timers.h>
|
8afc81 | 1998-02-04 | Per Hedbor | |
|
c7a5f0 | 1999-02-16 | Per Hedbor | | #define CATCH(P,X) do{mixed e;if(e=catch{X;})report_error("While "+P+"\n"+describe_backtrace(e));}while(0)
|
18be21 | 1998-05-07 | Henrik Grubbström (Grubba) | |
|
23414a | 2000-07-21 | Andreas Lange | |
#define LOC_S(X,Y) _STR_LOCALE("roxen_start",X,Y)
#define LOC_C(X,Y) _STR_LOCALE("roxen_config",X,Y)
#define LOC_M(X,Y) _STR_LOCALE("roxen_message",X,Y)
#define DLOCALE(X,Y) _DEF_LOCALE("roxen_config",X,Y)
|
18be21 | 1998-05-07 | Henrik Grubbström (Grubba) | |
|
199d03 | 1999-09-05 | Francesco Chemolli | | #ifdef THROTTLING_DEBUG
#undef THROTTLING_DEBUG
|
91d3c3 | 2001-03-12 | Martin Nilsson | | #define THROTTLING_DEBUG(X) report_debug("Throttling: "+X+"\n")
|
199d03 | 1999-09-05 | Francesco Chemolli | | #else
#define THROTTLING_DEBUG(X)
#endif
|
10c7e1 | 1999-12-28 | Martin Nilsson | | #ifdef REQUEST_DEBUG
|
91d3c3 | 2001-03-12 | Martin Nilsson | | # define REQUEST_WERR(X) report_debug("CONFIG: "+X+"\n")
|
10c7e1 | 1999-12-28 | Martin Nilsson | | #else
# define REQUEST_WERR(X)
#endif
|
471705 | 2001-05-07 | Per Hedbor | |
#ifdef AVERAGE_PROFILING
class ProfStack
{
array current_stack = ({});
void enter( string k, RequestID id )
{
current_stack += ({ ({ k, gethrtime(), gethrvtime() }) });
}
void leave( string k, RequestID id )
{
int t0 = gethrtime();
int t1 = gethrvtime();
if( !sizeof(current_stack ) )
{
|
7937df | 2001-05-16 | Per Hedbor | |
|
471705 | 2001-05-07 | Per Hedbor | | return;
}
int i = sizeof( current_stack )-1;
while( current_stack[ i ][0] != k && i >= 0 ) i--;
if(i < 0 )
{
return;
}
|
7937df | 2001-05-16 | Per Hedbor | | void low_leave( int i )
{
int tt = t0-current_stack[i][1];
int ttv = t1-current_stack[i][2];
if( i > 0 )
{
current_stack[i-1][1]+=tt+gethrtime()-t0;
current_stack[i-1][2]+=ttv+gethrvtime()-t1;
}
current_stack = current_stack[..i-1];
add_prof_entry( id, k, tt, ttv );
};
|
471705 | 2001-05-07 | Per Hedbor | |
|
7937df | 2001-05-16 | Per Hedbor | | if( i != sizeof( current_stack )-1 )
|
471705 | 2001-05-07 | Per Hedbor | | {
|
7937df | 2001-05-16 | Per Hedbor | | for( int j = sizeof( current_stack )-1; j>=i; j-- )
low_leave( j );
return;
|
471705 | 2001-05-07 | Per Hedbor | | }
|
7937df | 2001-05-16 | Per Hedbor | | low_leave( i );
|
471705 | 2001-05-07 | Per Hedbor | | }
}
class ProfInfo( string url )
{
mapping data = ([]);
void add( string k, int h, int hrv )
{
if( !data[k] )
data[k] = ({ h, hrv, 1 });
else
{
data[k][0]+=h;
data[k][1]+=hrv;
data[k][2]++;
}
}
array summarize_table( )
{
array table = ({});
int n, t, v;
foreach( indices( data ), string k )
table += ({ ({ k,
sprintf( "%d", (n=data[k][2]) ),
sprintf("%5.2f",(t=data[k][0])/1000000.0),
sprintf("%5.2f", (v=data[k][1])/1000000.0),
sprintf("%8.2f", t/n/1000.0),
sprintf("%8.2f",v/n/1000.0), }) });
sort( (array(float))column(table,2), table );
return reverse(table);
}
void dump( )
{
write( "\n"+url+": \n" );
ADT.Table t = ADT.Table->table( summarize_table(),
({ "What", "Calls",
"Time", "CPU",
"t/call(ms)", "cpu/call(ms)" }));
write( ADT.Table.ASCII.encode( t )+"\n" );
}
}
mapping profiling_info = ([]);
void debug_write_prof( )
{
foreach( sort( indices( profiling_info ) ), string p )
profiling_info[p]->dump();
}
void add_prof_entry( RequestID id, string k, int hr, int hrv )
{
|
e8dffa | 2001-05-14 | Per Hedbor | | string l = id->not_query;
|
7937df | 2001-05-16 | Per Hedbor | |
if( has_prefix( l, query_internal_location() ) )
l = dirname( l );
if( !profiling_info[l] )
profiling_info[l] = ProfInfo(l);
|
e8dffa | 2001-05-14 | Per Hedbor | | profiling_info[l]->add( k, hr, hrv );
|
471705 | 2001-05-07 | Per Hedbor | | }
void avg_prof_enter( string name, string type, RequestID id )
{
if( !id->misc->prof_stack )
id->misc->prof_stack = ProfStack();
id->misc->prof_stack->enter( name+":"+type,id );
}
void avg_prof_leave( string name, string type, RequestID id )
{
if( !id->misc->prof_stack ) id->misc->prof_stack = ProfStack();
id->misc->prof_stack->leave( name+":"+type,id );
}
#endif
|
b1fca0 | 1996-11-12 | Per Hedbor | |
|
9a8a15 | 2000-09-25 | Per Hedbor | | inherit Configuration;
inherit "basic_defvar";
|
dfe036 | 2000-03-19 | Martin Nilsson | |
|
3557f5 | 2001-06-30 | Martin Stjernholm | |
string name = roxen->bootstrap_info->get();
|
d09399 | 2000-09-25 | Per Hedbor | |
class DataCache
{
mapping(string:array(string|mapping(string:mixed))) cache = ([]);
int current_size;
int max_size;
int max_file_size;
int hits, misses;
void flush()
{
current_size = 0;
cache = ([]);
}
static void clear_some_cache()
{
array q = indices( cache );
if(!sizeof(q))
{
current_size=0;
return;
}
for( int i = 0; i<sizeof( q )/10; i++ )
expire_entry( q[random(sizeof(q))] );
}
void expire_entry( string url )
{
if( cache[ url ] )
{
current_size -= strlen(cache[url][0]);
m_delete( cache, url );
}
}
void set( string url, string data, mapping meta, int expire )
{
if( strlen( data ) > max_size ) return;
call_out( expire_entry, expire, url );
current_size += strlen( data );
cache[url] = ({ data, meta });
int n;
while( (current_size > max_size) && (n++<10))
clear_some_cache();
}
array(string|mapping(string:mixed)) get( string url )
{
mixed res;
if( res = cache[ url ] )
hits++;
else
misses++;
return res;
}
void init_from_variables( )
{
max_size = query( "data_cache_size" ) * 1024;
max_file_size = query( "data_cache_file_max_size" ) * 1024;
if( max_size < max_file_size )
max_size += max_file_size;
int n;
while( (current_size > max_size) && (n++<10))
clear_some_cache();
}
static void create()
{
init_from_variables();
}
}
|
3b1783 | 1998-11-22 | Per Hedbor | | #include "rxml.pike";
|
9a8a15 | 2000-09-25 | Per Hedbor | | constant store = roxen.store;
constant retrieve = roxen.retrieve;
constant remove = roxen.remove;
|
14179b | 1997-01-29 | Per Hedbor | |
|
65c6d2 | 2000-03-10 | Martin Nilsson | | int config_id;
|
9a8a15 | 2000-09-25 | Per Hedbor | | int get_config_id()
{
|
65c6d2 | 2000-03-10 | Martin Nilsson | | if(config_id) return config_id;
for(int i=sizeof(roxen->configurations); i;)
if(roxen->configurations[--i]->name==name) return config_id=i;
}
|
c7a5f0 | 1999-02-16 | Per Hedbor | | string get_doc_for( string region, string variable )
{
|
e351dd | 1999-11-29 | Per Hedbor | | RoxenModule module;
|
c7a5f0 | 1999-02-16 | Per Hedbor | | if(variable[0] == '_')
return 0;
if((int)reverse(region))
return 0;
if(module = find_module( region ))
{
if(module->variables[variable])
|
b2c49b | 2000-07-09 | Per Hedbor | | return module->variables[variable]->name()+
"\n"+module->variables[ variable ]->doc();
|
c7a5f0 | 1999-02-16 | Per Hedbor | | }
if(variables[ variable ])
|
b2c49b | 2000-07-09 | Per Hedbor | | return variables[variable]->name()+
"\n"+variables[ variable ]->doc();
|
c7a5f0 | 1999-02-16 | Per Hedbor | | }
|
14179b | 1997-01-29 | Per Hedbor | |
|
e351dd | 1999-11-29 | Per Hedbor | | string query_internal_location(RoxenModule|void mod)
|
5839c3 | 1999-01-22 | Marcus Comstedt | | {
|
8552d9 | 2001-01-13 | Martin Nilsson | | return query("InternalLoc")+(mod?replace(otomod[mod]||"", "#", "!")+"/":"");
|
5839c3 | 1999-01-22 | Marcus Comstedt | | }
|
b1fca0 | 1996-11-12 | Per Hedbor | |
string query_name()
{
|
8552d9 | 2001-01-13 | Martin Nilsson | | if(strlen(query("name")))
return query("name");
|
b1fca0 | 1996-11-12 | Per Hedbor | | return name;
}
string comment()
{
|
8552d9 | 2001-01-13 | Martin Nilsson | | return query("comment");
|
b1fca0 | 1996-11-12 | Per Hedbor | | }
|
e351dd | 1999-11-29 | Per Hedbor | | array (Priority) allocate_pris()
|
b1fca0 | 1996-11-12 | Per Hedbor | | {
|
c5e096 | 1999-10-04 | Per Hedbor | | return allocate(10, Priority)();
|
b1fca0 | 1996-11-12 | Per Hedbor | | }
|
2f1e89 | 2000-08-15 | Martin Nilsson | |
|
b1fca0 | 1996-11-12 | Per Hedbor | |
|
7a243b | 2000-08-19 | Per Hedbor | | private mapping (int:string) log_format = ([]);
|
b1fca0 | 1996-11-12 | Per Hedbor | |
|
c5e096 | 1999-10-04 | Per Hedbor | |
|
053a55 | 2000-10-04 | Per Hedbor | | array (Priority) pri = allocate_pris();
|
b1fca0 | 1996-11-12 | Per Hedbor | |
|
9c1900 | 2001-02-27 | Per Hedbor | | mapping modules = ([]);
|
1dd64a | 2000-09-19 | Mattias Wingstedt | |
|
e75fd1 | 2000-07-26 | Johan Sundström | |
|
b1fca0 | 1996-11-12 | Per Hedbor | |
|
9c1900 | 2001-02-27 | Per Hedbor | | mapping (RoxenModule:string) otomod = ([]);
|
e75fd1 | 2000-07-26 | Johan Sundström | |
|
b1fca0 | 1996-11-12 | Per Hedbor | |
private array (function) url_module_cache, last_module_cache;
private array (function) logger_module_cache, first_module_cache;
private array (function) filter_module_cache;
private array (array (string|function)) location_module_cache;
private mapping (string:array (function)) file_extension_module_cache=([]);
|
e351dd | 1999-11-29 | Per Hedbor | | private mapping (string:array (RoxenModule)) provider_module_cache=([]);
|
3342dd | 2001-01-19 | Per Hedbor | | private array (RoxenModule) auth_module_cache, userdb_module_cache;
|
b1fca0 | 1996-11-12 | Per Hedbor | |
|
38dca8 | 1996-12-10 | Per Hedbor | |
|
0e1557 | 2001-02-23 | Martin Stjernholm | | void unregister_urls()
|
38dca8 | 1996-12-10 | Per Hedbor | | {
|
e62d48 | 2000-02-29 | David Hedbor | | foreach( registered_urls, string url )
|
ecd9ab | 2000-08-23 | Per Hedbor | | roxen.unregister_url(url);
|
dffa22 | 2000-12-10 | Per Hedbor | | registered_urls = ({});
|
38dca8 | 1996-12-10 | Per Hedbor | | }
|
0e1557 | 2001-02-23 | Martin Stjernholm | | private int num_modules = 0;
#ifdef THREADS
private Thread.Condition modules_stopped = Thread.Condition();
#endif
private void safe_stop_module (RoxenModule mod, string desc)
{
if (mixed err = catch (mod && mod->stop && mod->stop()))
report_error ("While stopping " + desc + ": " + describe_backtrace (err));
|
a5249e | 2001-03-05 | Per Hedbor | | if (!--num_modules)
#ifdef THREADS
modules_stopped->signal()
#endif
;
|
0e1557 | 2001-02-23 | Martin Stjernholm | | }
void stop (void|int asynch)
{
unregister_urls();
multiset allmods = mkmultiset (indices (otomod));
num_modules = 17;
if (types_module) {
num_modules++;
roxen.handle (safe_stop_module, types_module, "type module");
allmods[types_module] = 0;
}
if (dir_module) {
num_modules++;
roxen.handle (safe_stop_module, dir_module, "directory module");
allmods[dir_module] = 0;
}
for(int i=0; i<10; i++)
if (Priority p = pri[i]) {
#define STOP_MODULES(MODS, DESC) \
foreach(MODS, RoxenModule m) \
if (allmods[m]) { \
num_modules++; \
roxen.handle (safe_stop_module, m, DESC); \
allmods[m] = 0; \
}
STOP_MODULES (p->url_modules, "url module");
STOP_MODULES (p->logger_modules, "logging module");
STOP_MODULES (p->filter_modules, "filter module");
STOP_MODULES (p->location_modules, "location module");
STOP_MODULES (p->last_modules, "last module");
STOP_MODULES (p->first_modules, "first module");
STOP_MODULES (indices (p->provider_modules), "provider module");
}
if (mixed err = catch {
if (object m = log_function && function_object (log_function)) {
destruct (m);
allmods[m] = 0;
}
}) report_error ("While stopping the logger: " + describe_backtrace (err));
STOP_MODULES(indices (allmods), "unclassified module");
#undef STOP_MODULES
if (!asynch) {
num_modules -= 17;
if (num_modules) {
#ifdef THREADS
modules_stopped->wait();
#else
error ("num_modules shouldn't be nonzero here when running nonthreaded.\n");
#endif
}
}
}
|
9a8a15 | 2000-09-25 | Per Hedbor | | string type_from_filename( string file, int|void to, string|void myext )
|
b1fca0 | 1996-11-12 | Per Hedbor | | {
|
f28c11 | 2000-03-06 | Martin Nilsson | | array(string)|string tmp;
|
14179b | 1997-01-29 | Per Hedbor | | if(!types_fun)
return to?({ "application/octet-stream", 0 }):"application/octet-stream";
|
dfe036 | 2000-03-19 | Martin Nilsson | | string ext=myext || Roxen.extension(file);
|
41b77c | 1999-07-15 | David Hedbor | |
|
14179b | 1997-01-29 | Per Hedbor | | if(tmp = types_fun(ext))
{
mixed tmp2,nx;
if(tmp[0] == "strip")
{
tmp2=file/".";
if(sizeof(tmp2) > 2)
nx=tmp2[-2];
if(nx && (tmp2=types_fun(nx)))
tmp[0] = tmp2[0];
|
9be5aa | 1998-07-03 | Henrik Grubbström (Grubba) | | else if(tmp2=types_fun("default"))
tmp[0] = tmp2[0];
|
14179b | 1997-01-29 | Per Hedbor | | else
|
9be5aa | 1998-07-03 | Henrik Grubbström (Grubba) | | tmp[0]="application/octet-stream";
|
14179b | 1997-01-29 | Per Hedbor | | }
|
9be5aa | 1998-07-03 | Henrik Grubbström (Grubba) | | } else if(!(tmp = types_fun("default"))) {
tmp = ({ "application/octet-stream", 0 });
|
14179b | 1997-01-29 | Per Hedbor | | }
|
9be5aa | 1998-07-03 | Henrik Grubbström (Grubba) | | return to?tmp:tmp[0];
|
b1fca0 | 1996-11-12 | Per Hedbor | | }
|
e351dd | 1999-11-29 | Per Hedbor | | array (RoxenModule) get_providers(string provides)
|
2f1e89 | 2000-08-15 | Martin Nilsson | |
|
ae32d0 | 1998-03-23 | David Hedbor | | {
|
2f1e89 | 2000-08-15 | Martin Nilsson | |
|
ae32d0 | 1998-03-23 | David Hedbor | | if(!provider_module_cache[provides])
|
10c7e1 | 1999-12-28 | Martin Nilsson | | {
|
ae32d0 | 1998-03-23 | David Hedbor | | int i;
provider_module_cache[provides] = ({ });
for(i = 9; i >= 0; i--)
{
|
10c7e1 | 1999-12-28 | Martin Nilsson | | foreach(indices(pri[i]->provider_modules), RoxenModule d)
if(pri[i]->provider_modules[ d ][ provides ])
|
ae32d0 | 1998-03-23 | David Hedbor | | provider_module_cache[provides] += ({ d });
}
}
return provider_module_cache[provides];
}
|
14179b | 1997-01-29 | Per Hedbor | |
|
e351dd | 1999-11-29 | Per Hedbor | | RoxenModule get_provider(string provides)
|
2f1e89 | 2000-08-15 | Martin Nilsson | |
|
ae32d0 | 1998-03-23 | David Hedbor | | {
|
e351dd | 1999-11-29 | Per Hedbor | | array (RoxenModule) prov = get_providers(provides);
|
ae32d0 | 1998-03-23 | David Hedbor | | if(sizeof(prov))
return prov[0];
return 0;
}
|
bdb8da | 1998-09-02 | Johan Schön | | array(mixed) map_providers(string provides, string fun, mixed ... args)
|
2f1e89 | 2000-08-15 | Martin Nilsson | |
|
ae32d0 | 1998-03-23 | David Hedbor | | {
|
e351dd | 1999-11-29 | Per Hedbor | | array (RoxenModule) prov = get_providers(provides);
|
ae32d0 | 1998-03-23 | David Hedbor | | array error;
|
bdb8da | 1998-09-02 | Johan Schön | | array a=({ });
mixed m;
|
10c7e1 | 1999-12-28 | Martin Nilsson | | foreach(prov, RoxenModule mod)
|
9bb813 | 1998-09-12 | Per Hedbor | | {
|
ae32d0 | 1998-03-23 | David Hedbor | | if(!objectp(mod))
continue;
|
10c7e1 | 1999-12-28 | Martin Nilsson | | if(functionp(mod[fun]))
|
bdb8da | 1998-09-02 | Johan Schön | | error = catch(m=mod[fun](@args));
|
24fbd4 | 1999-04-21 | David Hedbor | | if(arrayp(error)) {
error[0] = "Error in map_providers(): "+error[0];
|
10c7e1 | 1999-12-28 | Martin Nilsson | | report_debug(describe_backtrace(error));
|
24fbd4 | 1999-04-21 | David Hedbor | | }
|
bdb8da | 1998-09-02 | Johan Schön | | else
|
9bb813 | 1998-09-12 | Per Hedbor | | a += ({ m });
|
18be21 | 1998-05-07 | Henrik Grubbström (Grubba) | | error = 0;
|
ae32d0 | 1998-03-23 | David Hedbor | | }
|
9bb813 | 1998-09-12 | Per Hedbor | | return a;
|
ae32d0 | 1998-03-23 | David Hedbor | | }
mixed call_provider(string provides, string fun, mixed ... args)
|
2f1e89 | 2000-08-15 | Martin Nilsson | |
|
ae32d0 | 1998-03-23 | David Hedbor | | {
|
10c7e1 | 1999-12-28 | Martin Nilsson | | foreach(get_providers(provides), RoxenModule mod)
|
e351dd | 1999-11-29 | Per Hedbor | | {
|
d8b772 | 1998-05-28 | Henrik Grubbström (Grubba) | | function f;
if(objectp(mod) && functionp(f = mod[fun])) {
mixed error;
if (arrayp(error = catch {
mixed ret;
if (ret = f(@args)) {
|
c5e096 | 1999-10-04 | Per Hedbor | | return ret;
|
d8b772 | 1998-05-28 | Henrik Grubbström (Grubba) | | }
})) {
|
24fbd4 | 1999-04-21 | David Hedbor | | error[0] = "Error in call_provider(): "+error[0];
throw(error);
|
d8b772 | 1998-05-28 | Henrik Grubbström (Grubba) | | }
}
|
ae32d0 | 1998-03-23 | David Hedbor | | }
}
|
14179b | 1997-01-29 | Per Hedbor | |
|
517c7e | 2000-09-30 | Per Hedbor | | array (function) file_extension_modules(string ext)
|
b1fca0 | 1996-11-12 | Per Hedbor | | {
if(!file_extension_module_cache[ext])
|
10c7e1 | 1999-12-28 | Martin Nilsson | | {
|
b1fca0 | 1996-11-12 | Per Hedbor | | int i;
file_extension_module_cache[ext] = ({ });
for(i=9; i>=0; i--)
{
|
e351dd | 1999-11-29 | Per Hedbor | | array(RoxenModule) d;
RoxenModule p;
|
b1fca0 | 1996-11-12 | Per Hedbor | | if(d = pri[i]->file_extension_modules[ext])
foreach(d, p)
file_extension_module_cache[ext] += ({ p->handle_file_extension });
}
}
return file_extension_module_cache[ext];
}
|
517c7e | 2000-09-30 | Per Hedbor | | array (function) url_modules()
|
b1fca0 | 1996-11-12 | Per Hedbor | | {
if(!url_module_cache)
{
int i;
url_module_cache=({ });
for(i=9; i>=0; i--)
{
|
e351dd | 1999-11-29 | Per Hedbor | | array(RoxenModule) d;
RoxenModule p;
|
b1fca0 | 1996-11-12 | Per Hedbor | | if(d=pri[i]->url_modules)
foreach(d, p)
url_module_cache += ({ p->remap_url });
}
}
return url_module_cache;
}
|
9a8a15 | 2000-09-25 | Per Hedbor | | static mapping api_module_cache = ([]);
|
e351dd | 1999-11-29 | Per Hedbor | | mapping api_functions(void|RequestID id)
|
4f4bc1 | 1998-02-04 | Per Hedbor | | {
|
fc9d8e | 2000-08-28 | Per Hedbor | | return api_module_cache+([]);
|
4f4bc1 | 1998-02-04 | Per Hedbor | | }
|
517c7e | 2000-09-30 | Per Hedbor | | array (function) logger_modules()
|
b1fca0 | 1996-11-12 | Per Hedbor | | {
if(!logger_module_cache)
{
int i;
logger_module_cache=({ });
for(i=9; i>=0; i--)
{
|
e351dd | 1999-11-29 | Per Hedbor | | array(RoxenModule) d;
RoxenModule p;
|
b1fca0 | 1996-11-12 | Per Hedbor | | if(d=pri[i]->logger_modules)
foreach(d, p)
if(p->log)
logger_module_cache += ({ p->log });
}
}
return logger_module_cache;
}
|
517c7e | 2000-09-30 | Per Hedbor | | array (function) last_modules()
|
b1fca0 | 1996-11-12 | Per Hedbor | | {
if(!last_module_cache)
{
int i;
last_module_cache=({ });
for(i=9; i>=0; i--)
{
|
e351dd | 1999-11-29 | Per Hedbor | | array(RoxenModule) d;
RoxenModule p;
|
b1fca0 | 1996-11-12 | Per Hedbor | | if(d=pri[i]->last_modules)
foreach(d, p)
if(p->last_resort)
last_module_cache += ({ p->last_resort });
}
}
return last_module_cache;
}
|
ca44e5 | 1998-07-02 | Henrik Grubbström (Grubba) | | #ifdef __NT__
|
e351dd | 1999-11-29 | Per Hedbor | | static mixed strip_fork_information(RequestID id)
|
ca44e5 | 1998-07-02 | Henrik Grubbström (Grubba) | | {
array a = id->not_query/"::";
|
9a629c | 2001-06-11 | Per Hedbor | | id->not_query = a[0]-":";
|
ca44e5 | 1998-07-02 | Henrik Grubbström (Grubba) | | id->misc->fork_information = a[1..];
|
c5e096 | 1999-10-04 | Per Hedbor | | return 0;
|
ca44e5 | 1998-07-02 | Henrik Grubbström (Grubba) | | }
#endif /* __NT__ */
|
517c7e | 2000-09-30 | Per Hedbor | | array (function) first_modules()
|
b1fca0 | 1996-11-12 | Per Hedbor | | {
if(!first_module_cache)
{
int i;
|
ca44e5 | 1998-07-02 | Henrik Grubbström (Grubba) | | first_module_cache=({
#ifdef __NT__
strip_fork_information,
#endif /* __NT__ */
});
|
b1fca0 | 1996-11-12 | Per Hedbor | | for(i=9; i>=0; i--)
{
|
e351dd | 1999-11-29 | Per Hedbor | | array(RoxenModule) d; RoxenModule p;
|
f12890 | 1997-08-15 | Henrik Grubbström (Grubba) | | if(d=pri[i]->first_modules) {
foreach(d, p) {
if(p->first_try) {
|
b1fca0 | 1996-11-12 | Per Hedbor | | first_module_cache += ({ p->first_try });
|
f12890 | 1997-08-15 | Henrik Grubbström (Grubba) | | }
}
}
|
b1fca0 | 1996-11-12 | Per Hedbor | | }
}
|
f12890 | 1997-08-15 | Henrik Grubbström (Grubba) | |
|
b1fca0 | 1996-11-12 | Per Hedbor | | return first_module_cache;
}
|
4d1023 | 2001-06-26 | Per Hedbor | | void set_userdb_module_cache( array to )
{
userdb_module_cache = to;
}
|
3342dd | 2001-01-19 | Per Hedbor | | array(UserDB) user_databases()
{
if( userdb_module_cache )
return userdb_module_cache;
array tmp = ({});
foreach( values( modules ), mapping m )
foreach( values(m->copies), RoxenModule mo )
if( mo->module_type & MODULE_USERDB )
tmp += ({ ({ mo->query( "_priority" ), mo }) });
sort( tmp );
|
96d86e | 2001-01-29 | Per Hedbor | |
|
3342dd | 2001-01-19 | Per Hedbor | | return userdb_module_cache = reverse(column(tmp,1));
}
array(AuthModule) auth_modules()
{
if( auth_module_cache )
return auth_module_cache;
array tmp = ({});
foreach( values( modules ), mapping m )
foreach( values(m->copies), RoxenModule mo )
if( mo->module_type & MODULE_AUTH )
tmp += ({ ({ mo->query( "_priority" ), mo }) });
sort( tmp );
return auth_module_cache = reverse(column(tmp,1));
}
|
b1fca0 | 1996-11-12 | Per Hedbor | |
|
517c7e | 2000-09-30 | Per Hedbor | | array location_modules()
|
3342dd | 2001-01-19 | Per Hedbor | |
|
cd9287 | 2000-08-15 | Johan Sundström | |
|
b1fca0 | 1996-11-12 | Per Hedbor | | {
if(!location_module_cache)
{
int i;
|
8cc31b | 1997-10-12 | Henrik Grubbström (Grubba) | | array new_location_module_cache=({ });
|
b1fca0 | 1996-11-12 | Per Hedbor | | for(i=9; i>=0; i--)
{
|
10c7e1 | 1999-12-28 | Martin Nilsson | | array(RoxenModule) d;
|
e351dd | 1999-11-29 | Per Hedbor | | RoxenModule p;
|
8cc31b | 1997-10-12 | Henrik Grubbström (Grubba) | | if(d=pri[i]->location_modules) {
array level_find_files = ({});
array level_locations = ({});
foreach(d, p) {
string location;
if(p->find_file && (location = p->query_location())) {
level_find_files += ({ p->find_file });
level_locations += ({ location });
}
}
|
dffddc | 2000-10-10 | Johan Sundström | | sort(map(level_locations, sizeof), level_locations, level_find_files);
|
8cc31b | 1997-10-12 | Henrik Grubbström (Grubba) | | int j;
for (j = sizeof(level_locations); j--;) {
new_location_module_cache += ({ ({ level_locations[j],
level_find_files[j] }) });
}
}
|
b1fca0 | 1996-11-12 | Per Hedbor | | }
|
8cc31b | 1997-10-12 | Henrik Grubbström (Grubba) | | location_module_cache = new_location_module_cache;
|
b1fca0 | 1996-11-12 | Per Hedbor | | }
return location_module_cache;
}
|
517c7e | 2000-09-30 | Per Hedbor | | array(function) filter_modules()
|
b1fca0 | 1996-11-12 | Per Hedbor | | {
if(!filter_module_cache)
{
int i;
filter_module_cache=({ });
for(i=9; i>=0; i--)
{
|
10c7e1 | 1999-12-28 | Martin Nilsson | | array(RoxenModule) d;
|
e351dd | 1999-11-29 | Per Hedbor | | RoxenModule p;
|
b1fca0 | 1996-11-12 | Per Hedbor | | if(d=pri[i]->filter_modules)
foreach(d, p)
if(p->filter)
filter_module_cache+=({ p->filter });
}
}
return filter_module_cache;
}
|
1c7823 | 2000-03-13 | Per Hedbor | | void init_log_file()
{
if(log_function)
{
destruct(function_object(log_function));
log_function = 0;
}
if(query("Log"))
{
string logfile = query("LogFile");
|
f7d981 | 1997-09-12 | Per Hedbor | | if(strlen(logfile))
|
f3ca76 | 2000-08-19 | Per Hedbor | | log_function = roxen.LogFile( logfile )->write;
|
1c7823 | 2000-03-13 | Per Hedbor | | }
|
b1fca0 | 1996-11-12 | Per Hedbor | | }
|
14179b | 1997-01-29 | Per Hedbor | |
private inline string fix_logging(string s)
|
b1fca0 | 1996-11-12 | Per Hedbor | | {
|
f3ca76 | 2000-08-19 | Per Hedbor | | sscanf(s, "%*[\t ]%s", s);
|
14179b | 1997-01-29 | Per Hedbor | | return s;
|
b1fca0 | 1996-11-12 | Per Hedbor | | }
|
14179b | 1997-01-29 | Per Hedbor | | private void parse_log_formats()
{
string b;
array foo=query("LogFormat")/"\n";
foreach(foo, b)
if(strlen(b) && b[0] != '#' && sizeof(b/":")>1)
|
7a243b | 2000-08-19 | Per Hedbor | | log_format[(int)(b/":")[0]] = fix_logging((b/":")[1..]*":");
|
14179b | 1997-01-29 | Per Hedbor | | }
|
b1fca0 | 1996-11-12 | Per Hedbor | |
|
9c1900 | 2001-02-27 | Per Hedbor | | void log(mapping file, RequestID request_id)
|
14179b | 1997-01-29 | Per Hedbor | | {
function f;
|
f3ca76 | 2000-08-19 | Per Hedbor | |
|
517c7e | 2000-09-30 | Per Hedbor | | foreach(logger_module_cache||logger_modules(), f)
|
f3ca76 | 2000-08-19 | Per Hedbor | | if( f( request_id, file ) )
return;
|
14179b | 1997-01-29 | Per Hedbor | |
|
7a243b | 2000-08-19 | Per Hedbor | | if( !log_function )
|
f3ca76 | 2000-08-19 | Per Hedbor | | return;
|
14179b | 1997-01-29 | Per Hedbor | |
|
7a243b | 2000-08-19 | Per Hedbor | | if(do_not_log_patterns &&
Roxen._match(request_id->remoteaddr, do_not_log_patterns))
|
14179b | 1997-01-29 | Per Hedbor | | return;
|
10c7e1 | 1999-12-28 | Martin Nilsson | |
|
7a243b | 2000-08-19 | Per Hedbor | | string form;
if(!(form=log_format[file->error]))
form = log_format[0];
|
14179b | 1997-01-29 | Per Hedbor | | if(!form) return;
|
7a243b | 2000-08-19 | Per Hedbor | |
roxen.run_log_format( form, log_function, request_id, file );
|
14179b | 1997-01-29 | Per Hedbor | | }
|
9c1900 | 2001-02-27 | Per Hedbor | | array(string) userinfo(string u, RequestID|void id)
|
3342dd | 2001-01-19 | Per Hedbor | |
|
cd8192 | 2000-09-19 | Johan Sundström | |
|
ac7745 | 2001-06-13 | Per Hedbor | |
|
14179b | 1997-01-29 | Per Hedbor | | {
|
3342dd | 2001-01-19 | Per Hedbor | | User uid;
foreach( user_databases(), UserDB m )
if( uid = m->find_user( u ) )
|
ac7745 | 2001-06-13 | Per Hedbor | | return uid->compat_userinfo(id);
|
14179b | 1997-01-29 | Per Hedbor | | }
|
9c1900 | 2001-02-27 | Per Hedbor | | array(string) userlist(RequestID|void id)
|
3342dd | 2001-01-19 | Per Hedbor | |
|
cd8192 | 2000-09-19 | Johan Sundström | |
|
ac7745 | 2001-06-13 | Per Hedbor | |
|
14179b | 1997-01-29 | Per Hedbor | | {
|
3342dd | 2001-01-19 | Per Hedbor | | array(string) list = ({});
foreach( user_databases(), UserDB m )
|
ac7745 | 2001-06-13 | Per Hedbor | | list |= m->list_users(id);
|
3342dd | 2001-01-19 | Per Hedbor | | return list;
|
14179b | 1997-01-29 | Per Hedbor | | }
|
9c1900 | 2001-02-27 | Per Hedbor | | array(string) user_from_uid(int u, RequestID|void id)
|
3342dd | 2001-01-19 | Per Hedbor | |
|
cd8192 | 2000-09-19 | Johan Sundström | |
|
ac7745 | 2001-06-13 | Per Hedbor | |
|
14179b | 1997-01-29 | Per Hedbor | | {
|
3342dd | 2001-01-19 | Per Hedbor | | User uid;
foreach( user_databases(), UserDB m )
|
ac7745 | 2001-06-13 | Per Hedbor | | if( uid = m->find_user_from_uid( u,id ) )
|
3342dd | 2001-01-19 | Per Hedbor | | return uid->compat_userinfo();
|
14179b | 1997-01-29 | Per Hedbor | | }
|
e3f466 | 2001-01-19 | Per Hedbor | | UserDB find_user_database( string name )
|
96d86e | 2001-01-29 | Per Hedbor | |
|
e3f466 | 2001-01-19 | Per Hedbor | | {
foreach( user_databases(), UserDB m )
if( m->name == name )
return m;
}
AuthModule find_auth_module( string name )
|
96d86e | 2001-01-29 | Per Hedbor | |
|
e3f466 | 2001-01-19 | Per Hedbor | | {
foreach( auth_modules(), AuthModule m )
if( m->name == name )
return m;
}
|
3342dd | 2001-01-19 | Per Hedbor | |
|
96d86e | 2001-01-29 | Per Hedbor | | User authenticate( RequestID id, UserDB|void database)
|
3342dd | 2001-01-19 | Per Hedbor | |
|
96d86e | 2001-01-29 | Per Hedbor | |
|
3342dd | 2001-01-19 | Per Hedbor | |
|
0cde96 | 2001-01-21 | Per Hedbor | |
|
3342dd | 2001-01-19 | Per Hedbor | | {
User u;
|
9a4c05 | 2001-01-28 | Per Hedbor | | foreach( auth_modules(), AuthModule method )
if( u = method->authenticate( id, database ) )
return id->misc->authenticated_user = u;
|
3342dd | 2001-01-19 | Per Hedbor | | }
|
96d86e | 2001-01-29 | Per Hedbor | | mapping authenticate_throw( RequestID id, string realm,
UserDB|void database)
|
3342dd | 2001-01-19 | Per Hedbor | |
|
96d86e | 2001-01-29 | Per Hedbor | |
|
3342dd | 2001-01-19 | Per Hedbor | | {
mapping m;
|
9a4c05 | 2001-01-28 | Per Hedbor | | foreach( auth_modules(), AuthModule method )
if( m = method->authenticate_throw( id, realm, database ) )
return m;
|
96d86e | 2001-01-29 | Per Hedbor | | }
User find_user( string user, RequestID|void id )
|
ac7745 | 2001-06-13 | Per Hedbor | |
|
96d86e | 2001-01-29 | Per Hedbor | | {
User uid;
|
d2fcaf | 2001-01-30 | Per Hedbor | | if( id && id->misc->authenticated_user
|
ac7745 | 2001-06-13 | Per Hedbor | | && ( uid = id->misc->authenticated_user->database->find_user(user,id)))
|
96d86e | 2001-01-29 | Per Hedbor | | return uid;
foreach( user_databases(), UserDB m )
|
ac7745 | 2001-06-13 | Per Hedbor | | if( uid = m->find_user( user,id ) )
|
96d86e | 2001-01-29 | Per Hedbor | | return uid;
}
|
ac7745 | 2001-06-13 | Per Hedbor | | array(string) list_users(RequestID|void id)
|
d2fcaf | 2001-01-30 | Per Hedbor | |
|
ac7745 | 2001-06-13 | Per Hedbor | |
|
d2fcaf | 2001-01-30 | Per Hedbor | | {
array(string) list = ({});
foreach( user_databases(), UserDB m )
|
ac7745 | 2001-06-13 | Per Hedbor | | list |= m->list_users(id);
|
d2fcaf | 2001-01-30 | Per Hedbor | | return list;
}
|
ac7745 | 2001-06-13 | Per Hedbor | | array(string) list_groups(RequestID|void id)
|
d2fcaf | 2001-01-30 | Per Hedbor | |
|
ac7745 | 2001-06-13 | Per Hedbor | |
|
d2fcaf | 2001-01-30 | Per Hedbor | | {
array(string) list = ({});
foreach( user_databases(), UserDB m )
|
ac7745 | 2001-06-13 | Per Hedbor | | list |= m->list_groups(id);
|
d2fcaf | 2001-01-30 | Per Hedbor | | return list;
}
|
96d86e | 2001-01-29 | Per Hedbor | | Group find_group( string group, RequestID|void id )
|
ac7745 | 2001-06-13 | Per Hedbor | |
|
96d86e | 2001-01-29 | Per Hedbor | | {
Group uid;
|
d2fcaf | 2001-01-30 | Per Hedbor | | if( id && id->misc->authenticated_user
|
96d86e | 2001-01-29 | Per Hedbor | | && ( uid = id->misc->authenticated_user->database->find_group( group ) ))
return uid;
foreach( user_databases(), UserDB m )
|
ac7745 | 2001-06-13 | Per Hedbor | | if( uid = m->find_group( group,id ) )
|
96d86e | 2001-01-29 | Per Hedbor | | return uid;
|
3342dd | 2001-01-19 | Per Hedbor | | }
|
9c1900 | 2001-02-27 | Per Hedbor | | string last_modified_by(Stdio.File file, RequestID id)
|
6103bc | 1999-10-09 | Henrik Grubbström (Grubba) | | {
|
1f4a6c | 2000-08-28 | Per Hedbor | | Stat s;
|
6103bc | 1999-10-09 | Henrik Grubbström (Grubba) | | int uid;
|
9f9fc3 | 2000-02-17 | Per Hedbor | | array u;
|
10c7e1 | 1999-12-28 | Martin Nilsson | |
|
6103bc | 1999-10-09 | Henrik Grubbström (Grubba) | | if(objectp(file)) s=file->stat();
if(!s || sizeof(s)<5) return "A. Nonymous";
uid=s[5];
u=user_from_uid(uid, id);
if(u) return u[0];
return "A. Nonymous";
}
|
14179b | 1997-01-29 | Per Hedbor | |
private mapping internal_gopher_image(string from)
{
sscanf(from, "%s.gif", from);
sscanf(from, "%s.jpg", from);
from -= ".";
|
1c7823 | 2000-03-13 | Per Hedbor | | Stdio.File f = lopen("roxen-images/dir/"+from+".gif","r");
if (f)
|
584884 | 2000-08-28 | Per Hedbor | | return (["file":f, "type":"image/gif", "stat":f->stat(),]);
else
|
06026c | 1999-10-19 | Henrik Grubbström (Grubba) | | return 0;
|
584884 | 2000-08-28 | Per Hedbor | |
|
14179b | 1997-01-29 | Per Hedbor | | }
private static int nest = 0;
|
10c7e1 | 1999-12-28 | Martin Nilsson | |
|
14179b | 1997-01-29 | Per Hedbor | | #ifdef MODULE_LEVEL_SECURITY
private mapping misc_cache=([]);
|
3e3bab | 2001-01-19 | Per Hedbor | | int|mapping check_security(function|RoxenModule a, RequestID id,
void|int slevel)
|
14179b | 1997-01-29 | Per Hedbor | | {
array seclevels;
|
12a9c5 | 1997-08-11 | Henrik Grubbström (Grubba) | |
|
193535 | 1997-04-28 | Henrik Grubbström (Grubba) | |
|
bc0fa0 | 2001-03-08 | Per Hedbor | | if(!(seclevels = misc_cache[ a ]))
{
|
3e3bab | 2001-01-19 | Per Hedbor | | RoxenModule mod = Roxen.get_owning_module (a);
|
ab7c31 | 2000-08-12 | Martin Stjernholm | | if(mod && mod->query_seclevels)
|
3b1783 | 1998-11-22 | Per Hedbor | | misc_cache[ a ] = seclevels = ({
|
2b8642 | 2000-06-29 | Martin Stjernholm | | mod->query_seclevels(),
mod->query("_seclvl"),
|
3b1783 | 1998-11-22 | Per Hedbor | | });
else
|
bc0fa0 | 2001-03-08 | Per Hedbor | | misc_cache[ a ] = seclevels = ({0,0});
|
2b8642 | 2000-06-29 | Martin Stjernholm | | }
|
14179b | 1997-01-29 | Per Hedbor | |
|
bc0fa0 | 2001-03-08 | Per Hedbor | | if(slevel && (seclevels[1] > slevel))
|
14179b | 1997-01-29 | Per Hedbor | | return 1;
|
10c7e1 | 1999-12-28 | Martin Nilsson | |
|
18be21 | 1998-05-07 | Henrik Grubbström (Grubba) | | mixed err;
|
bc0fa0 | 2001-03-08 | Per Hedbor | | if( function(RequestID:int|mapping) f = seclevels[0] )
err=catch { return f( id ); };
else
return 0;
|
18be21 | 1998-05-07 | Henrik Grubbström (Grubba) | |
|
bc0fa0 | 2001-03-08 | Per Hedbor | | report_error("check_security(): %s:\n%s\n",
LOC_M(39, "Error during module security check"),
describe_backtrace(err));
|
18be21 | 1998-05-07 | Henrik Grubbström (Grubba) | |
|
bc0fa0 | 2001-03-08 | Per Hedbor | | return 1;
|
14179b | 1997-01-29 | Per Hedbor | | }
#endif
|
8cc31b | 1997-10-12 | Henrik Grubbström (Grubba) | | void invalidate_cache()
|
14179b | 1997-01-29 | Per Hedbor | | {
last_module_cache = 0;
filter_module_cache = 0;
|
3342dd | 2001-01-19 | Per Hedbor | | userdb_module_cache = 0;
auth_module_cache = 0;
|
14179b | 1997-01-29 | Per Hedbor | | first_module_cache = 0;
url_module_cache = 0;
location_module_cache = 0;
logger_module_cache = 0;
file_extension_module_cache = ([]);
|
ae32d0 | 1998-03-23 | David Hedbor | | provider_module_cache = ([]);
|
14179b | 1997-01-29 | Per Hedbor | | #ifdef MODULE_LEVEL_SECURITY
|
bc0fa0 | 2001-03-08 | Per Hedbor | | misc_cache = ([ ]);
|
14179b | 1997-01-29 | Per Hedbor | | #endif
}
|
ec058c | 1998-07-04 | Henrik Grubbström (Grubba) | |
void clear_memory_caches()
{
invalidate_cache();
|
10c7e1 | 1999-12-28 | Martin Nilsson | | foreach(indices(otomod), RoxenModule m)
if (m && m->clear_memory_caches)
if (mixed err = catch( m->clear_memory_caches() ))
|
434bac | 2000-07-14 | Andreas Lange | | report_error("clear_memory_caches() "+
|
49cd28 | 2000-08-11 | Andreas Lange | | LOC_M(40, "failed for module %O:\n%s\n"),
|
67f60e | 2000-07-09 | Martin Nilsson | | otomod[m], describe_backtrace(err));
|
ec058c | 1998-07-04 | Henrik Grubbström (Grubba) | | }
|
7de44b | 2000-09-13 | Jonas Wallden | |
|
9a8a15 | 2000-09-25 | Per Hedbor | | static array(string) draw_saturation_bar(int hue,int brightness, int where)
|
fc9433 | 1997-10-25 | Per Hedbor | | {
|
e351dd | 1999-11-29 | Per Hedbor | | Image.Image bar=Image.Image(30,256);
|
fc9433 | 1997-10-25 | Per Hedbor | |
for(int i=0;i<128;i++)
{
int j = i*2;
bar->line(0,j,29,j,@hsv_to_rgb(hue,255-j,brightness));
bar->line(0,j+1,29,j+1,@hsv_to_rgb(hue,255-j,brightness));
}
where = 255-where;
bar->line(0,where,29,where, 255,255,255);
|
2a346d | 2000-09-19 | Per Hedbor | | #if constant(Image.JPEG) && constant(Image.JPEG.encode)
|
7de44b | 2000-09-13 | Jonas Wallden | | return ({ Image.JPEG.encode(bar), "image/jpeg" });
|
2a346d | 2000-09-19 | Per Hedbor | | #else
return ({ Image.PNG.encode(bar), "image/png" });
|
7de44b | 2000-09-13 | Jonas Wallden | | #endif
|
fc9433 | 1997-10-25 | Per Hedbor | | }
|
14179b | 1997-01-29 | Per Hedbor | |
|
a6ef1f | 2000-03-28 | Johan Sundström | |
|
2a346d | 2000-09-19 | Per Hedbor | | private mapping internal_roxen_image( string from, RequestID id )
|
14179b | 1997-01-29 | Per Hedbor | | {
sscanf(from, "%s.gif", from);
sscanf(from, "%s.jpg", from);
|
2b658c | 2000-02-07 | Per Hedbor | | sscanf(from, "%s.xcf", from);
sscanf(from, "%s.png", from);
|
fc9433 | 1997-10-25 | Per Hedbor | |
|
1c7823 | 2000-03-13 | Per Hedbor | |
|
fc9433 | 1997-10-25 | Per Hedbor | | int hue,bright,w;
|
7de44b | 2000-09-13 | Jonas Wallden | | if(sscanf(from, "%*s:%d,%d,%d", hue, bright,w)==4) {
array bar = draw_saturation_bar(hue, bright, w);
return Roxen.http_string_answer(bar[0], bar[1]);
}
|
fc9433 | 1997-10-25 | Per Hedbor | |
|
2b658c | 2000-02-07 | Per Hedbor | | Stdio.File f;
|
731076 | 2000-09-19 | Per Hedbor | | if( !id->misc->internal_get )
if(f = lopen("roxen-images/"+from+".gif", "r"))
return (["file":f, "type":"image/gif", "stat":f->stat()]);
|
1c7823 | 2000-03-13 | Per Hedbor | | if(f = lopen("roxen-images/"+from+".png", "r"))
|
584884 | 2000-08-28 | Per Hedbor | | return (["file":f, "type":"image/png", "stat":f->stat()]);
|
731076 | 2000-09-19 | Per Hedbor | |
if(f = lopen("roxen-images/"+from+".jpg", "r"))
return (["file":f, "type":"image/jpeg", "stat":f->stat()]);
|
1c7823 | 2000-03-13 | Per Hedbor | | if(f = lopen("roxen-images/"+from+".xcf", "r"))
|
584884 | 2000-08-28 | Per Hedbor | | return (["file":f, "type":"image/x-gimp-image", "stat":f->stat()]);
|
731076 | 2000-09-19 | Per Hedbor | |
if(f = lopen("roxen-images/"+from+".gif", "r"))
return (["file":f, "type":"image/gif", "stat":f->stat()]);
|
2b658c | 2000-02-07 | Per Hedbor | |
return 0;
|
14179b | 1997-01-29 | Per Hedbor | | }
mapping (mixed:function|int) locks = ([]);
#ifdef THREADS
|
e5bad2 | 1998-02-10 | Per Hedbor | |
|
e6aff0 | 1997-05-25 | Henrik Grubbström (Grubba) | |
|
55a89e | 1997-09-14 | Per Hedbor | | mapping locked = ([]), thread_safe = ([]);
|
e351dd | 1999-11-29 | Per Hedbor | | mixed _lock(object|function f)
|
14179b | 1997-01-29 | Per Hedbor | | {
|
3e3bab | 2001-01-19 | Per Hedbor | | Thread.MutexKey key;
|
1fab6f | 1997-09-03 | Henrik Grubbström (Grubba) | | function|int l;
|
9c1900 | 2001-02-27 | Per Hedbor | | TIMER_START(module_lock);
|
1fab6f | 1997-09-03 | Henrik Grubbström (Grubba) | | if (functionp(f)) {
f = function_object(f);
}
|
55a89e | 1997-09-14 | Per Hedbor | | if (l = locks[f])
{
if (l != -1)
{
|
1fab6f | 1997-09-03 | Henrik Grubbström (Grubba) | |
|
beb1f2 | 1998-05-23 | Mattias Wingstedt | | catch{
|
91d3c3 | 2001-03-12 | Martin Nilsson | |
|
55a89e | 1997-09-14 | Per Hedbor | | locked[f]++;
|
1fab6f | 1997-09-03 | Henrik Grubbström (Grubba) | | key = l();
|
beb1f2 | 1998-05-23 | Mattias Wingstedt | | };
|
55a89e | 1997-09-14 | Per Hedbor | | } else
thread_safe[f]++;
|
1fab6f | 1997-09-03 | Henrik Grubbström (Grubba) | | } else if (f->thread_safe) {
locks[f]=-1;
|
55a89e | 1997-09-14 | Per Hedbor | | thread_safe[f]++;
|
14179b | 1997-01-29 | Per Hedbor | | } else {
|
55a89e | 1997-09-14 | Per Hedbor | | if (!locks[f])
{
|
1fab6f | 1997-09-03 | Henrik Grubbström (Grubba) | |
|
e5bad2 | 1998-02-10 | Per Hedbor | | l = Thread.Mutex()->lock;
|
1fab6f | 1997-09-03 | Henrik Grubbström (Grubba) | | if (!locks[f]) {
locks[f]=l;
}
|
14179b | 1997-01-29 | Per Hedbor | | }
|
91d3c3 | 2001-03-12 | Martin Nilsson | |
|
55a89e | 1997-09-14 | Per Hedbor | | locked[f]++;
|
1fab6f | 1997-09-03 | Henrik Grubbström (Grubba) | | key = l();
|
b1fca0 | 1996-11-12 | Per Hedbor | | }
|
9c1900 | 2001-02-27 | Per Hedbor | | TIMER_END(module_lock);
|
14179b | 1997-01-29 | Per Hedbor | | return key;
|
b1fca0 | 1996-11-12 | Per Hedbor | | }
|
14179b | 1997-01-29 | Per Hedbor | | #define LOCK(X) key=_lock(X)
|
d7b087 | 1997-08-31 | Per Hedbor | | #define UNLOCK() do{key=0;}while(0)
|
14179b | 1997-01-29 | Per Hedbor | | #else
#define LOCK(X)
|
c95bd5 | 1998-01-30 | Henrik Grubbström (Grubba) | | #define UNLOCK()
|
14179b | 1997-01-29 | Per Hedbor | | #endif
|
a1334f | 1998-02-20 | Mirar (Pontus Hagland) | | string examine_return_mapping(mapping m)
{
string res;
if (m->extra_heads)
m->extra_heads=mkmapping(Array.map(indices(m->extra_heads),
lower_case),
values(m->extra_heads));
else
m->extra_heads=([]);
switch (m->error||200)
{
case 302:
|
10c7e1 | 1999-12-28 | Martin Nilsson | | if (m->extra_heads &&
|
a1334f | 1998-02-20 | Mirar (Pontus Hagland) | | (m->extra_heads->location))
|
1a89f4 | 2000-08-14 | Martin Stjernholm | | res = sprintf("Returned redirect to %s ", m->extra_heads->location);
|
a1334f | 1998-02-20 | Mirar (Pontus Hagland) | | else
|
1a89f4 | 2000-08-14 | Martin Stjernholm | | res = "Returned redirect, but no location header. ";
|
a1334f | 1998-02-20 | Mirar (Pontus Hagland) | | break;
case 401:
if (m->extra_heads["www-authenticate"])
|
1a89f4 | 2000-08-14 | Martin Stjernholm | | res = sprintf("Returned authentication failed: %s ",
|
67f60e | 2000-07-09 | Martin Nilsson | | m->extra_heads["www-authenticate"]);
|
a1334f | 1998-02-20 | Mirar (Pontus Hagland) | | else
|
1a89f4 | 2000-08-14 | Martin Stjernholm | | res = "Returned authentication failed. ";
|
a1334f | 1998-02-20 | Mirar (Pontus Hagland) | | break;
case 200:
|
1a89f4 | 2000-08-14 | Martin Stjernholm | | res = "Returned ok. ";
|
a1334f | 1998-02-20 | Mirar (Pontus Hagland) | | break;
|
a8f1b3 | 2000-01-31 | Per Hedbor | |
|
a1334f | 1998-02-20 | Mirar (Pontus Hagland) | | default:
|
1a89f4 | 2000-08-14 | Martin Stjernholm | | res = sprintf("Returned %d. ", m->error);
|
a1334f | 1998-02-20 | Mirar (Pontus Hagland) | | }
if (!zero_type(m->len))
if (m->len<0)
|
434bac | 2000-07-14 | Andreas Lange | | res += "No data ";
|
a1334f | 1998-02-20 | Mirar (Pontus Hagland) | | else
|
434bac | 2000-07-14 | Andreas Lange | | res += sprintf("%d bytes ", m->len);
|
a1334f | 1998-02-20 | Mirar (Pontus Hagland) | | else if (stringp(m->data))
|
434bac | 2000-07-14 | Andreas Lange | | res += sprintf("%d bytes ", strlen(m->data));
|
a1334f | 1998-02-20 | Mirar (Pontus Hagland) | | else if (objectp(m->file))
if (catch {
|
1f4a6c | 2000-08-28 | Per Hedbor | | Stat a=m->file->stat();
|
434bac | 2000-07-14 | Andreas Lange | | res += sprintf("%d bytes ", a[1]-m->file->tell());
|
b46164 | 1998-10-11 | Henrik Grubbström (Grubba) | | })
|
1a89f4 | 2000-08-14 | Martin Stjernholm | | res += "? bytes ";
|
a1334f | 1998-02-20 | Mirar (Pontus Hagland) | |
|
1a89f4 | 2000-08-14 | Martin Stjernholm | | if (m->data) res += "(static)";
|
434bac | 2000-07-14 | Andreas Lange | | else if (m->file) res += "(open file)";
|
a1334f | 1998-02-20 | Mirar (Pontus Hagland) | |
|
dffa22 | 2000-12-10 | Per Hedbor | | if (stringp(m->extra_heads["content-type"]) ||
|
b46164 | 1998-10-11 | Henrik Grubbström (Grubba) | | stringp(m->type)) {
|
dffa22 | 2000-12-10 | Per Hedbor | | res += sprintf(" of %s", m->type||m->extra_heads["content-type"]);
|
b46164 | 1998-10-11 | Henrik Grubbström (Grubba) | | }
|
a1334f | 1998-02-20 | Mirar (Pontus Hagland) | |
|
67f60e | 2000-07-09 | Martin Nilsson | | res+="<br />";
|
a1334f | 1998-02-20 | Mirar (Pontus Hagland) | |
return res;
}
|
c5e096 | 1999-10-04 | Per Hedbor | |
|
cd9287 | 2000-08-15 | Johan Sundström | | mapping|int(-1..0) low_get_file(RequestID id, int|void no_magic)
|
14179b | 1997-01-29 | Per Hedbor | | {
#ifdef MODULE_LEVEL_SECURITY
int slevel;
#endif
#ifdef THREADS
|
3e3bab | 2001-01-19 | Per Hedbor | | Thread.MutexKey key;
|
14179b | 1997-01-29 | Per Hedbor | | #endif
|
db5f6b | 2001-07-31 | Per Hedbor | |
id->not_query = VFS.normalize_path( id->not_query );
|
5655dc | 2001-06-06 | Per Hedbor | |
|
434bac | 2000-07-14 | Andreas Lange | | TRACE_ENTER(sprintf("Request for %s", id->not_query), 0);
|
14179b | 1997-01-29 | Per Hedbor | |
string file=id->not_query;
string loc;
function funp;
mixed tmp, tmp2;
|
cd9287 | 2000-08-15 | Johan Sundström | | mapping|object(Stdio.File)|int fid;
|
14179b | 1997-01-29 | Per Hedbor | |
if(!no_magic)
{
|
9c1900 | 2001-02-27 | Per Hedbor | | TIMER_START(internal_magic);
|
41b77c | 1999-07-15 | David Hedbor | | #ifndef NO_INTERNAL_HACK
|
fd9302 | 2000-05-05 | Martin Nilsson | |
|
41b77c | 1999-07-15 | David Hedbor | |
|
fd9302 | 2000-05-05 | Martin Nilsson | | string type;
|
67f60e | 2000-07-09 | Martin Nilsson | | if(sizeof(file) > 17 &&
|
51d4d2 | 2001-01-04 | Martin Nilsson | | #if ROXEN_COMPAT <= 2.1
|
67f60e | 2000-07-09 | Martin Nilsson | | (file[0] == '/') &&
|
cd9287 | 2000-08-15 | Johan Sundström | | sscanf(file, "%*s/internal-%s-%[^/]", type, loc) == 3
|
67f60e | 2000-07-09 | Martin Nilsson | | #else
|
cd9287 | 2000-08-15 | Johan Sundström | | sscanf(file, "/internal-%s-%[^/]", type, loc) == 2
|
67f60e | 2000-07-09 | Martin Nilsson | | #endif
|
cd9287 | 2000-08-15 | Johan Sundström | | ) {
|
41b77c | 1999-07-15 | David Hedbor | | switch(type) {
|
fd9302 | 2000-05-05 | Martin Nilsson | | case "roxen":
|
a7d034 | 2000-11-13 | Martin Nilsson | | TRACE_LEAVE("Magic internal roxen image");
|
5eb283 | 2001-01-03 | Martin Nilsson | | if(loc=="unit" || loc=="pixel-of-destiny")
|
9c1900 | 2001-02-27 | Per Hedbor | | {
TIMER_END(internal_magic);
return (["data":"GIF89a\1\0\1\0\200ÿ\0ÀÀÀ\0\0\0!ù\4\1\0\0\0\0,"
"\0\0\0\0\1\0\1\0\0\1\1""2\0;",
|
a7d034 | 2000-11-13 | Martin Nilsson | | "type":"image/gif" ]);
|
9c1900 | 2001-02-27 | Per Hedbor | | }
|
5eb283 | 2001-01-03 | Martin Nilsson | | if(has_prefix(loc, "pixel-"))
|
9c1900 | 2001-02-27 | Per Hedbor | | {
TIMER_END(internal_magic);
return (["data":sprintf("GIF89a\1\0\1\0\200\0\0\0\0\0%c%c%c,\0\0\0"
"\0\1\0\1\0\0\2\2L\1\0;",
|
5eb283 | 2001-01-03 | Martin Nilsson | | @parse_color(loc[6..])),
"type":"image/gif" ]);
|
9c1900 | 2001-02-27 | Per Hedbor | | }
TIMER_END(internal_magic);
|
2a346d | 2000-09-19 | Per Hedbor | | return internal_roxen_image(loc, id);
|
fd9302 | 2000-05-05 | Martin Nilsson | |
|
41b77c | 1999-07-15 | David Hedbor | | case "gopher":
|
a7d034 | 2000-11-13 | Martin Nilsson | | TRACE_LEAVE("Magic internal gopher image");
|
9c1900 | 2001-02-27 | Per Hedbor | | TIMER_END(internal_magic);
|
14179b | 1997-01-29 | Per Hedbor | | return internal_gopher_image(loc);
|
41d0f9 | 1998-02-20 | Per Hedbor | | }
|
14179b | 1997-01-29 | Per Hedbor | | }
#endif
|
10c7e1 | 1999-12-28 | Martin Nilsson | |
|
fd9302 | 2000-05-05 | Martin Nilsson | |
|
8552d9 | 2001-01-13 | Martin Nilsson | | if(!search(file, query("InternalLoc")))
|
5839c3 | 1999-01-22 | Marcus Comstedt | | {
|
434bac | 2000-07-14 | Andreas Lange | | TRACE_ENTER("Magic internal module location", 0);
|
e351dd | 1999-11-29 | Per Hedbor | | RoxenModule module;
|
5839c3 | 1999-01-22 | Marcus Comstedt | | string name, rest;
function find_internal;
|
8552d9 | 2001-01-13 | Martin Nilsson | | if(2==sscanf(file[strlen(query("InternalLoc"))..], "%s/%s", name, rest) &&
|
5839c3 | 1999-01-22 | Marcus Comstedt | | (module = find_module(replace(name, "!", "#"))) &&
(find_internal = module->find_internal))
{
#ifdef MODULE_LEVEL_SECURITY
if(tmp2 = check_security(find_internal, id, slevel))
if(intp(tmp2))
{
|
434bac | 2000-07-14 | Andreas Lange | | TRACE_LEAVE("Permission to access module denied.");
|
5839c3 | 1999-01-22 | Marcus Comstedt | | find_internal = 0;
} else {
TRACE_LEAVE("");
|
434bac | 2000-07-14 | Andreas Lange | | TRACE_LEAVE("Request denied.");
|
9c1900 | 2001-02-27 | Per Hedbor | | TIMER_END(internal_magic);
|
5839c3 | 1999-01-22 | Marcus Comstedt | | return tmp2;
}
#endif
|
41b77c | 1999-07-15 | David Hedbor | | if(find_internal)
|
5839c3 | 1999-01-22 | Marcus Comstedt | | {
|
434bac | 2000-07-14 | Andreas Lange | | TRACE_ENTER("Calling find_internal()...", find_internal);
|
471705 | 2001-05-07 | Per Hedbor | | PROF_ENTER("find_internal","location");
|
5839c3 | 1999-01-22 | Marcus Comstedt | | LOCK(find_internal);
fid=find_internal( rest, id );
UNLOCK();
|
434bac | 2000-07-14 | Andreas Lange | | TRACE_LEAVE(sprintf("find_internal has returned %O", fid));
|
471705 | 2001-05-07 | Per Hedbor | | PROF_LEAVE("find_internal","location");
|
5839c3 | 1999-01-22 | Marcus Comstedt | | if(fid)
{
if(mappingp(fid))
{
TRACE_LEAVE("");
TRACE_LEAVE(examine_return_mapping(fid));
|
9c1900 | 2001-02-27 | Per Hedbor | | TIMER_END(internal_magic);
|
5839c3 | 1999-01-22 | Marcus Comstedt | | return fid;
}
else
{
#ifdef MODULE_LEVEL_SECURITY
int oslevel = slevel;
slevel = misc_cache[ find_internal ][1];
id->misc->seclevel = slevel;
#endif
if(objectp(fid))
|
434bac | 2000-07-14 | Andreas Lange | | TRACE_LEAVE("Returned open filedescriptor. "
|
5839c3 | 1999-01-22 | Marcus Comstedt | | #ifdef MODULE_LEVEL_SECURITY
+(slevel != oslevel?
|
434bac | 2000-07-14 | Andreas Lange | | sprintf(" The security level is now %d.", slevel):"")
|
5839c3 | 1999-01-22 | Marcus Comstedt | | #endif
|
67f60e | 2000-07-09 | Martin Nilsson | | );
|
5839c3 | 1999-01-22 | Marcus Comstedt | | else
|
434bac | 2000-07-14 | Andreas Lange | | TRACE_LEAVE("Returned directory indicator."
|
5839c3 | 1999-01-22 | Marcus Comstedt | | #ifdef MODULE_LEVEL_SECURITY
+(oslevel != slevel?
|
434bac | 2000-07-14 | Andreas Lange | | sprintf(" The security level is now %d.", slevel):"")
|
5839c3 | 1999-01-22 | Marcus Comstedt | | #endif
);
}
} else
TRACE_LEAVE("");
} else
TRACE_LEAVE("");
} else
TRACE_LEAVE("");
}
|
9c1900 | 2001-02-27 | Per Hedbor | | TIMER_END(internal_magic);
|
14179b | 1997-01-29 | Per Hedbor | | }
|
10c7e1 | 1999-12-28 | Martin Nilsson | |
|
5839c3 | 1999-01-22 | Marcus Comstedt | | if(!fid)
{
|
14179b | 1997-01-29 | Per Hedbor | | #ifdef URL_MODULES
|
f12890 | 1997-08-15 | Henrik Grubbström (Grubba) | |
|
9c1900 | 2001-02-27 | Per Hedbor | | TIMER_START(url_modules);
|
517c7e | 2000-09-30 | Per Hedbor | | foreach(url_module_cache||url_modules(), funp)
|
41d0f9 | 1998-02-20 | Per Hedbor | | {
|
471705 | 2001-05-07 | Per Hedbor | | PROF_ENTER(Roxen.get_owning_module(funp)->module_name,"url module");
|
5839c3 | 1999-01-22 | Marcus Comstedt | | LOCK(funp);
|
434bac | 2000-07-14 | Andreas Lange | | TRACE_ENTER("URL module", funp);
|
5839c3 | 1999-01-22 | Marcus Comstedt | | tmp=funp( id, file );
UNLOCK();
|
471705 | 2001-05-07 | Per Hedbor | | PROF_LEAVE(Roxen.get_owning_module(funp)->module_name,"url module");
|
10c7e1 | 1999-12-28 | Martin Nilsson | |
if(mappingp(tmp))
|
5839c3 | 1999-01-22 | Marcus Comstedt | | {
TRACE_LEAVE("");
|
434bac | 2000-07-14 | Andreas Lange | | TRACE_LEAVE("Returning data");
|
9c1900 | 2001-02-27 | Per Hedbor | | TIMER_END(url_modules);
|
5839c3 | 1999-01-22 | Marcus Comstedt | | return tmp;
}
if(objectp( tmp ))
{
array err;
|
a8f1b3 | 2000-01-31 | Per Hedbor | |
|
5839c3 | 1999-01-22 | Marcus Comstedt | | nest ++;
err = catch {
if( nest < 20 )
tmp = (id->conf || this_object())->low_get_file( tmp, no_magic );
else
{
|
434bac | 2000-07-14 | Andreas Lange | | TRACE_LEAVE("Too deep recursion");
|
5839c3 | 1999-01-22 | Marcus Comstedt | | error("Too deep recursion in roxen::get_file() while mapping "
+file+".\n");
}
};
nest = 0;
if(err) throw(err);
TRACE_LEAVE("");
|
434bac | 2000-07-14 | Andreas Lange | | TRACE_LEAVE("Returning data");
|
9c1900 | 2001-02-27 | Per Hedbor | | TIMER_END(url_modules);
|
5839c3 | 1999-01-22 | Marcus Comstedt | | return tmp;
}
|
41d0f9 | 1998-02-20 | Per Hedbor | | TRACE_LEAVE("");
|
9c1900 | 2001-02-27 | Per Hedbor | | TIMER_END(url_modules);
|
41d0f9 | 1998-02-20 | Per Hedbor | | }
|
14179b | 1997-01-29 | Per Hedbor | | #endif
|
c5e096 | 1999-10-04 | Per Hedbor | |
|
9c1900 | 2001-02-27 | Per Hedbor | | TIMER_START(location_modules);
|
517c7e | 2000-09-30 | Per Hedbor | | foreach(location_module_cache||location_modules(), tmp)
|
14179b | 1997-01-29 | Per Hedbor | | {
|
5839c3 | 1999-01-22 | Marcus Comstedt | | loc = tmp[0];
|
41b77c | 1999-07-15 | David Hedbor | | if(!search(file, loc))
|
5839c3 | 1999-01-22 | Marcus Comstedt | | {
|
434bac | 2000-07-14 | Andreas Lange | | TRACE_ENTER(sprintf("Location module [%s] ", loc), tmp[1]);
|
df8d71 | 1998-02-27 | Per Hedbor | | #ifdef MODULE_LEVEL_SECURITY
|
5839c3 | 1999-01-22 | Marcus Comstedt | | if(tmp2 = check_security(tmp[1], id, slevel))
if(intp(tmp2))
{
|
434bac | 2000-07-14 | Andreas Lange | | TRACE_LEAVE("Permission to access module denied.");
|
5839c3 | 1999-01-22 | Marcus Comstedt | | continue;
} else {
TRACE_LEAVE("");
|
434bac | 2000-07-14 | Andreas Lange | | TRACE_LEAVE("Request denied.");
|
9c1900 | 2001-02-27 | Per Hedbor | | TIMER_END(location_modules);
|
5839c3 | 1999-01-22 | Marcus Comstedt | | return tmp2;
}
|
14179b | 1997-01-29 | Per Hedbor | | #endif
|
7937df | 2001-05-16 | Per Hedbor | | PROF_ENTER(Roxen.get_owning_module(tmp[1])->module_name,"location");
|
434bac | 2000-07-14 | Andreas Lange | | TRACE_ENTER("Calling find_file()...", 0);
|
5839c3 | 1999-01-22 | Marcus Comstedt | | LOCK(tmp[1]);
fid=tmp[1]( file[ strlen(loc) .. ] + id->extra_extension, id);
UNLOCK();
|
b8b107 | 2000-03-24 | Per Hedbor | | TRACE_LEAVE("");
|
7937df | 2001-05-16 | Per Hedbor | | PROF_LEAVE(Roxen.get_owning_module(tmp[1])->module_name,"location");
|
5839c3 | 1999-01-22 | Marcus Comstedt | | if(fid)
|
14179b | 1997-01-29 | Per Hedbor | | {
|
5839c3 | 1999-01-22 | Marcus Comstedt | | id->virtfile = loc;
|
a8f1b3 | 2000-01-31 | Per Hedbor | |
|
5839c3 | 1999-01-22 | Marcus Comstedt | | if(mappingp(fid))
{
TRACE_LEAVE("");
TRACE_LEAVE(examine_return_mapping(fid));
|
9c1900 | 2001-02-27 | Per Hedbor | | TIMER_END(location_modules);
|
5839c3 | 1999-01-22 | Marcus Comstedt | | return fid;
}
else
{
|
14179b | 1997-01-29 | Per Hedbor | | #ifdef MODULE_LEVEL_SECURITY
|
5839c3 | 1999-01-22 | Marcus Comstedt | | int oslevel = slevel;
slevel = misc_cache[ tmp[1] ][1];
id->misc->seclevel = slevel;
|
14179b | 1997-01-29 | Per Hedbor | | #endif
|
5839c3 | 1999-01-22 | Marcus Comstedt | | if(objectp(fid))
|
434bac | 2000-07-14 | Andreas Lange | | TRACE_LEAVE("Returned open filedescriptor."
|
41d0f9 | 1998-02-20 | Per Hedbor | | #ifdef MODULE_LEVEL_SECURITY
|
5839c3 | 1999-01-22 | Marcus Comstedt | | +(slevel != oslevel?
|
434bac | 2000-07-14 | Andreas Lange | | sprintf(" The security level is now %d.", slevel):"")
|
41d0f9 | 1998-02-20 | Per Hedbor | | #endif
|
a8f1b3 | 2000-01-31 | Per Hedbor | |
|
67f60e | 2000-07-09 | Martin Nilsson | | );
|
5839c3 | 1999-01-22 | Marcus Comstedt | | else
|
434bac | 2000-07-14 | Andreas Lange | | TRACE_LEAVE("Returned directory indicator."
|
41d0f9 | 1998-02-20 | Per Hedbor | | #ifdef MODULE_LEVEL_SECURITY
|
5839c3 | 1999-01-22 | Marcus Comstedt | | +(oslevel != slevel?
|
434bac | 2000-07-14 | Andreas Lange | | sprintf(" The security level is now %d.", slevel):"")
|
41d0f9 | 1998-02-20 | Per Hedbor | | #endif
|
5839c3 | 1999-01-22 | Marcus Comstedt | | );
break;
}
} else
TRACE_LEAVE("");
|
41b77c | 1999-07-15 | David Hedbor | | } else if(strlen(loc)-1==strlen(file) && file+"/" == loc) {
|
10c7e1 | 1999-12-28 | Martin Nilsson | |
|
5839c3 | 1999-01-22 | Marcus Comstedt | |
|
67f60e | 2000-07-09 | Martin Nilsson | |
|
434bac | 2000-07-14 | Andreas Lange | | TRACE_ENTER("Automatic redirect to location_module.", tmp[1]);
TRACE_LEAVE("Returning data");
|
a8f1b3 | 2000-01-31 | Per Hedbor | |
|
41b77c | 1999-07-15 | David Hedbor | |
|
fd9302 | 2000-05-05 | Martin Nilsson | |
|
dfe036 | 2000-03-19 | Martin Nilsson | | string new_query = Roxen.http_encode_string(id->not_query) + "/" +
|
41b77c | 1999-07-15 | David Hedbor | | (id->query?("?"+id->query):"");
|
fd9302 | 2000-05-05 | Martin Nilsson | | new_query=Roxen.add_pre_state(new_query, id->prestate);
|
a8f1b3 | 2000-01-31 | Per Hedbor | |
|
9c1900 | 2001-02-27 | Per Hedbor | | TIMER_END(location_modules);
|
dfe036 | 2000-03-19 | Martin Nilsson | | return Roxen.http_redirect(new_query, id);
|
41d0f9 | 1998-02-20 | Per Hedbor | | }
|
14179b | 1997-01-29 | Per Hedbor | | }
|
9c1900 | 2001-02-27 | Per Hedbor | | TIMER_END(location_modules);
|
14179b | 1997-01-29 | Per Hedbor | | }
|
10c7e1 | 1999-12-28 | Martin Nilsson | |
|
14179b | 1997-01-29 | Per Hedbor | | if(fid == -1)
{
|
41d0f9 | 1998-02-20 | Per Hedbor | | if(no_magic)
{
|
434bac | 2000-07-14 | Andreas Lange | | TRACE_LEAVE("No magic requested. Returning -1.");
|
41d0f9 | 1998-02-20 | Per Hedbor | | return -1;
}
|
9c1900 | 2001-02-27 | Per Hedbor | | TIMER_START(directory_module);
|
14179b | 1997-01-29 | Per Hedbor | | if(dir_module)
{
|
7937df | 2001-05-16 | Per Hedbor | | PROF_ENTER(dir_module->module_name,"directory");
|
14179b | 1997-01-29 | Per Hedbor | | LOCK(dir_module);
|
434bac | 2000-07-14 | Andreas Lange | | TRACE_ENTER("Directory module", dir_module);
|
14179b | 1997-01-29 | Per Hedbor | | fid = dir_module->parse_directory(id);
UNLOCK();
|
7937df | 2001-05-16 | Per Hedbor | | PROF_LEAVE(dir_module->module_name,"directory");
|
14179b | 1997-01-29 | Per Hedbor | | }
else
|
41d0f9 | 1998-02-20 | Per Hedbor | | {
|
434bac | 2000-07-14 | Andreas Lange | | TRACE_LEAVE("No directory module. Returning 'no such file'");
|
14179b | 1997-01-29 | Per Hedbor | | return 0;
|
41d0f9 | 1998-02-20 | Per Hedbor | | }
|
9c1900 | 2001-02-27 | Per Hedbor | | TIMER_END(directory_module);
|
10c7e1 | 1999-12-28 | Martin Nilsson | | if(mappingp(fid))
|
41d0f9 | 1998-02-20 | Per Hedbor | | {
|
434bac | 2000-07-14 | Andreas Lange | | TRACE_LEAVE("Returning data");
|
41d0f9 | 1998-02-20 | Per Hedbor | | return (mapping)fid;
}
|
14179b | 1997-01-29 | Per Hedbor | | }
|
10c7e1 | 1999-12-28 | Martin Nilsson | |
|
14179b | 1997-01-29 | Per Hedbor | |
|
9c1900 | 2001-02-27 | Per Hedbor | | TIMER_START(extension_module);
|
41b77c | 1999-07-15 | David Hedbor | | if(objectp(fid) &&
|
517c7e | 2000-09-30 | Per Hedbor | | (tmp = file_extension_modules(loc = Roxen.extension(id->not_query, id))))
{
|
14179b | 1997-01-29 | Per Hedbor | | foreach(tmp, funp)
{
|
434bac | 2000-07-14 | Andreas Lange | | TRACE_ENTER(sprintf("Extension module [%s] ", loc), funp);
|
14179b | 1997-01-29 | Per Hedbor | | #ifdef MODULE_LEVEL_SECURITY
if(tmp=check_security(funp, id, slevel))
if(intp(tmp))
{
|
434bac | 2000-07-14 | Andreas Lange | | TRACE_LEAVE("Permission to access module denied.");
|
14179b | 1997-01-29 | Per Hedbor | | continue;
}
else
|
41d0f9 | 1998-02-20 | Per Hedbor | | {
TRACE_LEAVE("");
|
434bac | 2000-07-14 | Andreas Lange | | TRACE_LEAVE("Permission denied");
|
9c1900 | 2001-02-27 | Per Hedbor | | TIMER_END(extension_module);
|
14179b | 1997-01-29 | Per Hedbor | | return tmp;
|
41d0f9 | 1998-02-20 | Per Hedbor | | }
|
14179b | 1997-01-29 | Per Hedbor | | #endif
|
7937df | 2001-05-16 | Per Hedbor | | PROF_ENTER(Roxen.get_owning_module(funp)->module_name,"ext");
|
14179b | 1997-01-29 | Per Hedbor | | LOCK(funp);
tmp=funp(fid, loc, id);
UNLOCK();
|
7937df | 2001-05-16 | Per Hedbor | | PROF_LEAVE(Roxen.get_owning_module(funp)->module_name,"ext");
|
14179b | 1997-01-29 | Per Hedbor | | if(tmp)
{
if(!objectp(tmp))
|
41d0f9 | 1998-02-20 | Per Hedbor | | {
TRACE_LEAVE("");
|
434bac | 2000-07-14 | Andreas Lange | | TRACE_LEAVE("Returning data");
|
9c1900 | 2001-02-27 | Per Hedbor | | TIMER_END(extension_module);
|
14179b | 1997-01-29 | Per Hedbor | | return tmp;
|
41d0f9 | 1998-02-20 | Per Hedbor | | }
|
cd9287 | 2000-08-15 | Johan Sundström | | if(fid && tmp != fid)
|
41b77c | 1999-07-15 | David Hedbor | | destruct(fid);
|
434bac | 2000-07-14 | Andreas Lange | | TRACE_LEAVE("Returned new open file");
|
14179b | 1997-01-29 | Per Hedbor | | fid = tmp;
break;
|
41d0f9 | 1998-02-20 | Per Hedbor | | } else
TRACE_LEAVE("");
|
14179b | 1997-01-29 | Per Hedbor | | }
|
41b77c | 1999-07-15 | David Hedbor | | }
|
9c1900 | 2001-02-27 | Per Hedbor | | TIMER_END(extension_module);
|
fd9302 | 2000-05-05 | Martin Nilsson | |
|
14179b | 1997-01-29 | Per Hedbor | | if(objectp(fid))
{
|
9c1900 | 2001-02-27 | Per Hedbor | | TIMER_START(content_type_module);
|
41b77c | 1999-07-15 | David Hedbor | | if(stringp(id->extension)) {
|
14179b | 1997-01-29 | Per Hedbor | | id->not_query += id->extension;
|
dfe036 | 2000-03-19 | Martin Nilsson | | loc = Roxen.extension(id->not_query, id);
|
41b77c | 1999-07-15 | David Hedbor | | }
|
434bac | 2000-07-14 | Andreas Lange | | TRACE_ENTER("Content-type mapping module", types_module);
|
41b77c | 1999-07-15 | David Hedbor | | tmp=type_from_filename(id->not_query, 1, loc);
|
3d9458 | 2000-07-31 | Martin Nilsson | | TRACE_LEAVE(tmp?sprintf("Returned type %s %s.", tmp[0], tmp[1]||"")
|
434bac | 2000-07-14 | Andreas Lange | | : "Missing type.");
|
14179b | 1997-01-29 | Per Hedbor | | if(tmp)
|
41d0f9 | 1998-02-20 | Per Hedbor | | {
TRACE_LEAVE("");
|
9c1900 | 2001-02-27 | Per Hedbor | | TIMER_END(content_type_module);
|
14179b | 1997-01-29 | Per Hedbor | | return ([ "file":fid, "type":tmp[0], "encoding":tmp[1] ]);
|
10c7e1 | 1999-12-28 | Martin Nilsson | | }
|
41d0f9 | 1998-02-20 | Per Hedbor | | TRACE_LEAVE("");
|
9c1900 | 2001-02-27 | Per Hedbor | | TIMER_END(content_type_module);
|
14179b | 1997-01-29 | Per Hedbor | | return ([ "file":fid, ]);
}
|
9c1900 | 2001-02-27 | Per Hedbor | |
|
41d0f9 | 1998-02-20 | Per Hedbor | | if(!fid)
|
434bac | 2000-07-14 | Andreas Lange | | TRACE_LEAVE("Returned 'no such file'.");
|
41d0f9 | 1998-02-20 | Per Hedbor | | else
|
434bac | 2000-07-14 | Andreas Lange | | TRACE_LEAVE("Returning data");
|
14179b | 1997-01-29 | Per Hedbor | | return fid;
}
|
e351dd | 1999-11-29 | Per Hedbor | | mixed handle_request( RequestID id )
|
c7a5f0 | 1999-02-16 | Per Hedbor | | {
function funp;
mixed file;
|
10c7e1 | 1999-12-28 | Martin Nilsson | | REQUEST_WERR("handle_request()");
|
9c1900 | 2001-02-27 | Per Hedbor | | TIMER_START(handle_request);
TIMER_START(first_modules);
|
517c7e | 2000-09-30 | Per Hedbor | | foreach(first_module_cache||first_modules(), funp)
|
c7a5f0 | 1999-02-16 | Per Hedbor | | {
|
10c7e1 | 1999-12-28 | Martin Nilsson | | if(file = funp( id ))
|
c7a5f0 | 1999-02-16 | Per Hedbor | | break;
|
cfda38 | 1999-03-28 | Henrik Grubbström (Grubba) | | if(id->conf != this_object()) {
|
10c7e1 | 1999-12-28 | Martin Nilsson | | REQUEST_WERR("handle_request(): Redirected (2)");
|
c7a5f0 | 1999-02-16 | Per Hedbor | | return id->conf->handle_request(id);
|
cfda38 | 1999-03-28 | Henrik Grubbström (Grubba) | | }
|
c7a5f0 | 1999-02-16 | Per Hedbor | | }
|
9c1900 | 2001-02-27 | Per Hedbor | | TIMER_END(first_modules);
|
fd8b15 | 1999-05-19 | David Hedbor | | if(!mappingp(file) && !mappingp(file = get_file(id)))
|
c7a5f0 | 1999-02-16 | Per Hedbor | | {
mixed ret;
|
9c1900 | 2001-02-27 | Per Hedbor | | TIMER_START(last_modules);
|
517c7e | 2000-09-30 | Per Hedbor | | foreach(last_module_cache||last_modules(), funp) if(ret = funp(id)) break;
|
cfda38 | 1999-03-28 | Henrik Grubbström (Grubba) | | if (ret == 1) {
|
10c7e1 | 1999-12-28 | Martin Nilsson | | REQUEST_WERR("handle_request(): Recurse");
|
9c1900 | 2001-02-27 | Per Hedbor | | TIMER_END(last_modules);
TIMER_END(handle_request);
|
c7a5f0 | 1999-02-16 | Per Hedbor | | return handle_request(id);
|
cfda38 | 1999-03-28 | Henrik Grubbström (Grubba) | | }
|
c7a5f0 | 1999-02-16 | Per Hedbor | | file = ret;
|
9c1900 | 2001-02-27 | Per Hedbor | | TIMER_END(last_modules);
|
c7a5f0 | 1999-02-16 | Per Hedbor | | }
|
9c1900 | 2001-02-27 | Per Hedbor | | TIMER_END(handle_request);
|
10c7e1 | 1999-12-28 | Martin Nilsson | | REQUEST_WERR("handle_request(): Done");
|
9c1900 | 2001-02-27 | Per Hedbor | | MERGE_TIMERS(roxen);
|
c7a5f0 | 1999-02-16 | Per Hedbor | | return file;
}
|
fd9302 | 2000-05-05 | Martin Nilsson | | mapping get_file(RequestID id, int|void no_magic, int|void internal_get)
|
cd9287 | 2000-08-15 | Johan Sundström | |
|
14179b | 1997-01-29 | Per Hedbor | | {
|
9c1900 | 2001-02-27 | Per Hedbor | | TIMER_START(get_file);
|
576c11 | 2000-03-07 | Martin Stjernholm | | int orig_internal_get = id->misc->internal_get;
id->misc->internal_get = internal_get;
|
fd9302 | 2000-05-05 | Martin Nilsson | | mapping|int res;
mapping res2;
|
14179b | 1997-01-29 | Per Hedbor | | function tmp;
res = low_get_file(id, no_magic);
|
9c1900 | 2001-02-27 | Per Hedbor | | TIMER_END(get_file);
|
fd9302 | 2000-05-05 | Martin Nilsson | |
|
14179b | 1997-01-29 | Per Hedbor | |
|
9c1900 | 2001-02-27 | Per Hedbor | | TIMER_START(filter_modules);
|
517c7e | 2000-09-30 | Per Hedbor | | foreach(filter_module_cache||filter_modules(), tmp)
|
41d0f9 | 1998-02-20 | Per Hedbor | | {
|
434bac | 2000-07-14 | Andreas Lange | | TRACE_ENTER("Filter module", tmp);
|
471705 | 2001-05-07 | Per Hedbor | | PROF_ENTER(Roxen.get_owning_module(tmp)->module_name,"filter");
|
14179b | 1997-01-29 | Per Hedbor | | if(res2=tmp(res,id))
{
if(res && res->file && (res2->file != res->file))
destruct(res->file);
|
434bac | 2000-07-14 | Andreas Lange | | TRACE_LEAVE("Rewrote result.");
|
14179b | 1997-01-29 | Per Hedbor | | res=res2;
|
41d0f9 | 1998-02-20 | Per Hedbor | | } else
TRACE_LEAVE("");
|
471705 | 2001-05-07 | Per Hedbor | | PROF_LEAVE(Roxen.get_owning_module(tmp)->module_name,"filter");
|
41d0f9 | 1998-02-20 | Per Hedbor | | }
|
9c1900 | 2001-02-27 | Per Hedbor | | TIMER_END(filter_modules);
|
576c11 | 2000-03-07 | Martin Stjernholm | |
id->misc->internal_get = orig_internal_get;
|
14179b | 1997-01-29 | Per Hedbor | | return res;
}
|
9a8a15 | 2000-09-25 | Per Hedbor | | array(string) find_dir(string file, RequestID id, void|int(0..1) verbose)
|
14179b | 1997-01-29 | Per Hedbor | | {
|
fd9302 | 2000-05-05 | Martin Nilsson | | array dir;
|
434bac | 2000-07-14 | Andreas Lange | | TRACE_ENTER(sprintf("List directory %O.", file), 0);
|
10c7e1 | 1999-12-28 | Martin Nilsson | |
|
db43d1 | 2000-11-24 | Martin Stjernholm | | if(!sizeof (file) || file[0] != '/')
|
193535 | 1997-04-28 | Henrik Grubbström (Grubba) | | file = "/" + file;
|
f12890 | 1997-08-15 | Henrik Grubbström (Grubba) | | #ifdef URL_MODULES
|
fc0e5d | 1997-08-26 | Henrik Grubbström (Grubba) | | #ifdef THREADS
|
3e3bab | 2001-01-19 | Per Hedbor | | Thread.MutexKey key;
|
fc0e5d | 1997-08-26 | Henrik Grubbström (Grubba) | | #endif
|
f12890 | 1997-08-15 | Henrik Grubbström (Grubba) | |
|
517c7e | 2000-09-30 | Per Hedbor | | foreach(url_modules(), function funp)
|
f12890 | 1997-08-15 | Henrik Grubbström (Grubba) | | {
string of = id->not_query;
id->not_query = file;
LOCK(funp);
|
434bac | 2000-07-14 | Andreas Lange | | TRACE_ENTER("URL module", funp);
|
3e3bab | 2001-01-19 | Per Hedbor | | mixed remap=funp( id, file );
|
f12890 | 1997-08-15 | Henrik Grubbström (Grubba) | | UNLOCK();
|
fd9302 | 2000-05-05 | Martin Nilsson | | if(mappingp( remap ))
|
f12890 | 1997-08-15 | Henrik Grubbström (Grubba) | | {
id->not_query=of;
|
434bac | 2000-07-14 | Andreas Lange | | TRACE_LEAVE("Returned 'No thanks'.");
|
41d0f9 | 1998-02-20 | Per Hedbor | | TRACE_LEAVE("");
|
f12890 | 1997-08-15 | Henrik Grubbström (Grubba) | | return 0;
}
|
fd9302 | 2000-05-05 | Martin Nilsson | | if(objectp( remap ))
|
f12890 | 1997-08-15 | Henrik Grubbström (Grubba) | | {
array err;
nest ++;
|
10c7e1 | 1999-12-28 | Martin Nilsson | |
|
434bac | 2000-07-14 | Andreas Lange | | TRACE_LEAVE("Recursing");
|
f12890 | 1997-08-15 | Henrik Grubbström (Grubba) | | file = id->not_query;
err = catch {
if( nest < 20 )
|
fd9302 | 2000-05-05 | Martin Nilsson | | dir = (id->conf || this_object())->find_dir( file, id );
|
f12890 | 1997-08-15 | Henrik Grubbström (Grubba) | | else
error("Too deep recursion in roxen::find_dir() while mapping "
+file+".\n");
};
nest = 0;
|
41d0f9 | 1998-02-20 | Per Hedbor | | TRACE_LEAVE("");
|
f12890 | 1997-08-15 | Henrik Grubbström (Grubba) | | if(err)
throw(err);
|
fd9302 | 2000-05-05 | Martin Nilsson | | return dir;
|
f12890 | 1997-08-15 | Henrik Grubbström (Grubba) | | }
id->not_query=of;
}
|
a86c6c | 1997-09-22 | Henrik Grubbström (Grubba) | | #endif /* URL_MODULES */
|
f12890 | 1997-08-15 | Henrik Grubbström (Grubba) | |
|
3e3bab | 2001-01-19 | Per Hedbor | | array | mapping d;
|
e927de | 2000-05-06 | Martin Nilsson | | array(string) locks=({});
|
3e3bab | 2001-01-19 | Per Hedbor | | RoxenModule mod;
|
e927de | 2000-05-06 | Martin Nilsson | | string loc;
|
517c7e | 2000-09-30 | Per Hedbor | | foreach(location_modules(), array tmp)
|
14179b | 1997-01-29 | Per Hedbor | | {
loc = tmp[0];
|
a47671 | 1997-10-20 | Henrik Grubbström (Grubba) | | if(!search(file, loc)) {
|
434bac | 2000-07-14 | Andreas Lange | | TRACE_ENTER(sprintf("Location module [%s] ", loc), tmp[1]);
|
a78a59 | 1997-04-28 | Henrik Grubbström (Grubba) | | #ifdef MODULE_LEVEL_SECURITY
|
41d0f9 | 1998-02-20 | Per Hedbor | | if(check_security(tmp[1], id)) {
|
434bac | 2000-07-14 | Andreas Lange | | TRACE_LEAVE("Permission denied");
|
41d0f9 | 1998-02-20 | Per Hedbor | | continue;
}
|
a78a59 | 1997-04-28 | Henrik Grubbström (Grubba) | | #endif
|
e927de | 2000-05-06 | Martin Nilsson | | mod=function_object(tmp[1]);
if(d=mod->find_dir(file[strlen(loc)..], id))
|
41d0f9 | 1998-02-20 | Per Hedbor | | {
|
29a807 | 1998-08-21 | David Hedbor | | if(mappingp(d))
{
|
10c7e1 | 1999-12-28 | Martin Nilsson | | if(d->files) {
|
434bac | 2000-07-14 | Andreas Lange | | TRACE_LEAVE("Got exclusive directory.");
TRACE_LEAVE(sprintf("Returning list of %d files.", sizeof(d->files)));
|
fd9302 | 2000-05-05 | Martin Nilsson | | return d->files;
|
29a807 | 1998-08-21 | David Hedbor | | } else
TRACE_LEAVE("");
} else {
|
434bac | 2000-07-14 | Andreas Lange | | TRACE_LEAVE("Got files.");
|
e927de | 2000-05-06 | Martin Nilsson | | if(!dir) dir=({ });
|
29a807 | 1998-08-21 | David Hedbor | | dir |= d;
}
|
e927de | 2000-05-06 | Martin Nilsson | | }
else {
if(verbose && mod->list_lock_files)
locks |= mod->list_lock_files();
|
41d0f9 | 1998-02-20 | Per Hedbor | | TRACE_LEAVE("");
|
e927de | 2000-05-06 | Martin Nilsson | | }
|
a47671 | 1997-10-20 | Henrik Grubbström (Grubba) | | } else if((search(loc, file)==0) && (loc[strlen(file)-1]=='/') &&
(loc[0]==loc[-1]) && (loc[-1]=='/') &&
|
6c67c8 | 1998-02-28 | Johan Schön | | (function_object(tmp[1])->stat_file(".", id))) {
|
a47671 | 1997-10-20 | Henrik Grubbström (Grubba) | | |
24fa08 | 1998-02-28 | Henrik Grubbström (Grubba) | | * and stat_file(".") returns non-zero.
|
a47671 | 1997-10-20 | Henrik Grubbström (Grubba) | | */
|
434bac | 2000-07-14 | Andreas Lange | | TRACE_ENTER(sprintf("Location module [%s] ", loc), tmp[1]);
|
a47671 | 1997-10-20 | Henrik Grubbström (Grubba) | | loc=loc[strlen(file)..];
sscanf(loc, "%s/", loc);
|
df4045 | 2000-06-19 | Henrik Grubbström (Grubba) | | if (dir) {
dir |= ({ loc });
} else {
dir = ({ loc });
}
|
434bac | 2000-07-14 | Andreas Lange | | TRACE_LEAVE("Added module mountpoint.");
|
14179b | 1997-01-29 | Per Hedbor | | }
}
|
e927de | 2000-05-06 | Martin Nilsson | | if(!dir) return verbose ? ({0})+locks : ([])[0];
|
14179b | 1997-01-29 | Per Hedbor | | if(sizeof(dir))
|
41d0f9 | 1998-02-20 | Per Hedbor | | {
|
434bac | 2000-07-14 | Andreas Lange | | TRACE_LEAVE(sprintf("Returning list of %d files.", sizeof(dir)));
|
14179b | 1997-01-29 | Per Hedbor | | return dir;
|
10c7e1 | 1999-12-28 | Martin Nilsson | | }
|
434bac | 2000-07-14 | Andreas Lange | | TRACE_LEAVE("Returning 'No such directory'.");
|
fd9302 | 2000-05-05 | Martin Nilsson | | return 0;
|
14179b | 1997-01-29 | Per Hedbor | | }
|
10c7e1 | 1999-12-28 | Martin Nilsson | |
|
14179b | 1997-01-29 | Per Hedbor | |
|
9a8a15 | 2000-09-25 | Per Hedbor | | array(int)|Stat stat_file(string file, RequestID id)
|
14179b | 1997-01-29 | Per Hedbor | | {
string loc;
|
1f4a6c | 2000-08-28 | Per Hedbor | | mixed s, tmp;
|
c5e096 | 1999-10-04 | Per Hedbor | | #ifdef THREADS
|
3e3bab | 2001-01-19 | Per Hedbor | | Thread.MutexKey key;
|
c5e096 | 1999-10-04 | Per Hedbor | | #endif
|
434bac | 2000-07-14 | Andreas Lange | | TRACE_ENTER(sprintf("Stat file %O.", file), 0);
|
10c7e1 | 1999-12-28 | Martin Nilsson | |
|
14179b | 1997-01-29 | Per Hedbor | | file=replace(file, "//", "/");
|
f12890 | 1997-08-15 | Henrik Grubbström (Grubba) | |
#ifdef URL_MODULES
|
517c7e | 2000-09-30 | Per Hedbor | | foreach(url_modules(), function funp)
|
f12890 | 1997-08-15 | Henrik Grubbström (Grubba) | | {
string of = id->not_query;
id->not_query = file;
|
434bac | 2000-07-14 | Andreas Lange | | TRACE_ENTER("URL module", funp);
|
f12890 | 1997-08-15 | Henrik Grubbström (Grubba) | | LOCK(funp);
tmp=funp( id, file );
UNLOCK();
if(mappingp( tmp )) {
id->not_query = of;
|
41d0f9 | 1998-02-20 | Per Hedbor | | TRACE_LEAVE("");
|
434bac | 2000-07-14 | Andreas Lange | | TRACE_LEAVE("Returned 'No thanks'.");
|
f12890 | 1997-08-15 | Henrik Grubbström (Grubba) | | return 0;
}
if(objectp( tmp ))
{
file = id->not_query;
array err;
nest ++;
|
434bac | 2000-07-14 | Andreas Lange | | TRACE_LEAVE("Recursing");
|
f12890 | 1997-08-15 | Henrik Grubbström (Grubba) | | err = catch {
if( nest < 20 )
tmp = (id->conf || this_object())->stat_file( file, id );
else
error("Too deep recursion in roxen::stat_file() while mapping "
+file+".\n");
};
nest = 0;
if(err)
throw(err);
|
8fd51f | 1998-03-01 | Per Hedbor | | TRACE_LEAVE("");
|
434bac | 2000-07-14 | Andreas Lange | | TRACE_LEAVE("Returning data");
|
f12890 | 1997-08-15 | Henrik Grubbström (Grubba) | | return tmp;
}
|
8fd51f | 1998-03-01 | Per Hedbor | | TRACE_LEAVE("");
|
f12890 | 1997-08-15 | Henrik Grubbström (Grubba) | | id->not_query = of;
}
#endif
|
10c7e1 | 1999-12-28 | Martin Nilsson | |
|
14179b | 1997-01-29 | Per Hedbor | |
|
517c7e | 2000-09-30 | Per Hedbor | | foreach(location_modules(), tmp)
|
14179b | 1997-01-29 | Per Hedbor | | {
loc = tmp[0];
if((file == loc) || ((file+"/")==loc))
|
41d0f9 | 1998-02-20 | Per Hedbor | | {
|
434bac | 2000-07-14 | Andreas Lange | | TRACE_ENTER(sprintf("Location module [%s] ", loc), tmp[1]);
TRACE_LEAVE("Exact match.");
|
41d0f9 | 1998-02-20 | Per Hedbor | | TRACE_LEAVE("");
|
223fd1 | 2000-01-27 | Johan Sundström | | return ({ 0775, -3, 0, 0, 0, 0, 0 });
|
41d0f9 | 1998-02-20 | Per Hedbor | | }
|
10c7e1 | 1999-12-28 | Martin Nilsson | | if(!search(file, loc))
|
14179b | 1997-01-29 | Per Hedbor | | {
|
434bac | 2000-07-14 | Andreas Lange | | TRACE_ENTER(sprintf("Location module [%s] ", loc), tmp[1]);
|
a78a59 | 1997-04-28 | Henrik Grubbström (Grubba) | | #ifdef MODULE_LEVEL_SECURITY
|
41d0f9 | 1998-02-20 | Per Hedbor | | if(check_security(tmp[1], id)) {
|
8fd51f | 1998-03-01 | Per Hedbor | | TRACE_LEAVE("");
|
434bac | 2000-07-14 | Andreas Lange | | TRACE_LEAVE("Permission denied");
|
41d0f9 | 1998-02-20 | Per Hedbor | | continue;
}
|
a78a59 | 1997-04-28 | Henrik Grubbström (Grubba) | | #endif
|
14179b | 1997-01-29 | Per Hedbor | | if(s=function_object(tmp[1])->stat_file(file[strlen(loc)..], id))
|
41d0f9 | 1998-02-20 | Per Hedbor | | {
TRACE_LEAVE("");
|
434bac | 2000-07-14 | Andreas Lange | | TRACE_LEAVE("Stat ok.");
|
14179b | 1997-01-29 | Per Hedbor | | return s;
|
41d0f9 | 1998-02-20 | Per Hedbor | | }
TRACE_LEAVE("");
|
14179b | 1997-01-29 | Per Hedbor | | }
}
|
434bac | 2000-07-14 | Andreas Lange | | TRACE_LEAVE("Returned 'no such file'.");
|
14179b | 1997-01-29 | Per Hedbor | | }
|
73ce3d | 2000-12-11 | Per Hedbor | | mapping error_file( RequestID id )
{
string data = query("ZNoSuchFile");
NOCACHE();
|
51d4d2 | 2001-01-04 | Martin Nilsson | | #if ROXEN_COMPAT <= 2.1
|
73ce3d | 2000-12-11 | Per Hedbor | | data = replace(data,({"$File", "$Me"}),
|
149344 | 2000-12-17 | Henrik Grubbström (Grubba) | | ({"&page.virtfile;", "&roxen.server;"}));
|
73ce3d | 2000-12-11 | Per Hedbor | | #endif
|
1371e0 | 2001-06-22 | Martin Nilsson | | mapping res = Roxen.http_rxml_answer( data, id, 0, "text/html" );
res->error = 404;
return res;
|
73ce3d | 2000-12-11 | Per Hedbor | | }
|
e8790b | 1998-02-19 | Per Hedbor | |
|
9a8a15 | 2000-09-25 | Per Hedbor | | array open_file(string fname, string mode, RequestID id, void|int internal_get)
|
e8790b | 1998-02-19 | Per Hedbor | | {
|
517c7e | 2000-09-30 | Per Hedbor | | if( id->conf && (id->conf != this_object()) )
return id->conf->open_file( fname, mode, id, internal_get );
|
3e3bab | 2001-01-19 | Per Hedbor | | Configuration oc = id->conf;
|
e8790b | 1998-02-19 | Per Hedbor | | string oq = id->not_query;
function funp;
|
3a4b9a | 1999-12-27 | Martin Nilsson | | mapping|int(0..1) file;
|
cd7ea4 | 1998-12-14 | Peter Bortas | |
id->not_query = fname;
|
c7a5f0 | 1999-02-16 | Per Hedbor | |
|
517c7e | 2000-09-30 | Per Hedbor | | foreach(first_modules(), funp)
|
10c7e1 | 1999-12-28 | Martin Nilsson | | if(file = funp( id ))
|
e8790b | 1998-02-19 | Per Hedbor | | break;
|
517c7e | 2000-09-30 | Per Hedbor | | else if(id->conf && (id->conf != oc))
|
e8790b | 1998-02-19 | Per Hedbor | | {
|
517c7e | 2000-09-30 | Per Hedbor | | return id->conf->open_file(fname, mode,id, internal_get);
|
e8790b | 1998-02-19 | Per Hedbor | | }
fname = id->not_query;
if(search(mode, "R")!=-1)
{
string f;
mode -= "R";
if(f = real_file(fname, id))
|
41d0f9 | 1998-02-20 | Per Hedbor | | {
|
91d3c3 | 2001-03-12 | Martin Nilsson | |
|
e8790b | 1998-02-19 | Per Hedbor | | return ({ open(f, mode), ([]) });
|
41d0f9 | 1998-02-20 | Per Hedbor | | }
|
238083 | 1998-02-22 | Per Hedbor | |
|
e8790b | 1998-02-19 | Per Hedbor | | }
if(mode=="r")
{
if(!file)
{
|
517c7e | 2000-09-30 | Per Hedbor | | file = get_file( id, 0, internal_get );
|
f920ce | 1998-10-02 | Henrik Grubbström (Grubba) | | if(!file) {
|
517c7e | 2000-09-30 | Per Hedbor | | foreach(last_modules(), funp) if(file = funp( id ))
|
e8790b | 1998-02-19 | Per Hedbor | | break;
|
f920ce | 1998-10-02 | Henrik Grubbström (Grubba) | | if (file == 1) {
|
484ec9 | 2000-06-23 | Martin Stjernholm | | return open_file(id->not_query, mode, id, internal_get);
|
f920ce | 1998-10-02 | Henrik Grubbström (Grubba) | | }
}
|
e8790b | 1998-02-19 | Per Hedbor | | }
if(!mappingp(file))
{
if(id->misc->error_code)
|
dfe036 | 2000-03-19 | Martin Nilsson | | file = Roxen.http_low_answer(id->misc->error_code, "Failed" );
|
238083 | 1998-02-22 | Per Hedbor | | else if(id->method!="GET"&&id->method != "HEAD"&&id->method!="POST")
|
dfe036 | 2000-03-19 | Martin Nilsson | | file = Roxen.http_low_answer(501, "Not implemented.");
|
73ce3d | 2000-12-11 | Per Hedbor | | else
file = error_file( id );
|
e8790b | 1998-02-19 | Per Hedbor | |
id->not_query = oq;
|
10c7e1 | 1999-12-28 | Martin Nilsson | |
|
e8790b | 1998-02-19 | Per Hedbor | | return ({ 0, file });
}
|
10c7e1 | 1999-12-28 | Martin Nilsson | | if( file->data )
|
e8790b | 1998-02-19 | Per Hedbor | | {
file->file = StringFile(file->data);
m_delete(file, "data");
|
10c7e1 | 1999-12-28 | Martin Nilsson | | }
|
e8790b | 1998-02-19 | Per Hedbor | | id->not_query = oq;
return ({ file->file, file });
}
id->not_query = oq;
|
23414a | 2000-07-21 | Andreas Lange | | return ({ 0, (["error":501, "data":"Not implemented." ]) });
|
e8790b | 1998-02-19 | Per Hedbor | | }
|
9a8a15 | 2000-09-25 | Per Hedbor | | mapping(string:array(mixed)) find_dir_stat(string file, RequestID id)
|
a86c6c | 1997-09-22 | Henrik Grubbström (Grubba) | | {
string loc;
|
a47671 | 1997-10-20 | Henrik Grubbström (Grubba) | | mapping(string:array(mixed)) dir = ([]);
mixed d, tmp;
|
a86c6c | 1997-09-22 | Henrik Grubbström (Grubba) | |
|
c7a5f0 | 1999-02-16 | Per Hedbor | |
|
a86c6c | 1997-09-22 | Henrik Grubbström (Grubba) | | file=replace(file, "//", "/");
|
10c7e1 | 1999-12-28 | Martin Nilsson | |
|
db43d1 | 2000-11-24 | Martin Stjernholm | | if(!sizeof (file) || file[0] != '/')
|
a86c6c | 1997-09-22 | Henrik Grubbström (Grubba) | | file = "/" + file;
|
ae60b6 | 1998-05-23 | Henrik Grubbström (Grubba) | |
|
434bac | 2000-07-14 | Andreas Lange | | TRACE_ENTER(sprintf("Request for directory and stat's \"%s\".", file), 0);
|
ae60b6 | 1998-05-23 | Henrik Grubbström (Grubba) | |
|
a86c6c | 1997-09-22 | Henrik Grubbström (Grubba) | | #ifdef URL_MODULES
#ifdef THREADS
|
3e3bab | 2001-01-19 | Per Hedbor | | Thread.MutexKey key;
|
a86c6c | 1997-09-22 | Henrik Grubbström (Grubba) | | #endif
|
517c7e | 2000-09-30 | Per Hedbor | | foreach(url_modules(), function funp)
|
a86c6c | 1997-09-22 | Henrik Grubbström (Grubba) | | {
string of = id->not_query;
id->not_query = file;
LOCK(funp);
|
434bac | 2000-07-14 | Andreas Lange | | TRACE_ENTER("URL module", funp);
|
a86c6c | 1997-09-22 | Henrik Grubbström (Grubba) | | tmp=funp( id, file );
UNLOCK();
if(mappingp( tmp ))
{
id->not_query=of;
|
3510fb | 1997-11-09 | Henrik Grubbström (Grubba) | | #ifdef MODULE_DEBUG
|
91d3c3 | 2001-03-12 | Martin Nilsson | | report_debug("conf->find_dir_stat(\"%s\"): url_module returned mapping:%O\n",
file, tmp);
|
3510fb | 1997-11-09 | Henrik Grubbström (Grubba) | | #endif /* MODULE_DEBUG */
|
434bac | 2000-07-14 | Andreas Lange | | TRACE_LEAVE("Returned mapping."+sprintf("%O", tmp));
|
07014c | 1999-05-24 | Per Hedbor | | TRACE_LEAVE("");
|
a86c6c | 1997-09-22 | Henrik Grubbström (Grubba) | | return 0;
}
if(objectp( tmp ))
{
array err;
nest ++;
|
10c7e1 | 1999-12-28 | Martin Nilsson | |
|
a86c6c | 1997-09-22 | Henrik Grubbström (Grubba) | | file = id->not_query;
err = catch {
if( nest < 20 )
tmp = (id->conf || this_object())->find_dir_stat( file, id );
|
ae60b6 | 1998-05-23 | Henrik Grubbström (Grubba) | | else {
|
434bac | 2000-07-14 | Andreas Lange | | TRACE_LEAVE("Too deep recursion");
|
a86c6c | 1997-09-22 | Henrik Grubbström (Grubba) | | error("Too deep recursion in roxen::find_dir_stat() while mapping "
+file+".\n");
|
ae60b6 | 1998-05-23 | Henrik Grubbström (Grubba) | | }
|
a86c6c | 1997-09-22 | Henrik Grubbström (Grubba) | | };
nest = 0;
if(err)
throw(err);
|
3510fb | 1997-11-09 | Henrik Grubbström (Grubba) | | #ifdef MODULE_DEBUG
|
91d3c3 | 2001-03-12 | Martin Nilsson | | report_debug("conf->find_dir_stat(\"%s\"): url_module returned object:\n",
file);
|
3510fb | 1997-11-09 | Henrik Grubbström (Grubba) | | #endif /* MODULE_DEBUG */
|
434bac | 2000-07-14 | Andreas Lange | | TRACE_LEAVE("Returned object.");
TRACE_LEAVE("Returning it.");
|
ae60b6 | 1998-05-23 | Henrik Grubbström (Grubba) | | return tmp;
|
a86c6c | 1997-09-22 | Henrik Grubbström (Grubba) | | }
id->not_query=of;
|
ae60b6 | 1998-05-23 | Henrik Grubbström (Grubba) | | TRACE_LEAVE("");
|
a86c6c | 1997-09-22 | Henrik Grubbström (Grubba) | | }
#endif /* URL_MODULES */
|
517c7e | 2000-09-30 | Per Hedbor | | foreach(location_modules(), tmp)
|
a86c6c | 1997-09-22 | Henrik Grubbström (Grubba) | | {
loc = tmp[0];
|
a47671 | 1997-10-20 | Henrik Grubbström (Grubba) | |
|
434bac | 2000-07-14 | Andreas Lange | | TRACE_ENTER(sprintf("Location module [%s] ", loc), 0);
|
a47671 | 1997-10-20 | Henrik Grubbström (Grubba) | |
|
a86c6c | 1997-09-22 | Henrik Grubbström (Grubba) | | if(!search(file, loc))
{
|
a47671 | 1997-10-20 | Henrik Grubbström (Grubba) | |
|
a86c6c | 1997-09-22 | Henrik Grubbström (Grubba) | | #ifdef MODULE_LEVEL_SECURITY
if(check_security(tmp[1], id)) continue;
#endif
|
e351dd | 1999-11-29 | Per Hedbor | | RoxenModule c = function_object(tmp[1]);
|
a86c6c | 1997-09-22 | Henrik Grubbström (Grubba) | | string f = file[strlen(loc)..];
if (c->find_dir_stat) {
|
434bac | 2000-07-14 | Andreas Lange | | TRACE_ENTER("Has find_dir_stat().", 0);
|
a86c6c | 1997-09-22 | Henrik Grubbström (Grubba) | | if (d = c->find_dir_stat(f, id)) {
|
434bac | 2000-07-14 | Andreas Lange | | TRACE_ENTER("Returned mapping."+sprintf("%O", d), c);
|
a47671 | 1997-10-20 | Henrik Grubbström (Grubba) | | dir = d | dir;
|
ae60b6 | 1998-05-23 | Henrik Grubbström (Grubba) | | TRACE_LEAVE("");
|
a86c6c | 1997-09-22 | Henrik Grubbström (Grubba) | | }
|
ae60b6 | 1998-05-23 | Henrik Grubbström (Grubba) | | TRACE_LEAVE("");
|
a86c6c | 1997-09-22 | Henrik Grubbström (Grubba) | | } else if(d = c->find_dir(f, id)) {
|
434bac | 2000-07-14 | Andreas Lange | | TRACE_ENTER("Returned array.", 0);
|
10c7e1 | 1999-12-28 | Martin Nilsson | | dir = mkmapping(d, Array.map(d, lambda(string fn)
|
e351dd | 1999-11-29 | Per Hedbor | | {
return c->stat_file(f + fn, id);
})) | dir;
|
ae60b6 | 1998-05-23 | Henrik Grubbström (Grubba) | | TRACE_LEAVE("");
|
a86c6c | 1997-09-22 | Henrik Grubbström (Grubba) | | }
|
a47671 | 1997-10-20 | Henrik Grubbström (Grubba) | | } else if(search(loc, file)==0 && loc[strlen(file)-1]=='/' &&
(loc[0]==loc[-1]) && loc[-1]=='/' &&
|
8935ad | 1998-03-30 | Johan Schön | | (function_object(tmp[1])->stat_file(".", id))) {
|
a47671 | 1997-10-20 | Henrik Grubbström (Grubba) | | |
8935ad | 1998-03-30 | Johan Schön | | * and stat_file(".") returns non-zero.
|
a47671 | 1997-10-20 | Henrik Grubbström (Grubba) | | */
|
434bac | 2000-07-14 | Andreas Lange | | TRACE_ENTER(sprintf("The file %O is on the path to the mountpoint %O.",
|
67f60e | 2000-07-09 | Martin Nilsson | | file, loc), 0);
|
a47671 | 1997-10-20 | Henrik Grubbström (Grubba) | | loc=loc[strlen(file)..];
sscanf(loc, "%s/", loc);
if (!dir[loc]) {
|
cd9287 | 2000-08-15 | Johan Sundström | | dir[loc] = ({ 0775, -3, 0, 0, 0, 0, 0 });
|
a86c6c | 1997-09-22 | Henrik Grubbström (Grubba) | | }
|
ae60b6 | 1998-05-23 | Henrik Grubbström (Grubba) | | TRACE_LEAVE("");
|
a86c6c | 1997-09-22 | Henrik Grubbström (Grubba) | | }
|
ae60b6 | 1998-05-23 | Henrik Grubbström (Grubba) | | TRACE_LEAVE("");
|
a86c6c | 1997-09-22 | Henrik Grubbström (Grubba) | | }
if(sizeof(dir))
return dir;
}
|
14179b | 1997-01-29 | Per Hedbor | |
|
9a8a15 | 2000-09-25 | Per Hedbor | | array access(string file, RequestID id)
|
14179b | 1997-01-29 | Per Hedbor | | {
string loc;
array s, tmp;
|
10c7e1 | 1999-12-28 | Martin Nilsson | |
|
14179b | 1997-01-29 | Per Hedbor | | file=replace(file, "//", "/");
|
10c7e1 | 1999-12-28 | Martin Nilsson | |
|
14179b | 1997-01-29 | Per Hedbor | |
|
517c7e | 2000-09-30 | Per Hedbor | | foreach(location_modules(), tmp)
|
14179b | 1997-01-29 | Per Hedbor | | {
loc = tmp[0];
|
477042 | 1999-11-22 | Henrik Grubbström (Grubba) | | if((file+"/")==loc) {
#ifdef MODULE_LEVEL_SECURITY
if(check_security(tmp[1], id)) continue;
#endif
if(s=function_object(tmp[1])->access("", id))
return s;
} else if(!search(file, loc)) {
|
14179b | 1997-01-29 | Per Hedbor | | #ifdef MODULE_LEVEL_SECURITY
if(check_security(tmp[1], id)) continue;
#endif
if(s=function_object(tmp[1])->access(file[strlen(loc)..], id))
return s;
}
}
|
477042 | 1999-11-22 | Henrik Grubbström (Grubba) | | return 0;
|
14179b | 1997-01-29 | Per Hedbor | | }
|
9a8a15 | 2000-09-25 | Per Hedbor | | string real_file(string file, RequestID id)
|
9fd809 | 2000-08-08 | Johan Sundström | |
|
14179b | 1997-01-29 | Per Hedbor | | {
string loc;
string s;
array tmp;
file=replace(file, "//", "/");
|
10c7e1 | 1999-12-28 | Martin Nilsson | |
|
14179b | 1997-01-29 | Per Hedbor | | if(!id) error("No id passed to real_file");
|
517c7e | 2000-09-30 | Per Hedbor | | foreach(location_modules(), tmp)
|
14179b | 1997-01-29 | Per Hedbor | | {
loc = tmp[0];
|
10c7e1 | 1999-12-28 | Martin Nilsson | | if(!search(file, loc))
|
14179b | 1997-01-29 | Per Hedbor | | {
#ifdef MODULE_LEVEL_SECURITY
if(check_security(tmp[1], id)) continue;
#endif
|
c5e096 | 1999-10-04 | Per Hedbor | | if(s=function_object(tmp[1])->real_file(file[strlen(loc)..], id))
|
14179b | 1997-01-29 | Per Hedbor | | return s;
}
}
}
|
10c7e1 | 1999-12-28 | Martin Nilsson | | int|string try_get_file(string s, RequestID id,
|
646f72 | 2000-03-07 | Martin Stjernholm | | int|void status, int|void nocache,
int|void not_internal)
|
2688e2 | 2000-07-26 | Johan Sundström | |
|
14179b | 1997-01-29 | Per Hedbor | | {
|
646f72 | 2000-03-07 | Martin Stjernholm | | string res, q, cache_key;
|
e351dd | 1999-11-29 | Per Hedbor | | RequestID fake_id;
|
14179b | 1997-01-29 | Per Hedbor | | mapping m;
|
10c7e1 | 1999-12-28 | Martin Nilsson | | if(!objectp(id))
|
14179b | 1997-01-29 | Per Hedbor | | error("No ID passed to 'try_get_file'\n");
|
e351dd | 1999-11-29 | Per Hedbor | |
if ( !id->misc )
id->misc = ([]);
if ( !id->misc->common )
id->misc->common = ([]);
|
10c7e1 | 1999-12-28 | Martin Nilsson | |
|
e351dd | 1999-11-29 | Per Hedbor | | fake_id = id->clone_me();
|
10c7e1 | 1999-12-28 | Martin Nilsson | |
|
e351dd | 1999-11-29 | Per Hedbor | | fake_id->misc->common = id->misc->common;
|
484ec9 | 2000-06-23 | Martin Stjernholm | | fake_id->misc->internal_get = !not_internal;
|
e351dd | 1999-11-29 | Per Hedbor | |
|
4e0a53 | 2000-03-20 | Martin Stjernholm | | if (fake_id->scan_for_query)
|
c65dbe | 2001-05-03 | Per Hedbor | |
|
4e0a53 | 2000-03-20 | Martin Stjernholm | | s = fake_id->scan_for_query (s);
|
c65dbe | 2001-05-03 | Per Hedbor | |
s = Roxen.fix_relative (s, id);
|
14179b | 1997-01-29 | Per Hedbor | | fake_id->raw_url=s;
fake_id->not_query=s;
|
c927a0 | 2000-03-18 | Martin Stjernholm | | if(!(m = get_file(fake_id,0,!not_internal))) {
|
4cd5e8 | 2000-03-20 | Martin Stjernholm | |
m_delete (fake_id->misc, "path_info");
|
484ec9 | 2000-06-23 | Martin Stjernholm | | array a = open_file( s, "r", fake_id, !not_internal );
|
e1e86d | 2000-03-20 | Martin Stjernholm | | if(a && a[0]) {
m = a[1];
m->file = a[0];
}
else {
destruct (fake_id);
return 0;
}
|
c927a0 | 2000-03-18 | Martin Stjernholm | | }
|
a59fc9 | 2000-08-16 | Per Hedbor | | CACHE( fake_id->misc->cacheable );
|
c927a0 | 2000-03-18 | Martin Stjernholm | | destruct (fake_id);
|
889d03 | 1999-10-04 | Per Hedbor | |
|
3bb38c | 2000-01-20 | Martin Bähr | | if (!mappingp(m) && !objectp(m)) {
report_error("try_get_file(%O, %O, %O, %O): m = %O is not a mapping.\n",
s, id, status, nocache, m);
return 0;
}
|
96d86e | 2001-01-29 | Per Hedbor | |
if (!(< 0,2,3 >)[m->error/100]) return 0;
|
10c7e1 | 1999-12-28 | Martin Nilsson | |
|
3510fb | 1997-11-09 | Henrik Grubbström (Grubba) | | if(status) return 1;
|
10c7e1 | 1999-12-28 | Martin Nilsson | | if(m->data)
|
a22f6f | 1999-05-12 | Per Hedbor | | res = m->data;
|
10c7e1 | 1999-12-28 | Martin Nilsson | | else
|
a22f6f | 1999-05-12 | Per Hedbor | | res="";
|
14179b | 1997-01-29 | Per Hedbor | | m->data = 0;
|
10c7e1 | 1999-12-28 | Martin Nilsson | |
|
4cb221 | 2000-05-22 | Per Hedbor | | if( objectp(m->file) )
|
14179b | 1997-01-29 | Per Hedbor | | {
|
3a4d7e | 1997-09-03 | Per Hedbor | | res += m->file->read();
|
14179b | 1997-01-29 | Per Hedbor | | destruct(m->file);
m->file = 0;
}
|
10c7e1 | 1999-12-28 | Martin Nilsson | |
|
14179b | 1997-01-29 | Per Hedbor | | if(m->raw)
{
res -= "\r";
if(!sscanf(res, "%*s\n\n%s", res))
sscanf(res, "%*s\n%s", res);
}
return res;
}
|
9fd809 | 2000-08-08 | Johan Sundström | | int(0..1) is_file(string virt_path, RequestID id)
|
14179b | 1997-01-29 | Per Hedbor | | {
|
9fd809 | 2000-08-08 | Johan Sundström | | return !!stat_file(virt_path, id);
|
14179b | 1997-01-29 | Per Hedbor | | }
|
03aa49 | 2000-08-23 | Per Hedbor | | array registered_urls = ({}), failed_urls = ({ });
|
7a243b | 2000-08-19 | Per Hedbor | | array do_not_log_patterns = 0;
|
14179b | 1997-01-29 | Per Hedbor | | void start(int num)
{
|
c109fc | 2001-07-21 | Martin Stjernholm | | fix_my_url();
|
c5e096 | 1999-10-04 | Per Hedbor | |
|
5d6c8d | 2000-09-01 | Per Hedbor | | foreach( (registered_urls-query("URLs"))+failed_urls, string url )
{
registered_urls -= ({ url });
|
03aa49 | 2000-08-23 | Per Hedbor | | roxen.unregister_url( url );
|
5d6c8d | 2000-09-01 | Per Hedbor | | }
|
ecd9ab | 2000-08-23 | Per Hedbor | |
|
03aa49 | 2000-08-23 | Per Hedbor | | failed_urls = ({ });
|
ecd9ab | 2000-08-23 | Per Hedbor | |
|
5d6c8d | 2000-09-01 | Per Hedbor | | foreach( (query( "URLs" )-registered_urls), string url )
|
ecd9ab | 2000-08-23 | Per Hedbor | | if( roxen.register_url( url, this_object() ) )
registered_urls += ({ url });
|
03aa49 | 2000-08-23 | Per Hedbor | | else
failed_urls += ({ url });
|
5f6dae | 2000-08-13 | Per Hedbor | | if( !datacache )
datacache = DataCache( );
else
datacache->init_from_variables();
|
7a243b | 2000-08-19 | Per Hedbor | |
parse_log_formats();
init_log_file();
do_not_log_patterns = query("NoLog");
if(!sizeof(do_not_log_patterns))
do_not_log_patterns = 0;
|
6f669a | 2001-08-14 | Honza Petrous | |
#ifdef SNMP_AGENT
if(query("snmp_process") && objectp(roxen->snmpagent))
roxen->snmpagent->add_virtserv(get_config_id());
#endif
|
14179b | 1997-01-29 | Per Hedbor | | }
|
e7e603 | 1999-11-05 | Per Hedbor | | void save_me()
{
save_one( 0 );
}
|
14179b | 1997-01-29 | Per Hedbor | | void save(int|void all)
|
2688e2 | 2000-07-26 | Johan Sundström | |
|
14179b | 1997-01-29 | Per Hedbor | | {
if(all)
{
|
3f628a | 1999-12-09 | Martin Stjernholm | | store("spider#0", variables, 0, this_object());
|
14179b | 1997-01-29 | Per Hedbor | | start(2);
}
|
10c7e1 | 1999-12-28 | Martin Nilsson | |
|
3f628a | 1999-12-09 | Martin Stjernholm | | foreach(indices(modules), string modname)
|
14179b | 1997-01-29 | Per Hedbor | | {
|
3f628a | 1999-12-09 | Martin Stjernholm | | foreach(indices(modules[modname]->copies), int i)
|
14179b | 1997-01-29 | Per Hedbor | | {
|
3f628a | 1999-12-09 | Martin Stjernholm | | store(modname+"#"+i, modules[modname]->copies[i]->query(), 0, this_object());
|
49e3bc | 2001-03-12 | Anders Johansson | | if (mixed err = catch(modules[modname]->copies[i]->
start(2, this_object())))
report_error("Error calling start in module.\n%s",
describe_backtrace (err));
|
14179b | 1997-01-29 | Per Hedbor | | }
}
|
8cc31b | 1997-10-12 | Henrik Grubbström (Grubba) | | invalidate_cache();
|
14179b | 1997-01-29 | Per Hedbor | | }
|
e351dd | 1999-11-29 | Per Hedbor | | int save_one( RoxenModule o )
|
2688e2 | 2000-07-26 | Johan Sundström | |
|
14179b | 1997-01-29 | Per Hedbor | | {
mapping mod;
|
10c7e1 | 1999-12-28 | Martin Nilsson | | if(!o)
|
14179b | 1997-01-29 | Per Hedbor | | {
|
c5e096 | 1999-10-04 | Per Hedbor | | store("spider#0", variables, 0, this_object());
|
14179b | 1997-01-29 | Per Hedbor | | start(2);
return 1;
}
|
2c13a8 | 1999-11-10 | Per Hedbor | | string q = otomod[ o ];
if( !q )
error("Invalid module");
|
10c7e1 | 1999-12-28 | Martin Nilsson | |
|
2c13a8 | 1999-11-10 | Per Hedbor | | store(q, o->query(), 0, this_object());
invalidate_cache();
|
0d1e43 | 2000-11-02 | Per Hedbor | | mixed error;
if( error = catch( o->start(2, this_object()) ) )
{
if( objectp(error ) )
error = (array)error;
if( sizeof(error)>1 && arrayp( error[1] ) )
{
int i;
for( i = 0; i<sizeof( error[1] ); i++ )
if( error[1][i][2] == save_one )
break;
error[1] = error[1][i+1..];
}
if( o->report_error )
o->report_error( "Call to start failed.\n"+describe_backtrace( error ) );
else
report_error( "Call to start failed.\n"+describe_backtrace( error ));
}
|
2c13a8 | 1999-11-10 | Per Hedbor | | invalidate_cache();
return 1;
|
14179b | 1997-01-29 | Per Hedbor | | }
|
2f7920 | 2000-03-27 | Per Hedbor | | RoxenModule reload_module( string modname )
|
596425 | 1999-11-19 | Per Hedbor | | {
|
e351dd | 1999-11-29 | Per Hedbor | | RoxenModule old_module = find_module( modname );
|
9a8a15 | 2000-09-25 | Per Hedbor | | ModuleInfo mi = roxen.find_module( (modname/"#")[0] );
|
2f7920 | 2000-03-27 | Per Hedbor | | if( !old_module ) return 0;
|
f56958 | 1999-11-23 | Per Hedbor | |
|
b86de8 | 2000-11-13 | Per Hedbor | | master()->clear_compilation_failures();
|
1f5652 | 1999-11-23 | Per Hedbor | |
|
b86de8 | 2000-11-13 | Per Hedbor | | if( !old_module->fake )
{
save_one( old_module );
master()->refresh_inherit( object_program( old_module ) );
master()->refresh( object_program( old_module ), 1 );
}
|
2f7920 | 2000-03-27 | Per Hedbor | |
|
2141a1 | 2001-07-12 | Martin Stjernholm | | if (mixed err = catch( disable_module( modname, 1 ) ))
report_error ("Error doing reload of %O:\n%s",
modname, describe_backtrace (err));
array old_error_log = (array) old_module->error_log;
if (mixed err = catch (destruct (old_module)))
report_error ("Error destructing module instance of %O:\n%s",
modname, describe_backtrace (err));
|
f56958 | 1999-11-23 | Per Hedbor | |
|
2f7920 | 2000-03-27 | Per Hedbor | | RoxenModule nm;
|
2141a1 | 2001-07-12 | Martin Stjernholm | | if( mixed err = catch( nm = enable_module( modname, 0, 0, 1 ) ) )
report_error ("Error doing reload of %O:\n%s",
modname, describe_backtrace (err));
if (!nm) return 0;
foreach (old_error_log, [string msg, array(int) times])
nm->error_log[msg] += times;
mi = roxen.find_module( (modname/"#")[0] );
catch( mi->update_with( nm,0 ) );
nm->report_notice(LOC_C(11, "Reloaded %s.")+"\n", mi->get_name());
|
bcf566 | 2000-04-05 | Per Hedbor | |
call_start_callbacks( nm, mi, modules[ (modname/"#")[0] ] );
|
f56958 | 1999-11-23 | Per Hedbor | |
|
2f7920 | 2000-03-27 | Per Hedbor | | return nm;
|
596425 | 1999-11-19 | Per Hedbor | | }
|
beba57 | 2000-03-20 | Martin Stjernholm | | #ifdef THREADS
Thread.Mutex enable_modules_mutex = Thread.Mutex();
#define MODULE_LOCK \
Thread.MutexKey enable_modules_lock = enable_modules_mutex->lock (2)
#else
#define MODULE_LOCK
#endif
|
9a1d47 | 2000-01-12 | Martin Stjernholm | | static int enable_module_batch_msgs;
|
2f7920 | 2000-03-27 | Per Hedbor | | RoxenModule enable_module( string modname, RoxenModule|void me,
|
bcf566 | 2000-04-05 | Per Hedbor | | ModuleInfo|void moduleinfo,
int|void nostart )
|
14179b | 1997-01-29 | Per Hedbor | | {
|
beba57 | 2000-03-20 | Martin Stjernholm | | MODULE_LOCK;
|
c5e096 | 1999-10-04 | Per Hedbor | | int id;
|
e351dd | 1999-11-29 | Per Hedbor | | ModuleCopies module;
|
c5e096 | 1999-10-04 | Per Hedbor | | int pr;
mixed err;
int module_type;
|
747a7c | 2001-08-13 | Per Hedbor | | if( forcibly_added[modname] )
return search(otomod, modname);
|
4867e9 | 2000-09-05 | Per Hedbor | | if( datacache ) datacache->flush();
|
8b16fe | 2000-09-05 | Per Hedbor | |
|
e7e603 | 1999-11-05 | Per Hedbor | | if( sscanf(modname, "%s#%d", modname, id ) != 2 )
|
2f7920 | 2000-03-27 | Per Hedbor | | while( modules[ modname ] && modules[ modname ][ id ] )
|
4f43eb | 1999-11-05 | Per Hedbor | | id++;
|
c5e096 | 1999-10-04 | Per Hedbor | |
|
1e7925 | 2001-07-11 | Martin Stjernholm | | roxen->bootstrap_info->set (({this_object(), modname + "#" + id}));
|
a42fe4 | 2001-07-05 | Martin Nilsson | | #ifdef MODULE_DEBUG
|
7f0008 | 1998-03-20 | Per Hedbor | | int start_time = gethrtime();
|
a42fe4 | 2001-07-05 | Martin Nilsson | | #endif
|
25171c | 1999-11-06 | Per Hedbor | |
|
2f7920 | 2000-03-27 | Per Hedbor | | if( !moduleinfo )
|
ad683e | 1998-05-09 | Henrik Grubbström (Grubba) | | {
|
2e8d0f | 2001-06-28 | Martin Stjernholm | | moduleinfo = roxen->find_module( modname );
|
2f7920 | 2000-03-27 | Per Hedbor | |
if (!moduleinfo)
{
report_warning("Failed to load %s. The module probably "
"doesn't exist in the module path.\n", modname);
|
8b700e | 2000-09-19 | Martin Stjernholm | | got_no_delayed_load = -1;
|
3557f5 | 2001-06-30 | Martin Stjernholm | | roxen->bootstrap_info->set (0);
|
2f7920 | 2000-03-27 | Per Hedbor | | return 0;
}
|
c5e096 | 1999-10-04 | Per Hedbor | | }
|
9a1d47 | 2000-01-12 | Martin Stjernholm | | string descr = moduleinfo->get_name() + (id ? " copy " + (id + 1) : "");
|
835c6c | 2001-06-17 | Martin Nilsson | |
|
9a1d47 | 2000-01-12 | Martin Stjernholm | |
|
3bbda8 | 1997-06-11 | Henrik Grubbström (Grubba) | | #ifdef MODULE_DEBUG
|
9a1d47 | 2000-01-12 | Martin Stjernholm | | if (enable_module_batch_msgs)
report_debug(" %-43s... \b", descr );
|
c5e096 | 1999-10-04 | Per Hedbor | | else
|
9a1d47 | 2000-01-12 | Martin Stjernholm | | report_debug("Enabling " + descr + "\n");
|
3bbda8 | 1997-06-11 | Henrik Grubbström (Grubba) | | #endif
|
c5e096 | 1999-10-04 | Per Hedbor | |
|
0b7d2b | 1999-12-22 | Per Hedbor | | module = modules[ modname ];
|
c5e096 | 1999-10-04 | Per Hedbor | |
if(!module)
|
7e446c | 1999-11-24 | Per Hedbor | | modules[ modname ] = module = ModuleCopies();
|
c5e096 | 1999-10-04 | Per Hedbor | |
|
f56958 | 1999-11-23 | Per Hedbor | | if( !me )
|
c5e096 | 1999-10-04 | Per Hedbor | | {
|
f56958 | 1999-11-23 | Per Hedbor | | if(err = catch(me = moduleinfo->instance(this_object())))
{
|
c45b2a | 1999-12-09 | Martin Stjernholm | | #ifdef MODULE_DEBUG
|
9a1d47 | 2000-01-12 | Martin Stjernholm | | if (enable_module_batch_msgs) report_debug("\bERROR\n");
|
67f60e | 2000-07-09 | Martin Nilsson | | if (err != "") {
#endif
string bt=describe_backtrace(err);
|
434bac | 2000-07-14 | Andreas Lange | | report_error("enable_module(): " +
|
49cd28 | 2000-08-11 | Andreas Lange | | LOC_M(41, "Error while initiating module copy of %s%s"),
|
434bac | 2000-07-14 | Andreas Lange | | moduleinfo->get_name(), (bt ? ":\n"+bt : "\n"));
|
67f60e | 2000-07-09 | Martin Nilsson | | #ifdef MODULE_DEBUG
}
|
c45b2a | 1999-12-09 | Martin Stjernholm | | #endif
|
f63aca | 2000-09-08 | Martin Stjernholm | | got_no_delayed_load = -1;
|
3557f5 | 2001-06-30 | Martin Stjernholm | | roxen->bootstrap_info->set (0);
|
0b7d2b | 1999-12-22 | Per Hedbor | | return module[id];
|
f56958 | 1999-11-23 | Per Hedbor | | }
|
c5e096 | 1999-10-04 | Per Hedbor | | }
|
0b7d2b | 1999-12-22 | Per Hedbor | | if(module[id] && module[id] != me)
|
c5e096 | 1999-10-04 | Per Hedbor | | {
|
c45e3f | 2000-02-16 | Per Hedbor | | if( module[id]->stop )
|
0d1e43 | 2000-11-02 | Per Hedbor | | catch( module[id]->stop() );
|
f56958 | 1999-11-23 | Per Hedbor | |
|
ad683e | 1998-05-09 | Henrik Grubbström (Grubba) | | }
|
14179b | 1997-01-29 | Per Hedbor | |
|
c5e096 | 1999-10-04 | Per Hedbor | | me->set_configuration( this_object() );
module_type = moduleinfo->type;
if (module_type & (MODULE_LOCATION|MODULE_EXTENSION|
MODULE_CONFIG|MODULE_FILE_EXTENSION|MODULE_LOGGER|
MODULE_URL|MODULE_LAST|MODULE_PROVIDER|
|
f59076 | 2000-09-10 | Martin Nilsson | | MODULE_FILTER|MODULE_TAG|MODULE_FIRST))
|
ad683e | 1998-05-09 | Henrik Grubbström (Grubba) | | {
|
c5e096 | 1999-10-04 | Per Hedbor | | if(module_type != MODULE_CONFIG)
|
3b1783 | 1998-11-22 | Per Hedbor | | {
|
477042 | 1999-11-22 | Henrik Grubbström (Grubba) | | if (err = catch {
|
23414a | 2000-07-21 | Andreas Lange | | me->defvar("_priority", 5, DLOCALE(12, "Priority"), TYPE_INT_LIST,
DLOCALE(13, "The priority of the module. 9 is highest and 0 is lowest."
|
477042 | 1999-11-22 | Henrik Grubbström (Grubba) | | " Modules with the same priority can be assumed to be "
|
f498ed | 2000-07-11 | Martin Nilsson | | "called in random order"),
|
477042 | 1999-11-22 | Henrik Grubbström (Grubba) | | ({0, 1, 2, 3, 4, 5, 6, 7, 8, 9}));
}) {
|
3557f5 | 2001-06-30 | Martin Stjernholm | | roxen->bootstrap_info->set (0);
|
477042 | 1999-11-22 | Henrik Grubbström (Grubba) | | throw(err);
}
|
3b1783 | 1998-11-22 | Per Hedbor | | }
|
10c7e1 | 1999-12-28 | Martin Nilsson | |
|
21306c | 2000-11-02 | Per Hedbor | | #ifdef MODULE_LEVEL_SECURITY
if( (module_type & ~(MODULE_LOGGER|MODULE_PROVIDER)) != 0 )
|
ad683e | 1998-05-09 | Henrik Grubbström (Grubba) | | {
|
bc0fa0 | 2001-03-08 | Per Hedbor | |
|
23414a | 2000-07-21 | Andreas Lange | |
me->defvar("_seclevels", "", DLOCALE(16, "Security: Patterns"),
TYPE_TEXT_FIELD,
|
89d1d8 | 2001-05-16 | Martin Nilsson | | DLOCALE(245,
|
62e2cb | 2001-03-08 | Per Hedbor | | "The syntax is:\n"
" \n<dl>"
" <dt><b>userdb</b> <i>userdatabase module</i></dt>\n"
" <dd> Select a non-default userdatabase module. The default is to "
" search all modules. The userdatabase module config_userdb is always "
" present, and contains the configuration users</dd>\n"
"<dt><b>authmethod</b> <i>authentication module</i></dt>\n"
"<dd>Select a non-default authentication method.</dd>"
"<dt><b>realm</b> <i>realm name</i></dt>\n"
"<dd>The realm is used when user authentication info is requested</dd>"
"</dl>\n"
" Below, CMD is one of 'allow' and 'deny'\n"
" <dl>\n"
" <dt>CMD <b>ip</b>=<i>ip/bits</i> [return]<br />\n"
" CMD <b>ip</b>=<i>ip:mask</i> [return] <br />\n"
" CMD <b>ip</b>=<i>pattern[,pattern,...]</i> [return] <br /></dt>\n"
" <dd>Match the remote IP-address.</dd>\n"
" \n"
" <dt>CMD <b>user</b>=<i>name[,name,...]</i> [return]</dt>\n"
" <dd>Requires a authenticated user. If the user name 'any' is used, any "
"valid user will be OK. Otherwise, one of the listed users are required.</dd>"
" <dt>CMD <b>group</b>=<i>name[,name,...]</i> [return]</dt>\n"
"<dd>Requires a authenticated user with a group. If the group name "
" 'any' is used, any valid group will be OK. Otherwise, one of the "
"listed groups are required.</dd>\n"
" \n"
"<dt>CMD <b>dns</b>=<i>pattern[,pattern,...]</i> [return]</dt>\n"
"<dd>Require one of the specified DNS domain-names</dd>"
" \n"
"<dt>CMD <b>time</b>=<i>HH:mm-HH:mm</i> [return]</dt>\n"
"<dd>Only allow access to the module from the first time to the "
" second each day. Both times should be specified in 24-hour "
" HH:mm format.</dd>\n"
"<dt>CMD <b>day</b>=<i>day[,day,...]</i> [return]</dt>\n"
"<dd>Only allow access during certain days. Day is either a numerical "
" value (monday=1, sunday=7) or a string (monday, thuesday etc)</dd>"
"</dl><p>\n"
" pattern is always a glob pattern (* = any characters, ? = any character).\n"
"</p><p>\n"
" return means that reaching this command results in immediate\n"
" return, only useful for 'allow'.</p>\n"
" \n"
" <p>'deny' always implies a return, no futher testing is done if a\n"
" 'deny' match.</p>\n"));
|
23414a | 2000-07-21 | Andreas Lange | |
|
c5e096 | 1999-10-04 | Per Hedbor | | if(!(module_type & MODULE_PROXY))
|
14179b | 1997-01-29 | Per Hedbor | | {
|
23414a | 2000-07-21 | Andreas Lange | | me->defvar("_seclvl", 0, DLOCALE(18, "Security: Security level"),
TYPE_INT,
|
55a866 | 2000-11-20 | Per Hedbor | | DLOCALE(305, "The modules security level is used to determine if a "
|
3bf345 | 1998-10-01 | Peter Bortas | | " request should be handled by the module."
"\n<p><h2>Security level vs Trust level</h2>"
" Each module has a configurable <i>security level</i>."
" Each request has an assigned trust level. Higher"
" <i>trust levels</i> grants access to modules with higher"
" <i>security levels</i>."
"\n<p><h2>Definitions</h2><ul>"
|
f498ed | 2000-07-11 | Martin Nilsson | | " <li>A requests initial Trust level is infinitely high.</li>"
|
3bf345 | 1998-10-01 | Peter Bortas | | " <li> A request will only be handled by a module if its"
" <i>trust level</i> is higher or equal to the"
|
f498ed | 2000-07-11 | Martin Nilsson | | " <i>security level</i> of the module.</li>"
|
3bf345 | 1998-10-01 | Peter Bortas | | " <li> Each time the request is handled by a module the"
" <i>trust level</i> of the module will be set to the"
" lower of its <i>trust level</i> and the modules"
|
90ecbb | 2000-11-15 | Per Hedbor | | " <i>security level</i>, <i>unless</i> the security "
" level of the module is 0, which is a special "
" case and means that no change should be made.</li>"
|
f498ed | 2000-07-11 | Martin Nilsson | | " </ul></p>"
|
3bf345 | 1998-10-01 | Peter Bortas | | "\n<p><h2>Example</h2>"
" Modules:<ul>"
|
f498ed | 2000-07-11 | Martin Nilsson | | " <li> User filesystem, <i>security level</i> 1</li>"
" <li> Filesystem module, <i>security level</i> 3</li>"
" <li> CGI module, <i>security level</i> 2</li>"
" </ul></p>"
|
3bf345 | 1998-10-01 | Peter Bortas | | "\n<p>A request handled by \"User filesystem\" is assigned"
" a <i>trust level</i> of one after the <i>security"
" level</i> of that module. That request can then not be"
" handled by the \"CGI module\" since that module has a"
" higher <i>security level</i> than the requests trust"
|
f498ed | 2000-07-11 | Martin Nilsson | | " level.</p>"
|
3bf345 | 1998-10-01 | Peter Bortas | | "\n<p>On the other hand, a request handled by the the"
" \"Filsystem module\" could later be handled by the"
|
f498ed | 2000-07-11 | Martin Nilsson | | " \"CGI module\".</p>"));
|
ad683e | 1998-05-09 | Henrik Grubbström (Grubba) | | } else {
me->definvisvar("_seclvl", -10, TYPE_INT);
|
14179b | 1997-01-29 | Per Hedbor | | }
|
3bbda8 | 1997-06-11 | Henrik Grubbström (Grubba) | | }
|
21306c | 2000-11-02 | Per Hedbor | | #endif
|
ad683e | 1998-05-09 | Henrik Grubbström (Grubba) | | } else {
me->defvar("_priority", 0, "", TYPE_INT, "", 0, 1);
}
|
14179b | 1997-01-29 | Per Hedbor | |
|
a0fbcc | 2000-04-05 | Martin Stjernholm | | mapping(string:mixed) stored_vars = retrieve(modname + "#" + id, this_object());
int has_stored_vars = sizeof (stored_vars);
me->setvars(stored_vars);
|
33e635 | 1998-02-28 | Martin Stjernholm | |
|
0b7d2b | 1999-12-22 | Per Hedbor | | module[ id ] = me;
|
37c1b3 | 1999-10-12 | Per Hedbor | | otomod[ me ] = modname+"#"+id;
|
10c7e1 | 1999-12-28 | Martin Nilsson | |
|
bcf566 | 2000-04-05 | Per Hedbor | | if(!nostart) call_start_callbacks( me, moduleinfo, module );
#ifdef MODULE_DEBUG
if (enable_module_batch_msgs)
report_debug("\bOK %6.1fms\n", (gethrtime()-start_time)/1000.0);
#endif
|
fd24e2 | 2000-08-28 | Per Hedbor | | if( !enabled_modules[modname+"#"+id] )
{
enabled_modules[modname+"#"+id] = 1;
store( "EnabledModules", enabled_modules, 1, this_object());
}
|
6f595f | 2000-08-20 | Per Hedbor | |
|
bcf566 | 2000-04-05 | Per Hedbor | | if (!has_stored_vars)
store (modname + "#" + id, me->query(), 0, this_object());
|
f63aca | 2000-09-08 | Martin Stjernholm | | if( me->no_delayed_load && got_no_delayed_load >= 0 )
got_no_delayed_load = 1;
|
a8ba69 | 2000-08-29 | Marcus Wellhardh | |
|
3557f5 | 2001-06-30 | Martin Stjernholm | | roxen->bootstrap_info->set (0);
|
bcf566 | 2000-04-05 | Per Hedbor | | return me;
}
void call_start_callbacks( RoxenModule me,
ModuleInfo moduleinfo,
ModuleCopies module )
{
|
40f064 | 2000-09-13 | Per Hedbor | | if(!me) return;
if(!moduleinfo) return;
if(!module) return;
|
a8ba69 | 2000-08-29 | Marcus Wellhardh | | call_low_start_callbacks( me, moduleinfo, module );
|
ad683e | 1998-05-09 | Henrik Grubbström (Grubba) | | mixed err;
|
c5e096 | 1999-10-04 | Per Hedbor | | if((me->start) && (err = catch( me->start(0, this_object()) ) ) )
{
#ifdef MODULE_DEBUG
|
bcf566 | 2000-04-05 | Per Hedbor | | if (enable_module_batch_msgs)
report_debug("\bERROR\n");
|
c5e096 | 1999-10-04 | Per Hedbor | | #endif
|
67f60e | 2000-07-09 | Martin Nilsson | | string bt=describe_backtrace(err);
|
49cd28 | 2000-08-11 | Andreas Lange | | report_error(LOC_M(41, "Error while initiating module copy of %s%s"),
|
67f60e | 2000-07-09 | Martin Nilsson | | moduleinfo->get_name(), (bt ? ":\n"+bt : "\n"));
|
f63aca | 2000-09-08 | Martin Stjernholm | | got_no_delayed_load = -1;
|
ad683e | 1998-05-09 | Henrik Grubbström (Grubba) | |
|
bcf566 | 2000-04-05 | Per Hedbor | |
|
ad683e | 1998-05-09 | Henrik Grubbström (Grubba) | | }
|
5ffa54 | 2000-02-16 | Per Hedbor | | if( inited && me->ready_to_receive_requests )
|
bcf566 | 2000-04-05 | Per Hedbor | | if( mixed q = catch( me->ready_to_receive_requests( this_object() ) ) )
{
|
c2fdff | 2000-03-21 | Martin Stjernholm | | #ifdef MODULE_DEBUG
if (enable_module_batch_msgs) report_debug("\bERROR\n");
#endif
report_error( "While calling ready_to_receive_requests:\n"+
describe_backtrace( q ) );
|
f63aca | 2000-09-08 | Martin Stjernholm | | got_no_delayed_load = -1;
|
c2fdff | 2000-03-21 | Martin Stjernholm | | }
|
a8ba69 | 2000-08-29 | Marcus Wellhardh | | }
void call_low_start_callbacks( RoxenModule me,
ModuleInfo moduleinfo,
ModuleCopies module )
{
|
40f064 | 2000-09-13 | Per Hedbor | | if(!me) return;
if(!moduleinfo) return;
if(!module) return;
|
a8ba69 | 2000-08-29 | Marcus Wellhardh | | int module_type = moduleinfo->type, pr;
mixed err;
|
10c7e1 | 1999-12-28 | Martin Nilsson | | if (err = catch(pr = me->query("_priority")))
|
c5e096 | 1999-10-04 | Per Hedbor | | {
|
c45b2a | 1999-12-09 | Martin Stjernholm | | #ifdef MODULE_DEBUG
|
9a1d47 | 2000-01-12 | Martin Stjernholm | | if (enable_module_batch_msgs) report_debug("\bERROR\n");
|
c45b2a | 1999-12-09 | Martin Stjernholm | | #endif
|
67f60e | 2000-07-09 | Martin Nilsson | | string bt=describe_backtrace(err);
|
49cd28 | 2000-08-11 | Andreas Lange | | report_error(LOC_M(41, "Error while initiating module copy of %s%s"),
|
67f60e | 2000-07-09 | Martin Nilsson | | moduleinfo->get_name(), (bt ? ":\n"+bt : "\n"));
|
ad683e | 1998-05-09 | Henrik Grubbström (Grubba) | | pr = 3;
}
api_module_cache |= me->api_functions();
|
10c7e1 | 1999-12-28 | Martin Nilsson | | if(module_type & MODULE_EXTENSION)
|
c5e096 | 1999-10-04 | Per Hedbor | | {
|
434bac | 2000-07-14 | Andreas Lange | | report_error("%s is an MODULE_EXTENSION, that type is no "
"longer available.\nPlease notify the modules writer.\n"
"Suitable replacement types include MODULE_FIRST and "
" MODULE_LAST.\n", moduleinfo->get_name());
|
c5e096 | 1999-10-04 | Per Hedbor | | }
|
ad683e | 1998-05-09 | Henrik Grubbström (Grubba) | |
|
c5e096 | 1999-10-04 | Per Hedbor | | if(module_type & MODULE_FILE_EXTENSION)
|
ad683e | 1998-05-09 | Henrik Grubbström (Grubba) | | if (err = catch {
array arr = me->query_file_extensions();
|
10c7e1 | 1999-12-28 | Martin Nilsson | | if (arrayp(arr))
|
c5e096 | 1999-10-04 | Per Hedbor | | {
|
ad683e | 1998-05-09 | Henrik Grubbström (Grubba) | | string foo;
foreach( me->query_file_extensions(), foo )
|
10c7e1 | 1999-12-28 | Martin Nilsson | | if(pri[pr]->file_extension_modules[foo] )
|
ad683e | 1998-05-09 | Henrik Grubbström (Grubba) | | pri[pr]->file_extension_modules[foo]+=({me});
else
pri[pr]->file_extension_modules[foo]=({me});
}
|
c45b2a | 1999-12-09 | Martin Stjernholm | | }) {
#ifdef MODULE_DEBUG
|
9a1d47 | 2000-01-12 | Martin Stjernholm | | if (enable_module_batch_msgs) report_debug("\bERROR\n");
|
c45b2a | 1999-12-09 | Martin Stjernholm | | #endif
|
f63aca | 2000-09-08 | Martin Stjernholm | | string bt=describe_backtrace(err);
report_error(LOC_M(41, "Error while initiating module copy of %s%s"),
moduleinfo->get_name(), (bt ? ":\n"+bt : "\n"));
got_no_delayed_load = -1;
|
c45b2a | 1999-12-09 | Martin Stjernholm | | }
|
14179b | 1997-01-29 | Per Hedbor | |
|
10c7e1 | 1999-12-28 | Martin Nilsson | | if(module_type & MODULE_PROVIDER)
if (err = catch
|
c5e096 | 1999-10-04 | Per Hedbor | | {
|
747a7c | 2001-08-13 | Per Hedbor | | mixed provs = me->query_provides ? me->query_provides() : ({});
|
ad683e | 1998-05-09 | Henrik Grubbström (Grubba) | | if(stringp(provs))
provs = (< provs >);
if(arrayp(provs))
provs = mkmultiset(provs);
if (multisetp(provs)) {
pri[pr]->provider_modules [ me ] = provs;
|
3bbda8 | 1997-06-11 | Henrik Grubbström (Grubba) | | }
|
c45b2a | 1999-12-09 | Martin Stjernholm | | }) {
#ifdef MODULE_DEBUG
|
9a1d47 | 2000-01-12 | Martin Stjernholm | | if (enable_module_batch_msgs) report_debug("\bERROR\n");
|
c45b2a | 1999-12-09 | Martin Stjernholm | | #endif
|
f63aca | 2000-09-08 | Martin Stjernholm | | string bt=describe_backtrace(err);
report_error(LOC_M(41, "Error while initiating module copy of %s%s"),
moduleinfo->get_name(), (bt ? ":\n"+bt : "\n"));
got_no_delayed_load = -1;
|
c45b2a | 1999-12-09 | Martin Stjernholm | | }
|
10c7e1 | 1999-12-28 | Martin Nilsson | |
|
c5e096 | 1999-10-04 | Per Hedbor | | if(module_type & MODULE_TYPES)
|
ad683e | 1998-05-09 | Henrik Grubbström (Grubba) | | {
types_module = me;
types_fun = me->type_from_extension;
}
|
10c7e1 | 1999-12-28 | Martin Nilsson | |
|
f59076 | 2000-09-10 | Martin Nilsson | | if(module_type & MODULE_TAG)
|
c5e096 | 1999-10-04 | Per Hedbor | | add_parse_module( me );
|
14179b | 1997-01-29 | Per Hedbor | |
|
c5e096 | 1999-10-04 | Per Hedbor | | if(module_type & MODULE_DIRECTORIES)
|
aaf391 | 2000-09-19 | Jonas Wallden | | if (me->parse_directory)
dir_module = me;
|
14179b | 1997-01-29 | Per Hedbor | |
|
c5e096 | 1999-10-04 | Per Hedbor | | if(module_type & MODULE_LOCATION)
|
ad683e | 1998-05-09 | Henrik Grubbström (Grubba) | | pri[pr]->location_modules += ({ me });
|
14179b | 1997-01-29 | Per Hedbor | |
|
c5e096 | 1999-10-04 | Per Hedbor | | if(module_type & MODULE_LOGGER)
|
ad683e | 1998-05-09 | Henrik Grubbström (Grubba) | | pri[pr]->logger_modules += ({ me });
|
14179b | 1997-01-29 | Per Hedbor | |
|
c5e096 | 1999-10-04 | Per Hedbor | | if(module_type & MODULE_URL)
|
ad683e | 1998-05-09 | Henrik Grubbström (Grubba) | | pri[pr]->url_modules += ({ me });
|
14179b | 1997-01-29 | Per Hedbor | |
|
c5e096 | 1999-10-04 | Per Hedbor | | if(module_type & MODULE_LAST)
|
ad683e | 1998-05-09 | Henrik Grubbström (Grubba) | | pri[pr]->last_modules += ({ me });
|
14179b | 1997-01-29 | Per Hedbor | |
|
c5e096 | 1999-10-04 | Per Hedbor | | if(module_type & MODULE_FILTER)
|
ad683e | 1998-05-09 | Henrik Grubbström (Grubba) | | pri[pr]->filter_modules += ({ me });
|
14179b | 1997-01-29 | Per Hedbor | |
|
10c7e1 | 1999-12-28 | Martin Nilsson | | if(module_type & MODULE_FIRST)
|
ad683e | 1998-05-09 | Henrik Grubbström (Grubba) | | pri[pr]->first_modules += ({ me });
|
14179b | 1997-01-29 | Per Hedbor | |
|
ad683e | 1998-05-09 | Henrik Grubbström (Grubba) | | invalidate_cache();
|
14179b | 1997-01-29 | Per Hedbor | | }
|
a6ef1f | 2000-03-28 | Johan Sundström | |
|
199d03 | 1999-09-05 | Francesco Chemolli | | string check_variable(string name, mixed value)
|
14179b | 1997-01-29 | Per Hedbor | | {
switch(name)
{
|
cffbaa | 2000-04-11 | Per Hedbor | |
|
c109fc | 2001-07-21 | Martin Stjernholm | | case "MyWorldLocation":
case "URLs":
fix_my_url();
return 0;
|
199d03 | 1999-09-05 | Francesco Chemolli | | case "throttle":
if (value) {
THROTTLING_DEBUG("configuration: Starting throttler up");
throttler=.throttler();
throttler->throttle(query("throttle_fill_rate"),
query("throttle_bucket_depth"),
query("throttle_min_grant"),
query("throttle_max_grant"));
} else {
|
7e0f38 | 2000-05-06 | Francesco Chemolli | | if (throttler) {
THROTTLING_DEBUG("configuration: Stopping throttler");
destruct(throttler);
throttler=0;
}
|
199d03 | 1999-09-05 | Francesco Chemolli | | }
return 0;
case "throttle_fill_rate":
case "throttle_bucket_depth":
case "throttle_min_grant":
case "throttle_max_grant":
THROTTLING_DEBUG("configuration: setting throttling parameter: "+
name+"="+value);
throttler->throttle(query("throttle_fill_rate"),
query("throttle_bucket_depth"),
query("throttle_min_grant"),
query("throttle_max_grant"));
return 0;
|
e42791 | 2001-06-30 | Honza Petrous | | #ifdef SNMP_AGENT
case "snmp_process":
if (objectp(roxen->snmpagent)) {
int cid = get_config_id();
value ? roxen->snmpagent->add_virtserv(cid) : roxen->snmpagent->del_virtserv(cid);
}
return 0;
#endif
|
14179b | 1997-01-29 | Per Hedbor | | }
}
|
2f4ac1 | 2000-11-02 | Per Hedbor | | void module_changed( ModuleInfo moduleinfo,
RoxenModule me )
|
14179b | 1997-01-29 | Per Hedbor | | {
|
2f4ac1 | 2000-11-02 | Per Hedbor | | clean_up_for_module( moduleinfo, me );
call_low_start_callbacks( me,
moduleinfo,
modules[ moduleinfo->sname ] );
}
|
14179b | 1997-01-29 | Per Hedbor | |
|
2f4ac1 | 2000-11-02 | Per Hedbor | | void clean_up_for_module( ModuleInfo moduleinfo,
RoxenModule me )
{
int pr;
|
c5e096 | 1999-10-04 | Per Hedbor | | if(moduleinfo->type & MODULE_FILE_EXTENSION)
|
14179b | 1997-01-29 | Per Hedbor | | {
string foo;
|
d54d06 | 1999-06-10 | Martin Stjernholm | | for(pr=0; pr<10; pr++)
foreach( indices (pri[pr]->file_extension_modules), foo )
pri[pr]->file_extension_modules[foo]-=({me});
|
14179b | 1997-01-29 | Per Hedbor | | }
|
c5e096 | 1999-10-04 | Per Hedbor | | if(moduleinfo->type & MODULE_PROVIDER) {
|
ae32d0 | 1998-03-23 | David Hedbor | | for(pr=0; pr<10; pr++)
m_delete(pri[pr]->provider_modules, me);
}
|
10c7e1 | 1999-12-28 | Martin Nilsson | |
|
c5e096 | 1999-10-04 | Per Hedbor | | if(moduleinfo->type & MODULE_TYPES)
|
14179b | 1997-01-29 | Per Hedbor | | {
types_module = 0;
types_fun = 0;
}
|
f59076 | 2000-09-10 | Martin Nilsson | | if(moduleinfo->type & MODULE_TAG)
|
b796b5 | 1998-11-18 | Per Hedbor | | remove_parse_module( me );
|
14179b | 1997-01-29 | Per Hedbor | |
|
c5e096 | 1999-10-04 | Per Hedbor | | if( moduleinfo->type & MODULE_DIRECTORIES )
|
14179b | 1997-01-29 | Per Hedbor | | dir_module = 0;
|
c5e096 | 1999-10-04 | Per Hedbor | | if( moduleinfo->type & MODULE_LOCATION )
|
14179b | 1997-01-29 | Per Hedbor | | for(pr=0; pr<10; pr++)
pri[pr]->location_modules -= ({ me });
|
c5e096 | 1999-10-04 | Per Hedbor | | if( moduleinfo->type & MODULE_URL )
|
14179b | 1997-01-29 | Per Hedbor | | for(pr=0; pr<10; pr++)
pri[pr]->url_modules -= ({ me });
|
c5e096 | 1999-10-04 | Per Hedbor | | if( moduleinfo->type & MODULE_LAST )
|
14179b | 1997-01-29 | Per Hedbor | | for(pr=0; pr<10; pr++)
pri[pr]->last_modules -= ({ me });
|
c5e096 | 1999-10-04 | Per Hedbor | | if( moduleinfo->type & MODULE_FILTER )
|
14179b | 1997-01-29 | Per Hedbor | | for(pr=0; pr<10; pr++)
pri[pr]->filter_modules -= ({ me });
|
c5e096 | 1999-10-04 | Per Hedbor | | if( moduleinfo->type & MODULE_FIRST ) {
|
14179b | 1997-01-29 | Per Hedbor | | for(pr=0; pr<10; pr++)
pri[pr]->first_modules -= ({ me });
|
f12890 | 1997-08-15 | Henrik Grubbström (Grubba) | | }
|
14179b | 1997-01-29 | Per Hedbor | |
|
c5e096 | 1999-10-04 | Per Hedbor | | if( moduleinfo->type & MODULE_LOGGER )
|
14179b | 1997-01-29 | Per Hedbor | | for(pr=0; pr<10; pr++)
pri[pr]->logger_modules -= ({ me });
|
2f4ac1 | 2000-11-02 | Per Hedbor | | }
int disable_module( string modname, int|void nodest )
{
MODULE_LOCK;
RoxenModule me;
int id, pr;
sscanf(modname, "%s#%d", modname, id );
if( datacache ) datacache->flush();
ModuleInfo moduleinfo = roxen.find_module( modname );
mapping module = modules[ modname ];
string descr = moduleinfo->get_name() + (id ? " copy " + (id + 1) : "");
if(!module)
{
report_error("disable_module(): " +
LOC_M(42, "Failed to disable module:\n"
"No module by that name: \"%s\".\n"), modname);
return 0;
}
me = module[id];
m_delete(module->copies, id);
if(!sizeof(module->copies))
m_delete( modules, modname );
invalidate_cache();
if(!me)
{
report_error("disable_module(): " +
LOC_M(43, "Failed to disable module \"%s\".\n"),
descr);
return 0;
}
if(me->stop)
if (mixed err = catch (me->stop())) {
string bt=describe_backtrace(err);
report_error("disable_module(): " +
LOC_M(44, "Error while disabling module %s%s"),
descr, (bt ? ":\n"+bt : "\n"));
}
#ifdef MODULE_DEBUG
report_debug("Disabling "+descr+"\n");
#endif
|
14179b | 1997-01-29 | Per Hedbor | |
|
2f4ac1 | 2000-11-02 | Per Hedbor | | clean_up_for_module( moduleinfo, me );
|
14179b | 1997-01-29 | Per Hedbor | |
|
5fbaec | 2001-04-11 | Per Hedbor | | if( !nodest )
{
|
a42fe4 | 2001-07-05 | Martin Nilsson | | m_delete( enabled_modules, modname + "#" + id );
forcibly_added[ modname + "#" + id ] = 0;
|
5fbaec | 2001-04-11 | Per Hedbor | | store( "EnabledModules",enabled_modules, 1, this_object());
|
2f7920 | 2000-03-27 | Per Hedbor | | destruct(me);
|
5fbaec | 2001-04-11 | Per Hedbor | | }
|
14179b | 1997-01-29 | Per Hedbor | | return 1;
}
|
9a8a15 | 2000-09-25 | Per Hedbor | | RoxenModule find_module(string name)
|
9fd809 | 2000-08-08 | Johan Sundström | |
|
14179b | 1997-01-29 | Per Hedbor | | {
int id;
sscanf(name, "%s#%d", name, id);
if(modules[name])
|
c5e096 | 1999-10-04 | Per Hedbor | | return modules[name]->copies[id];
|
14179b | 1997-01-29 | Per Hedbor | | return 0;
}
|
f5a274 | 1999-10-18 | Per Hedbor | | multiset forcibly_added = (<>);
int add_modules( array(string) mods, int|void now )
|
14179b | 1997-01-29 | Per Hedbor | | {
|
ba18d7 | 1999-11-27 | Per Hedbor | | #ifdef MODULE_DEBUG
|
c5e096 | 1999-10-04 | Per Hedbor | | int wr;
|
ba18d7 | 1999-11-27 | Per Hedbor | | #endif
|
c5e096 | 1999-10-04 | Per Hedbor | | foreach (mods, string mod)
|
8f061b | 1999-11-19 | Per Hedbor | | {
sscanf( mod, "%s#", mod );
|
10c7e1 | 1999-12-28 | Martin Nilsson | | if( ((now && !modules[ mod ]) ||
|
0ce25d | 1999-11-15 | Per Hedbor | | !enabled_modules[ mod+"#0" ] )
&& !forcibly_added[ mod+"#0" ])
|
14179b | 1997-01-29 | Per Hedbor | | {
|
ba18d7 | 1999-11-27 | Per Hedbor | | #ifdef MODULE_DEBUG
|
c5e096 | 1999-10-04 | Per Hedbor | | if( !wr++ )
|
9a1d47 | 2000-01-12 | Martin Stjernholm | | if (enable_module_batch_msgs)
report_debug("\b[ adding req module" + (sizeof (mods) > 1 ? "s" : "") + "\n");
else
report_debug("Adding required module" + (sizeof (mods) > 1 ? "s" : "") + "\n");
|
14179b | 1997-01-29 | Per Hedbor | | #endif
|
9a1d47 | 2000-01-12 | Martin Stjernholm | | enable_module( mod+"#0" );
|
747a7c | 2001-08-13 | Per Hedbor | | forcibly_added[ mod+"#0" ] = 1;
|
14179b | 1997-01-29 | Per Hedbor | | }
|
8f061b | 1999-11-19 | Per Hedbor | | }
|
ba18d7 | 1999-11-27 | Per Hedbor | | #ifdef MODULE_DEBUG
|
9a1d47 | 2000-01-12 | Martin Stjernholm | | if( wr && enable_module_batch_msgs )
|
ed8d26 | 1999-12-30 | Martin Stjernholm | | report_debug("] \b");
|
c79b26 | 1998-02-05 | Johan Schön | | #endif
|
14179b | 1997-01-29 | Per Hedbor | | }
|
850c28 | 2001-01-10 | Per Hedbor | | #if ROXEN_COMPAT < 2.2
|
279a0c | 1997-11-26 | Henrik Grubbström (Grubba) | |
|
14179b | 1997-01-29 | Per Hedbor | |
|
279a0c | 1997-11-26 | Henrik Grubbström (Grubba) | | mapping(string:string) sql_urls = ([]);
|
3f059e | 2001-06-24 | Per Hedbor | | constant sql_cache_get = DBManager.sql_cache_get;
|
ed9313 | 1998-07-09 | Johan Schön | |
|
850c28 | 2001-01-10 | Per Hedbor | | Sql.Sql sql_connect(string db)
|
279a0c | 1997-11-26 | Henrik Grubbström (Grubba) | | {
|
c5e096 | 1999-10-04 | Per Hedbor | | if (sql_urls[db])
return sql_cache_get(sql_urls[db]);
else
return sql_cache_get(db);
|
279a0c | 1997-11-26 | Henrik Grubbström (Grubba) | | }
|
850c28 | 2001-01-10 | Per Hedbor | | #endif
|
14179b | 1997-01-29 | Per Hedbor | |
|
c109fc | 2001-07-21 | Martin Stjernholm | | static string my_url;
void fix_my_url()
|
14179b | 1997-01-29 | Per Hedbor | | {
|
c109fc | 2001-07-21 | Martin Stjernholm | | my_url = query ("MyWorldLocation");
|
f41857 | 2001-07-21 | Martin Stjernholm | | if (!sizeof (my_url) &&
!(my_url = Roxen.get_world (query ("URLs"))))
|
3ec7cf | 2001-07-21 | Martin Stjernholm | |
my_url = "";
else
if (!has_suffix (my_url, "/")) my_url += "/";
|
14179b | 1997-01-29 | Per Hedbor | | }
|
c109fc | 2001-07-21 | Martin Stjernholm | | string get_url() {return my_url;}
|
5ffa54 | 2000-02-16 | Per Hedbor | | array after_init_hooks = ({});
mixed add_init_hook( mixed what )
{
if( inited )
call_out( what, 0, this_object() );
else
after_init_hooks |= ({ what });
}
|
d53f0b | 2000-09-09 | Martin Stjernholm | | static int got_no_delayed_load = 0;
|
f63aca | 2000-09-08 | Martin Stjernholm | |
|
d53f0b | 2000-09-09 | Martin Stjernholm | | void fix_no_delayed_load_flag()
|
14179b | 1997-01-29 | Per Hedbor | | {
|
d53f0b | 2000-09-09 | Martin Stjernholm | | if( got_no_delayed_load >= 0 &&
query ("no_delayed_load") != got_no_delayed_load ) {
|
f63aca | 2000-09-08 | Martin Stjernholm | | set( "no_delayed_load", got_no_delayed_load );
|
c45e3f | 2000-02-16 | Per Hedbor | | save_one( 0 );
|
f63aca | 2000-09-08 | Martin Stjernholm | | }
|
5ffa54 | 2000-02-16 | Per Hedbor | | }
|
d53f0b | 2000-09-09 | Martin Stjernholm | | void enable_all_modules()
{
MODULE_LOCK;
low_init( );
fix_no_delayed_load_flag();
}
void low_init(void|int modules_already_enabled)
|
5ffa54 | 2000-02-16 | Per Hedbor | | {
if( inited )
return;
|
8516a7 | 1999-12-22 | Per Hedbor | |
|
24c06c | 2000-02-16 | Per Hedbor | | int start_time = gethrtime();
|
d53f0b | 2000-09-09 | Martin Stjernholm | | if (!modules_already_enabled)
report_debug("\nEnabling all modules for "+query_name()+"... \n");
|
24c06c | 2000-02-16 | Per Hedbor | |
|
d53f0b | 2000-09-09 | Martin Stjernholm | | if (!modules_already_enabled) {
enabled_modules = retrieve("EnabledModules", this_object());
|
747a7c | 2001-08-13 | Per Hedbor | |
|
d53f0b | 2000-09-09 | Martin Stjernholm | |
array modules_to_process = indices( enabled_modules );
string tmp_string;
array err;
forcibly_added = (<>);
enable_module_batch_msgs = 1;
foreach( modules_to_process, tmp_string )
{
if( !forcibly_added[ tmp_string ] )
|
747a7c | 2001-08-13 | Per Hedbor | | if(err = catch( enable_module( tmp_string )))
{
report_error(LOC_M(45, "Failed to enable the module %s. Skipping.")
+"\n%s\n", tmp_string, describe_backtrace(err));
|
d53f0b | 2000-09-09 | Martin Stjernholm | | got_no_delayed_load = -1;
}
}
enable_module_batch_msgs = 0;
roxenloader.pop_compile_error_handler();
|
4f928a | 2001-07-31 | Per Hedbor | |
|
747a7c | 2001-08-13 | Per Hedbor | | forcibly_added = (<>);
|
f5a274 | 1999-10-18 | Per Hedbor | | }
|
17d6d1 | 2000-03-30 | Per Hedbor | |
|
3e3bab | 2001-01-19 | Per Hedbor | | foreach( ({this_object()})+indices( otomod ), RoxenModule mod )
|
5ffa54 | 2000-02-16 | Per Hedbor | | if( mod->ready_to_receive_requests )
|
f63aca | 2000-09-08 | Martin Stjernholm | | if( mixed q = catch( mod->ready_to_receive_requests( this_object() ) ) ) {
|
c2fdff | 2000-03-21 | Martin Stjernholm | | report_error( "While calling ready_to_receive_requests in "+
|
5ffa54 | 2000-02-16 | Per Hedbor | | otomod[mod]+":\n"+
describe_backtrace( q ) );
|
f63aca | 2000-09-08 | Martin Stjernholm | | got_no_delayed_load = -1;
}
|
5ffa54 | 2000-02-16 | Per Hedbor | |
foreach( after_init_hooks, function q )
|
f63aca | 2000-09-08 | Martin Stjernholm | | if( mixed w = catch( q(this_object()) ) ) {
|
c2fdff | 2000-03-21 | Martin Stjernholm | | report_error( "While calling after_init_hook %O:\n%s",
|
5ffa54 | 2000-02-16 | Per Hedbor | | q, describe_backtrace( w ) );
|
f63aca | 2000-09-08 | Martin Stjernholm | | got_no_delayed_load = -1;
}
|
5ffa54 | 2000-02-16 | Per Hedbor | |
after_init_hooks = ({});
inited = 1;
|
d53f0b | 2000-09-09 | Martin Stjernholm | | if (!modules_already_enabled)
report_notice(LOC_S(4, "All modules for %s enabled in %3.1f seconds") +
"\n\n", query_name(), (gethrtime()-start_time)/1000000.0);
|
14cf2b | 2001-07-18 | Honza Petrous | |
#ifdef SNMP_AGENT
if(objectp(roxen->snmpagent))
roxen->snmpagent->coldstart_trap(({ get_config_id() }));
#endif
|
0f28da | 1997-08-13 | Per Hedbor | | }
|
5f6dae | 2000-08-13 | Per Hedbor | | DataCache datacache;
|
3557f5 | 2001-06-30 | Martin Stjernholm | | static void create()
|
0f28da | 1997-08-13 | Per Hedbor | | {
|
3557f5 | 2001-06-30 | Martin Stjernholm | | if (!name) error ("Configuration name not set through bootstrap_info.\n");
|
851483 | 2000-11-27 | Per Hedbor | |
|
3557f5 | 2001-06-30 | Martin Stjernholm | | roxen.add_permission( "Site:"+name, LOC_C(306,"Site")+": "+name );
|
62e1bb | 2000-11-08 | Per Hedbor | |
|
b0a9ea | 2001-04-18 | Martin Stjernholm | |
|
a3be8e | 2000-10-06 | Martin Stjernholm | | defvar( "data_cache_size", 2048, DLOCALE(274, "Cache:Cache size"),
|
e4e6d3 | 2000-11-02 | Per Hedbor | | TYPE_INT| VAR_PUBLIC,
|
99a745 | 2000-08-22 | Andreas Lange | | DLOCALE(275, "The size of the data cache used to speed up requests "
|
5f6dae | 2000-08-13 | Per Hedbor | | "for commonly requested files, in KBytes"));
|
a3be8e | 2000-10-06 | Martin Stjernholm | | defvar( "data_cache_file_max_size", 50, DLOCALE(276, "Cache:Max file size"),
|
e4e6d3 | 2000-11-02 | Per Hedbor | | TYPE_INT | VAR_PUBLIC,
|
99a745 | 2000-08-22 | Andreas Lange | | DLOCALE(277, "The maximum size of a file that is to be considered for "
|
5f6dae | 2000-08-13 | Per Hedbor | | "the cache"));
|
23414a | 2000-07-21 | Andreas Lange | | defvar("default_server", 0, DLOCALE(20, "Default site"),
|
e4e6d3 | 2000-11-02 | Per Hedbor | | TYPE_FLAG| VAR_PUBLIC,
|
23414a | 2000-07-21 | Andreas Lange | | DLOCALE(21, "If true, this site will be selected in preference of "
|
40e24c | 2000-05-27 | Per Hedbor | | "other sites when virtual hosting is used and no host "
"header is supplied, or the supplied host header does not "
|
f498ed | 2000-07-11 | Martin Nilsson | | "match the address of any of the other servers.") );
|
40e24c | 2000-05-27 | Per Hedbor | |
|
1dd64a | 2000-09-19 | Mattias Wingstedt | | defvar("comment", "", DLOCALE(22, "Site comment"),
|
9b9f70 | 1997-08-12 | Per Hedbor | | TYPE_TEXT_FIELD|VAR_MORE,
|
23414a | 2000-07-21 | Andreas Lange | | DLOCALE(23, "This text will be visible in the administration "
|
434bac | 2000-07-14 | Andreas Lange | | "interface, it can be quite useful to use as a memory helper."));
|
b796b5 | 1998-11-18 | Per Hedbor | |
|
1dd64a | 2000-09-19 | Mattias Wingstedt | | defvar("name", "", DLOCALE(24, "Site name"),
|
b98c02 | 2001-07-31 | Per Hedbor | | TYPE_STRING|VAR_MORE| VAR_PUBLIC|VAR_NO_DEFAULT,
|
8148ed | 2000-09-13 | Andreas Lange | | DLOCALE(25, "This is the name that will be used in the administration "
|
14179b | 1997-01-29 | Per Hedbor | | "interface. If this is left empty, the actual name of the "
|
1dd64a | 2000-09-19 | Mattias Wingstedt | | "site will be used."));
|
10c7e1 | 1999-12-28 | Martin Nilsson | |
|
b0a9ea | 2001-04-18 | Martin Stjernholm | | defvar("compat_level", Variable.StringChoice (
|
b98c02 | 2001-07-31 | Per Hedbor | | "", roxen.compat_levels, VAR_NO_DEFAULT,
|
89d1d8 | 2001-05-16 | Martin Nilsson | | DLOCALE(246, "Compatibility level"),
|
8e0825 | 2001-06-17 | Martin Nilsson | | DLOCALE(384, "The compatibility level is used by different modules to select "
|
7848ae | 2001-06-15 | Martin Stjernholm | | "the right behavior to remain compatible with earlier Roxen "
"versions. When a server configuration is created, this variable "
"is set to the latest version. After that it's never changed "
"automatically, thereby ensuring that server configurations "
"migrated from earlier Roxen versions is kept at the right "
"compatibility level.\n"
"<p>\n"
"This variable may be changed manually, but it's advisable to "
"test the site carefully afterwards. A reload of the whole "
"server configuration is required to propagate the change properly "
"to all modules.")));
|
b0a9ea | 2001-04-18 | Martin Stjernholm | | set ("compat_level", roxen.__roxen_version__);
|
7848ae | 2001-06-15 | Martin Stjernholm | |
|
b0a9ea | 2001-04-18 | Martin Stjernholm | |
|
10c7e1 | 1999-12-28 | Martin Nilsson | | defvar("LogFormat",
|
f498ed | 2000-07-11 | Martin Nilsson | | "404: $host $referer - [$cern_date] \"$method $resource $protocol\" 404 -\n"
"500: $host $referer ERROR [$cern_date] \"$method $resource $protocol\" 500 -\n"
"*: $host - - [$cern_date] \"$method $resource $protocol\" $response $length",
|
23414a | 2000-07-21 | Andreas Lange | | DLOCALE(26, "Logging: Format"),
|
9b9f70 | 1997-08-12 | Per Hedbor | | TYPE_TEXT_FIELD|VAR_MORE,
|
23414a | 2000-07-21 | Andreas Lange | | DLOCALE(27, "What format to use for logging. The syntax is:\n"
|
14179b | 1997-01-29 | Per Hedbor | | "<pre>"
|
434bac | 2000-07-14 | Andreas Lange | | "response-code or *: Log format for that response code\n\n"
|
14179b | 1997-01-29 | Per Hedbor | | "Log format is normal characters, or one or more of the "
"variables below:\n"
"\n"
"\\n \\t \\r -- As in C, newline, tab and linefeed\n"
"$char(int) -- Insert the (1 byte) character specified by the integer.\n"
"$wchar(int) -- Insert the (2 byte) word specified by the integer.\n"
"$int(int) -- Insert the (4 byte) word specified by the integer.\n"
"$^ -- Supress newline at the end of the logentry\n"
"$host -- The remote host name, or ip number.\n"
|
f034ab | 2001-04-17 | Per Hedbor | | "$vhost -- The Host request-header sent by the client, or - if none\n"
|
14179b | 1997-01-29 | Per Hedbor | | "$ip_number -- The remote ip number.\n"
"$bin-ip_number -- The remote host id as a binary integer number.\n"
"\n"
"$cern_date -- Cern Common Log file format date.\n"
|
434bac | 2000-07-14 | Andreas Lange | | "$bin-date -- Time, but as an 32 bit integer in network byteorder\n"
|
14179b | 1997-01-29 | Per Hedbor | | "\n"
"$method -- Request method\n"
"$resource -- Resource identifier\n"
|
dfb4ec | 1999-05-20 | Francesco Chemolli | | "$full_resource -- Full requested resource, including any query fields\n"
|
14179b | 1997-01-29 | Per Hedbor | | "$protocol -- The protocol used (normally HTTP/1.0)\n"
"$response -- The response code sent\n"
"$bin-response -- The response code sent as a binary short number\n"
"$length -- The length of the data section of the reply\n"
|
434bac | 2000-07-14 | Andreas Lange | | "$bin-length -- Same, but as an 32 bit integer in network byteorder\n"
|
0bf5a1 | 1998-04-03 | Henrik Grubbström (Grubba) | | "$request-time -- The time the request took (seconds)\n"
|
14179b | 1997-01-29 | Per Hedbor | | "$referer -- the header 'referer' from the request, or '-'.\n"
|
f498ed | 2000-07-11 | Martin Nilsson | | "$user_agent -- the header 'User-Agent' from the request, or '-'.\n\n"
|
14179b | 1997-01-29 | Per Hedbor | | "$user -- the name of the auth user used, if any\n"
"$user_id -- A unique user ID, if cookies are supported,\n"
" by the client, otherwise '0'\n"
|
f498ed | 2000-07-11 | Martin Nilsson | | "</pre>"), 0, lambda(){ return !query("Log");});
|
b796b5 | 1998-11-18 | Per Hedbor | |
|
23414a | 2000-07-21 | Andreas Lange | | defvar("Log", 1, DLOCALE(28, "Logging: Enabled"),
TYPE_FLAG, DLOCALE(29, "Log requests"));
|
14179b | 1997-01-29 | Per Hedbor | |
|
f498ed | 2000-07-11 | Martin Nilsson | |
defvar("LogFile", "$LOGDIR/"+Roxen.short_name(name)+"/Log",
|
23414a | 2000-07-21 | Andreas Lange | | DLOCALE(30, "Logging: Log file"), TYPE_FILE,
DLOCALE(31, "The log file. "
|
f7d981 | 1997-09-12 | Per Hedbor | | ""
|
f498ed | 2000-07-11 | Martin Nilsson | | "A file name. Some substitutions will be done:"
|
f7d981 | 1997-09-12 | Per Hedbor | | "<pre>"
|
b796b5 | 1998-11-18 | Per Hedbor | | "%y Year (e.g. '1997')\n"
"%m Month (e.g. '08')\n"
"%d Date (e.g. '10' for the tenth)\n"
|
3bb38c | 2000-01-20 | Martin Bähr | | "%h Hour (e.g. '00')\n"
"%H Hostname\n"
|
f498ed | 2000-07-11 | Martin Nilsson | | "</pre>")
|
c5e096 | 1999-10-04 | Per Hedbor | | ,0, lambda(){ return !query("Log");});
|
10c7e1 | 1999-12-28 | Martin Nilsson | |
defvar("NoLog", ({ }),
|
23414a | 2000-07-21 | Andreas Lange | | DLOCALE(32, "Logging: No Logging for"), TYPE_STRING_LIST|VAR_MORE,
DLOCALE(33, "Don't log requests from hosts with an IP number which "
|
434bac | 2000-07-14 | Andreas Lange | | "matches any of the patterns in this list. This also affects "
"the access counter log."),
0, lambda(){ return !query("Log");});
|
a8f1b3 | 2000-01-31 | Per Hedbor | |
|
e4e6d3 | 2000-11-02 | Per Hedbor | | defvar("Domain", roxen.get_domain(), DLOCALE(34, "Domain"),
|
b98c02 | 2001-07-31 | Per Hedbor | | TYPE_STRING|VAR_PUBLIC|VAR_NO_DEFAULT,
|
1dd64a | 2000-09-19 | Mattias Wingstedt | | DLOCALE(35, "The domain name of the server. The domain name is used "
|
434bac | 2000-07-14 | Andreas Lange | | "to generate default URLs, and to generate email addresses."));
|
14179b | 1997-01-29 | Per Hedbor | |
|
f41857 | 2001-07-21 | Martin Stjernholm | | defvar("MyWorldLocation", "",
|
e4e6d3 | 2000-11-02 | Per Hedbor | | DLOCALE(36, "Primary Server URL"), TYPE_URL|VAR_PUBLIC,
|
f41857 | 2001-07-21 | Martin Stjernholm | | DLOCALE(37, #"\
This is the main server URL, where your start page is located. This
setting is for instance used as fallback to generate absolute URLs to
the server, but in most circumstances the URLs sent by the clients are
used. A URL is deduced from the first entry in 'URLs' if this is left
blank.
<p>Note that setting this doesn't make the server accessible; you must
also set 'URLs'."));
|
434bac | 2000-07-14 | Andreas Lange | |
|
c551f2 | 2000-07-04 | Per Hedbor | | defvar("URLs",
|
b98c02 | 2001-07-31 | Per Hedbor | | Variable.PortList( ({"http://*/"}), VAR_INITIAL|VAR_NO_DEFAULT,
|
23414a | 2000-07-21 | Andreas Lange | | DLOCALE(38, "URLs"),
DLOCALE(39, "Bind to these URLs. You can use '*' and '?' to perform"
|
434bac | 2000-07-14 | Andreas Lange | | " globbing (using any of these will default to binding to "
"all IP-numbers on your machine). The possible protocols "
|
bc0dec | 2001-08-05 | Martin Nilsson | | "are http, https, ftp, ftps, hilfe and tetris.")));
|
c5e096 | 1999-10-04 | Per Hedbor | |
|
199d03 | 1999-09-05 | Francesco Chemolli | | defvar("InternalLoc", "/_internal/",
|
23414a | 2000-07-21 | Andreas Lange | | DLOCALE(40, "Internal module resource mountpoint"),
|
f406ba | 1999-11-27 | Per Hedbor | | TYPE_LOCATION|VAR_MORE|VAR_DEVELOPER,
|
23414a | 2000-07-21 | Andreas Lange | | DLOCALE(41, "Some modules may want to create links to internal "
|
434bac | 2000-07-14 | Andreas Lange | | "resources. This setting configures an internally handled "
"location that can be used for such purposes. Simply select "
"a location that you are not likely to use for regular "
"resources."));
|
f498ed | 2000-07-11 | Martin Nilsson | |
defvar("throttle", 0,
|
101eb5 | 2000-11-16 | Per Hedbor | | DLOCALE(42, "Throttling: Server; Enabled"),TYPE_FLAG,
|
23414a | 2000-07-21 | Andreas Lange | | DLOCALE(43, "If set, per-server bandwidth throttling will be enabled. "
|
434bac | 2000-07-14 | Andreas Lange | | "It will allow you to limit the total available bandwidth for "
|
1dd64a | 2000-09-19 | Mattias Wingstedt | | "this site.<br />Bandwidth is assigned using a Token Bucket. "
|
f498ed | 2000-07-11 | Martin Nilsson | | "The principle under which it works is: for each byte we send we use a token. "
"Tokens are added to a repository at a constant rate. When there's not enough, "
"we can't transmit. When there's too many, they \"spill\" and are lost."));
|
199d03 | 1999-09-05 | Francesco Chemolli | |
|
f498ed | 2000-07-11 | Martin Nilsson | | defvar("throttle_fill_rate", 102400,
|
101eb5 | 2000-11-16 | Per Hedbor | | DLOCALE(44, "Throttling: Server; Average available bandwidth"),
|
199d03 | 1999-09-05 | Francesco Chemolli | | TYPE_INT,
|
1dd64a | 2000-09-19 | Mattias Wingstedt | | DLOCALE(45, "This is the average bandwidth available to this site in "
|
f498ed | 2000-07-11 | Martin Nilsson | | "bytes/sec (the bucket \"fill rate\")."),
0, arent_we_throttling_server);
defvar("throttle_bucket_depth", 1024000,
|
101eb5 | 2000-11-16 | Per Hedbor | | DLOCALE(46, "Throttling: Server; Bucket Depth"), TYPE_INT,
|
23414a | 2000-07-21 | Andreas Lange | | DLOCALE(47, "This is the maximum depth of the bucket. After a long enough period "
|
f498ed | 2000-07-11 | Martin Nilsson | | "of inactivity, a request will get this many unthrottled bytes of data, before "
"throttling kicks back in.<br>Set equal to the Fill Rate in order not to allow "
"any data bursts. This value determines the length of the time over which the "
"bandwidth is averaged."), 0, arent_we_throttling_server);
defvar("throttle_min_grant", 1300,
|
101eb5 | 2000-11-16 | Per Hedbor | | DLOCALE(48, "Throttling: Server; Minimum Grant"), TYPE_INT,
|
23414a | 2000-07-21 | Andreas Lange | | DLOCALE(49, "When the bandwidth availability is below this value, connections will "
|
f498ed | 2000-07-11 | Martin Nilsson | | "be delayed rather than granted minimal amounts of bandwidth. The purpose "
"is to avoid sending too small packets (which would increase the IP overhead)."),
0, arent_we_throttling_server);
defvar("throttle_max_grant", 14900,
|
101eb5 | 2000-11-16 | Per Hedbor | | DLOCALE(50, "Throttling: Server; Maximum Grant"), TYPE_INT,
|
23414a | 2000-07-21 | Andreas Lange | | DLOCALE(51, "This is the maximum number of bytes assigned in a single request "
|
f498ed | 2000-07-11 | Martin Nilsson | | "to a connection. Keeping this number low will share bandwidth more evenly "
"among the pending connections, but keeping it too low will increase IP "
"overhead and (marginally) CPU usage. You'll want to set it just a tiny "
"bit lower than any integer multiple of your network's MTU (typically 1500 "
"for ethernet)."), 0, arent_we_throttling_server);
|
199d03 | 1999-09-05 | Francesco Chemolli | |
defvar("req_throttle", 0,
|
101eb5 | 2000-11-16 | Per Hedbor | | DLOCALE(52, "Throttling: Request; Enabled"), TYPE_FLAG,
|
23414a | 2000-07-21 | Andreas Lange | | DLOCALE(53, "If set, per-request bandwidth throttling will be enabled.")
|
199d03 | 1999-09-05 | Francesco Chemolli | | );
|
4d1683 | 1999-11-17 | Per Hedbor | |
|
199d03 | 1999-09-05 | Francesco Chemolli | | defvar("req_throttle_min", 1024,
|
101eb5 | 2000-11-16 | Per Hedbor | | DLOCALE(54, "Throttling: Request; Minimum guarranteed bandwidth"),
|
199d03 | 1999-09-05 | Francesco Chemolli | | TYPE_INT,
|
23414a | 2000-07-21 | Andreas Lange | | DLOCALE(55, "The maximum bandwidth each connection (in bytes/sec) can use is determined "
|
f498ed | 2000-07-11 | Martin Nilsson | | "combining a number of modules. But doing so can lead to too small "
"or even negative bandwidths for particularly unlucky requests. This variable "
"guarantees a minimum bandwidth for each request."),
0, arent_we_throttling_request);
|
4d1683 | 1999-11-17 | Per Hedbor | |
|
199d03 | 1999-09-05 | Francesco Chemolli | | defvar("req_throttle_depth_mult", 60.0,
|
101eb5 | 2000-11-16 | Per Hedbor | | DLOCALE(56, "Throttling: Request; Bucket Depth Multiplier"),
|
199d03 | 1999-09-05 | Francesco Chemolli | | TYPE_FLOAT,
|
23414a | 2000-07-21 | Andreas Lange | | DLOCALE(57, "The average bandwidth available for each request will be determined by "
|
f498ed | 2000-07-11 | Martin Nilsson | | "the modules combination. The bucket depth will be determined multiplying "
"the rate by this factor."),
0, arent_we_throttling_request);
|
4d1683 | 1999-11-17 | Per Hedbor | |
|
9fbde2 | 2000-11-06 | Per Hedbor | |
defvar("404-files", ({ "404.inc" }),
|
55a866 | 2000-11-20 | Per Hedbor | | DLOCALE(307, "No such file message override files"),
|
9fbde2 | 2000-11-06 | Per Hedbor | | TYPE_STRING_LIST|VAR_PUBLIC,
|
55a866 | 2000-11-20 | Per Hedbor | | DLOCALE(308,
|
9fbde2 | 2000-11-06 | Per Hedbor | | "If no file match a given resource all directories above the"
" wanted file is searched for one of the files in this list."
"<p>\n"
"As an example, if the file /foo/bar/not_there.html is "
"wanted, and this list contains the default value of 404.inc,"
" these files will be searched for, in this order:</p><br /> "
" /foo/bar/404.inc, /foo/404.inc and /404.inc." ) );
class NoSuchFileOverride
{
inherit Variable.Variable;
int check_visibility( RequestID id, int more_mode,
int expert_mode, int devel_mode,
int initial, int|void variable_in_cfif )
{
return 0;
}
void set( string newval )
{
if( search(newval,"emit source=values") == -1 )
variables[ "404-message" ]->set( newval );
}
void create()
{
::create(
#"<nooutput><emit source=values scope=ef variable='modvar.site.404-files'>
<set variable='var.base' value=''/>
<emit source='path'>
<append variable='var.base' value='/&_.name;'/>
<set variable='var.404' value='&var.base;/&ef.value;'/>
<if exists='&var.404;'>
<set variable='var.errfile' from='var.404'/>
</if>
</emit>
</emit>
</nooutput><if variable='var.errfile'><eval><insert file='&var.errfile;'/></eval></if><else><eval>&modvar.site.404-message:none;</eval></else>", 0, 0, 0 );
}
};
defvar("ZNoSuchFile", NoSuchFileOverride() );
|
b82d0f | 2001-08-01 | Per Hedbor | | defvar("404-message", #"<html><head>
|
94d475 | 2000-04-05 | Martin Nilsson | | <title>404 - Page not found</title>
</head>
<body alink=\"#000000\" bgcolor=\"#ffffff\" bottommargin=\"0\" leftmargin=\"0\" link=\"#ce5c00\" marginheight=\"2\" marginwidth=\"0\" rightmargin=\"0\" text=\"#333333\" topmargin=\"2\" vlink=\"#ce5c00\">
|
8cf9d8 | 2000-09-19 | Martin Nilsson | | <if nserious=''><set variable='var.404' value='-sorry' /></if>
|
94d475 | 2000-04-05 | Martin Nilsson | | <table width=\"100%\" border=\"0\" cellspacing=\"0\" cellpadding=\"0\">
<tr>
|
8cf9d8 | 2000-09-19 | Martin Nilsson | | <td><img src=\"/internal-roxen-page-not-found&var.404;\" border=\"0\" alt=\"Page not found\" width=\"404\" hspace=\"2\" /></td>
|
94d475 | 2000-04-05 | Martin Nilsson | | <td> </td>
|
8cf9d8 | 2000-09-19 | Martin Nilsson | | <td align=\"right\"><font face=\"lucida,helvetica,arial\">
|
59a049 | 2000-12-11 | Martin Nilsson | | <b>Roxen WebServer &roxen.base-version; </b></font></td>
|
94d475 | 2000-04-05 | Martin Nilsson | | </tr>
<tr>
<td width=\"100%\" height=\"21\" colspan=\"3\" background=\"/internal-roxen-tile\"><img src=\"/internal-roxen-unit\" alt=\"\" /></td>
</tr>
</table>
<font face=\"lucida,helvetica,arial\">
<h2> Unable to retrieve &page.virtfile;.</h2>
<br /><br />
<blockquote>
If you feel that this is a configuration error,
|
8cf9d8 | 2000-09-19 | Martin Nilsson | | please contact the administrators of this
webserver or the author of the
<if referrer=''>
|
94d475 | 2000-04-05 | Martin Nilsson | | <a href=\"&client.referrer;\">referring</a>
</if><else>
referring
</else>
page.
</blockquote>
</font>
</body>
",
|
9fbde2 | 2000-11-06 | Per Hedbor | | DLOCALE(58, "No such file message"),
TYPE_TEXT_FIELD|VAR_PUBLIC,
|
23414a | 2000-07-21 | Andreas Lange | | DLOCALE(59, "What to return when there is no resource or file "
|
434bac | 2000-07-14 | Andreas Lange | | "available at a certain location."));
|
a7e39f | 2000-02-04 | Per Hedbor | |
|
e42791 | 2001-06-30 | Honza Petrous | | #ifdef SNMP_AGENT
defvar("snmp_process", 0,
"SNMP: Enabled",TYPE_FLAG,
"If set, per-server objects will be added to the SNMP agent database.",
0, snmp_global_disabled);
defvar("snmp_community", "public:ro",
"SNMP: Community string", TYPE_STRING,
"The community string and access level for manipulation on server "
" specific objects.",
0, snmp_disabled);
|
14cf2b | 2001-07-18 | Honza Petrous | | defvar("snmp_traphosts", ({ }),
"SNMP: Trap hosts", TYPE_STRING_LIST,
"The remote nodes, where should be sent traps.", 0, snmp_disabled);
|
e42791 | 2001-06-30 | Honza Petrous | |
if (query("snmp_process")) {
if(objectp(roxen()->snmpagent)) {
int servid;
|
12e6ea | 2001-07-19 | Honza Petrous | | servid = roxen()->snmpagent->add_virtserv(get_config_id());
|
e42791 | 2001-06-30 | Honza Petrous | |
|
14cf2b | 2001-07-18 | Honza Petrous | |
|
e42791 | 2001-06-30 | Honza Petrous | | } else
report_error("SNMPagent: something gets wrong! The main agent is disabled!\n"); }
#endif
|
12e6ea | 2001-07-19 | Honza Petrous | |
definvisvar( "no_delayed_load", 0, TYPE_FLAG|VAR_PUBLIC );
mapping(string:mixed) retrieved_vars = retrieve("spider#0", this_object());
if (sizeof (retrieved_vars) && !retrieved_vars->compat_level)
set ("compat_level", "2.1");
setvars( retrieved_vars );
if (query("throttle"))
{
throttler=.throttler();
throttler->throttle(query("throttle_fill_rate"),
query("throttle_bucket_depth"),
query("throttle_min_grant"),
query("throttle_max_grant"));
}
|
199d03 | 1999-09-05 | Francesco Chemolli | | }
|
9a8a15 | 2000-09-25 | Per Hedbor | | static int arent_we_throttling_server () {
|
199d03 | 1999-09-05 | Francesco Chemolli | | return !query("throttle");
}
|
9a8a15 | 2000-09-25 | Per Hedbor | | static int arent_we_throttling_request() {
|
199d03 | 1999-09-05 | Francesco Chemolli | | return !query("req_throttle");
|
14179b | 1997-01-29 | Per Hedbor | | }
|
e42791 | 2001-06-30 | Honza Petrous | |
#ifdef SNMP_AGENT
private static int(0..1) snmp_disabled() {
return (!snmp_global_disabled() && !query("snmp_process"));
}
|
14cf2b | 2001-07-18 | Honza Petrous | | private static int(0..1) snmp_global_disabled() {
return (!objectp(roxen->snmpagent));
}
|
e42791 | 2001-06-30 | Honza Petrous | | #endif
|