Changeset 13318d1 in mainline for uspace/lib/hound/src/protocol.c


Ignore:
Timestamp:
2013-03-24T03:44:11Z (11 years ago)
Author:
Jan Vesely <jano.vesely@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
7294b5b
Parents:
fd7c98b
Message:

libhound: Implement client side connection controls

File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/lib/hound/src/protocol.c

    rfd7c98b r13318d1  
    4949        IPC_M_HOUND_CONTEXT_REGISTER = IPC_FIRST_USER_METHOD,
    5050        IPC_M_HOUND_CONTEXT_UNREGISTER,
     51        IPC_M_HOUND_GET_LIST,
     52        IPC_M_HOUND_CONNECT,
     53        IPC_M_HOUND_DISCONNECT,
    5154        IPC_M_HOUND_STREAM_ENTER,
    5255        IPC_M_HOUND_STREAM_EXIT,
     
    99102        async_exchange_end(exch);
    100103        return ret;
     104}
     105
     106int hound_service_get_list(hound_sess_t *sess, const char ***ids, size_t *count,
     107    int flags, const char *connection)
     108{
     109        assert(sess);
     110        assert(ids);
     111        assert(count);
     112
     113        if (connection && !(flags & HOUND_CONNECTED))
     114                return EINVAL;
     115
     116        async_exch_t *exch = async_exchange_begin(sess);
     117        if (!exch)
     118                return ENOMEM;
     119
     120        ipc_call_t res_call;
     121        aid_t mid = async_send_3(exch, IPC_M_HOUND_GET_LIST, flags, *count,
     122            (bool)connection, &res_call);
     123
     124        int ret = EOK;
     125        if (mid && connection)
     126                ret = async_data_write_start(exch, connection,
     127                    str_size(connection));
     128
     129        if (ret == EOK)
     130                async_wait_for(mid, (sysarg_t*)&ret);
     131
     132        if (ret != EOK) {
     133                async_exchange_end(exch);
     134                return ret;
     135        }
     136        unsigned name_count = IPC_GET_ARG1(res_call);
     137        size_t max_length = IPC_GET_ARG2(res_call);
     138
     139        /* Start receiving names */
     140        const char ** names = NULL;
     141        if (name_count) {
     142                names = calloc(name_count, sizeof(char *));
     143                char *tmp_name = malloc(max_length + 1);
     144                if (!names || !tmp_name) {
     145                        async_exchange_end(exch);
     146                        return ENOMEM;
     147                }
     148                for (unsigned i = 0; i < name_count; ++i) {
     149                        bzero(tmp_name, max_length + 1);
     150                        ret = async_data_read_start(exch, tmp_name, max_length);
     151                        if (ret == EOK) {
     152                                names[i] = str_dup(tmp_name);
     153                                ret = names[i] ? EOK : ENOMEM;
     154                        }
     155                        if (ret != EOK)
     156                                break;
     157                }
     158                free(tmp_name);
     159        }
     160        async_exchange_end(exch);
     161        if (ret != EOK) {
     162                for (unsigned i = 0; i < name_count; ++i)
     163                        free(names[i]);
     164                free(names);
     165        } else {
     166                *ids = names;
     167                *count = name_count;
     168        }
     169        return ret;
     170}
     171
     172int hound_service_connect_source_sink(hound_sess_t *sess, const char *source,
     173    const char *sink)
     174{
     175        assert(sess);
     176        assert(source);
     177        assert(sink);
     178
     179        async_exch_t *exch = async_exchange_begin(sess);
     180        if (!exch)
     181                return ENOMEM;
     182        int ret = async_req_0_0(exch, IPC_M_HOUND_CONNECT);
     183        if (ret == EOK)
     184                ret = async_data_write_start(exch, source, str_size(source));
     185        if (ret == EOK)
     186                ret = async_data_write_start(exch, sink, str_size(sink));
     187        async_exchange_end(exch);
     188        return ret;
     189}
     190
     191int hound_service_disconnect_source_sink(hound_sess_t *sess, const char *source,
     192    const char *sink)
     193{
     194        assert(sess);
     195        async_exch_t *exch = async_exchange_begin(sess);
     196        if (!exch)
     197                return ENOMEM;
     198        int ret = async_req_0_0(exch, IPC_M_HOUND_DISCONNECT);
     199        if (ret == EOK)
     200                ret = async_data_write_start(exch, source, str_size(source));
     201        if (ret == EOK)
     202                ret = async_data_write_start(exch, sink, str_size(sink));
     203        async_exchange_end(exch);
     204        return ENOTSUP;
    101205}
    102206
Note: See TracChangeset for help on using the changeset viewer.