source: mainline/uspace/lib/c/generic/dnsr.c@ fff7ef4

lfn serial ticket/834-toolchain-update topic/msim-upgrade topic/simplify-dev-export
Last change on this file since fff7ef4 was fff7ef4, checked in by Jiri Svoboda <jiri@…>, 13 years ago

Make dnsr client initialization implicit (to allow for multiple consumers in the same program).

  • Property mode set to 100644
File size: 3.4 KB
Line 
1/*
2 * Copyright (c) 2013 Jiri Svoboda
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 *
9 * - Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * - Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
14 * - The name of the author may not be used to endorse or promote products
15 * derived from this software without specific prior written permission.
16 *
17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 */
28
29#include <async.h>
30#include <assert.h>
31#include <errno.h>
32#include <fibril_synch.h>
33#include <inet/dnsr.h>
34#include <ipc/dnsr.h>
35#include <ipc/services.h>
36#include <loc.h>
37#include <stdlib.h>
38#include <str.h>
39
40static FIBRIL_MUTEX_INITIALIZE(dnsr_sess_mutex);
41
42static async_sess_t *dnsr_sess = NULL;
43
44static async_exch_t *dnsr_exchange_begin(void)
45{
46 async_sess_t *sess;
47 service_id_t dnsr_svc;
48
49 fibril_mutex_lock(&dnsr_sess_mutex);
50
51 if (dnsr_sess == NULL) {
52 (void) loc_service_get_id(SERVICE_NAME_DNSR, &dnsr_svc,
53 IPC_FLAG_BLOCKING);
54
55 dnsr_sess = loc_service_connect(EXCHANGE_SERIALIZE, dnsr_svc,
56 IPC_FLAG_BLOCKING);
57 }
58
59 sess = dnsr_sess;
60 fibril_mutex_unlock(&dnsr_sess_mutex);
61
62 return async_exchange_begin(sess);
63}
64
65static void dnsr_exchange_end(async_exch_t *exch)
66{
67 async_exchange_end(exch);
68}
69
70int dnsr_name2host(const char *name, dnsr_hostinfo_t **rinfo)
71{
72 async_exch_t *exch = dnsr_exchange_begin();
73 dnsr_hostinfo_t *info;
74
75 ipc_call_t answer;
76 aid_t req = async_send_0(exch, DNSR_NAME2HOST, &answer);
77 sysarg_t retval = async_data_write_start(exch, name, str_size(name));
78
79 dnsr_exchange_end(exch);
80
81 if (retval != EOK) {
82 async_forget(req);
83 return retval;
84 }
85
86 async_wait_for(req, &retval);
87 if (retval != EOK)
88 return EIO;
89
90 info = calloc(1, sizeof(dnsr_hostinfo_t));
91 if (info == NULL)
92 return ENOMEM;
93
94 info->name = str_dup(name);
95 info->addr.ipv4 = IPC_GET_ARG1(answer);
96
97 *rinfo = info;
98 return EOK;
99}
100
101void dnsr_hostinfo_destroy(dnsr_hostinfo_t *info)
102{
103 if (info == NULL)
104 return;
105
106 free(info->name);
107 free(info);
108}
109
110int dnsr_get_srvaddr(inet_addr_t *srvaddr)
111{
112 sysarg_t addr;
113 async_exch_t *exch = dnsr_exchange_begin();
114
115 int rc = async_req_0_1(exch, DNSR_GET_SRVADDR, &addr);
116 dnsr_exchange_end(exch);
117
118 if (rc != EOK)
119 return rc;
120
121 srvaddr->ipv4 = addr;
122 return EOK;
123}
124
125int dnsr_set_srvaddr(inet_addr_t *srvaddr)
126{
127 async_exch_t *exch = dnsr_exchange_begin();
128
129 int rc = async_req_1_0(exch, DNSR_SET_SRVADDR, srvaddr->ipv4);
130 dnsr_exchange_end(exch);
131
132 if (rc != EOK)
133 return rc;
134
135 return EOK;
136}
137
138/** @}
139 */
Note: See TracBrowser for help on using the repository browser.