Question

I'm writing some apache (2.2) modules in C and I'm pretty new at it, so I was wondering:

I need to know if it's possible to create a global variable that will be initiated whenever the apache server starts to run.

See, I need to have a list of host names (that will be "privileged"), so that every request I get, I need to check if the host name appears in the list (to check if it's "previleged").

So the list should be global (so that every server instance will have the same instance of the list), and I need to initialize it at the beginning.

How do I do that, if it's at all possible?

Thanks!

Was it helpful?

Solution

Although not a complete answer, I did manage to find a way to have global variables.

I used the apr_pool_userdata_get and apr_pool_userdata_set methods with the process's global pools (pconf and pool).

For further reference:
http://apr.apache.org/docs/apr/0.9/group_apr_pools.html

Examples:

attach static global data to server process pool

char *data = "this is some data";
apr_pool_userdata_setn ((void*) data, "myglobaldata_key", NULL, request->server->process->pool);

attach malloced heap data to server process pool

char *data = strdup("this is some data");
apr_pool_userdata_setn ((void*) data, "myglobaldata_key", (apr_status_t(*)(void *))free, request->server->process->pool);

Now retrieve the global data:

char *data;
apr_pool_userdata_get ((void**)&data, "myglobaldata_key", request->server->process->pool);
if (data == NULL) {
    // data not set...
}

OTHER TIPS

This link indicates one can use static/global variables in a module, they do require care in accessing from multiple threads. My observation is that given there may be multiple processes (the global variable would live in a process, shared by many threads), the static should not be counted on to be initialized. Ie initializing once probably is not enough.

http://httpd.apache.org/docs/2.2/developer/thread_safety.html#variables

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top