ajp.h revision a8561b204b681363cf7702e48c369855a4714a3e
aadf50900dfe0e5da15c24f69650e3b3d72601b4jfclere/* Copyright 1999-2004 The Apache Software Foundation
aadf50900dfe0e5da15c24f69650e3b3d72601b4jfclere * Licensed under the Apache License, Version 2.0 (the "License");
aadf50900dfe0e5da15c24f69650e3b3d72601b4jfclere * you may not use this file except in compliance with the License.
aadf50900dfe0e5da15c24f69650e3b3d72601b4jfclere * You may obtain a copy of the License at
aadf50900dfe0e5da15c24f69650e3b3d72601b4jfclere * Unless required by applicable law or agreed to in writing, software
aadf50900dfe0e5da15c24f69650e3b3d72601b4jfclere * distributed under the License is distributed on an "AS IS" BASIS,
aadf50900dfe0e5da15c24f69650e3b3d72601b4jfclere * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
aadf50900dfe0e5da15c24f69650e3b3d72601b4jfclere * See the License for the specific language governing permissions and
aadf50900dfe0e5da15c24f69650e3b3d72601b4jfclere * limitations under the License.
aadf50900dfe0e5da15c24f69650e3b3d72601b4jfclere#define AJP13_DEF_PORT 9009 /* default to 9009 since 8009 is used by OS */
f1553ab5b144409f25679ffcce2d51e7dc396160mturk/* The following environment variables match mod_ssl! */
f1553ab5b144409f25679ffcce2d51e7dc396160mturk#define AJP13_SSL_CLIENT_CERT_INDICATOR "SSL_CLIENT_CERT"
f1553ab5b144409f25679ffcce2d51e7dc396160mturk#define AJP13_SSL_KEY_SIZE_INDICATOR "SSL_CIPHER_USEKEYSIZE"
aadf50900dfe0e5da15c24f69650e3b3d72601b4jfclere#define ajp_xlate_to_ascii(b, l) ap_xlate_proto_to_ascii(b, l)
aadf50900dfe0e5da15c24f69650e3b3d72601b4jfclere#define ajp_xlate_from_ascii(b, l) ap_xlate_proto_from_ascii(b, l)
aadf50900dfe0e5da15c24f69650e3b3d72601b4jfclere#else /* APR_CHARSET_EBCDIC */
aadf50900dfe0e5da15c24f69650e3b3d72601b4jfclere/** AJP Specific error codes
aadf50900dfe0e5da15c24f69650e3b3d72601b4jfclere/** Buffer overflow exception */
aadf50900dfe0e5da15c24f69650e3b3d72601b4jfclere/** Destination Buffer is to small */
aadf50900dfe0e5da15c24f69650e3b3d72601b4jfclere/** Invalid input parameters */
aadf50900dfe0e5da15c24f69650e3b3d72601b4jfclere/** Bad message signature */
aadf50900dfe0e5da15c24f69650e3b3d72601b4jfclere#define AJP_EBAD_SIGNATURE (APR_OS_START_USERERR + 4)
aadf50900dfe0e5da15c24f69650e3b3d72601b4jfclere/** Incoming message too bg */
aadf50900dfe0e5da15c24f69650e3b3d72601b4jfclere/** Missing message header */
aadf50900dfe0e5da15c24f69650e3b3d72601b4jfclere/** Bad message header */
aadf50900dfe0e5da15c24f69650e3b3d72601b4jfclere/** Bad message */
aadf50900dfe0e5da15c24f69650e3b3d72601b4jfclere/** Cant log via AJP14 */
aadf50900dfe0e5da15c24f69650e3b3d72601b4jfclere/** A structure that represents ajp message */
aadf50900dfe0e5da15c24f69650e3b3d72601b4jfclere/** A structure that represents ajp message */
aadf50900dfe0e5da15c24f69650e3b3d72601b4jfclere /** The buffer holding a AJP message */
aadf50900dfe0e5da15c24f69650e3b3d72601b4jfclere /** The length of AJP message header (defaults to AJP_HEADER_LEN) */
aadf50900dfe0e5da15c24f69650e3b3d72601b4jfclere /** The length of AJP message */
aadf50900dfe0e5da15c24f69650e3b3d72601b4jfclere /** The current read position */
aadf50900dfe0e5da15c24f69650e3b3d72601b4jfclere /** Flag indicating the origing of the message */
aadf50900dfe0e5da15c24f69650e3b3d72601b4jfclere * @defgroup AJP_defines AJP definitions
aadf50900dfe0e5da15c24f69650e3b3d72601b4jfclere * Signature for the messages sent from Apache to tomcat
aadf50900dfe0e5da15c24f69650e3b3d72601b4jfclere#define AJP13_MAX_SEND_BODY_SZ (AJP_MSG_BUFFER_SZ - 6)
aadf50900dfe0e5da15c24f69650e3b3d72601b4jfclere/** Send a request from web server to container*/
aadf50900dfe0e5da15c24f69650e3b3d72601b4jfclere/** Write a body chunk from the servlet container to the web server */
aadf50900dfe0e5da15c24f69650e3b3d72601b4jfclere/** Send response headers from the servlet container to the web server. */
aadf50900dfe0e5da15c24f69650e3b3d72601b4jfclere/** Marks the end of response. */
aadf50900dfe0e5da15c24f69650e3b3d72601b4jfclere/** Get further data from the web server if it hasn't all been transferred yet. */
aadf50900dfe0e5da15c24f69650e3b3d72601b4jfclere/** The web server asks the container to shut itself down. */
aadf50900dfe0e5da15c24f69650e3b3d72601b4jfclere/** Webserver ask container to take control (logon phase) */
aadf50900dfe0e5da15c24f69650e3b3d72601b4jfclere/** Container response to cping request */
aadf50900dfe0e5da15c24f69650e3b3d72601b4jfclere/** Webserver check if container is alive, since container should respond by cpong */
aadf50900dfe0e5da15c24f69650e3b3d72601b4jfclere * @defgroup AJP_api AJP API functions
aadf50900dfe0e5da15c24f69650e3b3d72601b4jfclere * Check a new AJP Message by looking at signature and return its size
aadf50900dfe0e5da15c24f69650e3b3d72601b4jfclere * @param msg AJP Message to check
aadf50900dfe0e5da15c24f69650e3b3d72601b4jfclere * @param len Pointer to returned len
aadf50900dfe0e5da15c24f69650e3b3d72601b4jfclere * @return APR_SUCCESS or error
aadf50900dfe0e5da15c24f69650e3b3d72601b4jfclereapr_status_t ajp_msg_check_header(ajp_msg_t *msg, apr_size_t *len);
aadf50900dfe0e5da15c24f69650e3b3d72601b4jfclere * Reset an AJP Message
aadf50900dfe0e5da15c24f69650e3b3d72601b4jfclere * @param msg AJP Message to reset
aadf50900dfe0e5da15c24f69650e3b3d72601b4jfclere * @return APR_SUCCESS or error
aadf50900dfe0e5da15c24f69650e3b3d72601b4jfclere * Mark the end of an AJP Message
aadf50900dfe0e5da15c24f69650e3b3d72601b4jfclere * @param msg AJP Message to end
aadf50900dfe0e5da15c24f69650e3b3d72601b4jfclere * @return APR_SUCCESS or error
aadf50900dfe0e5da15c24f69650e3b3d72601b4jfclere * Add an unsigned 32bits value to AJP Message
aadf50900dfe0e5da15c24f69650e3b3d72601b4jfclere * @param msg AJP Message to get value from
aadf50900dfe0e5da15c24f69650e3b3d72601b4jfclere * @param value value to add to AJP Message
aadf50900dfe0e5da15c24f69650e3b3d72601b4jfclere * @return APR_SUCCESS or error
aadf50900dfe0e5da15c24f69650e3b3d72601b4jfclereapr_status_t ajp_msg_append_uint32(ajp_msg_t *msg, apr_uint32_t value);
aadf50900dfe0e5da15c24f69650e3b3d72601b4jfclere * Add an unsigned 16bits value to AJP Message
aadf50900dfe0e5da15c24f69650e3b3d72601b4jfclere * @param msg AJP Message to get value from
aadf50900dfe0e5da15c24f69650e3b3d72601b4jfclere * @param value value to add to AJP Message
aadf50900dfe0e5da15c24f69650e3b3d72601b4jfclere * @return APR_SUCCESS or error
aadf50900dfe0e5da15c24f69650e3b3d72601b4jfclereapr_status_t ajp_msg_append_uint16(ajp_msg_t *msg, apr_uint16_t value);
aadf50900dfe0e5da15c24f69650e3b3d72601b4jfclere * Add an unsigned 8bits value to AJP Message
aadf50900dfe0e5da15c24f69650e3b3d72601b4jfclere * @param msg AJP Message to get value from
aadf50900dfe0e5da15c24f69650e3b3d72601b4jfclere * @param value value to add to AJP Message
aadf50900dfe0e5da15c24f69650e3b3d72601b4jfclere * @return APR_SUCCESS or error
aadf50900dfe0e5da15c24f69650e3b3d72601b4jfclereapr_status_t ajp_msg_append_uint8(ajp_msg_t *msg, apr_byte_t value);
aadf50900dfe0e5da15c24f69650e3b3d72601b4jfclere * Add a String in AJP message, and transform the String in ASCII
aadf50900dfe0e5da15c24f69650e3b3d72601b4jfclere * if convert is set and we're on an EBCDIC machine
aadf50900dfe0e5da15c24f69650e3b3d72601b4jfclere * @param msg AJP Message to get value from
aadf50900dfe0e5da15c24f69650e3b3d72601b4jfclere * @param value Pointer to String
aadf50900dfe0e5da15c24f69650e3b3d72601b4jfclere * @param convert When set told to convert String to ASCII
aadf50900dfe0e5da15c24f69650e3b3d72601b4jfclere * @return APR_SUCCESS or error
aadf50900dfe0e5da15c24f69650e3b3d72601b4jfclereapr_status_t ajp_msg_append_string_ex(ajp_msg_t *msg, const char *value,
aadf50900dfe0e5da15c24f69650e3b3d72601b4jfclere * Add a String in AJP message, and transform
aadf50900dfe0e5da15c24f69650e3b3d72601b4jfclere * the String in ASCII if we're on an EBCDIC machine
aadf50900dfe0e5da15c24f69650e3b3d72601b4jfclere#define ajp_msg_append_string(m, v) ajp_msg_append_string_ex(m, v, 1)
aadf50900dfe0e5da15c24f69650e3b3d72601b4jfclere * Add a String in AJP message.
aadf50900dfe0e5da15c24f69650e3b3d72601b4jfclere#define ajp_msg_append_string_ascii(m, v) ajp_msg_append_string_ex(m, v, 0)
aadf50900dfe0e5da15c24f69650e3b3d72601b4jfclere * Add a Byte array to AJP Message
aadf50900dfe0e5da15c24f69650e3b3d72601b4jfclere * @param msg AJP Message to get value from
aadf50900dfe0e5da15c24f69650e3b3d72601b4jfclere * @param value Pointer to Byte array
aadf50900dfe0e5da15c24f69650e3b3d72601b4jfclere * @param valuelen Byte array len
aadf50900dfe0e5da15c24f69650e3b3d72601b4jfclere * @return APR_SUCCESS or error
aadf50900dfe0e5da15c24f69650e3b3d72601b4jfclereapr_status_t ajp_msg_append_bytes(ajp_msg_t *msg, const apr_byte_t *value,
aadf50900dfe0e5da15c24f69650e3b3d72601b4jfclere * Get a 32bits unsigned value from AJP Message
aadf50900dfe0e5da15c24f69650e3b3d72601b4jfclere * @param msg AJP Message to get value from
aadf50900dfe0e5da15c24f69650e3b3d72601b4jfclere * @param rvalue Pointer where value will be returned
aadf50900dfe0e5da15c24f69650e3b3d72601b4jfclere * @return APR_SUCCESS or error
aadf50900dfe0e5da15c24f69650e3b3d72601b4jfclereapr_status_t ajp_msg_get_uint32(ajp_msg_t *msg, apr_uint32_t *rvalue);
aadf50900dfe0e5da15c24f69650e3b3d72601b4jfclere * Get a 16bits unsigned value from AJP Message
aadf50900dfe0e5da15c24f69650e3b3d72601b4jfclere * @param msg AJP Message to get value from
aadf50900dfe0e5da15c24f69650e3b3d72601b4jfclere * @param rvalue Pointer where value will be returned
aadf50900dfe0e5da15c24f69650e3b3d72601b4jfclere * @return APR_SUCCESS or error
aadf50900dfe0e5da15c24f69650e3b3d72601b4jfclereapr_status_t ajp_msg_get_uint16(ajp_msg_t *msg, apr_uint16_t *rvalue);
aadf50900dfe0e5da15c24f69650e3b3d72601b4jfclere * Peek a 16bits unsigned value from AJP Message, position in message
aadf50900dfe0e5da15c24f69650e3b3d72601b4jfclere * is not updated
aadf50900dfe0e5da15c24f69650e3b3d72601b4jfclere * @param msg AJP Message to get value from
aadf50900dfe0e5da15c24f69650e3b3d72601b4jfclere * @param rvalue Pointer where value will be returned
aadf50900dfe0e5da15c24f69650e3b3d72601b4jfclere * @return APR_SUCCESS or error
aadf50900dfe0e5da15c24f69650e3b3d72601b4jfclereapr_status_t ajp_msg_peek_uint16(ajp_msg_t *msg, apr_uint16_t *rvalue);
aadf50900dfe0e5da15c24f69650e3b3d72601b4jfclere * Get a 8bits unsigned value from AJP Message
aadf50900dfe0e5da15c24f69650e3b3d72601b4jfclere * @param msg AJP Message to get value from
aadf50900dfe0e5da15c24f69650e3b3d72601b4jfclere * @param rvalue Pointer where value will be returned
aadf50900dfe0e5da15c24f69650e3b3d72601b4jfclere * @return APR_SUCCESS or error
aadf50900dfe0e5da15c24f69650e3b3d72601b4jfclereapr_status_t ajp_msg_get_uint8(ajp_msg_t *msg, apr_byte_t *rvalue);
aadf50900dfe0e5da15c24f69650e3b3d72601b4jfclere * Peek a 8bits unsigned value from AJP Message, position in message
aadf50900dfe0e5da15c24f69650e3b3d72601b4jfclere * is not updated
aadf50900dfe0e5da15c24f69650e3b3d72601b4jfclere * @param msg AJP Message to get value from
aadf50900dfe0e5da15c24f69650e3b3d72601b4jfclere * @param rvalue Pointer where value will be returned
aadf50900dfe0e5da15c24f69650e3b3d72601b4jfclere * @return APR_SUCCESS or error
aadf50900dfe0e5da15c24f69650e3b3d72601b4jfclereapr_status_t ajp_msg_peek_uint8(ajp_msg_t *msg, apr_byte_t *rvalue);
aadf50900dfe0e5da15c24f69650e3b3d72601b4jfclere * Get a String value from AJP Message
aadf50900dfe0e5da15c24f69650e3b3d72601b4jfclere * @param msg AJP Message to get value from
aadf50900dfe0e5da15c24f69650e3b3d72601b4jfclere * @param rvalue Pointer where value will be returned
aadf50900dfe0e5da15c24f69650e3b3d72601b4jfclere * @return APR_SUCCESS or error
aadf50900dfe0e5da15c24f69650e3b3d72601b4jfclereapr_status_t ajp_msg_get_string(ajp_msg_t *msg, char **rvalue);
aadf50900dfe0e5da15c24f69650e3b3d72601b4jfclere * Get a Byte array from AJP Message
aadf50900dfe0e5da15c24f69650e3b3d72601b4jfclere * @param msg AJP Message to get value from
aadf50900dfe0e5da15c24f69650e3b3d72601b4jfclere * @param rvalue Pointer where value will be returned
aadf50900dfe0e5da15c24f69650e3b3d72601b4jfclere * @param rvalueLen Pointer where Byte array len will be returned
aadf50900dfe0e5da15c24f69650e3b3d72601b4jfclere * @return APR_SUCCESS or error
aadf50900dfe0e5da15c24f69650e3b3d72601b4jfclereapr_status_t ajp_msg_get_bytes(ajp_msg_t *msg, apr_byte_t **rvalue,
aadf50900dfe0e5da15c24f69650e3b3d72601b4jfclere * Create an AJP Message from pool
aadf50900dfe0e5da15c24f69650e3b3d72601b4jfclere * @param pool memory pool to allocate AJP message from
aadf50900dfe0e5da15c24f69650e3b3d72601b4jfclere * @param rmsg Pointer to newly created AJP message
aadf50900dfe0e5da15c24f69650e3b3d72601b4jfclere * @return APR_SUCCESS or error
aadf50900dfe0e5da15c24f69650e3b3d72601b4jfclereapr_status_t ajp_msg_create(apr_pool_t *pool, ajp_msg_t **rmsg);
aadf50900dfe0e5da15c24f69650e3b3d72601b4jfclere * Recopy an AJP Message to another
aadf50900dfe0e5da15c24f69650e3b3d72601b4jfclere * @param smsg source AJP message
aadf50900dfe0e5da15c24f69650e3b3d72601b4jfclere * @param dmsg destination AJP message
aadf50900dfe0e5da15c24f69650e3b3d72601b4jfclere * @return APR_SUCCESS or error
aadf50900dfe0e5da15c24f69650e3b3d72601b4jfclereapr_status_t ajp_msg_copy(ajp_msg_t *smsg, ajp_msg_t *dmsg);
aadf50900dfe0e5da15c24f69650e3b3d72601b4jfclere * Serialize in an AJP Message a PING command
aadf50900dfe0e5da15c24f69650e3b3d72601b4jfclere * +-----------------------+
aadf50900dfe0e5da15c24f69650e3b3d72601b4jfclere * | PING CMD (1 byte) |
aadf50900dfe0e5da15c24f69650e3b3d72601b4jfclere * +-----------------------+
aadf50900dfe0e5da15c24f69650e3b3d72601b4jfclere * @param smsg AJP message to put serialized message
aadf50900dfe0e5da15c24f69650e3b3d72601b4jfclere * @return APR_SUCCESS or error
aadf50900dfe0e5da15c24f69650e3b3d72601b4jfclere * Serialize in an AJP Message a CPING command
aadf50900dfe0e5da15c24f69650e3b3d72601b4jfclere * +-----------------------+
aadf50900dfe0e5da15c24f69650e3b3d72601b4jfclere * | CPING CMD (1 byte) |
aadf50900dfe0e5da15c24f69650e3b3d72601b4jfclere * +-----------------------+
aadf50900dfe0e5da15c24f69650e3b3d72601b4jfclere * @param smsg AJP message to put serialized message
aadf50900dfe0e5da15c24f69650e3b3d72601b4jfclere * @return APR_SUCCESS or error
aadf50900dfe0e5da15c24f69650e3b3d72601b4jfclereapr_status_t ajp_msg_serialize_cping(ajp_msg_t *msg);
aadf50900dfe0e5da15c24f69650e3b3d72601b4jfclere * Dump up to the first 1024 bytes on an AJP Message
aadf50900dfe0e5da15c24f69650e3b3d72601b4jfclere * @param msg AJP Message to dump
aadf50900dfe0e5da15c24f69650e3b3d72601b4jfclere * @param err error string to display
aadf50900dfe0e5da15c24f69650e3b3d72601b4jfclere * @return APR_SUCCESS or error
aadf50900dfe0e5da15c24f69650e3b3d72601b4jfclereapr_status_t ajp_msg_dump(ajp_msg_t *msg, char *err);
aadf50900dfe0e5da15c24f69650e3b3d72601b4jfclere * Send an AJP message to backend
aadf50900dfe0e5da15c24f69650e3b3d72601b4jfclere * @param soct backend socket
aadf50900dfe0e5da15c24f69650e3b3d72601b4jfclere * @param smsg AJP message to put serialized message
aadf50900dfe0e5da15c24f69650e3b3d72601b4jfclere * @return APR_SUCCESS or error
aadf50900dfe0e5da15c24f69650e3b3d72601b4jfclereapr_status_t ajp_ilink_send(apr_socket_t *sock, ajp_msg_t *msg);
aadf50900dfe0e5da15c24f69650e3b3d72601b4jfclere * Receive an AJP message from backend
aadf50900dfe0e5da15c24f69650e3b3d72601b4jfclere * @param sock backend socket
aadf50900dfe0e5da15c24f69650e3b3d72601b4jfclere * @param smsg AJP message to put serialized message
aadf50900dfe0e5da15c24f69650e3b3d72601b4jfclere * @return APR_SUCCESS or error
aadf50900dfe0e5da15c24f69650e3b3d72601b4jfclereapr_status_t ajp_ilink_receive(apr_socket_t *sock, ajp_msg_t *msg);
aadf50900dfe0e5da15c24f69650e3b3d72601b4jfclere * Build the ajp header message and send it
aadf50900dfe0e5da15c24f69650e3b3d72601b4jfclere * @param sock backend socket
aadf50900dfe0e5da15c24f69650e3b3d72601b4jfclere * @param r current request
aadf50900dfe0e5da15c24f69650e3b3d72601b4jfclere * @return APR_SUCCESS or error
aadf50900dfe0e5da15c24f69650e3b3d72601b4jfclereapr_status_t ajp_send_header(apr_socket_t *sock, request_rec *r);
aadf50900dfe0e5da15c24f69650e3b3d72601b4jfclere * Read the ajp message and return the type of the message.
aadf50900dfe0e5da15c24f69650e3b3d72601b4jfclere * @param sock backend socket
aadf50900dfe0e5da15c24f69650e3b3d72601b4jfclere * @param r current request
aadf50900dfe0e5da15c24f69650e3b3d72601b4jfclere * @param msg returned AJP message
aadf50900dfe0e5da15c24f69650e3b3d72601b4jfclere * @return APR_SUCCESS or error
aadf50900dfe0e5da15c24f69650e3b3d72601b4jfclere * Allocate a msg to send data
a8561b204b681363cf7702e48c369855a4714a3emturk * @param pool pool to allocate from
aadf50900dfe0e5da15c24f69650e3b3d72601b4jfclere * @param ptr data buffer
aadf50900dfe0e5da15c24f69650e3b3d72601b4jfclere * @param len the length of allocated data buffer
aadf50900dfe0e5da15c24f69650e3b3d72601b4jfclere * @param msg returned AJP message
aadf50900dfe0e5da15c24f69650e3b3d72601b4jfclere * @return APR_SUCCESS or error
a8561b204b681363cf7702e48c369855a4714a3emturkapr_status_t ajp_alloc_data_msg(apr_pool_t *pool, char **ptr,
aadf50900dfe0e5da15c24f69650e3b3d72601b4jfclere * Send the data message
aadf50900dfe0e5da15c24f69650e3b3d72601b4jfclere * @param sock backend socket
aadf50900dfe0e5da15c24f69650e3b3d72601b4jfclere * @param msg AJP message to send
aadf50900dfe0e5da15c24f69650e3b3d72601b4jfclere * @param len AJP message length
aadf50900dfe0e5da15c24f69650e3b3d72601b4jfclere * @return APR_SUCCESS or error
aadf50900dfe0e5da15c24f69650e3b3d72601b4jfclere * Parse the message type
aadf50900dfe0e5da15c24f69650e3b3d72601b4jfclere * @param r current request
aadf50900dfe0e5da15c24f69650e3b3d72601b4jfclere * @param msg AJP message
aadf50900dfe0e5da15c24f69650e3b3d72601b4jfclere * @return AJP message type.
aadf50900dfe0e5da15c24f69650e3b3d72601b4jfclere * Parse the header message from container
aadf50900dfe0e5da15c24f69650e3b3d72601b4jfclere * @param r current request
aadf50900dfe0e5da15c24f69650e3b3d72601b4jfclere * @param msg AJP message
aadf50900dfe0e5da15c24f69650e3b3d72601b4jfclere * @return APR_SUCCESS or error
aadf50900dfe0e5da15c24f69650e3b3d72601b4jfclereapr_status_t ajp_parse_header(request_rec *r, ajp_msg_t *msg);
aadf50900dfe0e5da15c24f69650e3b3d72601b4jfclere * Parse the message body and return data address and length
aadf50900dfe0e5da15c24f69650e3b3d72601b4jfclere * @param r current request
aadf50900dfe0e5da15c24f69650e3b3d72601b4jfclere * @param msg AJP message
aadf50900dfe0e5da15c24f69650e3b3d72601b4jfclere * @param len returned AJP message length
aadf50900dfe0e5da15c24f69650e3b3d72601b4jfclere * @param ptr returned data
aadf50900dfe0e5da15c24f69650e3b3d72601b4jfclere * @return APR_SUCCESS or error
aadf50900dfe0e5da15c24f69650e3b3d72601b4jfclereapr_status_t ajp_parse_data(request_rec *r, ajp_msg_t *msg,
aadf50900dfe0e5da15c24f69650e3b3d72601b4jfclere#endif /* AJP_H */