Пример #1
0
SOL_API void
sol_oic_resource_unref(struct sol_oic_resource *r)
{
    SOL_NULL_CHECK(r);
    OIC_RESOURCE_CHECK_API(r);

    r->refcnt--;
    if (!r->refcnt) {
        struct sol_str_slice *slice;
        uint16_t idx;

        free((char *)r->href.data);
        free((char *)r->device_id.data);

        SOL_VECTOR_FOREACH_IDX (&r->types, slice, idx)
            free((char *)slice->data);
        sol_vector_clear(&r->types);

        SOL_VECTOR_FOREACH_IDX (&r->interfaces, slice, idx)
            free((char *)slice->data);
        sol_vector_clear(&r->interfaces);

        free(r);
    }
}
Пример #2
0
static void
found_resource(struct sol_oic_client *cli, struct sol_oic_resource *res, void *data)
{
    const char *query = NULL;
    struct sol_str_slice *slice;
    uint16_t idx;
    char addr[SOL_INET_ADDR_STRLEN];

    if (!sol_network_addr_to_str(&res->addr, addr, sizeof(addr))) {
        SOL_WRN("Could not convert network address to string");
        return;
    }

    printf("Found resource: coap://%s%.*s <observable: %s>\n", addr,
        (int)res->href.len, res->href.data, res->observable ? "yes" : "no");

    printf("Resource types:\n");
    SOL_VECTOR_FOREACH_IDX (&res->types, slice, idx)
        printf("\t\t%.*s\n", (int)slice->len, slice->data);

    printf("Resource interfaces:\n");
    SOL_VECTOR_FOREACH_IDX (&res->interfaces, slice, idx)
        printf("\t\t%.*s\n", (int)slice->len, slice->data);

    printf("Issuing GET %.*s on resource...\n", (int)res->href.len, res->href.data);
    sol_oic_client_resource_request(cli, res, SOL_COAP_METHOD_GET, NULL, 0,
        got_get_response, data);

    printf("\n");
}
Пример #3
0
static bool
on_write(void *data, int fd, uint32_t active_flags)
{
    struct subprocess_data *mdata = data;
    int err = 0;

    if (active_flags & SOL_FD_FLAGS_ERR)
        err = -EBADF;
    else
        err = out_write(mdata);

    if (err < 0) {
        uint16_t i;
        struct write_data *w;

        SOL_VECTOR_FOREACH_IDX (&mdata->write_data, w, i)
            sol_blob_unref(w->blob);
        sol_vector_clear(&mdata->write_data);
    }

    if (mdata->write_data.len == 0) {
        mdata->watches.out = NULL;
        return false;
    }

    return true;
}
Пример #4
0
void
process_subprocess_close(struct sol_flow_node *node, void *data)
{
    struct subprocess_data *mdata = data;

    if (mdata->fork_run)
        sol_platform_linux_fork_run_stop(mdata->fork_run);

    if (mdata->watches.in)
        sol_fd_del(mdata->watches.in);
    if (mdata->watches.err)
        sol_fd_del(mdata->watches.err);
    if (mdata->watches.out) {
        struct write_data *w;
        uint16_t i;

        sol_fd_del(mdata->watches.out);
        SOL_VECTOR_FOREACH_IDX (&mdata->write_data, w, i)
            sol_blob_unref(w->blob);
        sol_vector_clear(&mdata->write_data);
    }

    close(mdata->pipes.in[0]);
    close(mdata->pipes.in[1]);
    close(mdata->pipes.err[0]);
    close(mdata->pipes.err[1]);
    close(mdata->pipes.out[0]);
    close(mdata->pipes.out[1]);

    free(mdata->command);
}
Пример #5
0
void
sml_matrix_clear(struct sml_matrix *m)
{
    uint16_t i;
    struct sol_vector *line;

    SOL_VECTOR_FOREACH_IDX (&m->data, line, i)
        sol_vector_clear(line);

    sol_vector_clear(&m->data);
}
Пример #6
0
static void
http_composed_client_type_dispose(struct sol_flow_node_type *type)
{
    struct http_composed_client_type *self = (struct http_composed_client_type *)type;
    struct http_composed_client_port_out *port_out;
    struct http_composed_client_port_in *port_in;
    uint16_t i;

#ifdef SOL_FLOW_NODE_TYPE_DESCRIPTION_ENABLED
    struct sol_flow_node_type_description *desc;

    desc = (struct sol_flow_node_type_description *)self->base.description;
    if (desc) {
        if (desc->ports_in) {
            for (i = 0; i < self->ports_in.len; i++)
                free((struct sol_flow_port_description *)desc->ports_in[i]);
            free((struct sol_flow_port_description **)desc->ports_in);
        }
        if (desc->ports_out) {
            for (i = 0; i < self->ports_out.len; i++)
                free((struct sol_flow_port_description *)desc->ports_out[i]);
            free((struct sol_flow_port_description **)desc->ports_out);
        }
        free(desc);
    }
#endif

    SOL_VECTOR_FOREACH_IDX (&self->ports_in, port_in, i)
        free(port_in->name);
    SOL_VECTOR_FOREACH_IDX (&self->ports_out, port_out, i)
        free(port_out->name);

    sol_vector_clear(&self->ports_in);
    sol_vector_clear(&self->ports_out);
    free(self);
}
Пример #7
0
static int
network_up_start(const struct sol_platform_linux_micro_module *mod, const char *service)
{
    uint16_t idx;
    struct sol_network_link *itr;
    const struct sol_vector *links;

    links = sol_network_get_available_links();
    if (!links)
        return 0;

    SOL_VECTOR_FOREACH_IDX (links, itr, idx)
        sol_network_link_up(itr->index);

    return 0;
}
Пример #8
0
static void
on_fork_exit(void *data, uint64_t pid, int status)
{
    struct subprocess_data *mdata = data;

    mdata->fork_run = NULL;
    if (mdata->watches.in)
        sol_fd_del(mdata->watches.in);
    if (mdata->watches.err)
        sol_fd_del(mdata->watches.err);
    if (mdata->watches.out) {
        struct write_data *w;
        uint16_t i;
        sol_fd_del(mdata->watches.out);
        SOL_VECTOR_FOREACH_IDX (&mdata->write_data, w, i)
            sol_blob_unref(w->blob);
        sol_vector_clear(&mdata->write_data);
    }

    mdata->watches.in = NULL;
    mdata->watches.err = NULL;
    mdata->watches.out = NULL;
    sol_flow_send_irange_value_packet(mdata->node, SOL_FLOW_NODE_TYPE_PROCESS_SUBPROCESS__OUT__STATUS, status);
}