Stas Bekman wrote:
> I think we shouldn't support:
> 
> Apache->server_root_relative and equivalents, but only:
> 
> ($r|$s|$c)->server_root_relative(...) and
> Apache::server_root_relative($pool, ...)
> 
> because users will get bad memory leaks when a global pool is used to
> allocate memory in requests. We should support the non-(pool|$r|$c|$s)
> argument functions only in compat

ok, the attached patch takes care of this.  the only hitch is that
Apache->server_root_relative in compat.pm collides, so it needed to follow
the new override/restore API.

> the comments here are confusing. This is a generic internal
> modperl_sv2pool function and used in other places

actually, it's not that I can see.  maybe it used to be?

anyway, as a result of our new syntax and the fact that sv2pool isn't used
elsewhere, I've adjusted the function considerably - it no longer returns a
global pool at all and now supports properly formatted subclasses.

--Geoff
Index: Changes
===================================================================
RCS file: /home/cvspublic/modperl-2.0/Changes,v
retrieving revision 1.300
diff -u -r1.300 Changes
--- Changes     11 Jan 2004 20:22:56 -0000      1.300
+++ Changes     13 Jan 2004 20:03:51 -0000
@@ -12,6 +12,11 @@
 
 =item 1.99_13-dev
 
+server_root_relative() now requires either a valid pool or an $r, $s, or $c
+object as a first argument.  also, the returned result is a copy, protecting
+against cases where the pool would go out of scope before the result.
+[Geoffrey Young]
+
 Check the success of sysopen in tmpfile() in compat [Geoffrey Young]
 
 make sure DynaLoader is loaded before XSLoader, not only with perl
Index: lib/Apache/compat.pm
===================================================================
RCS file: /home/cvspublic/modperl-2.0/lib/Apache/compat.pm,v
retrieving revision 1.95
diff -u -r1.95 compat.pm
--- lib/Apache/compat.pm        11 Jan 2004 20:22:56 -0000      1.95
+++ lib/Apache/compat.pm        13 Jan 2004 20:03:51 -0000
@@ -139,6 +139,20 @@
 }
 EOI
 
+    'Apache::server_root_relative' => <<'EOI',
+{
+    require Apache::Server;
+    require Apache::ServerUtil;
+
+    my $orig_sub = *Apache::server_root_relative{CODE};
+    *Apache::server_root_relative = sub {
+        my $class = shift;
+        return Apache->server->server_root_relative(@_);
+    };
+    $orig_sub;
+}
+EOI
+
 );
 
 my %overridden_mp2_api = ();
@@ -210,7 +224,7 @@
 
 package Apache::Server;
 # XXX: is that good enough? see modperl/src/modules/perl/mod_perl.c:367
-our $CWD = Apache->server_root_relative();
+our $CWD = Apache::server_root;
 
 our $AddPerlVersion = 1;
 
@@ -334,9 +348,6 @@
 
     $r->content_type($type);
 }
-
-#to support $r->server_root_relative
-*server_root_relative = \&Apache::server_root_relative;
 
 #we support Apache->request; this is needed to support $r->request
 #XXX: seems sorta backwards
Index: src/modules/perl/modperl_util.c
===================================================================
RCS file: /home/cvspublic/modperl-2.0/src/modules/perl/modperl_util.c,v
retrieving revision 1.59
diff -u -r1.59 modperl_util.c
--- src/modules/perl/modperl_util.c     19 Dec 2003 01:17:32 -0000      1.59
+++ src/modules/perl/modperl_util.c     13 Jan 2004 20:03:51 -0000
@@ -172,39 +172,30 @@
     return rv;
 }
 
-apr_pool_t *modperl_sv2pool(pTHX_ SV *obj)
+apr_pool_t *modperl_sv2pool(pTHX_ SV *obj, CV *method)
 {
     apr_pool_t *p = NULL;
     char *classname = NULL;
     IV ptr = 0;
 
-    /*
-     * if inside request and 'PerlOptions +GlobalRequest' for this interp,
-     * get the pool from the current request
-     * else return the global pool
-     */
-    if (!SvOK(obj)) {
-        request_rec *r = NULL;
-        (void)modperl_tls_get_request_rec(&r);
-
-        if (r) {
-            return r->pool;
-        }
-
-        return modperl_global_get_pconf();
-    }
-    
     if ((SvROK(obj) && (SvTYPE(SvRV(obj)) == SVt_PVMG))) {
+        /* standard classes */
+        classname = SvCLASS(obj);
         ptr = SvObjIV(obj);
+    }
+    else if ((SvROK(obj) && (SvTYPE(SvRV(obj)) == SVt_PVHV))) {
+        /* Apache::RequestRec subclass */
         classname = SvCLASS(obj);
+        ptr = SvIV(modperl_hv_request_find(aTHX_ obj, classname, method));
+
+        /* if modperl_hv_request_find succeeeds then the class is an 
+         * Apache::RequestRec subclass (the only subclass we support).
+         * so, fake things a bit so we can dig out the proper pool below
+         */
+         classname = "Apache::RequestRec";
     }
     else {
-        STRLEN len;
-        classname = SvPV(obj, len);
-    }
-
-    if (*classname != 'A') {
-        /* XXX: could be a subclass */
+        MP_TRACE_m(MP_FUNC, "SV not a recognized object");
         return NULL;
     }
 
@@ -213,10 +204,11 @@
         switch (*classname) {
           case 'P':
             if (strEQ(classname, "Pool")) {
-                p = (apr_pool_t *)ptr;
+                p = (apr_pool_t *)SvObjIV(obj);
             }
             break;
           default:
+            MP_TRACE_m(MP_FUNC, "class %s not recognized", classname);
             break;
         };
     }
@@ -225,25 +217,33 @@
         switch (*classname) {
           case 'C':
             if (strEQ(classname, "Connection")) {
-                p = ptr ? ((conn_rec *)ptr)->pool : NULL;
+                p = ((conn_rec *)ptr)->pool;
             }
             break;
           case 'R':
             if (strEQ(classname, "RequestRec")) {
-                p = ptr ? ((request_rec *)ptr)->pool : NULL;
+                p = ((request_rec *)ptr)->pool;
             }
             break;
           case 'S':
             if (strEQ(classname, "Server")) {
-                p = ptr ? ((server_rec *)ptr)->process->pconf : NULL;
+                p = ((server_rec *)ptr)->process->pconf;
             }
             break;
           default:
+            MP_TRACE_m(MP_FUNC, "class %s not recognised", classname);
             break;
         };
     }
+    else {
+        MP_TRACE_m(MP_FUNC, "class %s not recognised", classname);
+    }
+
+    if (p == NULL) {
+        MP_TRACE_m(MP_FUNC, "unable to derive pool from object");
+    }
 
-    return p ? p : modperl_global_get_pconf();
+    return p;
 }
 
 char *modperl_apr_strerror(apr_status_t rv)
@@ -818,4 +818,28 @@
     }
    
     return package;
+}
+
+/* this is used across server_root_relative() in the
+ * Apache, Apache::Server, Apache::RequestRec, and 
+ * Apache::Connection classes
+ */
+SV *modperl_server_root_relative(pTHX_ SV *sv, const char *fname)
+{
+    apr_pool_t *p;
+
+    if (!sv_isobject(sv)) {
+        Perl_croak(aTHX_ "usage: Apache::server_root_relative(obj, name)");
+    }
+
+    p = modperl_sv2pool(aTHX_ sv, get_cv("Apache::server_root_relative", 0));
+
+    if (p == NULL) {
+        MP_TRACE_a(MP_FUNC,
+                   "unable to isolate pool for ap_server_root_relative()");
+        return &PL_sv_undef;
+    }
+
+    /* copy the SV in case the pool goes out of scope before the perl scalar */
+    return newSVpv(ap_server_root_relative(p, fname), 0);
 }
Index: src/modules/perl/modperl_util.h
===================================================================
RCS file: /home/cvspublic/modperl-2.0/src/modules/perl/modperl_util.h,v
retrieving revision 1.50
diff -u -r1.50 modperl_util.h
--- src/modules/perl/modperl_util.h     9 Jan 2004 00:12:07 -0000       1.50
+++ src/modules/perl/modperl_util.h     13 Jan 2004 20:03:51 -0000
@@ -87,7 +87,7 @@
 MP_INLINE SV *modperl_perl_sv_setref_uv(pTHX_ SV *rv,
                                         const char *classname, UV uv);
 
-apr_pool_t *modperl_sv2pool(pTHX_ SV *obj);
+apr_pool_t *modperl_sv2pool(pTHX_ SV *obj, CV *method);
 
 char *modperl_apr_strerror(apr_status_t rv);
 
@@ -161,4 +161,7 @@
 #endif
 
 char *modperl_file2package(apr_pool_t *p, const char *file);
+
+SV *modperl_server_root_relative(pTHX_ SV *sv, const char *fname);
+
 #endif /* MODPERL_UTIL_H */
Index: t/response/TestAPI/server_util.pm
===================================================================
RCS file: /home/cvspublic/modperl-2.0/t/response/TestAPI/server_util.pm,v
retrieving revision 1.5
diff -u -r1.5 server_util.pm
--- t/response/TestAPI/server_util.pm   11 Apr 2002 11:08:43 -0000      1.5
+++ t/response/TestAPI/server_util.pm   13 Jan 2004 20:03:52 -0000
@@ -5,43 +5,111 @@
 
 use Apache::Test;
 use Apache::TestUtil;
+use File::Spec::Functions qw(canonpath catfile);
 
 use Apache::RequestRec ();
 use Apache::ServerUtil ();
+use Apache::Process ();
+
+use APR::Pool ();
 
 use Apache::Const -compile => 'OK';
 
-sub handler {
-    my $r = shift;
+my $serverroot = Apache::Test::config()->{vars}->{serverroot};
 
-    my $s = $r->server;
+our @ISA = qw(Apache::RequestRec);
 
-    plan $r, tests => 9;
+sub new {
+    my $class = shift;
+    my $r = shift;
+    bless { r => $r }, $class;
+}
 
-    for my $p ($r->pool, $r->connection->pool,
-               $r, $r->connection, $r->server)
-    {
-        my $dir = Apache::server_root_relative($p, 'conf');
+sub handler {
 
-        ok -d $dir;
-    }
+    my $r = shift;
 
-    my $dir = Apache::server_root; #constant
+    my %pools = ( 
+        '$r->pool'                       => $r->pool, 
+        '$r->connection->pool'           => $r->connection->pool,
+        '$r->server->process->pool'      => $r->server->process->pool,
+        '$r->server->process->pconf'     => $r->server->process->pconf,
+        'Apache->server->process->pconf' => Apache->server->process->pconf,
+        'APR::Pool->new'                 => APR::Pool->new,
+    );
+
+    my %objects = ( 
+        '$r'                   => $r,
+        '$r->connection'       => $r->connection,
+        '$r->server'           => $r->server,
+        '__PACKAGE__->new($r)' => __PACKAGE__->new($r),
+    );
+
+    plan $r, tests => (scalar keys %pools) +
+                      (scalar keys %objects) + 8;
+
+    # syntax - an object or pool is required
+    t_debug("Apache::server_root_relative() died");
+    eval { my $dir = Apache::server_root_relative() };
+    t_debug("\$\@: $@");
+    ok $@;
+
+    t_debug("Apache->server_root_relative() died");
+    eval { my $dir = Apache->server_root_relative() };
+    ok $@;
+
+    # syntax - first argument must be an object, not a class
+    t_debug("Apache->server_root_relative('conf') died");
+    eval { my $dir = Apache->server_root_relative('conf') };
+    ok $@;
+
+    foreach my $p (keys %pools) {
+
+        ok t_cmp(catfile($serverroot, 'conf'),
+                 Apache::server_root_relative($pools{$p}, 'conf'),
+                 "Apache::server_root_relative($p, 'conf')");
+    }
 
-    ok -d $dir;
+    # dig out the pool from valid objects
+    foreach my $obj (keys %objects) {
 
-    $dir = join '/', Apache::server_root, 'logs';
+        ok t_cmp(catfile($serverroot, 'conf'),
+                 $objects{$obj}->server_root_relative('conf'),
+                 "$obj->server_root_relative('conf')");
+    }
 
-    ok $dir eq Apache::server_root_relative($r->pool, 'logs');
+    # syntax - unrecognized objects don't segfault
+    {
+        my $obj = bless {}, 'Apache::Foo';
+        eval { Apache::server_root_relative($obj, 'conf') };
 
-    $dir = Apache->server_root_relative('logs'); #1.x ish
+        ok t_cmp(qr/server_root_relative.*no .* key/,
+                 $@,
+                 "Apache::server_root_relative(\$obj, 'conf')");
+    }
 
-    ok -d $dir;
+    # no file argument gives ServerRoot
+    ok t_cmp(canonpath($serverroot),
+             canonpath($r->server_root_relative),
+             '$r->server_root_relative()');
+
+    ok t_cmp(canonpath($serverroot),
+             canonpath(Apache::server_root_relative($r->pool)),
+             'Apache::server_root_relative($r->pool)');
+
+    # Apache::server_root is also the ServerRoot constant
+    ok t_cmp(canonpath(Apache::server_root),
+             canonpath($r->server_root_relative),
+             'Apache::server_root');
 
-    #$r->server_root_relative works with use Apache::compat
-    $dir = Apache->server_root_relative(); #1.x ish
+    {
+        # absolute paths should resolve to themselves
+        my $dir = $r->server_root_relative('logs');
 
-    ok -d $dir;
+        ok t_cmp($r->server_root_relative($dir),
+                 $dir,
+                 "\$r->server_root_relative($dir)");
+    }
 
     Apache::OK;
 }
Index: t/response/TestAPR/finfo.pm
===================================================================
RCS file: /home/cvspublic/modperl-2.0/t/response/TestAPR/finfo.pm,v
retrieving revision 1.7
diff -u -r1.7 finfo.pm
--- t/response/TestAPR/finfo.pm 16 Dec 2003 18:13:04 -0000      1.7
+++ t/response/TestAPR/finfo.pm 13 Jan 2004 20:03:52 -0000
@@ -40,7 +40,7 @@
         ok $isa;
     }
 
-    my $file = Apache->server_root_relative(catfile qw(htdocs index.html));
+    my $file = $r->server_root_relative(catfile qw(htdocs index.html));
 
     # stat tests
     {
Index: t/response/TestCompat/apache.pm
===================================================================
RCS file: /home/cvspublic/modperl-2.0/t/response/TestCompat/apache.pm,v
retrieving revision 1.7
diff -u -r1.7 apache.pm
--- t/response/TestCompat/apache.pm     21 Oct 2003 22:20:18 -0000      1.7
+++ t/response/TestCompat/apache.pm     13 Jan 2004 20:03:52 -0000
@@ -9,6 +9,7 @@
 
 use Apache::TestUtil;
 use Apache::Test;
+use File::Spec::Functions qw(catfile canonpath);
 
 use Apache::compat ();
 use Apache::Constants qw(DIR_MAGIC_TYPE :common :response);
@@ -16,7 +17,7 @@
 sub handler {
     my $r = shift;
 
-    plan $r, tests => 11;
+    plan $r, tests => 16;
 
     $r->send_http_header('text/plain');
 
@@ -62,6 +63,33 @@
     ok t_cmp('[EMAIL PROTECTED]', $r->server->server_admin,
              'Apache->httpd_conf');
     $r->server->server_admin($admin);
+
+    ok t_cmp(canonpath($Apache::Server::CWD),
+             canonpath(Apache::Test::config()->{vars}->{serverroot}),
+             '$Apache::Server::CWD');
+
+    ok t_cmp(canonpath($Apache::Server::CWD),
+             canonpath($r->server_root_relative),
+             '$r->server_root_relative()');
+
+    ok t_cmp(catfile($Apache::Server::CWD, 'conf'),
+             $r->server_root_relative('conf'),
+             "\$r->server_root_relative('conf')");
+
+    # Apache->server_root_relative
+    {
+        Apache::compat::override_mp2_api('Apache::server_root_relative');
+
+        ok t_cmp(catfile($Apache::Server::CWD, 'conf'),
+                 Apache->server_root_relative('conf'),
+                 "Apache->server_root_relative('conf')");
+
+        ok t_cmp(canonpath($Apache::Server::CWD),
+                 canonpath(Apache->server_root_relative),
+                 'Apache->server_root_relative()');
+
+        Apache::compat::restore_mp2_api('Apache::server_root_relative');
+    }
 
     OK;
 }
Index: todo/release
===================================================================
RCS file: /home/cvspublic/modperl-2.0/todo/release,v
retrieving revision 1.6
diff -u -r1.6 release
--- todo/release        19 Dec 2003 01:17:32 -0000      1.6
+++ todo/release        13 Jan 2004 20:03:52 -0000
@@ -139,14 +139,6 @@
   http://marc.theaimsgroup.com/?l=apache-modperl-dev&m=100622977803237&w=2
   http://marc.theaimsgroup.com/?t=97984528900002&r=1&w=2
 
-* Apache->server_root_relative:
-  needs to default to current pool (pconf at startup, r->pool at
-  request time) - solution: require the pool object to be passed. if a
-  user doesn't have one, make them create one, e.g.:
-  Apache::server_root_relative(APR::Pool->new, ....). Must make sure
-  that the returned SV has a copy of that string and doesn't rely on
-  anything that it's in pool, which will be now destroyed.
-
 * $r->cleanup_for_exec  needs to be added to Apache::compat as a noop.
   Owner: stas
 
Index: xs/Apache/Connection/Apache__Connection.h
===================================================================
RCS file: /home/cvspublic/modperl-2.0/xs/Apache/Connection/Apache__Connection.h,v
retrieving revision 1.7
diff -u -r1.7 Apache__Connection.h
--- xs/Apache/Connection/Apache__Connection.h   24 Aug 2002 17:16:45 -0000      1.7
+++ xs/Apache/Connection/Apache__Connection.h   13 Jan 2004 20:03:52 -0000
@@ -24,3 +24,11 @@
 {
     return ap_get_remote_host(c, (void *)dir_config, type, NULL);
 }
+
+static MP_INLINE
+SV *mpxs_Apache__Connection_server_root_relative(pTHX_
+                                                 SV *sv,
+                                                 const char *fname)
+{
+    return modperl_server_root_relative(aTHX_ sv, fname);
+}
Index: xs/Apache/RequestRec/Apache__RequestRec.h
===================================================================
RCS file: /home/cvspublic/modperl-2.0/xs/Apache/RequestRec/Apache__RequestRec.h,v
retrieving revision 1.7
diff -u -r1.7 Apache__RequestRec.h
--- xs/Apache/RequestRec/Apache__RequestRec.h   18 Dec 2003 18:53:50 -0000      1.7
+++ xs/Apache/RequestRec/Apache__RequestRec.h   13 Jan 2004 20:03:52 -0000
@@ -59,3 +59,12 @@
 {
     return &r->finfo;
 }
+
+static MP_INLINE
+SV *mpxs_Apache__RequestRec_server_root_relative(pTHX_
+                                                 SV *sv,
+                                                 const char *fname)
+{
+    return modperl_server_root_relative(aTHX_ sv, fname);
+}
+
Index: xs/Apache/ServerUtil/Apache__ServerUtil.h
===================================================================
RCS file: /home/cvspublic/modperl-2.0/xs/Apache/ServerUtil/Apache__ServerUtil.h,v
retrieving revision 1.9
diff -u -r1.9 Apache__ServerUtil.h
--- xs/Apache/ServerUtil/Apache__ServerUtil.h   10 Jan 2004 02:52:20 -0000      1.9
+++ xs/Apache/ServerUtil/Apache__ServerUtil.h   13 Jan 2004 20:03:52 -0000
@@ -42,13 +42,20 @@
 #define mpxs_Apache_server(classname) \
 modperl_global_get_server_rec()
 
-static MP_INLINE char *mpxs_ap_server_root_relative(pTHX_
-                                                    SV *sv,
-                                                    const char *fname)
+static MP_INLINE
+SV *mpxs_Apache__Server_server_root_relative(pTHX_
+                                             SV *sv,
+                                             const char *fname)
 {
-    apr_pool_t *p = modperl_sv2pool(aTHX_ sv);
+    return modperl_server_root_relative(aTHX_ sv, fname);
+}
 
-    return ap_server_root_relative(p, fname);
+static MP_INLINE
+SV *mpxs_Apache_server_root_relative(pTHX_
+                                     SV *sv,
+                                     const char *fname)
+{
+    return modperl_server_root_relative(aTHX_ sv, fname);
 }
 
 static MP_INLINE
Index: xs/maps/apache_functions.map
===================================================================
RCS file: /home/cvspublic/modperl-2.0/xs/maps/apache_functions.map,v
retrieving revision 1.66
diff -u -r1.66 apache_functions.map
--- xs/maps/apache_functions.map        1 Dec 2003 17:14:16 -0000       1.66
+++ xs/maps/apache_functions.map        13 Jan 2004 20:03:52 -0000
@@ -166,7 +166,7 @@
  ap_get_server_built
  ap_get_server_version
  ap_psignature | | r,prefix
- ap_server_root_relative | mpxs_ | SV *:p, fname=""
+~ap_server_root_relative
 
 MODULE=Apache::Connection   PACKAGE=guess
 #XXX: thought this might be useful for protocol modules
Index: xs/maps/modperl_functions.map
===================================================================
RCS file: /home/cvspublic/modperl-2.0/xs/maps/modperl_functions.map,v
retrieving revision 1.64
diff -u -r1.64 modperl_functions.map
--- xs/maps/modperl_functions.map       10 Jan 2004 02:52:20 -0000      1.64
+++ xs/maps/modperl_functions.map       13 Jan 2004 20:03:52 -0000
@@ -16,6 +16,7 @@
  mpxs_Apache__RequestRec_proxyreq       | | r, val=Nullsv
  mpxs_Apache__RequestRec_subprocess_env | | r, key=NULL, val=Nullsv
  mpxs_Apache__RequestRec_finfo
+ mpxs_Apache__RequestRec_server_root_relative | | SV *:p, fname=""
 
 MODULE=Apache::RequestUtil   PACKAGE=guess
  mpxs_Apache__RequestRec_push_handlers
@@ -73,12 +74,15 @@
 
 PACKAGE=Apache::Server
  SV *:DEFINE_dir_config | | server_rec *:s, char *:key=NULL, SV *:sv_val=Nullsv
+ mpxs_Apache__Server_server_root_relative | | SV *:p, fname=""
 
 PACKAGE=Apache
  server_rec *:DEFINE_server | | SV *:classname=Nullsv
+ mpxs_Apache_server_root_relative | | SV *:p, fname=""
 
 MODULE=Apache::Connection
  mpxs_Apache__Connection_client_socket | | c, s=NULL
+ mpxs_Apache__Connection_server_root_relative | | SV *:p, fname=""
 
 MODULE=Apache::Filter
  modperl_filter_attributes | MPXS_ | ... | MODIFY_CODE_ATTRIBUTES
Index: xs/tables/current/Apache/FunctionTable.pm
===================================================================
RCS file: /home/cvspublic/modperl-2.0/xs/tables/current/Apache/FunctionTable.pm,v
retrieving revision 1.51
diff -u -r1.51 FunctionTable.pm
--- xs/tables/current/Apache/FunctionTable.pm   8 Dec 2003 19:31:53 -0000       1.51
+++ xs/tables/current/Apache/FunctionTable.pm   13 Jan 2004 20:03:52 -0000
@@ -4724,7 +4724,7 @@
     ]
   },
   {
-    'return_type' => 'char *',
+    'return_type' => 'SV *',
     'name' => 'ap_server_root_relative',
     'args' => [
       {
Index: xs/tables/current/ModPerl/FunctionTable.pm
===================================================================
RCS file: /home/cvspublic/modperl-2.0/xs/tables/current/ModPerl/FunctionTable.pm,v
retrieving revision 1.135
diff -u -r1.135 FunctionTable.pm
--- xs/tables/current/ModPerl/FunctionTable.pm  10 Jan 2004 02:52:20 -0000      1.135
+++ xs/tables/current/ModPerl/FunctionTable.pm  13 Jan 2004 20:03:53 -0000
@@ -6338,8 +6338,26 @@
     ]
   },
   {
-    'return_type' => 'char *',
-    'name' => 'mpxs_ap_server_root_relative',
+    'return_type' => 'SV *',
+    'name' => 'modperl_server_root_relative',
+    'args' => [
+      {
+        'type' => 'PerlInterpreter *',
+        'name' => 'my_perl'
+      },
+      {
+        'type' => 'SV *',
+        'name' => 'sv'
+      },
+      {
+        'type' => 'const char *',
+        'name' => 'fname'
+      }
+    ]
+  },
+  {
+    'return_type' => 'SV *',
+    'name' => 'mpxs_Apache_server_root_relative',
     'attr' => [
       'static',
       '__inline__'
@@ -6351,7 +6369,73 @@
       },
       {
         'type' => 'SV *',
-        'name' => 'sv'
+        'name' => 'p'
+      },
+      {
+        'type' => 'const char *',
+        'name' => 'fname'
+      }
+    ]
+  },
+  {
+    'return_type' => 'SV *',
+    'name' => 'mpxs_Apache__RequestRec_server_root_relative',
+    'attr' => [
+      'static',
+      '__inline__'
+    ],
+    'args' => [
+      {
+        'type' => 'PerlInterpreter *',
+        'name' => 'my_perl'
+      },
+      {
+        'type' => 'SV *',
+        'name' => 'p'
+      },
+      {
+        'type' => 'const char *',
+        'name' => 'fname'
+      }
+    ]
+  },
+  {
+    'return_type' => 'SV *',
+    'name' => 'mpxs_Apache__Server_server_root_relative',
+    'attr' => [
+      'static',
+      '__inline__'
+    ],
+    'args' => [
+      {
+        'type' => 'PerlInterpreter *',
+        'name' => 'my_perl'
+      },
+      {
+        'type' => 'SV *',
+        'name' => 'p'
+      },
+      {
+        'type' => 'const char *',
+        'name' => 'fname'
+      }
+    ]
+  },
+  {
+    'return_type' => 'SV *',
+    'name' => 'mpxs_Apache__Connection_server_root_relative',
+    'attr' => [
+      'static',
+      '__inline__'
+    ],
+    'args' => [
+      {
+        'type' => 'PerlInterpreter *',
+        'name' => 'my_perl'
+      },
+      {
+        'type' => 'SV *',
+        'name' => 'p'
       },
       {
         'type' => 'const char *',

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to