Exemple #1
0
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));
}
Exemple #2
0
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));
    }
}
Exemple #3
0
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));
}
Exemple #4
0
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 */
}
Exemple #5
0
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;
}