source: mainline/uspace/srv/devmap/devmap.c@ 2f3a594

lfn serial ticket/834-toolchain-update topic/msim-upgrade topic/simplify-dev-export
Last change on this file since 2f3a594 was 07e4a3c, checked in by Josef Cejka <malyzelenyhnus@…>, 18 years ago

Added message forwarding to device mapper.

  • Property mode set to 100644
File size: 4.5 KB
Line 
1/*
2 * Copyright (c) 2007 Josef Cejka
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/**
30 * @defgroup devmap Device mapper.
31 * @brief HelenOS device mapper.
32 * @{
33 */
34
35/** @file
36 */
37
38#include <ipc/services.h>
39#include <ipc/ns.h>
40#include <async.h>
41#include <stdio.h>
42#include <errno.h>
43#include <bool.h>
44#include <libadt/list.h>
45#include <futex.h>
46
47#include "devmap.h"
48
49LIST_INITIALIZE(device_list);
50
51atomic_t device_list_futex = FUTEX_INITIALIZER;
52
53/** Initialize device mapper.
54 *
55 *
56 */
57static int devmap_init()
58{
59 /* */
60
61 return EOK;
62}
63
64static int devmap_register()
65{
66 ipc_callid_t callid2;
67 size_t size;
68 char buffer[DEVMAP_NAME_MAXLEN + 1];
69 ipc_callid_t callid;
70 ipc_call_t call;
71 int retval;
72
73 if (ipc_data_receive(&callid, &call, NULL, &size) != 0) {
74 // retval =
75 }
76
77 if (size > DEVMAP_NAME_MAXLEN) {
78 retval = ELIMIT;
79 } else {
80 ipc_data_deliver(callid2, &call, buffer, size);
81 buffer[DEVMAP_NAME_MAXLEN] = 0;
82 }
83 return EOK;
84}
85
86static int devmap_unregister()
87{
88 return EOK;
89}
90
91static int devmap_forward(int handle, ipc_call_t *call, ipc_callid_t callid)
92{
93 link_t *item;
94 ipcarg_t phone;
95 devmap_device_t *dev;
96
97 /* FIXME: add futex */
98 futex_down(&device_list_futex);
99
100 item = (&device_list)->next;
101
102 while (item != &device_list) {
103
104 dev = list_get_instance(item, devmap_device_t, list);
105 if (dev->handle == handle) {
106 break;
107 }
108 item = item->next;
109 }
110
111 if (item == &device_list) {
112 return ENOENT;
113 }
114
115 dev = list_get_instance(item, devmap_device_t, list);
116 phone = dev->phone;
117
118 futex_up(&device_list_futex);
119
120 return ipc_forward_fast(callid, phone, 0, 0);
121}
122
123static int devmap_get_handle()
124{
125 return EOK;
126}
127
128/** Function for handling connections to devmap
129 *
130 */
131static void
132devmap_client_connection(ipc_callid_t iid, ipc_call_t *icall)
133{
134 ipc_callid_t callid;
135 ipc_call_t call;
136 int retval;
137 bool cont = true;
138
139 printf("DevMap: new connection.");
140
141 ipc_answer_fast(iid, EOK, 0, 0); /* Accept connection */
142
143 while (cont) {
144 callid = async_get_call(&call);
145
146 switch (IPC_GET_METHOD(call)) {
147 case IPC_M_PHONE_HUNGUP:
148 /* TODO: if its a device connection, remove it from table */
149 devmap_unregister();
150 printf("DevMap: connection hung up.");
151 cont = false;
152 continue; /* Exit thread */
153
154 case DEVMAP_REGISTER:
155
156 if ((retval = devmap_register()) != EOK) {
157 cont = false;
158 }
159 break;
160 case DEVMAP_UNREGISTER:
161 /* TODO: remove device (if registred) */
162 retval = devmap_unregister();
163 cont = false;
164 break;
165 case DEVMAP_CONNECT_TO_DEVICE:
166 retval = devmap_forward(IPC_GET_ARG1(call), &call, callid);
167 cont = false;
168 break;
169 case DEVMAP_GET_HANDLE:
170
171 break;
172 default:
173 retval = ENOENT;
174 }
175 ipc_answer_fast(callid, retval, 0, 0);
176 }
177
178 printf("DevMap: connection closed.");
179 return;
180}
181
182
183int main(int argc, char *argv[])
184{
185
186 ipcarg_t phonead;
187
188 printf("DevMap: HelenOS device mapper.\n");
189
190 if (devmap_init() != 0) {
191 printf("Error while initializing DevMap service.");
192 return -1;
193 }
194
195 /* Set a handler of incomming connections */
196 async_set_client_connection(devmap_client_connection);
197
198 /* Register device mapper at naming service */
199 if (ipc_connect_to_me(PHONE_NS, SERVICE_DEVMAP, 0, &phonead) != 0)
200 return -1;
201
202 async_manager();
203 /* Never reached */
204 return 0;
205}
206
207/**
208 * @}
209 */
210
Note: See TracBrowser for help on using the repository browser.