Esempio n. 1
0
struct mile_packet *pre_parse_packet(char *buf, uint32_t buf_len,
		uint32_t *parsed_len) {
	struct mile_packet *packet = NULL;
	if (buf_len < 4)
		return NULL;

	uint32_t packet_len = convert_int32(*(uint32_t *) buf);
	if (buf_len < packet_len)
		return NULL;

	// TODO: remove args.
	packet = init_mile_packet(0, NULL);
	if (NULL == packet)
		return NULL;

	packet->rbuf->array_border = 0;
	packet->rbuf->rpos = 0;
	packet->rbuf->wpos = 0;
	packet->rbuf->data_len = packet_len - 4;
	packet->rbuf->data = (uint8_t *) malloc(packet_len - 4);
	if (NULL == packet->rbuf) {
		log_error( "malloc failed, errno %d", errno);
		destroy_mile_packet(packet);
		return NULL;
	}

	memcpy(packet->rbuf->data, buf + 4, packet_len - 4);
	*parsed_len = packet_len;

	print_data_buffer(packet->rbuf);
	packet->message_type = read_pos_int16(packet->rbuf, 2);

	return packet;
}
Esempio n. 2
0
int32_t get_message_count(struct multi_mile_packet *multi_packet) {
	int32_t result;
	int32_t rec_len;
	int32_t sql_count = 0;
	int32_t ret = 0;

	log_debug("从merge server接收查询命令!");

	// get count of sql request in this packet
	rec_len = 4;
	while (rec_len > 0) {
		result = recv(multi_packet->socket_fd,
				(uint8_t*) (&sql_count) + 4 - rec_len, rec_len, 0);
		if (result == 0) {
			return ERROR_DATA_RECEIVE;
		}
		if (result == -1) {
			if (errno == EAGAIN || errno == EWOULDBLOCK) {
				continue;
			}
			return ERROR_DATA_RECEIVE;
		}
		rec_len -= result;
	}

	sql_count = convert_int32(sql_count);

	if (sql_count <= 0) {
		log_error("从merge server接收到 %d 字节数据, 可能是错误的数据报文!", sql_count);
		return ERROR_DATA_RECEIVE;
	}

	multi_packet->sql_count = sql_count;

	return ret;

}
Esempio n. 3
0
int
vfprintf(FILE *stream, const char *fmt, va_list ap)
{
    if(!stream || ISUNSET(stream->status,_FST_OPEN))
        return -1;
    __check_buf(stream);
    int tot = 0;
    char buf[INTERNAL_BUF];
    char *pbuf;
    uint32_t arg_u32;
    if(!stream || !fmt) {
        errno = EINVAL;
        return -1;
    }

    for (; *fmt; fmt++) {
        pbuf = 0;
        switch (*fmt) {
            case '%': {
                fmt++;
                int field_width = 0;
                int field_precision = -1;
                int *val = &field_width;
                char separator = ' ';
                bool pad_to_right = TRUE;
                bool done = FALSE;
                // zjedz flagi
                while(!done) {
                    switch (*fmt) {
                    case '-':
                        pad_to_right = FALSE;
                        fmt++;
                        break;
                    case '*':
                        *val = va_arg(ap, int);
                        fmt++;
                        if(*val<0) {
                            *val=-*val;
                            pad_to_right = FALSE; //?
                        }
                        break;
                    case '.':
                        val = &field_precision;
                        *val = 0;
                        fmt++;
                        break;
                    case '0':
                        if(*val == 0)
                            separator = '0';
                        else
                            *val *= 10;
                        fmt++;
                        break;
                    case '1':
                    case '2':
                    case '3':
                    case '4':
                    case '5':
                    case '6':
                    case '7':
                    case '8':
                    case '9':
                        *val = 10*(*val) + (*(fmt++) - '0');
                        break;
                    default:
                        done=TRUE;
                        break;
                    }
                }
                if(!pad_to_right)
                    separator = ' ';
                if(*fmt == 'l') //long
                    fmt++;
                // flagi zjedzone - do roboty
                switch (*fmt) {
                    case '%':
                        __put_char(stream, '%');
                        tot++;
                        break;
                    case 'u':
                        arg_u32 = va_arg(ap, uint32_t);
                        pbuf = convert_uint32(buf, arg_u32, 10);
                        break;
                    case 'd':
                    case 'i':
                        arg_u32 = va_arg(ap, int32_t);
                        pbuf = convert_int32(buf, (int32_t)arg_u32, 10);
                        break;
                    case 'x':
                        arg_u32 = va_arg(ap, uint32_t);
                        pbuf = convert_uint32(buf, arg_u32, 16);
                        break;
                    case 'o':
                        arg_u32 = va_arg(ap, uint32_t);
                        pbuf = convert_uint32(buf, arg_u32, 8);
                        break;
                    case 'b':
                        arg_u32 = va_arg(ap, uint32_t);
                        pbuf = convert_uint32(buf, arg_u32, 2);
                        break;
                    case 'p':
                        arg_u32 = va_arg(ap, uintptr_t);
                        pbuf = convert_uint32(buf, arg_u32, 16);
                        *(--pbuf) = 'x';
                        *(--pbuf) = '0';
                        break;
                    case 's':
                        pbuf = va_arg(ap, char *);
                        break;
                    case 'c':
                        __put_char(stream, (unsigned char)va_arg(ap, int));
                        tot++;
                        break;
                }
                if (pbuf)
                    tot+=from_string(stream, pbuf, separator, field_width,
                                     (*fmt=='s')?field_precision:-1,
                                      pad_to_right);
                break;
            }

            default:
                __put_char(stream, *fmt);
                break;
        }
    }

    return tot;
}
Esempio n. 4
0
int32_t read_message_from_mergeserver(struct mile_packet *packet) {
	if (NULL == packet) {
		return ERROR_DATA_RECEIVE;
	}
	struct data_buffer* rbuf = packet->rbuf;
	int32_t result;
	int32_t rec_len;
	int32_t data_len;

	log_debug("从merge server接收查询命令!");

	//获取数据包的长度
	rec_len = 4;
	while (rec_len > 0) {
		result = recv(packet->socket_fd, (uint8_t*) (&data_len) + 4 - rec_len,
				rec_len, 0);
		if (result == 0) {
			return ERROR_DATA_RECEIVE;
		}
		if (result == -1) {
			if (errno == EAGAIN || errno == EWOULDBLOCK) {
				continue;
			}
			return ERROR_DATA_RECEIVE;
		}
		rec_len -= result;
	}

	data_len = convert_int32(data_len);

	if (data_len <= 0) {
		log_error("从merge server接收到 %d 字节数据, 可能是错误的数据报文!", data_len);
		return ERROR_DATA_RECEIVE;
	} else {
		log_debug("从merge server接收到 %d 字节数据", data_len);
	}

	data_len -= 4;
	rec_len = data_len;

	rbuf->array_border = 0;
	rbuf->rpos = 0;
	rbuf->wpos = 0;
	//在这里向系统申请内存, 一定要注意释放
	databuf_resize(rbuf, data_len);
	rbuf->data_len = data_len;

	if (rbuf->data == NULL) {
		log_error("接收消息时申请内存失败, 申请内存长度 %d", data_len);
		return ERROR_NOT_ENOUGH_MEMORY;
	}

	while (rec_len > 0) {
		result = recv(packet->socket_fd, rbuf->data + data_len - rec_len,
				rec_len, 0);

		if (result == 0) {
			return ERROR_DATA_RECEIVE;
		}
		if (result == -1) {
			if (errno == EAGAIN || errno == EWOULDBLOCK) {
				log_warn("在接收数据时遇到EAGAIN错误!");
				continue;
			}
			return ERROR_DATA_RECEIVE;
		}
		rec_len -= result;
	}

	packet->message_type = read_pos_int16(rbuf, 2);
	return MILE_RETURN_SUCCESS;
}