source: mainline/uspace/lib/libc/generic/vfs.c@ 2f02aa17

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

Add VFS wrappers for VFS_MOUNT, VFS_OPEN and VFS_READ to libc.

  • Property mode set to 100644
File size: 4.0 KB
RevLine 
[2f02aa17]1/*
2 * Copyright (c) 2007 Jakub Jermar
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/** @addtogroup libc
30 * @{
31 */
32/** @file
33 */
34
35#include <vfs.h>
36#include <ipc/ipc.h>
37#include <ipc/services.h>
38#include <async.h>
39#include <atomic.h>
40#include <futex.h>
41#include <errno.h>
42#include <string.h>
43#include "../../srv/vfs/vfs.h"
44
45int vfs_phone = -1;
46atomic_t vfs_phone_futex = FUTEX_INITIALIZER;
47
48static int vfs_connect(void)
49{
50 if (vfs_phone < 0)
51 vfs_phone = ipc_connect_me_to(PHONE_NS, SERVICE_VFS, 0, 0);
52 return vfs_phone;
53}
54
55int mount(const char *fs_name, const char *mp, const char *dev)
56{
57 int res;
58 ipcarg_t rc;
59 aid_t req;
60
61 int dev_handle = 0; /* TODO */
62
63 futex_down(&vfs_phone_futex);
64 async_serialize_start();
65 if (vfs_phone < 0) {
66 res = vfs_connect();
67 if (res < 0) {
68 async_serialize_end();
69 futex_up(&vfs_phone_futex);
70 return res;
71 }
72 }
73 req = async_send_1(vfs_phone, VFS_MOUNT, dev_handle, NULL);
74 rc = ipc_data_write_send(vfs_phone, (void *)fs_name, strlen(fs_name));
75 if (rc != EOK) {
76 async_wait_for(req, NULL);
77 async_serialize_end();
78 futex_up(&vfs_phone_futex);
79 return (int) rc;
80 }
81 rc = ipc_data_write_send(vfs_phone, (void *)mp, strlen(mp));
82 if (rc != EOK) {
83 async_wait_for(req, NULL);
84 async_serialize_end();
85 futex_up(&vfs_phone_futex);
86 return (int) rc;
87 }
88 async_wait_for(req, &rc);
89 async_serialize_end();
90 futex_up(&vfs_phone_futex);
91 return (int) rc;
92}
93
94
95int open(const char *name, int oflag, ...)
96{
97 int res;
98 ipcarg_t rc;
99 ipc_call_t answer;
100 aid_t req;
101
102 futex_down(&vfs_phone_futex);
103 async_serialize_start();
104 if (vfs_phone < 0) {
105 res = vfs_connect();
106 if (res < 0) {
107 async_serialize_end();
108 futex_up(&vfs_phone_futex);
109 return res;
110 }
111 }
112 req = async_send_2(vfs_phone, VFS_OPEN, oflag, 0, &answer);
113 rc = ipc_data_write_send(vfs_phone, name, strlen(name));
114 if (rc != EOK) {
115 async_wait_for(req, NULL);
116 async_serialize_end();
117 futex_up(&vfs_phone_futex);
118 return (int) rc;
119 }
120 async_wait_for(req, &rc);
121 async_serialize_end();
122 futex_up(&vfs_phone_futex);
123 return (int) IPC_GET_ARG1(answer);
124}
125
126ssize_t read(int fildes, void *buf, size_t nbyte)
127{
128 int res;
129 ipcarg_t rc;
130 ipc_call_t answer;
131 aid_t req;
132
133 futex_down(&vfs_phone_futex);
134 async_serialize_start();
135 if (vfs_phone < 0) {
136 res = vfs_connect();
137 if (res < 0) {
138 async_serialize_end();
139 futex_up(&vfs_phone_futex);
140 return res;
141 }
142 }
143 req = async_send_1(vfs_phone, VFS_READ, 0, &answer);
144 if (ipc_data_read_send(vfs_phone, buf, sizeof(buf)) != EOK) {
145 async_wait_for(req, NULL);
146 async_serialize_end();
147 futex_up(&vfs_phone_futex);
148 return (ssize_t) rc;
149 }
150 async_wait_for(req, &rc);
151 async_serialize_end();
152 futex_up(&vfs_phone_futex);
153 return (ssize_t) IPC_GET_ARG1(answer);
154}
155
156/** @}
157 */
Note: See TracBrowser for help on using the repository browser.