source: mainline/uspace/lib/c/generic/dnsr.c@ 08bb73b

lfn serial ticket/834-toolchain-update topic/msim-upgrade topic/simplify-dev-export
Last change on this file since 08bb73b was a2e3ee6, checked in by Martin Decky <martin@…>, 12 years ago

use new network address infrastructure (towards IPv6 support)

  • Property mode set to 100644
File size: 4.2 KB
RevLine 
[31e9fe0]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>
[fff7ef4]32#include <fibril_synch.h>
[31e9fe0]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
[fff7ef4]40static FIBRIL_MUTEX_INITIALIZE(dnsr_sess_mutex);
41
[31e9fe0]42static async_sess_t *dnsr_sess = NULL;
43
[fff7ef4]44static async_exch_t *dnsr_exchange_begin(void)
[31e9fe0]45{
[fff7ef4]46 fibril_mutex_lock(&dnsr_sess_mutex);
[3e66428]47
[fff7ef4]48 if (dnsr_sess == NULL) {
[3e66428]49 service_id_t dnsr_svc;
50
[fff7ef4]51 (void) loc_service_get_id(SERVICE_NAME_DNSR, &dnsr_svc,
52 IPC_FLAG_BLOCKING);
[3e66428]53
[fff7ef4]54 dnsr_sess = loc_service_connect(EXCHANGE_SERIALIZE, dnsr_svc,
55 IPC_FLAG_BLOCKING);
56 }
[3e66428]57
58 async_sess_t *sess = dnsr_sess;
[fff7ef4]59 fibril_mutex_unlock(&dnsr_sess_mutex);
[3e66428]60
[fff7ef4]61 return async_exchange_begin(sess);
62}
63
64static void dnsr_exchange_end(async_exch_t *exch)
65{
66 async_exchange_end(exch);
[31e9fe0]67}
68
[287d729]69int dnsr_name2host(const char *name, dnsr_hostinfo_t **rinfo)
[31e9fe0]70{
[fff7ef4]71 async_exch_t *exch = dnsr_exchange_begin();
[959d2ec]72 char cname_buf[DNSR_NAME_MAX_SIZE + 1];
73 ipc_call_t cnreply;
74 size_t act_size;
[31e9fe0]75 dnsr_hostinfo_t *info;
76
77 ipc_call_t answer;
78 aid_t req = async_send_0(exch, DNSR_NAME2HOST, &answer);
79 sysarg_t retval = async_data_write_start(exch, name, str_size(name));
[959d2ec]80 aid_t cnreq = async_data_read(exch, cname_buf, DNSR_NAME_MAX_SIZE,
81 &cnreply);
[31e9fe0]82
[fff7ef4]83 dnsr_exchange_end(exch);
[31e9fe0]84
85 if (retval != EOK) {
86 async_forget(req);
[959d2ec]87 async_forget(cnreq);
[31e9fe0]88 return retval;
89 }
90
91 async_wait_for(req, &retval);
[959d2ec]92 if (retval != EOK) {
93 async_forget(cnreq);
94 return EIO;
95 }
96
97 async_wait_for(cnreq, &retval);
[31e9fe0]98 if (retval != EOK)
99 return EIO;
100
101 info = calloc(1, sizeof(dnsr_hostinfo_t));
102 if (info == NULL)
103 return ENOMEM;
104
[959d2ec]105 act_size = IPC_GET_ARG2(cnreply);
106 assert(act_size <= DNSR_NAME_MAX_SIZE);
107 cname_buf[act_size] = '\0';
108
109 info->cname = str_dup(cname_buf);
[a2e3ee6]110 inet_addr_unpack(IPC_GET_ARG1(answer), &info->addr);
[31e9fe0]111
112 *rinfo = info;
113 return EOK;
114}
115
116void dnsr_hostinfo_destroy(dnsr_hostinfo_t *info)
117{
[c55cbbf]118 if (info == NULL)
119 return;
[3e66428]120
[959d2ec]121 free(info->cname);
[31e9fe0]122 free(info);
123}
124
[a2e3ee6]125int dnsr_get_srvaddr(inet_addr_t *srvaddr)
[31e9fe0]126{
[fff7ef4]127 async_exch_t *exch = dnsr_exchange_begin();
[3e66428]128
129 ipc_call_t answer;
130 aid_t req = async_send_0(exch, DNSR_GET_SRVADDR, &answer);
[a2e3ee6]131 int rc = async_data_read_start(exch, srvaddr, sizeof(inet_addr_t));
[3e66428]132
133 loc_exchange_end(exch);
134
135 if (rc != EOK) {
136 async_forget(req);
[31e9fe0]137 return rc;
[3e66428]138 }
139
140 sysarg_t retval;
141 async_wait_for(req, &retval);
142
143 return (int) retval;
[31e9fe0]144}
145
[a2e3ee6]146int dnsr_set_srvaddr(inet_addr_t *srvaddr)
[31e9fe0]147{
[fff7ef4]148 async_exch_t *exch = dnsr_exchange_begin();
[3e66428]149
150 ipc_call_t answer;
151 aid_t req = async_send_0(exch, DNSR_SET_SRVADDR, &answer);
[a2e3ee6]152 int rc = async_data_write_start(exch, srvaddr, sizeof(inet_addr_t));
[3e66428]153
154 loc_exchange_end(exch);
155
156 if (rc != EOK) {
157 async_forget(req);
[31e9fe0]158 return rc;
[3e66428]159 }
160
161 sysarg_t retval;
162 async_wait_for(req, &retval);
163
164 return (int) retval;
[31e9fe0]165}
166
167/** @}
168 */
Note: See TracBrowser for help on using the repository browser.