00001 /* Licensed to the Apache Software Foundation (ASF) under one or more 00002 * contributor license agreements. See the NOTICE file distributed with 00003 * this work for additional information regarding copyright ownership. 00004 * The ASF licenses this file to You under the Apache License, Version 2.0 00005 * (the "License"); you may not use this file except in compliance with 00006 * the License. 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 */ 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 00054 #define APR_BUCKET_BUFF_SIZE 8000 00055 00057 typedef enum { 00058 APR_BLOCK_READ, 00059 APR_NONBLOCK_READ 00060 } apr_read_type_e; 00061 00114 /* 00115 * Forward declaration of the main types. 00116 */ 00117 00119 typedef struct apr_bucket_brigade apr_bucket_brigade; 00121 typedef struct apr_bucket apr_bucket; 00123 typedef struct apr_bucket_alloc_t apr_bucket_alloc_t; 00124 00126 typedef struct apr_bucket_type_t apr_bucket_type_t; 00127 00131 struct apr_bucket_type_t { 00135 const char *name; 00140 int num_func; 00151 enum { 00153 APR_BUCKET_DATA = 0, 00155 APR_BUCKET_METADATA = 1 00156 } is_metadata; 00164 void (*destroy)(void *data); 00165 00176 apr_status_t (*read)(apr_bucket *b, const char **str, apr_size_t *len, 00177 apr_read_type_e block); 00178 00192 apr_status_t (*setaside)(apr_bucket *e, apr_pool_t *pool); 00193 00203 apr_status_t (*split)(apr_bucket *e, apr_size_t point); 00204 00211 apr_status_t (*copy)(apr_bucket *e, apr_bucket **c); 00212 00213 }; 00214 00224 struct apr_bucket { 00226 APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link; APR_RING_ENTRY(apr_bucket) link;