static int platform_service_open(struct sol_flow_node *node, void *data, const struct sol_flow_node_options *options) { struct platform_service_data *mdata = data; const struct sol_flow_node_type_platform_service_options *opts; SOL_NULL_CHECK_MSG(options, -1, "Platform Service Node: Options not found."); opts = (const struct sol_flow_node_type_platform_service_options *)options; SOL_FLOW_NODE_OPTIONS_SUB_API_CHECK(options, SOL_FLOW_NODE_TYPE_PLATFORM_SERVICE_OPTIONS_API_VERSION, -EINVAL); mdata->node = node; if (!opts->name) return 0; mdata->service_name = strdup(opts->name); SOL_NULL_CHECK(mdata->service_name, -ENOMEM); sol_platform_add_service_monitor(on_service_state_changed, mdata->service_name, mdata); mdata->state = sol_platform_get_service_state(mdata->service_name); return sol_flow_send_boolean_packet(node, SOL_FLOW_NODE_TYPE_PLATFORM_SERVICE__OUT__ACTIVE, (mdata->state == SOL_PLATFORM_SERVICE_STATE_ACTIVE)); }
static void startup(void) { const char **itr; int pin = parse_cmdline_pin(); if (pin < 0) pin = parse_kcmdline_pin(); if (pin >= 0) { struct sol_gpio_config cfg = { .api_version = SOL_GPIO_CONFIG_API_VERSION, .dir = SOL_GPIO_DIR_OUT, }; gpio = sol_gpio_open(pin, &cfg); if (gpio) printf("blinking led on gpio pin=%d\n", pin); else fprintf(stderr, "failed to open gpio pin=%d for writing.\n", pin); } timeout = sol_timeout_add(1000, on_timeout, NULL); sol_platform_add_state_monitor(on_platform_state_change, NULL); printf("platform state: %d\n", sol_platform_get_state()); for (itr = services; *itr != NULL; itr++) { sol_platform_add_service_monitor(on_service_change, *itr, NULL); printf("service %s state: %d\n", *itr, sol_platform_get_service_state(*itr)); } }
static int platform_service_name_process(struct sol_flow_node *node, void *data, uint16_t port, uint16_t conn_id, const struct sol_flow_packet *packet) { struct platform_service_data *mdata = data; const char *name; int r; r = sol_flow_packet_get_string(packet, &name); SOL_INT_CHECK(r, < 0, r); if (mdata->service_name) { sol_platform_del_service_monitor(on_service_state_changed, mdata->service_name, mdata); } r = sol_util_replace_str_if_changed(&mdata->service_name, name); SOL_INT_CHECK(r, < 0, r); sol_platform_add_service_monitor(on_service_state_changed, mdata->service_name, mdata); mdata->state = sol_platform_get_service_state(mdata->service_name); return sol_flow_send_boolean_packet(node, SOL_FLOW_NODE_TYPE_PLATFORM_SERVICE__OUT__ACTIVE, (mdata->state == SOL_PLATFORM_SERVICE_STATE_ACTIVE)); }
static int machine_id_start(const struct sol_platform_linux_micro_module *mod, const char *service) { int ret = 0; static const char *FSTAB = "fstab"; enum sol_platform_service_state state = SOL_PLATFORM_SERVICE_STATE_ACTIVE; name = service; if (done) return 0; /* If fstab is present and functional, wait for it to go up for * this to run. If it's not, try to do machine-id's business * nonetheless */ ret = sol_platform_add_service_monitor (on_fstab_service_state_changed, FSTAB, mod); if (ret < 0) return run_do(); ret = sol_platform_start_service(FSTAB); if (ret < 0) { sol_platform_del_service_monitor (on_fstab_service_state_changed, FSTAB, NULL); return run_do(); } state = sol_platform_get_service_state(FSTAB); if (state == SOL_PLATFORM_SERVICE_STATE_ACTIVE) return run_do(); return 0; /* wait for dep to activate */ }
static int bluetooth_start(const struct sol_platform_linux_micro_module *mod, const char *service) { int ret = 0; static const char *DBUS = "dbus"; enum sol_platform_service_state state = SOL_PLATFORM_SERVICE_STATE_ACTIVE; name = service; if (fork_run) return 0; ret = sol_platform_add_service_monitor (on_dbus_service_state_changed, DBUS, mod); SOL_INT_CHECK_GOTO(ret, < 0, err); ret = sol_platform_start_service(DBUS); if (ret < 0) { SOL_WRN("D-Bus service is a dependency for bluetooth and could" " not be started"); sol_platform_del_service_monitor (on_dbus_service_state_changed, DBUS, NULL); goto err; } state = sol_platform_get_service_state(DBUS); if (state == SOL_PLATFORM_SERVICE_STATE_ACTIVE) return fork_run_do(); return 0; /* wait for dep to activate */ err: sol_platform_linux_micro_inform_service_state (service, SOL_PLATFORM_SERVICE_STATE_FAILED); return ret; }