return 1;
}
+int parse_int8(struct msg_buf_t *msg, uint8_t *val)
+{
+ parse_deb("size = %d\n", get_avail_msg_size(msg));
+ if (get_avail_msg_size(msg) < sizeof(*val))
+ return 0;
+ *val = *(uint8_t *)msg->cur_pos;
+ msg->cur_pos += sizeof(uint8_t);
+
+ parse_deb("<%d><0x%08X>\n", *val, *val);
+ return 1;
+}
+
+
+
int parse_int32(struct msg_buf_t *msg, uint32_t *val)
{
parse_deb("size = %d\n", get_avail_msg_size(msg));
struct us_func_inst_plane_t {
+ //format
+ //name | type | len | info
+ //------------------------------------------
+ //func_addr | uint64 | 8 |
+ //args | string | len(args) |end with '\0'
+ //ret_type | char | 1 |
uint64_t func_addr;
char args[0];
};
int sendACKToHost(enum HostMessageT resp, enum ErrorCode err_code,
char *payload, int payload_size);
+int parse_int8(struct msg_buf_t *msg, uint8_t *val);
int parse_int32(struct msg_buf_t *msg, uint32_t *val);
int parse_int64(struct msg_buf_t *msg, uint64_t *val);
int parse_string(struct msg_buf_t *msg, char **str);
return 1;
}
+int check_us_inst_func_ret_type(char ret_type)
+{
+ if (strchr(args_avail, (int)ret_type) == NULL){
+ LOGE("wrong ret type <%c> <0x%02X>\n", (int)ret_type, (char)ret_type);
+ return 0;
+ }
+ return 1;
+}
+
int check_lib_inst_count(uint32_t lib_count)
{
int res = 1;
//----------------------------------- parse -----------------------------------
int parse_us_inst_func(struct msg_buf_t *msg, struct probe_list_t **dest)
{
+ //probe format
+ //name | type | len | info
+ //------------------------------------------
+ //func_addr | uint64 | 8 |
+ //args | string | len(args) |end with '\0'
+ //ret_type | char | 1 |
+
uint32_t size = 0;
struct us_func_inst_plane_t *func;
+ int par_count = 0;
+ char *ret_type = NULL;
- size = sizeof(*func) + strlen(msg->cur_pos + sizeof(func->func_addr) ) + 1;
+ par_count = strlen(msg->cur_pos + sizeof(func->func_addr));
+ size = sizeof(*func) + par_count + 1 +
+ sizeof(char) /* sizeof(char) for ret_type */;
func = malloc(size);
if (!parse_int64(msg, &(func->func_addr))) {
LOGE("func addr parsing error\n");
- free(func);
- return 0;
+ goto err_ret;
}
if (!parse_string_no_alloc(msg, func->args) ||
- !check_us_inst_func_args(func->args))
+ !check_us_inst_func_args(func->args))
{
LOGE("args format parsing error\n");
- free(func);
- return 0;
+ goto err_ret;
+ }
+
+ //func->args type is char[0]
+ //and we need put ret_type after func->args
+ ret_type = func->args + par_count + 1;
+ if (!parse_int8(msg, (uint8_t *)ret_type) ||
+ !check_us_inst_func_ret_type(*ret_type))
+ {
+ LOGE("return type parsing error\n");
+ goto err_ret;
}
*dest = new_probe();
if (*dest == NULL) {
LOGE("alloc new_probe error\n");
- free(func);
- return 0;
+ goto err_ret;
}
(*dest)->size = size;
(*dest)->func = func;
return 1;
+err_ret:
+ free(func);
+ return 0;
}
int parse_func_inst_list(struct msg_buf_t *msg,