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; }
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; }
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; }
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; }