158 lines
5.3 KiB
C
158 lines
5.3 KiB
C
/* Licensed to the Apache Software Foundation (ASF) under one or more
|
|
* contributor license agreements. See the NOTICE file distributed with
|
|
* this work for additional information regarding copyright ownership.
|
|
* The ASF licenses this file to You under the Apache License, Version 2.0
|
|
* (the "License"); you may not use this file except in compliance with
|
|
* the License. You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
#ifndef tls_util_h
|
|
#define tls_util_h
|
|
|
|
#define TLS_DIM(a) (sizeof(a)/sizeof(a[0]))
|
|
|
|
|
|
/**
|
|
* Simple struct to hold a range of bytes and its length together.
|
|
*/
|
|
typedef struct tls_data_t tls_data_t;
|
|
struct tls_data_t {
|
|
const unsigned char* data;
|
|
apr_size_t len;
|
|
};
|
|
|
|
/**
|
|
* Return a tls_data_t for a string.
|
|
*/
|
|
tls_data_t tls_data_from_str(const char *s);
|
|
|
|
/**
|
|
* Create a copy of a tls_data_t using the given pool.
|
|
*/
|
|
tls_data_t *tls_data_copy(apr_pool_t *p, const tls_data_t *d);
|
|
|
|
/**
|
|
* Return a copy of a tls_data_t bytes allocated from pool.
|
|
*/
|
|
tls_data_t tls_data_assign_copy(apr_pool_t *p, const tls_data_t *d);
|
|
|
|
/**
|
|
* Convert the data bytes in `d` into a NUL-terminated string.
|
|
* There is no check if the data bytes already contain NUL.
|
|
*/
|
|
const char *tls_data_to_str(apr_pool_t *p, const tls_data_t *d);
|
|
|
|
/**
|
|
* Return != 0 if fpath is a 'real' file.
|
|
*/
|
|
int tls_util_is_file(apr_pool_t *p, const char *fpath);
|
|
|
|
/**
|
|
* Inspect a 'rustls_result', retrieve the error description for it and
|
|
* return the apr_status_t to use as our error status.
|
|
*/
|
|
apr_status_t tls_util_rustls_error(apr_pool_t *p, rustls_result rr, const char **perr_descr);
|
|
|
|
/**
|
|
* Load up to `max_len` bytes into a buffer allocated from the pool.
|
|
* @return ARP_SUCCESS on successful load.
|
|
* APR_EINVAL when the file was not a regular file or is too large.
|
|
*/
|
|
apr_status_t tls_util_file_load(
|
|
apr_pool_t *p, const char *fpath, size_t min_len, size_t max_len, tls_data_t *data);
|
|
|
|
/**
|
|
* Return != 0 iff the array of apr_uint16_t contains value n.
|
|
*/
|
|
int tls_util_array_uint16_contains(const apr_array_header_t* a, apr_uint16_t n);
|
|
|
|
/**
|
|
* Remove all apr_uint16_t in `others` from array `from`.
|
|
* Returns the new array or, if no overlap was found, the `from` array unchanged.
|
|
*/
|
|
const apr_array_header_t *tls_util_array_uint16_remove(
|
|
apr_pool_t *pool, const apr_array_header_t* from, const apr_array_header_t* others);
|
|
|
|
/**
|
|
* Transfer up to <length> bytes from <src> to <dest>, including all
|
|
* encountered meta data buckets. The transferred buckets/data are
|
|
* removed from <src>.
|
|
* Return the actual byte count transferred in <pnout>.
|
|
*/
|
|
apr_status_t tls_util_brigade_transfer(
|
|
apr_bucket_brigade *dest, apr_bucket_brigade *src, apr_off_t length,
|
|
apr_off_t *pnout);
|
|
|
|
/**
|
|
* Copy up to <length> bytes from <src> to <dest>, including all
|
|
* encountered meta data buckets. <src> remains semantically unchaanged,
|
|
* meaning there might have been buckets split or changed while reading
|
|
* their content.
|
|
* Return the actual byte count copied in <pnout>.
|
|
*/
|
|
apr_status_t tls_util_brigade_copy(
|
|
apr_bucket_brigade *dest, apr_bucket_brigade *src, apr_off_t length,
|
|
apr_off_t *pnout);
|
|
|
|
/**
|
|
* Get a line of max `length` bytes from `src` into `dest`.
|
|
* Return the number of bytes transferred in `pnout`.
|
|
*/
|
|
apr_status_t tls_util_brigade_split_line(
|
|
apr_bucket_brigade *dest, apr_bucket_brigade *src,
|
|
apr_read_type_e block, apr_off_t length,
|
|
apr_off_t *pnout);
|
|
|
|
/**
|
|
* Return != 0 iff the given <name> matches the configured 'ServerName'
|
|
* or one of the 'ServerAlias' name of <s>, including wildcard patterns
|
|
* as understood by ap_strcasecmp_match().
|
|
*/
|
|
int tls_util_name_matches_server(const char *name, server_rec *s);
|
|
|
|
|
|
/**
|
|
* Print a bucket's meta data (type and length) to the buffer.
|
|
* @return number of characters printed
|
|
*/
|
|
apr_size_t tls_util_bucket_print(char *buffer, apr_size_t bmax,
|
|
apr_bucket *b, const char *sep);
|
|
|
|
/**
|
|
* Prints the brigade bucket types and lengths into the given buffer
|
|
* up to bmax.
|
|
* @return number of characters printed
|
|
*/
|
|
apr_size_t tls_util_bb_print(char *buffer, apr_size_t bmax,
|
|
const char *tag, const char *sep,
|
|
apr_bucket_brigade *bb);
|
|
/**
|
|
* Logs the bucket brigade (which bucket types with what length)
|
|
* to the log at the given level.
|
|
* @param c the connection to log for
|
|
* @param sid the stream identifier this brigade belongs to
|
|
* @param level the log level (as in APLOG_*)
|
|
* @param tag a short message text about the context
|
|
* @param bb the brigade to log
|
|
*/
|
|
#define tls_util_bb_log(c, level, tag, bb) \
|
|
do { \
|
|
char buffer[4 * 1024]; \
|
|
const char *line = "(null)"; \
|
|
apr_size_t len, bmax = sizeof(buffer)/sizeof(buffer[0]); \
|
|
len = tls_util_bb_print(buffer, bmax, (tag), "", (bb)); \
|
|
ap_log_cerror(APLOG_MARK, level, 0, (c), "bb_dump(%ld): %s", \
|
|
((c)->master? (c)->master->id : (c)->id), (len? buffer : line)); \
|
|
} while(0)
|
|
|
|
|
|
|
|
#endif /* tls_util_h */
|