int process_subprocess_in_process(struct sol_flow_node *node, void *data, uint16_t port, uint16_t conn_id, const struct sol_flow_packet *packet) { struct subprocess_data *mdata = data; struct sol_blob *blob; struct write_data *w; int ret; SOL_NULL_CHECK(mdata->fork_run, -EINVAL); ret = sol_flow_packet_get_blob(packet, &blob); SOL_INT_CHECK(ret, < 0, ret); w = sol_vector_append(&mdata->write_data); SOL_NULL_CHECK(w, -ENOMEM); w->offset = 0; w->blob = sol_blob_ref(blob); if (mdata->write_data.len > 1) return 0; mdata->watches.out = sol_fd_add(mdata->pipes.out[1], SOL_FD_FLAGS_OUT | SOL_FD_FLAGS_ERR, on_write, mdata); if (!mdata->watches.out) { sol_blob_unref(w->blob); sol_vector_del_last(&mdata->write_data); return -1; } return 0; }
SOL_API void sol_blob_set_parent(struct sol_blob *blob, struct sol_blob *parent) { SOL_BLOB_CHECK(blob); if (parent) { SOL_BLOB_CHECK(parent); sol_blob_ref(parent); } if (blob->parent) sol_blob_unref(blob->parent); blob->parent = parent; }
SOL_API struct sol_lwm2m_bootstrap_server * sol_lwm2m_bootstrap_server_new(uint16_t port, const char **known_clients, uint16_t num_sec_modes, ...) { struct sol_lwm2m_bootstrap_server *server; struct sol_network_link_addr servaddr = { .family = SOL_NETWORK_FAMILY_INET6, .port = port }; int r; struct sol_lwm2m_security_psk **known_psks = NULL, *cli_psk; struct sol_lwm2m_security_rpk *my_rpk = NULL; struct sol_blob **known_pub_keys = NULL, *cli_pub_key; enum sol_lwm2m_security_mode *sec_modes; enum sol_socket_dtls_cipher *cipher_suites; uint16_t i, j; va_list ap; SOL_LOG_INTERNAL_INIT_ONCE; SOL_NULL_CHECK(known_clients, NULL); SOL_INT_CHECK(num_sec_modes, == 0, NULL); va_start(ap, num_sec_modes); cipher_suites = calloc(num_sec_modes, sizeof(enum sol_socket_dtls_cipher)); SOL_NULL_CHECK_GOTO(cipher_suites, err_va_list); sec_modes = calloc(num_sec_modes, sizeof(enum sol_lwm2m_security_mode)); SOL_NULL_CHECK_GOTO(sec_modes, err_cipher_suites); for (i = 0; i < num_sec_modes; i++) { sec_modes[i] = va_arg(ap, enum sol_lwm2m_security_mode); SOL_EXP_CHECK_GOTO(sec_mode_is_repeated(sec_modes[i], sec_modes, i), err_sec_modes); switch (sec_modes[i]) { case SOL_LWM2M_SECURITY_MODE_PRE_SHARED_KEY: known_psks = va_arg(ap, struct sol_lwm2m_security_psk **); SOL_NULL_CHECK_GOTO(known_psks, err_sec_modes); cipher_suites[i] = SOL_SOCKET_DTLS_CIPHER_PSK_AES128_CCM8; break; case SOL_LWM2M_SECURITY_MODE_RAW_PUBLIC_KEY: my_rpk = va_arg(ap, struct sol_lwm2m_security_rpk *); SOL_NULL_CHECK_GOTO(my_rpk, err_sec_modes); known_pub_keys = va_arg(ap, struct sol_blob **); SOL_NULL_CHECK_GOTO(known_pub_keys, err_sec_modes); cipher_suites[i] = SOL_SOCKET_DTLS_CIPHER_ECDHE_ECDSA_AES128_CCM8; break; case SOL_LWM2M_SECURITY_MODE_CERTIFICATE: SOL_WRN("Certificate security mode is not supported yet."); goto err_sec_modes; case SOL_LWM2M_SECURITY_MODE_NO_SEC: SOL_WRN("Bootstrap Server MUST use DTLS."); goto err_sec_modes; default: SOL_WRN("Unknown DTLS Security Mode: %d", sec_modes[i]); goto err_sec_modes; } } server = calloc(1, sizeof(struct sol_lwm2m_bootstrap_server)); SOL_NULL_CHECK_GOTO(server, err_sec_modes); //LWM2M Bootstrap Server MUST always use DTLS for (i = 0; i < num_sec_modes; i++) { if (sec_modes[i] == SOL_LWM2M_SECURITY_MODE_PRE_SHARED_KEY) { sol_vector_init(&server->known_psks, sizeof(sol_lwm2m_security_psk)); for (j = 0; known_psks[j]; j++) { cli_psk = sol_vector_append(&server->known_psks); SOL_NULL_CHECK_GOTO(cli_psk, err_copy_keys); cli_psk->id = sol_blob_ref(known_psks[j]->id); cli_psk->key = sol_blob_ref(known_psks[j]->key); } } else if (sec_modes[i] == SOL_LWM2M_SECURITY_MODE_RAW_PUBLIC_KEY) { sol_ptr_vector_init(&server->known_pub_keys); for (j = 0; known_pub_keys[j]; j++) { r = sol_ptr_vector_append(&server->known_pub_keys, sol_blob_ref(known_pub_keys[j])); SOL_INT_CHECK_GOTO(r, < 0, err_copy_keys); } server->rpk_pair.private_key = sol_blob_ref(my_rpk->private_key); server->rpk_pair.public_key = sol_blob_ref(my_rpk->public_key); } }