Apache HTTP Server Request Library
00001 /* 00002 ** Copyright 2003-2005 The Apache Software Foundation 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 #ifndef APREQ_UTIL_H 00018 #define APREQ_UTIL_H 00019 00020 #include "apr_file_io.h" 00021 #include "apr_buckets.h" 00022 #include "apreq.h" 00023 00024 #ifdef __cplusplus 00025 extern "C" { 00026 #endif 00027 00052 APREQ_DECLARE(char *) apreq_join(apr_pool_t *p, 00053 const char *sep, 00054 const apr_array_header_t *arr, 00055 apreq_join_t mode); 00056 00069 APREQ_DECLARE(apr_ssize_t) apreq_index(const char* hay, apr_size_t hlen, 00070 const char* ndl, apr_size_t nlen, 00071 const apreq_match_t type); 00072 00085 APREQ_DECLARE(apr_size_t) apreq_quote(char *dest, const char *src, 00086 const apr_size_t slen); 00087 00101 APREQ_DECLARE(apr_size_t) apreq_quote_once(char *dest, const char *src, 00102 const apr_size_t slen); 00103 00114 APREQ_DECLARE(apr_size_t) apreq_encode(char *dest, const char *src, 00115 const apr_size_t slen); 00116 00128 APREQ_DECLARE(apr_size_t) apreq_cp1252_to_utf8(char *dest, 00129 const char *src, apr_size_t slen); 00130 00151 APREQ_DECLARE(apr_status_t) apreq_decode(char *dest, apr_size_t *dlen, 00152 const char *src, apr_size_t slen); 00153 00174 APREQ_DECLARE(apr_status_t) apreq_decodev(char *dest, apr_size_t *dlen, 00175 struct iovec *v, int nelts); 00176 00189 static APR_INLINE 00190 char *apreq_escape(apr_pool_t *p, const char *src, const apr_size_t slen) 00191 { 00192 char *rv; 00193 00194 if (src == NULL) 00195 return NULL; 00196 00197 rv = apr_palloc(p, 3 * slen + 1); 00198 apreq_encode(rv, src, slen); 00199 return rv; 00200 } 00201 00209 static APR_INLINE apr_ssize_t apreq_unescape(char *str) 00210 { 00211 apr_size_t len; 00212 apr_status_t rv = apreq_decode(str, &len, str, strlen(str)); 00213 if (rv == APR_SUCCESS) 00214 return (apr_ssize_t)len; 00215 else 00216 return -1; 00217 } 00218 00230 APREQ_DECLARE(apr_int64_t) apreq_atoi64f(const char *s); 00231 00243 APREQ_DECLARE(apr_int64_t) apreq_atoi64t(const char *s); 00244 00262 APREQ_DECLARE(apr_status_t) apreq_brigade_fwrite(apr_file_t *f, 00263 apr_off_t *wlen, 00264 apr_bucket_brigade *bb); 00281 APREQ_DECLARE(apr_status_t) apreq_file_mktemp(apr_file_t **fp, 00282 apr_pool_t *pool, 00283 const char *path); 00284 00294 static APR_INLINE 00295 apr_status_t apreq_brigade_setaside(apr_bucket_brigade *bb, apr_pool_t *p) 00296 { 00297 apr_bucket *e; 00298 for (e = APR_BRIGADE_FIRST(bb); e != APR_BRIGADE_SENTINEL(bb); 00299 e = APR_BUCKET_NEXT(e)) 00300 { 00301 apr_status_t rv = apr_bucket_setaside(e, p); 00302 if (rv != APR_SUCCESS) 00303 return rv; 00304 } 00305 return APR_SUCCESS; 00306 } 00307 00308 00321 static APR_INLINE 00322 apr_status_t apreq_brigade_copy(apr_bucket_brigade *d, apr_bucket_brigade *s) { 00323 apr_bucket *e; 00324 for (e = APR_BRIGADE_FIRST(s); e != APR_BRIGADE_SENTINEL(s); 00325 e = APR_BUCKET_NEXT(e)) 00326 { 00327 apr_bucket *c; 00328 apr_status_t rv = apr_bucket_copy(e, &c); 00329 if (rv != APR_SUCCESS) 00330 return rv; 00331 00332 APR_BRIGADE_INSERT_TAIL(d, c); 00333 } 00334 return APR_SUCCESS; 00335 } 00336 00348 static APR_INLINE 00349 void apreq_brigade_move(apr_bucket_brigade *d, apr_bucket_brigade *s, 00350 apr_bucket *e) 00351 { 00352 apr_bucket *f; 00353 00354 if (e != APR_BRIGADE_SENTINEL(s)) { 00355 f = APR_RING_FIRST(&s->list); 00356 if (f == e) /* zero buckets to be moved */ 00357 return; 00358 00359 /* obtain the last bucket to be moved */ 00360 e = APR_RING_PREV(e, link); 00361 00362 APR_RING_UNSPLICE(f, e, link); 00363 APR_RING_SPLICE_HEAD(&d->list, f, e, apr_bucket, link); 00364 } 00365 else { 00366 APR_BRIGADE_CONCAT(d, s); 00367 } 00368 } 00369 00370 00384 APREQ_DECLARE(apr_status_t) apreq_header_attribute(const char *hdr, 00385 const char *name, 00386 const apr_size_t nlen, 00387 const char **val, 00388 apr_size_t *vlen); 00389 00390 00408 APREQ_DECLARE(apr_status_t) apreq_brigade_concat(apr_pool_t *pool, 00409 const char *temp_dir, 00410 apr_size_t brigade_limit, 00411 apr_bucket_brigade *out, 00412 apr_bucket_brigade *in); 00413 00422 APREQ_DECLARE(apr_file_t *)apreq_brigade_spoolfile(apr_bucket_brigade *bb); 00423 00424 #ifdef __cplusplus 00425 } 00426 #endif 00427 00428 #endif /* APREQ_UTIL_H */