⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ajp_msg.c

📁 Apache官方在今天放出产品系列2.2的最新版本2.2.11的源码包 最流行的HTTP服务器软件之一
💻 C
📖 第 1 页 / 共 2 页
字号:
 * @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 + -