How do I use APR'ized programs in connection with programs that don't
use APR?  These darn incomplete types don't let me fill out the APR types.

The APR developers acknowledge that most programs are not using APR, and
we don't expect them to migrate to using APR just because APR has been
released.  So, we have provided a way for non-APR'ized programs to interact
very cleanly with APR.

There are a set of functions, all documented in apr_portable.h, which allow
a programmer to either get a native type from an APR type, or to setup an
APR type from a native type.

For example, if you are writing an add-on to another program that does not use
APR for file I/O, but you (in your infinite wisdom) want to use APR to make
sure your section is portable.  Assume the program provides a type foo_t with
a file descriptor in it (fd).

void function_using_apr(foo_t non_apr_struct, ap_pool_t *p)
{
    ap_file_t *apr_file = NULL;

    ap_put_os_file(&apr_file, &non_apr_struct->fd, p);

    ...
}

There are portable functions for each APR incomplete type.  They are all 
called ap_put_os_foobar(), and they each take the same basic arguments, a
pointer to a pointer to the incomplete type (the last pointer in that list 
should be NULL), a pointer to the native type, and a pool.  Each of these can
be found in apr_portable.h.

If you have to do the exact opposite (take an APR type and convert it to a 
native type, there are functions for that too.  For example:

void function_not_using_apr(apr_file_t *apr_file)
{
    int unix_file_desc;

    ap_get_os_file(&unix_file_desc, apr_file);
   
    ...
}

For each ap_put_os_foobar, there is a corresponding ap_get_os_file.  These are
also documented in apr_portable.h.

