📄 ajp_msg.c
字号:
* @param msg AJP Message to get value from * @param value Pointer to Byte array * @param valuelen Byte array len * @return APR_SUCCESS or error */apr_status_t ajp_msg_append_bytes(ajp_msg_t *msg, const apr_byte_t *value, apr_size_t valuelen){ if (! valuelen) { return APR_SUCCESS; /* Shouldn't we indicate an error ? */ } if ((msg->len + valuelen) > msg->max_size) { return ajp_log_overflow(msg, "ajp_msg_append_bytes"); } /* We checked for space !! */ memcpy(msg->buf + msg->len, value, valuelen); msg->len += valuelen; return APR_SUCCESS;}/** * Get a 32bits unsigned value from AJP Message * * @param msg AJP Message to get value from * @param rvalue Pointer where value will be returned * @return APR_SUCCESS or error */apr_status_t ajp_msg_get_uint32(ajp_msg_t *msg, apr_uint32_t *rvalue){ apr_uint32_t value; if ((msg->pos + 3) > msg->len) { return ajp_log_overflow(msg, "ajp_msg_get_uint32"); } value = ((msg->buf[(msg->pos++)] & 0xFF) << 24); value |= ((msg->buf[(msg->pos++)] & 0xFF) << 16); value |= ((msg->buf[(msg->pos++)] & 0xFF) << 8); value |= ((msg->buf[(msg->pos++)] & 0xFF)); *rvalue = value; return APR_SUCCESS;}/** * Get a 16bits unsigned value from AJP Message * * @param msg AJP Message to get value from * @param rvalue Pointer where value will be returned * @return APR_SUCCESS or error */apr_status_t ajp_msg_get_uint16(ajp_msg_t *msg, apr_uint16_t *rvalue){ apr_uint16_t value; if ((msg->pos + 1) > msg->len) { return ajp_log_overflow(msg, "ajp_msg_get_uint16"); } value = ((msg->buf[(msg->pos++)] & 0xFF) << 8); value += ((msg->buf[(msg->pos++)] & 0xFF)); *rvalue = value; return APR_SUCCESS;}/** * Peek a 16bits unsigned value from AJP Message, position in message * is not updated * * @param msg AJP Message to get value from * @param rvalue Pointer where value will be returned * @return APR_SUCCESS or error */apr_status_t ajp_msg_peek_uint16(ajp_msg_t *msg, apr_uint16_t *rvalue){ apr_uint16_t value; if ((msg->pos + 1) > msg->len) { return ajp_log_overflow(msg, "ajp_msg_peek_uint16"); } value = ((msg->buf[(msg->pos)] & 0xFF) << 8); value += ((msg->buf[(msg->pos + 1)] & 0xFF)); *rvalue = value; return APR_SUCCESS;}/** * Peek a 8bits unsigned value from AJP Message, position in message * is not updated * * @param msg AJP Message to get value from * @param rvalue Pointer where value will be returned * @return APR_SUCCESS or error */apr_status_t ajp_msg_peek_uint8(ajp_msg_t *msg, apr_byte_t *rvalue){ if (msg->pos > msg->len) { return ajp_log_overflow(msg, "ajp_msg_peek_uint8"); } *rvalue = msg->buf[msg->pos]; return APR_SUCCESS;}/** * Get a 8bits unsigned value from AJP Message * * @param msg AJP Message to get value from * @param rvalue Pointer where value will be returned * @return APR_SUCCESS or error */apr_status_t ajp_msg_get_uint8(ajp_msg_t *msg, apr_byte_t *rvalue){ if (msg->pos > msg->len) { return ajp_log_overflow(msg, "ajp_msg_get_uint8"); } *rvalue = msg->buf[msg->pos++]; return APR_SUCCESS;}/** * Get a String value from AJP Message * * @param msg AJP Message to get value from * @param rvalue Pointer where value will be returned * @return APR_SUCCESS or error */apr_status_t ajp_msg_get_string(ajp_msg_t *msg, const char **rvalue){ apr_uint16_t size; apr_size_t start; apr_status_t status; status = ajp_msg_get_uint16(msg, &size); start = msg->pos; if ((status != APR_SUCCESS) || (size + start > msg->max_size)) { return ajp_log_overflow(msg, "ajp_msg_get_string"); } msg->pos += (apr_size_t)size; msg->pos++; /* a String in AJP is NULL terminated */ *rvalue = (const char *)(msg->buf + start); return APR_SUCCESS;}/** * Get a Byte array from AJP Message * * @param msg AJP Message to get value from * @param rvalue Pointer where value will be returned * @param rvalueLen Pointer where Byte array len will be returned * @return APR_SUCCESS or error */apr_status_t ajp_msg_get_bytes(ajp_msg_t *msg, apr_byte_t **rvalue, apr_size_t *rvalue_len){ apr_uint16_t size; apr_size_t start; apr_status_t status; status = ajp_msg_get_uint16(msg, &size); /* save the current position */ start = msg->pos; if ((status != APR_SUCCESS) || (size + start > msg->max_size)) { return ajp_log_overflow(msg, "ajp_msg_get_bytes"); } msg->pos += (apr_size_t)size; /* only bytes, no trailer */ *rvalue = msg->buf + start; *rvalue_len = size; return APR_SUCCESS;}/** * Create an AJP Message from pool * * @param pool memory pool to allocate AJP message from * @param size size of the buffer to create * @param rmsg Pointer to newly created AJP message * @return APR_SUCCESS or error */apr_status_t ajp_msg_create(apr_pool_t *pool, apr_size_t size, ajp_msg_t **rmsg){ ajp_msg_t *msg = (ajp_msg_t *)apr_pcalloc(pool, sizeof(ajp_msg_t)); if (!msg) { ap_log_error(APLOG_MARK, APLOG_ERR, 0, NULL, "ajp_msg_create(): can't allocate AJP message memory"); return APR_ENOPOOL; } msg->server_side = 0; msg->buf = (apr_byte_t *)apr_palloc(pool, size); /* XXX: This should never happen * In case if the OS cannont allocate 8K of data * we are in serious trouble * No need to check the alloc return value, cause the * core dump is probably the best solution anyhow. */ if (msg->buf == NULL) { ap_log_error(APLOG_MARK, APLOG_ERR, 0, NULL, "ajp_msg_create(): can't allocate AJP message memory"); return APR_ENOPOOL; } msg->len = 0; msg->header_len = AJP_HEADER_LEN; msg->max_size = size; *rmsg = msg; return APR_SUCCESS;}/** * Recopy an AJP Message to another * * @param smsg source AJP message * @param dmsg destination AJP message * @return APR_SUCCESS or error */apr_status_t ajp_msg_copy(ajp_msg_t *smsg, ajp_msg_t *dmsg){ if (dmsg == NULL) { ap_log_error(APLOG_MARK, APLOG_ERR, 0, NULL, "ajp_msg_copy(): destination msg is null"); return AJP_EINVAL; } if (smsg->len > smsg->max_size) { ap_log_error(APLOG_MARK, APLOG_ERR, 0, NULL, "ajp_msg_copy(): destination buffer too " "small %" APR_SIZE_T_FMT ", max size is %" APR_SIZE_T_FMT, smsg->len, smsg->max_size); return AJP_ETOSMALL; } memcpy(dmsg->buf, smsg->buf, smsg->len); dmsg->len = smsg->len; dmsg->pos = smsg->pos; return APR_SUCCESS;}/** * Serialize in an AJP Message a PING command * * +-----------------------+ * | PING CMD (1 byte) | * +-----------------------+ * * @param smsg AJP message to put serialized message * @return APR_SUCCESS or error */apr_status_t ajp_msg_serialize_ping(ajp_msg_t *msg){ apr_status_t rc; ajp_msg_reset(msg); if ((rc = ajp_msg_append_uint8(msg, CMD_AJP13_PING)) != APR_SUCCESS) return rc; return APR_SUCCESS;}/** * Serialize in an AJP Message a CPING command * * +-----------------------+ * | CPING CMD (1 byte) | * +-----------------------+ * * @param smsg AJP message to put serialized message * @return APR_SUCCESS or error */apr_status_t ajp_msg_serialize_cping(ajp_msg_t *msg){ apr_status_t rc; ajp_msg_reset(msg); if ((rc = ajp_msg_append_uint8(msg, CMD_AJP13_CPING)) != APR_SUCCESS) return rc; return APR_SUCCESS;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -