static void read_getconfig_struct(InputStream * inp, const char * name, void * x) { PortConnection * conn = (PortConnection *) x; if (strcmp(name, "InputStream") == 0) conn->in_stream_id = json_read_alloc_string(inp); else if (strcmp(name, "OutputStream") == 0) conn->out_stream_id = json_read_alloc_string(inp); else json_skip_object(inp); }
static void command_find_by_name_args(char * token, Channel * c, CommandFindByNameArgs * args) { args->ip = 0; json_read_string(&c->inp, args->id, sizeof(args->id)); json_test_char(&c->inp, MARKER_EOA); if (json_peek(&c->inp) != '"' && json_peek(&c->inp) != 'n') { args->ip = (ContextAddress)json_read_uint64(&c->inp); json_test_char(&c->inp, MARKER_EOA); } args->name = json_read_alloc_string(&c->inp); json_test_char(&c->inp, MARKER_EOA); json_test_char(&c->inp, MARKER_EOM); strlcpy(args->token, token, sizeof(args->token)); cache_enter(command_find_by_name_cache_client, c, args, sizeof(CommandFindByNameArgs)); }
static void command_find_in_scope(char * token, Channel * c) { CommandFindInScopeArgs args; json_read_string(&c->inp, args.frame_id, sizeof(args.frame_id)); json_test_char(&c->inp, MARKER_EOA); args.ip = (ContextAddress)json_read_uint64(&c->inp); json_test_char(&c->inp, MARKER_EOA); json_read_string(&c->inp, args.scope_id, sizeof(args.scope_id)); json_test_char(&c->inp, MARKER_EOA); args.name = json_read_alloc_string(&c->inp); json_test_char(&c->inp, MARKER_EOA); json_test_char(&c->inp, MARKER_EOM); strlcpy(args.token, token, sizeof(args.token)); cache_enter(command_find_in_scope_cache_client, c, &args, sizeof(args)); }
static void append_format_parameter(char * type, char * style, char * param) { /* Note: 'param' is UTF-8 encoded JSON text */ char str[64]; if (param != NULL && (*param == '"' || strcmp(type, "number") == 0)) { Trap trap; ByteArrayInputStream buf; InputStream * inp = create_byte_array_input_stream(&buf, param, strlen(param)); if (set_trap(&trap)) { if (*param == '"') { char * x = json_read_alloc_string(inp); if (x != NULL) { char * s = x; while (*s) { realloc_msg_buf(); msg_buf[msg_buf_len++] = *s++; } loc_free(x); } param = NULL; } else { double x = json_read_double(inp); if (strcmp(style, "percent") == 0) { snprintf(str, sizeof(str), "%ld%%", (long)(x * 100)); } else if (strcmp(style, "integer") == 0) { snprintf(str, sizeof(str), "%ld", (long)x); } else { snprintf(str, sizeof(str), "%g", x); } param = str; } clear_trap(&trap); } } if (param != NULL) { while (*param) { realloc_msg_buf(); msg_buf[msg_buf_len++] = *param++; } } }
static void read_disassembly_params(InputStream * inp, const char * name, void * x) { DisassembleCmdArgs * args = (DisassembleCmdArgs *) x; if (strcmp(name, "ISA") == 0) { args->isa = json_read_alloc_string(inp); } else if (strcmp(name, "Simplified") == 0) { args->simplified = json_read_boolean(inp); } else if (strcmp(name, "Pseudo") == 0) { args->pseudo_instr = json_read_boolean(inp); } else if (strcmp(name, "OpcodeValue") == 0) { args->opcode_value =json_read_boolean(inp); } else { json_skip_object(inp); } }
static void port_server_cmd_get_capabilities(char * token, Channel * c) { OutputStream * out = &c->out; int err = 0; char * id; id = json_read_alloc_string(&c->inp); json_test_char(&c->inp, MARKER_EOA); json_test_char(&c->inp, MARKER_EOM); loc_free(id); write_stringz(out, "R"); write_stringz(out, token); write_errno(out, err); if (err) { write_stringz(&c->out, "null"); } else { write_stream(out, '{'); write_stream(out, '}'); write_stream(out, 0); } write_stream(out, MARKER_EOM); }
static PortServer * create_port_server(Channel * c, PortRedirectionInfo * redir) { int sock; struct sockaddr_in addr; PortAttribute * attr = redir->attrs; #if defined(_WRS_KERNEL) int addrlen; #else socklen_t addrlen; #endif u_short port_number; PortServer * server = NULL; int is_udp = 0; /* do we use a server UDP -or TCP- port? */ while (attr != NULL) { if (strcmp(attr->name, "Config") == 0) { ByteArrayInputStream buf; char * config; InputStream * inp = create_byte_array_input_stream(&buf, attr->value, strlen(attr->value)); config = json_read_alloc_string(inp); if (strncasecmp(config, "udp:", strlen("udp:")) == 0) { is_udp = 1; } loc_free(config); break; } attr = attr->next; } memset((void *) &addr, 0, sizeof(addr)); addr.sin_family = AF_INET; addr.sin_addr.s_addr = htonl(INADDR_ANY); addr.sin_port = (u_short) htons(redir->local_port); sock = -1; if (is_udp) sock = socket(AF_INET, SOCK_DGRAM, 0); else if ((sock = socket(AF_INET, SOCK_STREAM, 0)) >= 0) set_socket_options(sock); /* set socket options */ if (sock == -1) return NULL ; if (bind(sock, (struct sockaddr *) &addr, sizeof(addr)) < 0) { if (redir->local_port != 0) { memset((void *) &addr, 0, sizeof(addr)); addr.sin_family = AF_INET; addr.sin_addr.s_addr = htonl(INADDR_ANY); addr.sin_port = (u_short) 0; if (bind(sock, (struct sockaddr *) &addr, sizeof(addr)) < 0) { perror ("bind"); goto error; } } else { perror("bind"); goto error; } } if (!is_udp) { if (listen(sock, 16) != 0) goto error; } /* Get port property in case the default port could not be used or * the client specified a port that the system converts to a * dynamic port number. */ addrlen = sizeof addr; if (getsockname(sock, (struct sockaddr *) &addr, &addrlen) < 0) goto error; port_number = (u_short) ntohs(addr.sin_port); server = loc_alloc_zero(sizeof(PortServer)); server->sock = sock; server->is_udp = is_udp; #if defined(SOCK_MAXADDRLEN) server->addr_len = SOCK_MAXADDRLEN; #else server->addr_len = 0x1000; #endif server->addr_buf = (struct sockaddr *)loc_alloc(server->addr_len); server->local_port = port_number; if (!server->is_udp) { server->accept_in_progress = 1; server->accreq.done = port_server_accept_done; server->accreq.client_data = server; server->accreq.type = AsyncReqAccept; server->accreq.u.acc.sock = sock; server->accreq.u.acc.addr = server->addr_buf; server->accreq.u.acc.addrlen = server->addr_len; async_req_post(&server->accreq); } else { /* For UDP, automatically connect to the port since there is no * connection request we can detect. */ redir->auto_connect = 1; } list_add_last(&server->link, &server_list); channel_lock_with_msg(server->channel = c, channel_lock_svr_msg); snprintf (server->id, sizeof(server->id), "%" PRIu64, port_server_id++); return server; error: closesocket(sock); loc_free(server); return NULL ; }
static PortServer * create_server(Channel * c, PortAttribute * attrs) { int sock = -1; struct sockaddr_in addr; PortAttribute * attr = attrs; #if defined(_WRS_KERNEL) int addrlen; #else socklen_t addrlen; #endif u_short port_number; PortServer * server = NULL; int is_udp = 0; /* do we use a server UDP -or TCP- port? */ char * port_config = NULL; int error = 0; int auto_connect = 0; uint64_t auto_connect_period = 0; unsigned int local_port = 0; while (attr != NULL) { if (strcmp(attr->name, "Port") == 0) { ByteArrayInputStream buf; InputStream * inp = create_byte_array_input_stream(&buf, attr->value, strlen(attr->value)); port_config = json_read_alloc_string(inp); if (strncasecmp(port_config, "udp:", strlen("udp:")) == 0) { is_udp = 1; } } else if (strcmp(attr->name, "AutoConnect") == 0) { ByteArrayInputStream buf; InputStream * inp = create_byte_array_input_stream(&buf, attr->value, strlen(attr->value)); auto_connect = json_read_boolean(inp); } else if (strcmp(attr->name, "AutoConnectPeriod") == 0) { ByteArrayInputStream buf; InputStream * inp = create_byte_array_input_stream(&buf, attr->value, strlen(attr->value)); auto_connect_period = json_read_ulong(inp); } else if (strcmp(attr->name, "LocalPort") == 0) { ByteArrayInputStream buf; InputStream * inp = create_byte_array_input_stream(&buf, attr->value, strlen(attr->value)); local_port = (unsigned int) json_read_uint64(inp); } attr = attr->next; } if (port_config == NULL) { error = set_errno(ERR_OTHER, "No port configuration is specified"); } if (error == 0) { loc_free(port_config); memset((void *) &addr, 0, sizeof(addr)); addr.sin_family = AF_INET; addr.sin_addr.s_addr = htonl(INADDR_ANY); addr.sin_port = (u_short) htons(local_port); if (is_udp) sock = socket(AF_INET, SOCK_DGRAM, 0); else if ((sock = socket(AF_INET, SOCK_STREAM, 0)) >= 0) set_socket_options(sock); /* set socket options */ if (sock == -1) error = errno; } if (error == 0) { if (bind(sock, (struct sockaddr *) &addr, sizeof(addr)) < 0) { error = errno; } } if (error == 0 && !is_udp) { if (listen(sock, 16) != 0) error = errno; } if (error == 0) { /* Get port property in case the default port could not be used or * the client specified a port that the system converts to a * dynamic port number. */ addrlen = sizeof addr; if (getsockname(sock, (struct sockaddr *) &addr, &addrlen) < 0) error = errno; } if (error == 0) { port_number = (u_short) ntohs(addr.sin_port); server = (PortServer *)loc_alloc_zero(sizeof(PortServer)); server->sock = sock; server->is_udp = is_udp; #if defined(SOCK_MAXADDRLEN) server->addr_len = SOCK_MAXADDRLEN; #else server->addr_len = 0x1000; #endif server->addr_buf = (struct sockaddr *)loc_alloc(server->addr_len); server->local_port = port_number; if (!server->is_udp) { server->accept_in_progress = 1; server->auto_connect = auto_connect; server->accreq.done = port_server_accept_done; server->accreq.client_data = server; server->accreq.type = AsyncReqAccept; server->accreq.u.acc.sock = sock; server->accreq.u.acc.addr = server->addr_buf; server->accreq.u.acc.addrlen = server->addr_len; async_req_post(&server->accreq); } else { /* For UDP, automatically connect to the port since there is no * connection request we can detect. */ server->auto_connect = 1; } server->auto_connect_period = auto_connect_period; list_add_last(&server->link, &server_list); channel_lock_with_msg(server->channel = c, channel_lock_svr_msg); snprintf (server->id, sizeof(server->id), "PS%" PRIu64, port_server_id++); server->attrs = attrs; } if (error == 0) return server; else { if (sock != -1) closesocket(sock); loc_free(server); return NULL ; } }