source: mainline/uspace/srv/fs/fat/fat.c@ d2d0baf

lfn serial ticket/834-toolchain-update topic/msim-upgrade topic/simplify-dev-export
Last change on this file since d2d0baf was d2d0baf, checked in by Jakub Jermar <jakub@…>, 18 years ago

No need to call async_manager() at the end of fat.c's main().

  • Property mode set to 100644
File size: 3.9 KB
Line 
1/*
2 * Copyright (c) 2006 Martin Decky
3 * Copyright (c) 2007 Jakub Jermar
4 * All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
8 * are met:
9 *
10 * - Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 * - Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in the
14 * documentation and/or other materials provided with the distribution.
15 * - The name of the author may not be used to endorse or promote products
16 * derived from this software without specific prior written permission.
17 *
18 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
19 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
20 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
21 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
22 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
23 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
27 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28 */
29
30/** @addtogroup fs
31 * @{
32 */
33
34/**
35 * @file fat.c
36 * @brief FAT file system driver for HelenOS.
37 */
38
39#include <ipc/ipc.h>
40#include <ipc/services.h>
41#include <async.h>
42#include <errno.h>
43#include <unistd.h>
44#include <stdio.h>>
45#include "../../vfs/vfs.h"
46
47#define dprintf(...) printf(__VA_ARGS__)
48
49vfs_info_t fat_vfs_info = {
50 .name = "fat",
51 .ops = {
52 [IPC_METHOD_TO_VFS_OP(VFS_REGISTER)] = VFS_OP_DEFINED,
53 [IPC_METHOD_TO_VFS_OP(VFS_MOUNT)] = VFS_OP_DEFINED,
54 [IPC_METHOD_TO_VFS_OP(VFS_UNMOUNT)] = VFS_OP_DEFINED,
55 [IPC_METHOD_TO_VFS_OP(VFS_LOOKUP)] = VFS_OP_DEFINED,
56 [IPC_METHOD_TO_VFS_OP(VFS_OPEN)] = VFS_OP_DEFINED,
57 [IPC_METHOD_TO_VFS_OP(VFS_CREATE)] = VFS_OP_DEFINED,
58 [IPC_METHOD_TO_VFS_OP(VFS_CLOSE)] = VFS_OP_DEFINED,
59 [IPC_METHOD_TO_VFS_OP(VFS_READ)] = VFS_OP_DEFINED,
60 [IPC_METHOD_TO_VFS_OP(VFS_WRITE)] = VFS_OP_NULL,
61 [IPC_METHOD_TO_VFS_OP(VFS_SEEK)] = VFS_OP_DEFAULT
62 }
63};
64
65/*
66 * This fibril processes request from the VFS server.
67 */
68void fat_connection(ipc_callid_t iid, ipc_call_t *icall)
69{
70 dprintf("Callback connection established.\n");
71 while (1) {
72 ipc_callid_t callid;
73 ipc_call_t call;
74
75 callid = async_get_call(&call);
76 ipc_answer_fast(callid, ENOTSUP, 0, 0);
77 }
78}
79
80int main(int argc, char **argv)
81{
82 int vfs_phone;
83
84 printf("FAT: HelenOS FAT file system server.\n");
85
86 vfs_phone = ipc_connect_me_to(PHONE_NS, SERVICE_VFS, 0);
87 while (vfs_phone < EOK) {
88 usleep(10000);
89 vfs_phone = ipc_connect_me_to(PHONE_NS, SERVICE_VFS, 0);
90 }
91
92 /*
93 * Tell VFS that we are here and want to get registered.
94 * We use the async framework because VFS will answer the request
95 * out-of-order, when it knows that the operation succeeded or failed.
96 */
97 ipc_call_t answer;
98 aid_t req = async_send_2(vfs_phone, VFS_REGISTER, 0, 0, &answer);
99
100 /*
101 * Send our VFS info structure to VFS.
102 */
103 int rc = ipc_data_send(vfs_phone, &fat_vfs_info, sizeof(fat_vfs_info));
104 if (rc != EOK) {
105 async_wait_for(req, NULL);
106 return rc;
107 }
108
109 /*
110 * Ask VFS for callback connection.
111 */
112 ipcarg_t phonehash;
113 ipc_connect_to_me(vfs_phone, 0, 0, &phonehash);
114
115 async_new_connection(phonehash, 0, NULL, fat_connection);
116
117 /*
118 * Pick up the answer for the request to the VFS_REQUEST call.
119 */
120 async_wait_for(req, NULL);
121 dprintf("FAT filesystem registered.\n");
122
123 /*
124 * TODO: Interestingly, if we return, the only thread dies.
125 * If the only thread dies, the whole task is destroyed.
126 * Prevent the thread from exiting when there are active fibrils.
127 */
128 while(1)
129 usleep(1000000);
130
131 return 0;
132}
133
134/**
135 * @}
136 */
Note: See TracBrowser for help on using the repository browser.