Main Page | Modules | Namespace List | Alphabetical List | Data Structures | Directories | File List | Data Fields | Globals | Related Pages | Examples

apr_buckets.h

Go to the documentation of this file.
00001 /* Copyright 2000-2005 The Apache Software Foundation or its licensors, as
00002  * applicable.
00003  *
00004  * Licensed under the Apache License, Version 2.0 (the "License");
00005  * you may not use this file except in compliance with the License.
00006  * You may obtain a copy of the License at
00007  *
00008  *     http://www.apache.org/licenses/LICENSE-2.0
00009  *
00010  * Unless required by applicable law or agreed to in writing, software
00011  * distributed under the License is distributed on an "AS IS" BASIS,
00012  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
00013  * See the License for the specific language governing permissions and
00014  * limitations under the License.
00015  */
00016 /**
00017  * @file apr_buckets.h
00018  * @brief APR-UTIL Buckets/Bucket Brigades
00019  */
00020 
00021 #ifndef APR_BUCKETS_H
00022 #define APR_BUCKETS_H
00023 
00024 #if defined(APR_BUCKET_DEBUG) && !defined(APR_RING_DEBUG)
00025 #define APR_RING_DEBUG
00026 #endif
00027 
00028 #include "apu.h"
00029 #include "apr_network_io.h"
00030 #include "apr_file_io.h"
00031 #include "apr_general.h"
00032 #include "apr_mmap.h"
00033 #include "apr_errno.h"
00034 #include "apr_ring.h"
00035 #include "apr.h"
00036 #if APR_HAVE_SYS_UIO_H
00037 #include <sys/uio.h>    /* for struct iovec */
00038 #endif
00039 #if APR_HAVE_STDARG_H
00040 #include <stdarg.h>
00041 #endif
00042 
00043 #ifdef __cplusplus
00044 extern "C" {
00045 #endif
00046 
00047 /**
00048  * @defgroup APR_Util_Bucket_Brigades Bucket Brigades
00049  * @ingroup APR_Util
00050  * @{ 
00051  */
00052 
00053 /** default bucket buffer size - 8KB minus room for memory allocator headers */
00054 #define APR_BUCKET_BUFF_SIZE 8000
00055 
00056 /** Determines how a bucket or brigade should be read */
00057 typedef enum {
00058     APR_BLOCK_READ,   /**< block until data becomes available */
00059     APR_NONBLOCK_READ /**< return immediately if no data is available */
00060 } apr_read_type_e;
00061 
00062 /**
00063  * The one-sentence buzzword-laden overview: Bucket brigades represent
00064  * a complex data stream that can be passed through a layered IO
00065  * system without unnecessary copying. A longer overview follows...
00066  *
00067  * A bucket brigade is a doubly linked list (ring) of buckets, so we
00068  * aren't limited to inserting at the front and removing at the end.
00069  * Buckets are only passed around as members of a brigade, although
00070  * singleton buckets can occur for short periods of time.
00071  *
00072  * Buckets are data stores of various types. They can refer to data in
00073  * memory, or part of a file or mmap area, or the output of a process,
00074  * etc. Buckets also have some type-dependent accessor functions:
00075  * read, split, copy, setaside, and destroy.
00076  *
00077  * read returns the address and size of the data in the bucket. If the
00078  * data isn't in memory then it is read in and the bucket changes type
00079  * so that it can refer to the new location of the data. If all the
00080  * data doesn't fit in the bucket then a new bucket is inserted into
00081  * the brigade to hold the rest of it.
00082  *
00083  * split divides the data in a bucket into two regions. After a split
00084  * the original bucket refers to the first part of the data and a new
00085  * bucket inserted into the brigade after the original bucket refers
00086  * to the second part of the data. Reference counts are maintained as
00087  * necessary.
00088  *
00089  * setaside ensures that the data in the bucket has a long enough
00090  * lifetime. Sometimes it is convenient to create a bucket referring
00091  * to data on the stack in the expectation that it will be consumed
00092  * (output to the network) before the stack is unwound. If that
00093  * expectation turns out not to be valid, the setaside function is
00094  * called to move the data somewhere safer.
00095  *
00096  * copy makes a duplicate of the bucket structure as long as it's
00097  * possible to have multiple references to a single copy of the
00098  * data itself.  Not all bucket types can be copied.
00099  *
00100  * destroy maintains the reference counts on the resources used by a
00101  * bucket and frees them if necessary.
00102  *
00103  * Note: all of the above functions have wrapper macros (apr_bucket_read(),
00104  * apr_bucket_destroy(), etc), and those macros should be used rather
00105  * than using the function pointers directly.
00106  *
00107  * To write a bucket brigade, they are first made into an iovec, so that we
00108  * don't write too little data at one time.  Currently we ignore compacting the
00109  * buckets into as few buckets as possible, but if we really want good
00110  * performance, then we need to compact the buckets before we convert to an
00111  * iovec, or possibly while we are converting to an iovec.
00112  */
00113 
00114 /*
00115  * Forward declaration of the main types.
00116  */
00117 
00118 /** @see apr_bucket_brigade */
00119 typedef struct apr_bucket_brigade apr_bucket_brigade;
00120 /** @see apr_bucket */
00121 typedef struct apr_bucket apr_bucket;
00122 /** @see apr_bucket_alloc_t */
00123 typedef struct apr_bucket_alloc_t apr_bucket_alloc_t;
00124 
00125 /** @see apr_bucket_type_t */
00126 typedef struct apr_bucket_type_t apr_bucket_type_t;
00127 
00128 /**
00129  * Basic bucket type
00130  */
00131 struct apr_bucket_type_t {
00132     /**
00133      * The name of the bucket type
00134      */
00135     const char *name;
00136     /** 
00137      * The number of functions this bucket understands.  Can not be less than
00138      * five.
00139      */
00140     int num_func;
00141     /**
00142      * Whether the bucket contains metadata (ie, information that
00143      * describes the regular contents of the brigade).  The metadata
00144      * is not returned by apr_bucket_read() and is not indicated by
00145      * the ->length of the apr_bucket itself.  In other words, an
00146      * empty bucket is safe to arbitrarily remove if and only if it
00147      * contains no metadata.  In this sense, "data" is just raw bytes
00148      * that are the "content" of the brigade and "metadata" describes
00149      * that data but is not a proper part of it.
00150      */
00151     enum {
00152         /** This bucket type represents actual data to send to the client. */
00153         APR_BUCKET_DATA = 0,
00154         /** This bucket type represents metadata. */
00155         APR_BUCKET_METADATA = 1
00156     } is_metadata;
00157     /**
00158      * Free the private data and any resources used by the bucket (if they
00159      *  aren't shared with another bucket).  This function is required to be
00160      *  implemented for all bucket types, though it might be a no-op on some
00161      *  of them (namely ones that never allocate any private data structures).
00162      * @param data The private data pointer from the bucket to be destroyed
00163      */
00164     void (*destroy)(void *data);
00165 
00166     /**
00167      * Read the data from the bucket. This is required to be implemented
00168      *  for all bucket types.
00169      * @param b The bucket to read from
00170      * @param str A place to store the data read.  Allocation should only be
00171      *            done if absolutely necessary. 
00172      * @param len The amount of data read.
00173      * @param block Should this read function block if there is more data that
00174      *              cannot be read immediately.
00175      */
00176     apr_status_t (*read)(apr_bucket *b, const char **str, apr_size_t *len, 
00177                          apr_read_type_e block);
00178     
00179     /**
00180      * Make it possible to set aside the data for at least as long as the
00181      *  given pool. Buckets containing data that could potentially die before
00182      *  this pool (e.g. the data resides on the stack, in a child pool of
00183      *  the given pool, or in a disjoint pool) must somehow copy, shift, or
00184      *  transform the data to have the proper lifetime.
00185      * @param e The bucket to convert
00186      * @remark Some bucket types contain data that will always outlive the
00187      *         bucket itself. For example no data (EOS and FLUSH), or the data
00188      *         resides in global, constant memory (IMMORTAL), or the data is on
00189      *      the heap (HEAP). For these buckets, apr_bucket_setaside_noop can
00190      *      be used.
00191      */
00192     apr_status_t (*setaside)(apr_bucket *e, apr_pool_t *pool);
00193 
00194     /**
00195      * Split one bucket in two at the specified position by duplicating
00196      *  the bucket structure (not the data) and modifying any necessary
00197      *  start/end/offset information.  If it's not possible to do this
00198      *  for the bucket type (perhaps the length of the data is indeterminate,
00199      *  as with pipe and socket buckets), then APR_ENOTIMPL is returned.
00200      * @param e The bucket to split
00201      * @param point The offset of the first byte in the new bucket
00202      */
00203     apr_status_t (*split)(apr_bucket *e, apr_size_t point);
00204 
00205     /**
00206      * Copy the bucket structure (not the data), assuming that this is
00207      *  possible for the bucket type. If it's not, APR_ENOTIMPL is returned.
00208      * @param e The bucket to copy
00209      * @param c Returns a pointer to the new bucket
00210      */
00211     apr_status_t (*copy)(apr_bucket *e, apr_bucket **c);
00212 
00213 };
00214 
00215 /**
00216  * apr_bucket structures are allocated on the malloc() heap and
00217  * their lifetime is controlled by the parent apr_bucket_brigade
00218  * structure. Buckets can move from one brigade to another e.g. by
00219  * calling APR_BRIGADE_CONCAT(). In general the data in a bucket has
00220  * the same lifetime as the bucket and is freed when the bucket is
00221  * destroyed; if the data is shared by more than one bucket (e.g.
00222  * after a split) the data is freed when the last bucket goes away.
00223  */
00224 struct apr_bucket {
00225     /** Links to the rest of the brigade */
00226     APR_RING_ENTRY(apr_bucket) link;
00227     /** The type of bucket.  */
00228     const apr_bucket_type_t *type;
00229     /** The length of the data in the bucket.  This could have been implemented
00230      *  with a function, but this is an optimization, because the most
00231      *  common thing to do will be to get the length.  If the length is unknown,
00232      *  the value of this field will be (apr_size_t)(-1).
00233      */
00234     apr_size_t length;
00235     /** The start of the data in the bucket relative to the private base
00236      *  pointer.  The vast majority of bucket types allow a fixed block of
00237      *  data to be referenced by multiple buckets, each bucket pointing to
00238      *  a different segment of the data.  That segment starts at base+start
00239      *  and ends at base+start+length.  
00240      *  If the length == (apr_size_t)(-1), then start == -1.
00241      */
00242     apr_off_t start;
00243     /** type-dependent data hangs off this pointer */
00244     void *data; 
00245     /**
00246      * Pointer to function used to free the bucket. This function should
00247      * always be defined and it should be consistent with the memory
00248      * function used to allocate the bucket. For example, if malloc() is 
00249      * used to allocate the bucket, this pointer should point to free().
00250      * @param e Pointer to the bucket being freed
00251      */
00252     void (*free)(void *e);
00253     /** The freelist from which this bucket was allocated */
00254     apr_bucket_alloc_t *list;
00255 };
00256 
00257 /** A list of buckets */
00258 struct apr_bucket_brigade {
00259     /** The pool to associate the brigade with.  The data is not allocated out
00260      *  of the pool, but a cleanup is registered with this pool.  If the 
00261      *  brigade is destroyed by some mechanism other than pool destruction,
00262      *  the destroying function is responsible for killing the cleanup.
00263      */
00264     apr_pool_t *p;
00265     /** The buckets in the brigade are on this list. */
00266     /*
00267      * The apr_bucket_list structure doesn't actually need a name tag
00268      * because it has no existence independent of struct apr_bucket_brigade;
00269      * the ring macros are designed so that you can leave the name tag
00270      * argument empty in this situation but apparently the Windows compiler
00271      * doesn't like that.
00272      */
00273     APR_RING_HEAD(apr_bucket_list, apr_bucket) list;
00274     /** The freelist from which this bucket was allocated */
00275     apr_bucket_alloc_t *bucket_alloc;
00276 };
00277 
00278 
00279 /**
00280  * Function called when a brigade should be flushed
00281  */
00282 typedef apr_status_t (*apr_brigade_flush)(apr_bucket_brigade *bb, void *ctx);
00283 
00284 /*
00285  * define APR_BUCKET_DEBUG if you want your brigades to be checked for
00286  * validity at every possible instant.  this will slow your code down
00287  * substantially but is a very useful debugging tool.
00288  */
00289 #ifdef APR_BUCKET_DEBUG
00290 
00291 #define APR_BRIGADE_CHECK_CONSISTENCY(b)                                \
00292         APR_RING_CHECK_CONSISTENCY(&(b)->list, apr_bucket, link)
00293 
00294 #define APR_BUCKET_CHECK_CONSISTENCY(e)                                 \
00295         APR_RING_CHECK_ELEM_CONSISTENCY((e), apr_bucket, link)
00296 
00297 #else
00298 /**
00299  * checks the ring pointers in a bucket brigade for consistency.  an
00300  * abort() will be triggered if any inconsistencies are found.
00301  *   note: this is a no-op unless APR_BUCKET_DEBUG is defined.
00302  * @param b The brigade
00303  */
00304 #define APR_BRIGADE_CHECK_CONSISTENCY(b)
00305 /**
00306  * checks the brigade a bucket is in for ring consistency.  an
00307  * abort() will be triggered if any inconsistencies are found.
00308  *   note: this is a no-op unless APR_BUCKET_DEBUG is defined.
00309  * @param e The bucket
00310  */
00311 #define APR_BUCKET_CHECK_CONSISTENCY(e)
00312 #endif
00313 
00314 
00315 /**
00316  * Wrappers around the RING macros to reduce the verbosity of the code
00317  * that handles bucket brigades.
00318  */
00319 /**
00320  * The magic pointer value that indicates the head of the brigade
00321  * @remark This is used to find the beginning and end of the brigade, eg:
00322  * <pre>
00323  *      while (e != APR_BRIGADE_SENTINEL(b)) {
00324  *          ...
00325  *          e = APR_BUCKET_NEXT(e);
00326  *      }
00327  * </pre>
00328  * @param  b The brigade
00329  * @return The magic pointer value
00330  */
00331 #define APR_BRIGADE_SENTINEL(b) APR_RING_SENTINEL(&(b)->list, apr_bucket, link)
00332 
00333 /**
00334  * Determine if the bucket brigade is empty
00335  * @param b The brigade to check
00336  * @return true or false
00337  */
00338 #define APR_BRIGADE_EMPTY(b)    APR_RING_EMPTY(&(b)->list, apr_bucket, link)
00339 
00340 /**
00341  * Return the first bucket in a brigade
00342  * @param b The brigade to query
00343  * @return The first bucket in the brigade
00344  */
00345 #define APR_BRIGADE_FIRST(b)    APR_RING_FIRST(&(b)->list)
00346 /**
00347  * Return the last bucket in a brigade
00348  * @param b The brigade to query
00349  * @return The last bucket in the brigade
00350  */
00351 #define APR_BRIGADE_LAST(b)     APR_RING_LAST(&(b)->list)
00352 
00353 /**
00354  * Iterate through a bucket brigade
00355  * @param e The current bucket
00356  * @param b The brigade to iterate over
00357  * @remark This is the same as either:
00358  * <pre>
00359  *      e = APR_BRIGADE_FIRST(b);
00360  *      while (e != APR_BRIGADE_SENTINEL(b)) {
00361  *          ...
00362  *          e = APR_BUCKET_NEXT(e);
00363  *      }
00364  *  OR
00365  *      for (e = APR_BRIGADE_FIRST(b);
00366  *           e != APR_BRIGADE_SENTINEL(b);
00367  *           e = APR_BUCKET_NEXT(e)) {
00368  *          ...
00369  *      }
00370  * </pre>
00371  * @warning Be aware that you cannot change the value of e within
00372  * the foreach loop, nor can you destroy the bucket it points to.
00373  * Modifying the prev and next pointers of the bucket is dangerous
00374  * but can be done if you're careful.  If you change e's value or
00375  * destroy the bucket it points to, then APR_BRIGADE_FOREACH
00376  * will have no way to find out what bucket to use for its next
00377  * iteration.  The reason for this can be seen by looking closely
00378  * at the equivalent loops given in the tip above.  So, for example,
00379  * if you are writing a loop that empties out a brigade one bucket
00380  * at a time, APR_BRIGADE_FOREACH just won't work for you.  Do it
00381  * by hand, like so:
00382  * <pre>
00383  *      while (!APR_BRIGADE_EMPTY(b)) {
00384  *          e = APR_BRIGADE_FIRST(b);
00385  *          ...
00386  *          apr_bucket_delete(e);
00387  *      }
00388  * </pre>
00389  * @deprecated This macro causes more headaches than it's worth.  Use
00390  * one of the alternatives documented here instead; the clarity gained
00391  * in what's really going on is well worth the extra line or two of code.
00392  * This macro will be removed at some point in the future.
00393  */
00394 #define APR_BRIGADE_FOREACH(e, b)                                       \
00395         APR_RING_FOREACH((e), &(b)->list, apr_bucket, link)
00396 
00397 /**
00398  * Insert a list of buckets at the front of a brigade
00399  * @param b The brigade to add to
00400  * @param e The first bucket in a list of buckets to insert
00401  */
00402 #define APR_BRIGADE_INSERT_HEAD(b, e) do {                              \
00403         apr_bucket *ap__b = (e);                                        \
00404         APR_RING_INSERT_HEAD(&(b)->list, ap__b, apr_bucket, link);      \
00405         APR_BRIGADE_CHECK_CONSISTENCY((b));                             \
00406     } while (0)
00407 
00408 /**
00409  * Insert a list of buckets at the end of a brigade
00410  * @param b The brigade to add to
00411  * @param e The first bucket in a list of buckets to insert
00412  */
00413 #define APR_BRIGADE_INSERT_TAIL(b, e) do {                              \
00414         apr_bucket *ap__b = (e);                                        \
00415         APR_RING_INSERT_TAIL(&(b)->list, ap__b, apr_bucket, link);      \
00416         APR_BRIGADE_CHECK_CONSISTENCY((b));                             \
00417     } while (0)
00418 
00419 /**
00420  * Concatenate brigade b onto the end of brigade a, leaving brigade b empty
00421  * @param a The first brigade
00422  * @param b The second brigade
00423  */
00424 #define APR_BRIGADE_CONCAT(a, b) do {                                   \
00425         APR_RING_CONCAT(&(a)->list, &(b)->list, apr_bucket, link);      \
00426         APR_BRIGADE_CHECK_CONSISTENCY((a));                             \
00427     } while (0)
00428 
00429 /**
00430  * Prepend brigade b onto the beginning of brigade a, leaving brigade b empty
00431  * @param a The first brigade
00432  * @param b The second brigade
00433  */
00434 #define APR_BRIGADE_PREPEND(a, b) do {                                  \
00435         APR_RING_PREPEND(&(a)->list, &(b)->list, apr_bucket, link);     \
00436         APR_BRIGADE_CHECK_CONSISTENCY((a));                             \
00437     } while (0)
00438 
00439 /**
00440  * Insert a list of buckets before a specified bucket
00441  * @param a The bucket to insert before
00442  * @param b The buckets to insert
00443  */
00444 #define APR_BUCKET_INSERT_BEFORE(a, b) do {                             \
00445         apr_bucket *ap__a = (a), *ap__b = (b);                          \
00446         APR_RING_INSERT_BEFORE(ap__a, ap__b, link);                     \
00447         APR_BUCKET_CHECK_CONSISTENCY(ap__a);                            \
00448     } while (0)
00449 
00450 /**
00451  * Insert a list of buckets after a specified bucket
00452  * @param a The bucket to insert after
00453  * @param b The buckets to insert
00454  */
00455 #define APR_BUCKET_INSERT_AFTER(a, b) do {                              \
00456         apr_bucket *ap__a = (a), *ap__b = (b);                          \
00457         APR_RING_INSERT_AFTER(ap__a, ap__b, link);                      \
00458         APR_BUCKET_CHECK_CONSISTENCY(ap__a);                            \
00459     } while (0)
00460 
00461 /**
00462  * Get the next bucket in the list
00463  * @param e The current bucket
00464  * @return The next bucket
00465  */
00466 #define APR_BUCKET_NEXT(e)      APR_RING_NEXT((e), link)
00467 /**
00468  * Get the previous bucket in the list
00469  * @param e The current bucket
00470  * @return The previous bucket
00471  */
00472 #define APR_BUCKET_PREV(e)      APR_RING_PREV((e), link)
00473 
00474 /**
00475  * Remove a bucket from its bucket brigade
00476  * @param e The bucket to remove
00477  */
00478 #define APR_BUCKET_REMOVE(e)    APR_RING_REMOVE((e), link)
00479 
00480 /**
00481  * Initialize a new bucket's prev/next pointers
00482  * @param e The bucket to initialize
00483  */
00484 #define APR_BUCKET_INIT(e)      APR_RING_ELEM_INIT((e), link)
00485 
00486 /**
00487  * Determine if a bucket contains metadata.  An empty bucket is
00488  * safe to arbitrarily remove if and only if this is false.
00489  * @param e The bucket to inspect
00490  * @return true or false
00491  */
00492 #define APR_BUCKET_IS_METADATA(e)    ((e)->type->is_metadata)
00493 
00494 /**
00495  * Determine if a bucket is a FLUSH bucket
00496  * @param e The bucket to inspect
00497  * @return true or false
00498  */
00499 #define APR_BUCKET_IS_FLUSH(e)       ((e)->type == &apr_bucket_type_flush)
00500 /**
00501  * Determine if a bucket is an EOS bucket
00502  * @param e The bucket to inspect
00503  * @return true or false
00504  */
00505 #define APR_BUCKET_IS_EOS(e)         ((e)->type == &apr_bucket_type_eos)
00506 /**
00507  * Determine if a bucket is a FILE bucket
00508  * @param e The bucket to inspect
00509  * @return true or false
00510  */
00511 #define APR_BUCKET_IS_FILE(e)        ((e)->type == &apr_bucket_type_file)
00512 /**
00513  * Determine if a bucket is a PIPE bucket
00514  * @param e The bucket to inspect
00515  * @return true or false
00516  */
00517 #define APR_BUCKET_IS_PIPE(e)        ((e)->type == &apr_bucket_type_pipe)
00518 /**
00519  * Determine if a bucket is a SOCKET bucket
00520  * @param e The bucket to inspect
00521  * @return true or false
00522  */
00523 #define APR_BUCKET_IS_SOCKET(e)      ((e)->type == &apr_bucket_type_socket)
00524 /**
00525  * Determine if a bucket is a HEAP bucket
00526  * @param e The bucket to inspect
00527  * @return true or false
00528  */
00529 #define APR_BUCKET_IS_HEAP(e)        ((e)->type == &apr_bucket_type_heap)
00530 /**
00531  * Determine if a bucket is a TRANSIENT bucket
00532  * @param e The bucket to inspect
00533  * @return true or false
00534  */
00535 #define APR_BUCKET_IS_TRANSIENT(e)   ((e)->type == &apr_bucket_type_transient)
00536 /**
00537  * Determine if a bucket is a IMMORTAL bucket
00538  * @param e The bucket to inspect
00539  * @return true or false
00540  */
00541 #define APR_BUCKET_IS_IMMORTAL(e)    ((e)->type == &apr_bucket_type_immortal)
00542 #if APR_HAS_MMAP
00543 /**
00544  * Determine if a bucket is a MMAP bucket
00545  * @param e The bucket to inspect
00546  * @return true or false
00547  */
00548 #define APR_BUCKET_IS_MMAP(e)        ((e)->type == &apr_bucket_type_mmap)
00549 #endif
00550 /**
00551  * Determine if a bucket is a POOL bucket
00552  * @param e The bucket to inspect
00553  * @return true or false
00554  */
00555 #define APR_BUCKET_IS_POOL(e)        ((e)->type == &apr_bucket_type_pool)
00556 
00557 /*
00558  * General-purpose reference counting for the various bucket types.
00559  *
00560  * Any bucket type that keeps track of the resources it uses (i.e.
00561  * most of them except for IMMORTAL, TRANSIENT, and EOS) needs to
00562  * attach a reference count to the resource so that it can be freed
00563  * when the last bucket that uses it goes away. Resource-sharing may
00564  * occur because of bucket splits or buckets that refer to globally
00565  * cached data. */
00566 
00567 /** @see apr_bucket_refcount */
00568 typedef struct apr_bucket_refcount apr_bucket_refcount;
00569 /**
00570  * The structure used to manage the shared resource must start with an
00571  * apr_bucket_refcount which is updated by the general-purpose refcount
00572  * code. A pointer to the bucket-type-dependent private data structure
00573  * can be cast to a pointer to an apr_bucket_refcount and vice versa.
00574  */
00575 struct apr_bucket_refcount {
00576     /** The number of references to this bucket */
00577     int          refcount;
00578 };
00579 
00580 /*  *****  Reference-counted bucket types  *****  */
00581 
00582 /** @see apr_bucket_heap */
00583 typedef struct apr_bucket_heap apr_bucket_heap;
00584 /**
00585  * A bucket referring to data allocated off the heap.
00586  */
00587 struct apr_bucket_heap {
00588     /** Number of buckets using this memory */
00589     apr_bucket_refcount  refcount;
00590     /** The start of the data actually allocated.  This should never be
00591      * modified, it is only used to free the bucket.
00592      */
00593     char    *base;
00594     /** how much memory was allocated */
00595     apr_size_t  alloc_len;
00596     /** function to use to delete the data */
00597     void (*free_func)(void *data);
00598 };
00599 
00600 /** @see apr_bucket_pool */
00601 typedef struct apr_bucket_pool apr_bucket_pool;
00602 /**
00603  * A bucket referring to data allocated from a pool
00604  */
00605 struct apr_bucket_pool {
00606     /** The pool bucket must be able to be easily morphed to a heap
00607      * bucket if the pool gets cleaned up before all references are
00608      * destroyed.  This apr_bucket_heap structure is populated automatically
00609      * when the pool gets cleaned up, and subsequent calls to pool_read()
00610      * will result in the apr_bucket in question being morphed into a
00611      * regular heap bucket.  (To avoid having to do many extra refcount
00612      * manipulations and b->data manipulations, the apr_bucket_pool
00613      * struct actually *contains* the apr_bucket_heap struct that it
00614      * will become as its first element; the two share their
00615      * apr_bucket_refcount members.)
00616      */
00617     apr_bucket_heap  heap;
00618     /** The block of data actually allocated from the pool.
00619      * Segments of this block are referenced by adjusting
00620      * the start and length of the apr_bucket accordingly.
00621      * This will be NULL after the pool gets cleaned up.
00622      */
00623     const char *base;
00624     /** The pool the data was allocated from.  When the pool
00625      * is cleaned up, this gets set to NULL as an indicator
00626      * to pool_read() that the data is now on the heap and
00627      * so it should morph the bucket into a regular heap
00628      * bucket before continuing.
00629      */
00630     apr_pool_t *pool;
00631     /** The freelist this structure was allocated from, which is
00632      * needed in the cleanup phase in order to allocate space on the heap
00633      */
00634     apr_bucket_alloc_t *list;
00635 };
00636 
00637 #if APR_HAS_MMAP
00638 /** @see apr_bucket_mmap */
00639 typedef struct apr_bucket_mmap apr_bucket_mmap;
00640 /**
00641  * A bucket referring to an mmap()ed file
00642  */
00643 struct apr_bucket_mmap {
00644     /** Number of buckets using this memory */
00645     apr_bucket_refcount  refcount;
00646     /** The mmap this sub_bucket refers to */
00647     apr_mmap_t *mmap;
00648 };
00649 #endif
00650 
00651 /** @see apr_bucket_file */
00652 typedef struct apr_bucket_file apr_bucket_file;
00653 /**
00654  * A bucket referring to an file
00655  */
00656 struct apr_bucket_file {
00657     /** Number of buckets using this memory */
00658     apr_bucket_refcount  refcount;
00659     /** The file this bucket refers to */
00660     apr_file_t *fd;
00661     /** The pool into which any needed structures should
00662      *  be created while reading from this file bucket */
00663     apr_pool_t *readpool;
00664 #if APR_HAS_MMAP
00665     /** Whether this bucket should be memory-mapped if
00666      *  a caller tries to read from it */
00667     int can_mmap;
00668 #endif /* APR_HAS_MMAP */
00669 };
00670 
00671 /** @see apr_bucket_structs */
00672 typedef union apr_bucket_structs apr_bucket_structs;
00673 /**
00674  * A union of all bucket structures so we know what
00675  * the max size is.
00676  */
00677 union apr_bucket_structs {
00678     apr_bucket      b;      /**< Bucket */
00679     apr_bucket_heap heap;   /**< Heap */
00680     apr_bucket_pool pool;   /**< Pool */
00681 #if APR_HAS_MMAP
00682     apr_bucket_mmap mmap;   /**< MMap */
00683 #endif
00684     apr_bucket_file file;   /**< File */
00685 };
00686 
00687 /**
00688  * The amount that apr_bucket_alloc() should allocate in the common case.
00689  * Note: this is twice as big as apr_bucket_structs to allow breathing
00690  * room for third-party bucket types.
00691  */
00692 #define APR_BUCKET_ALLOC_SIZE  APR_ALIGN_DEFAULT(2*sizeof(apr_bucket_structs))
00693 
00694 /*  *****  Bucket Brigade Functions  *****  */
00695 /**
00696  * Create a new bucket brigade.  The bucket brigade is originally empty.
00697  * @param p The pool to associate with the brigade.  Data is not allocated out
00698  *          of the pool, but a cleanup is registered.
00699  * @param list The bucket allocator to use
00700  * @return The empty bucket brigade
00701  */
00702 APU_DECLARE(apr_bucket_brigade *) apr_brigade_create(apr_pool_t *p,
00703                                                      apr_bucket_alloc_t *list);
00704 
00705 /**
00706  * destroy an entire bucket brigade.  This includes destroying all of the
00707  * buckets within the bucket brigade's bucket list. 
00708  * @param b The bucket brigade to destroy
00709  */
00710 APU_DECLARE(apr_status_t) apr_brigade_destroy(apr_bucket_brigade *b);
00711 
00712 /**
00713  * empty out an entire bucket brigade.  This includes destroying all of the
00714  * buckets within the bucket brigade's bucket list.  This is similar to
00715  * apr_brigade_destroy(), except that it does not deregister the brigade's
00716  * pool cleanup function.
00717  * @param data The bucket brigade to clean up
00718  * @remark Generally, you should use apr_brigade_destroy().  This function
00719  *         can be useful in situations where you have a single brigade that
00720  *         you wish to reuse many times by destroying all of the buckets in
00721  *         the brigade and putting new buckets into it later.
00722  */
00723 APU_DECLARE(apr_status_t) apr_brigade_cleanup(void *data);
00724 
00725 /**
00726  * Split a bucket brigade into two, such that the given bucket is the
00727  * first in the new bucket brigade. This function is useful when a
00728  * filter wants to pass only the initial part of a brigade to the next
00729  * filter.
00730  * @param b The brigade to split
00731  * @param e The first element of the new brigade
00732  * @return The new brigade
00733  */
00734 APU_DECLARE(apr_bucket_brigade *) apr_brigade_split(apr_bucket_brigade *b,
00735                                                     apr_bucket *e);
00736 
00737 /**
00738  * Partition a bucket brigade at a given offset (in bytes from the start of
00739  * the brigade).  This is useful whenever a filter wants to use known ranges
00740  * of bytes from the brigade; the ranges can even overlap.
00741  * @param b The brigade to partition
00742  * @param point The offset at which to partition the brigade
00743  * @param after_point Returns a pointer to the first bucket after the partition
00744  */
00745 APU_DECLARE(apr_status_t) apr_brigade_partition(apr_bucket_brigade *b,
00746                                                 apr_off_t point,
00747                                                 apr_bucket **after_point);
00748 
00749 #if APR_NOT_DONE_YET
00750 /**
00751  * consume nbytes from beginning of b -- call apr_bucket_destroy as
00752  * appropriate, and/or modify start on last element 
00753  * @param b The brigade to consume data from
00754  * @param nbytes The number of bytes to consume
00755  */
00756 APU_DECLARE(void) apr_brigade_consume(apr_bucket_brigade *b,
00757                                       apr_off_t nbytes);
00758 #endif
00759 
00760 /**
00761  * Return the total length of the brigade.
00762  * @param bb The brigade to compute the length of
00763  * @param read_all Read unknown-length buckets to force a size
00764  * @param length Returns the length of the brigade, or -1 if the brigade has
00765  *               buckets of indeterminate length and read_all is 0.
00766  */
00767 APU_DECLARE(apr_status_t) apr_brigade_length(apr_bucket_brigade *bb,
00768                                              int read_all,
00769                                              apr_off_t *length);
00770 
00771 /**
00772  * Take a bucket brigade and store the data in a flat char*
00773  * @param bb The bucket brigade to create the char* from
00774  * @param c The char* to write into
00775  * @param len The maximum length of the char array. On return, it is the
00776  *            actual length of the char array.
00777  */
00778 APU_DECLARE(apr_status_t) apr_brigade_flatten(apr_bucket_brigade *bb,
00779                                               char *c,
00780                                               apr_size_t *len);
00781 
00782 /**
00783  * Creates a pool-allocated string representing a flat bucket brigade
00784  * @param bb The bucket brigade to create the char array from
00785  * @param c On return, the allocated char array
00786  * @param len On return, the length of the char array.
00787  * @param pool The pool to allocate the string from.
00788  */
00789 APU_DECLARE(apr_status_t) apr_brigade_pflatten(apr_bucket_brigade *bb, 
00790                                                char **c,
00791                                                apr_size_t *len,
00792                                                apr_pool_t *pool);
00793 
00794 /**
00795  * Split a brigade to represent one LF line.
00796  * @param bbOut The bucket brigade that will have the LF line appended to.
00797  * @param bbIn The input bucket brigade to search for a LF-line.
00798  * @param block The blocking mode to be used to split the line.
00799  * @param maxbytes The maximum bytes to read.  If this many bytes are seen
00800  *                 without a LF, the brigade will contain a partial line.
00801  */
00802 APU_DECLARE(apr_status_t) apr_brigade_split_line(apr_bucket_brigade *bbOut,
00803                                                  apr_bucket_brigade *bbIn,
00804                                                  apr_read_type_e block,
00805                                                  apr_off_t maxbytes);
00806 
00807 /**
00808  * create an iovec of the elements in a bucket_brigade... return number 
00809  * of elements used.  This is useful for writing to a file or to the
00810  * network efficiently.
00811  * @param b The bucket brigade to create the iovec from
00812  * @param vec The iovec to create
00813  * @param nvec The number of elements in the iovec. On return, it is the
00814  *             number of iovec elements actually filled out.
00815  */
00816 APU_DECLARE(apr_status_t) apr_brigade_to_iovec(apr_bucket_brigade *b, 
00817                                                struct iovec *vec, int *nvec);
00818 
00819 /**
00820  * This function writes a list of strings into a bucket brigade. 
00821  * @param b The bucket brigade to add to
00822  * @param flush The flush function to use if the brigade is full
00823  * @param ctx The structure to pass to the flush function
00824  * @param va A list of strings to add
00825  * @return APR_SUCCESS or error code.
00826  */
00827 APU_DECLARE(apr_status_t) apr_brigade_vputstrs(apr_bucket_brigade *b,
00828                                                apr_brigade_flush flush,
00829                                                void *ctx,
00830                                                va_list va);
00831 
00832 /**
00833  * This function writes a string into a bucket brigade.
00834  * @param b The bucket brigade to add to
00835  * @param flush The flush function to use if the brigade is full
00836  * @param ctx The structure to pass to the flush function
00837  * @param str The string to add
00838  * @param nbyte The number of bytes to write
00839  * @return APR_SUCCESS or error code
00840  */
00841 APU_DECLARE(apr_status_t) apr_brigade_write(apr_bucket_brigade *b,
00842                                             apr_brigade_flush flush, void *ctx,
00843                                             const char *str, apr_size_t nbyte);
00844 
00845 /**
00846  * This function writes multiple strings into a bucket brigade.
00847  * @param b The bucket brigade to add to
00848  * @param flush The flush function to use if the brigade is full
00849  * @param ctx The structure to pass to the flush function
00850  * @param vec The strings to add (address plus length for each)
00851  * @param nvec The number of entries in iovec
00852  * @return APR_SUCCESS or error code
00853  */
00854 APU_DECLARE(apr_status_t) apr_brigade_writev(apr_bucket_brigade *b,
00855                                              apr_brigade_flush flush,
00856                                              void *ctx,
00857                                              const struct iovec *vec,
00858                                              apr_size_t nvec);
00859 
00860 /**
00861  * This function writes a string into a bucket brigade.
00862  * @param bb The bucket brigade to add to
00863  * @param flush The flush function to use if the brigade is full
00864  * @param ctx The structure to pass to the flush function
00865  * @param str The string to add
00866  * @return APR_SUCCESS or error code
00867  */
00868 APU_DECLARE(apr_status_t) apr_brigade_puts(apr_bucket_brigade *bb,
00869                                            apr_brigade_flush flush, void *ctx,
00870                                            const char *str);
00871 
00872 /**
00873  * This function writes a character into a bucket brigade.
00874  * @param b The bucket brigade to add to
00875  * @param flush The flush function to use if the brigade is full
00876  * @param ctx The structure to pass to the flush function
00877  * @param c The character to add
00878  * @return APR_SUCCESS or error code
00879  */
00880 APU_DECLARE(apr_status_t) apr_brigade_putc(apr_bucket_brigade *b,
00881                                            apr_brigade_flush flush, void *ctx,
00882                                            const char c);
00883 
00884 /**
00885  * This function writes an unspecified number of strings into a bucket brigade.
00886  * @param b The bucket brigade to add to
00887  * @param flush The flush function to use if the brigade is full
00888  * @param ctx The structure to pass to the flush function
00889  * @param ... The strings to add
00890  * @return APR_SUCCESS or error code
00891  */
00892 APU_DECLARE_NONSTD(apr_status_t) apr_brigade_putstrs(apr_bucket_brigade *b,
00893                                                      apr_brigade_flush flush,
00894                                                      void *ctx, ...);
00895 
00896 /**
00897  * Evaluate a printf and put the resulting string at the end 
00898  * of the bucket brigade.
00899  * @param b The brigade to write to
00900  * @param flush The flush function to use if the brigade is full
00901  * @param ctx The structure to pass to the flush function
00902  * @param fmt The format of the string to write
00903  * @param ... The arguments to fill out the format
00904  * @return APR_SUCCESS or error code
00905  */
00906 APU_DECLARE_NONSTD(apr_status_t) apr_brigade_printf(apr_bucket_brigade *b, 
00907                                                     apr_brigade_flush flush,
00908                                                     void *ctx,
00909                                                     const char *fmt, ...)
00910         __attribute__((format(printf,4,5)));
00911 
00912 /**
00913  * Evaluate a printf and put the resulting string at the end 
00914  * of the bucket brigade.
00915  * @param b The brigade to write to
00916  * @param flush The flush function to use if the brigade is full
00917  * @param ctx The structure to pass to the flush function
00918  * @param fmt The format of the string to write
00919  * @param va The arguments to fill out the format
00920  * @return APR_SUCCESS or error code
00921  */
00922 APU_DECLARE(apr_status_t) apr_brigade_vprintf(apr_bucket_brigade *b, 
00923                                               apr_brigade_flush flush,
00924                                               void *ctx,
00925                                               const char *fmt, va_list va);
00926 
00927 /*  *****  Bucket freelist functions *****  */
00928 /**
00929  * Create a bucket allocator.
00930  * @param p This pool's underlying apr_allocator_t is used to allocate memory
00931  *          for the bucket allocator.  When the pool is destroyed, the bucket
00932  *          allocator's cleanup routine will free all memory that has been
00933  *          allocated from it.
00934  * @remark  The reason the allocator gets its memory from the pool's
00935  *          apr_allocator_t rather than from the pool itself is because
00936  *          the bucket allocator will free large memory blocks back to the
00937  *          allocator when it's done with them, thereby preventing memory
00938  *          footprint growth that would occur if we allocated from the pool.
00939  * @warning The allocator must never be used by more than one thread at a time.
00940  */
00941 APU_DECLARE_NONSTD(apr_bucket_alloc_t *) apr_bucket_alloc_create(apr_pool_t *p);
00942 
00943 /**
00944  * Create a bucket allocator.
00945  * @param allocator This apr_allocator_t is used to allocate both the bucket
00946  *          allocator and all memory handed out by the bucket allocator.  The
00947  *          caller is responsible for destroying the bucket allocator and the
00948  *          apr_allocator_t -- no automatic cleanups will happen.
00949  * @warning The allocator must never be used by more than one thread at a time.
00950  */
00951 APU_DECLARE_NONSTD(apr_bucket_alloc_t *) apr_bucket_alloc_create_ex(apr_allocator_t *allocator);
00952 
00953 /**
00954  * Destroy a bucket allocator.
00955  * @param list The allocator to be destroyed
00956  */
00957 APU_DECLARE_NONSTD(void) apr_bucket_alloc_destroy(apr_bucket_alloc_t *list);
00958 
00959 /**
00960  * Allocate memory for use by the buckets.
00961  * @param size The amount to allocate.
00962  * @param list The allocator from which to allocate the memory.
00963  */
00964 APU_DECLARE_NONSTD(void *) apr_bucket_alloc(apr_size_t size, apr_bucket_alloc_t *list);
00965 
00966 /**
00967  * Free memory previously allocated with apr_bucket_alloc().
00968  * @param block The block of memory to be freed.
00969  */
00970 APU_DECLARE_NONSTD(void) apr_bucket_free(void *block);
00971 
00972 
00973 /*  *****  Bucket Functions  *****  */
00974 /**
00975  * Free the resources used by a bucket. If multiple buckets refer to
00976  * the same resource it is freed when the last one goes away.
00977  * @see apr_bucket_delete()
00978  * @param e The bucket to destroy
00979  */
00980 #define apr_bucket_destroy(e) do {                                      \
00981         (e)->type->destroy((e)->data);                                  \
00982         (e)->free(e);                                                   \
00983     } while (0)
00984 
00985 /**
00986  * Delete a bucket by removing it from its brigade (if any) and then
00987  * destroying it.
00988  * @remark This mainly acts as an aid in avoiding code verbosity.  It is
00989  * the preferred exact equivalent to:
00990  * <pre>
00991  *      APR_BUCKET_REMOVE(e);
00992  *      apr_bucket_destroy(e);
00993  * </pre>
00994  * @param e The bucket to delete
00995  */
00996 #define apr_bucket_delete(e) do {                                       \
00997         APR_BUCKET_REMOVE(e);                                           \
00998         apr_bucket_destroy(e);                                          \
00999     } while (0)
01000 
01001 /**
01002  * read the data from the bucket
01003  * @param e The bucket to read from
01004  * @param str The location to store the data in
01005  * @param len The amount of data read
01006  * @param block Whether the read function blocks
01007  */
01008 #define apr_bucket_read(e,str,len,block) (e)->type->read(e, str, len, block)
01009 
01010 /**
01011  * Setaside data so that stack data is not destroyed on returning from
01012  * the function
01013  * @param e The bucket to setaside
01014  * @param p The pool to setaside into
01015  */
01016 #define apr_bucket_setaside(e,p) (e)->type->setaside(e,p)
01017 
01018 /**
01019  * Split one bucket in two.
01020  * @param e The bucket to split
01021  * @param point The offset to split the bucket at
01022  */
01023 #define apr_bucket_split(e,point) (e)->type->split(e, point)
01024 
01025 /**
01026  * Copy a bucket.
01027  * @param e The bucket to copy
01028  * @param c Returns a pointer to the new bucket
01029  */
01030 #define apr_bucket_copy(e,c) (e)->type->copy(e, c)
01031 
01032 /* Bucket type handling */
01033 
01034 /**
01035  * This function simply returns APR_SUCCESS to denote that the bucket does
01036  * not require anything to happen for its setaside() function. This is
01037  * appropriate for buckets that have "immortal" data -- the data will live
01038  * at least as long as the bucket.
01039  * @param data The bucket to setaside
01040  * @param pool The pool defining the desired lifetime of the bucket data
01041  * @return APR_SUCCESS
01042  */ 
01043 APU_DECLARE_NONSTD(apr_status_t) apr_bucket_setaside_noop(apr_bucket *data,
01044                                                           apr_pool_t *pool);
01045 
01046 /**
01047  * A place holder function that signifies that the setaside function was not
01048  * implemented for this bucket
01049  * @param data The bucket to setaside
01050  * @param pool The pool defining the desired lifetime of the bucket data
01051  * @return APR_ENOTIMPL
01052  */ 
01053 APU_DECLARE_NONSTD(apr_status_t) apr_bucket_setaside_notimpl(apr_bucket *data,
01054                                                              apr_pool_t *pool);
01055 
01056 /**
01057  * A place holder function that signifies that the split function was not
01058  * implemented for this bucket
01059  * @param data The bucket to split
01060  * @param point The location to split the bucket
01061  * @return APR_ENOTIMPL
01062  */ 
01063 APU_DECLARE_NONSTD(apr_status_t) apr_bucket_split_notimpl(apr_bucket *data,
01064                                                           apr_size_t point);
01065 
01066 /**
01067  * A place holder function that signifies that the copy function was not
01068  * implemented for this bucket
01069  * @param e The bucket to copy
01070  * @param c Returns a pointer to the new bucket
01071  * @return APR_ENOTIMPL
01072  */
01073 APU_DECLARE_NONSTD(apr_status_t) apr_bucket_copy_notimpl(apr_bucket *e,
01074                                                          apr_bucket **c);
01075 
01076 /**
01077  * A place holder function that signifies that this bucket does not need
01078  * to do anything special to be destroyed.  That's only the case for buckets
01079  * that either have no data (metadata buckets) or buckets whose data pointer
01080  * points to something that's not a bucket-type-specific structure, as with
01081  * simple buckets where data points to a string and pipe buckets where data
01082  * points directly to the apr_file_t.
01083  * @param data The bucket data to destroy
01084  */ 
01085 APU_DECLARE_NONSTD(void) apr_bucket_destroy_noop(void *data);
01086 
01087 /**
01088  * There is no apr_bucket_destroy_notimpl, because destruction is required
01089  * to be implemented (it could be a noop, but only if that makes sense for
01090  * the bucket type)
01091  */
01092 
01093 /* There is no apr_bucket_read_notimpl, because it is a required function
01094  */
01095 
01096 
01097 /* All of the bucket types implemented by the core */
01098 /**
01099  * The flush bucket type.  This signifies that all data should be flushed to
01100  * the next filter.  The flush bucket should be sent with the other buckets.
01101  */
01102 APU_DECLARE_DATA extern const apr_bucket_type_t apr_bucket_type_flush;
01103 /**
01104  * The EOS bucket type.  This signifies that there will be no more data, ever.
01105  * All filters MUST send all data to the next filter when they receive a
01106  * bucket of this type
01107  */
01108 APU_DECLARE_DATA extern const apr_bucket_type_t apr_bucket_type_eos;
01109 /**
01110  * The FILE bucket type.  This bucket represents a file on disk
01111  */
01112 APU_DECLARE_DATA extern const apr_bucket_type_t apr_bucket_type_file;
01113 /**
01114  * The HEAP bucket type.  This bucket represents a data allocated from the
01115  * heap.
01116  */
01117 APU_DECLARE_DATA extern const apr_bucket_type_t apr_bucket_type_heap;
01118 #if APR_HAS_MMAP
01119 /**
01120  * The MMAP bucket type.  This bucket represents an MMAP'ed file
01121  */
01122 APU_DECLARE_DATA extern const apr_bucket_type_t apr_bucket_type_mmap;
01123 #endif
01124 /**
01125  * The POOL bucket type.  This bucket represents a data that was allocated
01126  * from a pool.  IF this bucket is still available when the pool is cleared,
01127  * the data is copied on to the heap.
01128  */
01129 APU_DECLARE_DATA extern const apr_bucket_type_t apr_bucket_type_pool;
01130 /**
01131  * The PIPE bucket type.  This bucket represents a pipe to another program.
01132  */
01133 APU_DECLARE_DATA extern const apr_bucket_type_t apr_bucket_type_pipe;
01134 /**
01135  * The IMMORTAL bucket type.  This bucket represents a segment of data that
01136  * the creator is willing to take responsibility for.  The core will do
01137  * nothing with the data in an immortal bucket
01138  */
01139 APU_DECLARE_DATA extern const apr_bucket_type_t apr_bucket_type_immortal;
01140 /**
01141  * The TRANSIENT bucket type.  This bucket represents a data allocated off
01142  * the stack.  When the setaside function is called, this data is copied on
01143  * to the heap
01144  */
01145 APU_DECLARE_DATA extern const apr_bucket_type_t apr_bucket_type_transient;
01146 /**
01147  * The SOCKET bucket type.  This bucket represents a socket to another machine
01148  */
01149 APU_DECLARE_DATA extern const apr_bucket_type_t apr_bucket_type_socket;
01150 
01151 
01152 /*  *****  Simple buckets  *****  */
01153 
01154 /**
01155  * Split a simple bucket into two at the given point.  Most non-reference
01156  * counting buckets that allow multiple references to the same block of
01157  * data (eg transient and immortal) will use this as their split function
01158  * without any additional type-specific handling.
01159  * @param b The bucket to be split
01160  * @param point The offset of the first byte in the new bucket
01161  * @return APR_EINVAL if the point is not within the bucket;
01162  *         APR_ENOMEM if allocation failed;
01163  *         or APR_SUCCESS
01164  */
01165 APU_DECLARE_NONSTD(apr_status_t) apr_bucket_simple_split(apr_bucket *b,
01166                                                          apr_size_t point);
01167 
01168 /**
01169  * Copy a simple bucket.  Most non-reference-counting buckets that allow
01170  * multiple references to the same block of data (eg transient and immortal)
01171  * will use this as their copy function without any additional type-specific
01172  * handling.
01173  * @param a The bucket to copy
01174  * @param b Returns a pointer to the new bucket
01175  * @return APR_ENOMEM if allocation failed;
01176  *         or APR_SUCCESS
01177  */
01178 APU_DECLARE_NONSTD(apr_status_t) apr_bucket_simple_copy(apr_bucket *a,
01179                                                         apr_bucket **b);
01180 
01181 
01182 /*  *****  Shared, reference-counted buckets  *****  */
01183 
01184 /**
01185  * Initialize a bucket containing reference-counted data that may be
01186  * shared. The caller must allocate the bucket if necessary and
01187  * initialize its type-dependent fields, and allocate and initialize
01188  * its own private data structure. This function should only be called
01189  * by type-specific bucket creation functions.
01190  * @param b The bucket to initialize
01191  * @param data A pointer to the private data structure
01192  *             with the reference count at the start
01193  * @param start The start of the data in the bucket
01194  *              relative to the private base pointer
01195  * @param length The length of the data in the bucket
01196  * @return The new bucket, or NULL if allocation failed
01197  */
01198 APU_DECLARE(apr_bucket *) apr_bucket_shared_make(apr_bucket *b, void *data,
01199                                                  apr_off_t start, 
01200                                                  apr_size_t length);
01201 
01202 /**
01203  * Decrement the refcount of the data in the bucket. This function
01204  * should only be called by type-specific bucket destruction functions.
01205  * @param data The private data pointer from the bucket to be destroyed
01206  * @return TRUE or FALSE; TRUE if the reference count is now
01207  *         zero, indicating that the shared resource itself can
01208  *         be destroyed by the caller.
01209  */
01210 APU_DECLARE(int) apr_bucket_shared_destroy(void *data);
01211 
01212 /**
01213  * Split a bucket into two at the given point, and adjust the refcount
01214  * to the underlying data. Most reference-counting bucket types will
01215  * be able to use this function as their split function without any
01216  * additional type-specific handling.
01217  * @param b The bucket to be split
01218  * @param point The offset of the first byte in the new bucket
01219  * @return APR_EINVAL if the point is not within the bucket;
01220  *         APR_ENOMEM if allocation failed;
01221  *         or APR_SUCCESS
01222  */
01223 APU_DECLARE_NONSTD(apr_status_t) apr_bucket_shared_split(apr_bucket *b,
01224                                                          apr_size_t point);
01225 
01226 /**
01227  * Copy a refcounted bucket, incrementing the reference count. Most
01228  * reference-counting bucket types will be able to use this function
01229  * as their copy function without any additional type-specific handling.
01230  * @param a The bucket to copy
01231  * @param b Returns a pointer to the new bucket
01232  * @return APR_ENOMEM if allocation failed;
01233            or APR_SUCCESS
01234  */
01235 APU_DECLARE_NONSTD(apr_status_t) apr_bucket_shared_copy(apr_bucket *a,
01236                                                         apr_bucket **b);
01237 
01238 
01239 /*  *****  Functions to Create Buckets of varying types  *****  */
01240 /*
01241  * Each bucket type foo has two initialization functions:
01242  * apr_bucket_foo_make which sets up some already-allocated memory as a
01243  * bucket of type foo; and apr_bucket_foo_create which allocates memory
01244  * for the bucket, calls apr_bucket_make_foo, and initializes the
01245  * bucket's list pointers. The apr_bucket_foo_make functions are used
01246  * inside the bucket code to change the type of buckets in place;
01247  * other code should call apr_bucket_foo_create. All the initialization
01248  * functions change nothing if they fail.
01249  */
01250 
01251 /**
01252  * Create an End of Stream bucket.  This indicates that there is no more data
01253  * coming from down the filter stack.  All filters should flush at this point.
01254  * @param list The freelist from which this bucket should be allocated
01255  * @return The new bucket, or NULL if allocation failed
01256  */
01257 APU_DECLARE(apr_bucket *) apr_bucket_eos_create(apr_bucket_alloc_t *list);
01258 
01259 /**
01260  * Make the bucket passed in an EOS bucket.  This indicates that there is no 
01261  * more data coming from down the filter stack.  All filters should flush at 
01262  * this point.
01263  * @param b The bucket to make into an EOS bucket
01264  * @return The new bucket, or NULL if allocation failed
01265  */
01266 APU_DECLARE(apr_bucket *) apr_bucket_eos_make(apr_bucket *b);
01267 
01268 /**
01269  * Create a flush  bucket.  This indicates that filters should flush their
01270  * data.  There is no guarantee that they will flush it, but this is the
01271  * best we can do.
01272  * @param list The freelist from which this bucket should be allocated
01273  * @return The new bucket, or NULL if allocation failed
01274  */
01275 APU_DECLARE(apr_bucket *) apr_bucket_flush_create(apr_bucket_alloc_t *list);
01276 
01277 /**
01278  * Make the bucket passed in a FLUSH  bucket.  This indicates that filters 
01279  * should flush their data.  There is no guarantee that they will flush it, 
01280  * but this is the best we can do.
01281  * @param b The bucket to make into a FLUSH bucket
01282  * @return The new bucket, or NULL if allocation failed
01283  */
01284 APU_DECLARE(apr_bucket *) apr_bucket_flush_make(apr_bucket *b);
01285 
01286 /**
01287  * Create a bucket referring to long-lived data.
01288  * @param buf The data to insert into the bucket
01289  * @param nbyte The size of the data to insert.
01290  * @param list The freelist from which this bucket should be allocated
01291  * @return The new bucket, or NULL if allocation failed
01292  */
01293 APU_DECLARE(apr_bucket *) apr_bucket_immortal_create(const char *buf, 
01294                                                      apr_size_t nbyte,
01295                                                      apr_bucket_alloc_t *list);
01296 
01297 /**
01298  * Make the bucket passed in a bucket refer to long-lived data
01299  * @param b The bucket to make into a IMMORTAL bucket
01300  * @param buf The data to insert into the bucket
01301  * @param nbyte The size of the data to insert.
01302  * @return The new bucket, or NULL if allocation failed
01303  */
01304 APU_DECLARE(apr_bucket *) apr_bucket_immortal_make(apr_bucket *b, 
01305                                                    const char *buf, 
01306                                                    apr_size_t nbyte);
01307 
01308 /**
01309  * Create a bucket referring to data on the stack.
01310  * @param buf The data to insert into the bucket
01311  * @param nbyte The size of the data to insert.
01312  * @param list The freelist from which this bucket should be allocated
01313  * @return The new bucket, or NULL if allocation failed
01314  */
01315 APU_DECLARE(apr_bucket *) apr_bucket_transient_create(const char *buf, 
01316                                                       apr_size_t nbyte,
01317                                                       apr_bucket_alloc_t *list);
01318 
01319 /**
01320  * Make the bucket passed in a bucket refer to stack data
01321  * @param b The bucket to make into a TRANSIENT bucket
01322  * @param buf The data to insert into the bucket
01323  * @param nbyte The size of the data to insert.
01324  * @return The new bucket, or NULL if allocation failed
01325  */
01326 APU_DECLARE(apr_bucket *) apr_bucket_transient_make(apr_bucket *b, 
01327                                                     const char *buf,
01328                                                     apr_size_t nbyte);
01329 
01330 /**
01331  * Create a bucket referring to memory on the heap. If the caller asks
01332  * for the data to be copied, this function always allocates 4K of
01333  * memory so that more data can be added to the bucket without
01334  * requiring another allocation. Therefore not all the data may be put
01335  * into the bucket. If copying is not requested then the bucket takes
01336  * over responsibility for free()ing the memory.
01337  * @param buf The buffer to insert into the bucket
01338  * @param nbyte The size of the buffer to insert.
01339  * @param free_func Function to use to free the data; NULL indicates that the
01340  *                  bucket should make a copy of the data
01341  * @param list The freelist from which this bucket should be allocated
01342  * @return The new bucket, or NULL if allocation failed
01343  */
01344 APU_DECLARE(apr_bucket *) apr_bucket_heap_create(const char *buf, 
01345                                                  apr_size_t nbyte,
01346                                                  void (*free_func)(void *data),
01347                                                  apr_bucket_alloc_t *list);
01348 /**
01349  * Make the bucket passed in a bucket refer to heap data
01350  * @param b The bucket to make into a HEAP bucket
01351  * @param buf The buffer to insert into the bucket
01352  * @param nbyte The size of the buffer to insert.
01353  * @param free_func Function to use to free the data; NULL indicates that the
01354  *                  bucket should make a copy of the data
01355  * @return The new bucket, or NULL if allocation failed
01356  */
01357 APU_DECLARE(apr_bucket *) apr_bucket_heap_make(apr_bucket *b, const char *buf,
01358                                                apr_size_t nbyte,
01359                                                void (*free_func)(void *data));
01360 
01361 /**
01362  * Create a bucket referring to memory allocated from a pool.
01363  *
01364  * @param buf The buffer to insert into the bucket
01365  * @param length The number of bytes referred to by this bucket
01366  * @param pool The pool the memory was allocated from
01367  * @param list The freelist from which this bucket should be allocated
01368  * @return The new bucket, or NULL if allocation failed
01369  */
01370 APU_DECLARE(apr_bucket *) apr_bucket_pool_create(const char *buf, 
01371                                                  apr_size_t length,
01372                                                  apr_pool_t *pool,
01373                                                  apr_bucket_alloc_t *list);
01374 
01375 /**
01376  * Make the bucket passed in a bucket refer to pool data
01377  * @param b The bucket to make into a pool bucket
01378  * @param buf The buffer to insert into the bucket
01379  * @param length The number of bytes referred to by this bucket
01380  * @param pool The pool the memory was allocated from
01381  * @return The new bucket, or NULL if allocation failed
01382  */
01383 APU_DECLARE(apr_bucket *) apr_bucket_pool_make(apr_bucket *b, const char *buf,
01384                                                apr_size_t length, 
01385                                                apr_pool_t *pool);
01386 
01387 #if APR_HAS_MMAP
01388 /**
01389  * Create a bucket referring to mmap()ed memory.
01390  * @param mm The mmap to insert into the bucket
01391