PS2SDK
PS2 Homebrew Libraries
Loading...
Searching...
No Matches
s147mdev.c
1/*
2# _____ ___ ____ ___ ____
3# ____| | ____| | | |____|
4# | ___| |____ ___| ____| | \ PS2DEV Open Source Project.
5#-----------------------------------------------------------------------
6# Copyright ps2dev - http://www.ps2dev.org
7# Licenced under Academic Free License version 2.0
8# Review ps2sdk README & LICENSE files for further details.
9*/
10
11#include "irx_imports.h"
12#include <errno.h>
13#include <s147mdev.h>
14
15IRX_ID("S147MDEV", 2, 1);
16// Text section hash:
17// bda8a15d6a4c9a560598c37fd397d263
18
19static int register_atfile_ioman_device(const char *atfile_name, const char *atfile_desc);
20static int atfile_drv_op_nulldev(const iop_file_t *f);
21static int atfile_drv_op_init(iop_device_t *dev);
22static int atfile_drv_op_deinit(iop_device_t *dev);
23static int atfile_drv_op_open(iop_file_t *f, const char *name, int flags);
24static int atfile_drv_op_close(iop_file_t *f);
25static int atfile_drv_op_read(iop_file_t *f, void *ptr, int size);
26static int atfile_drv_op_write(iop_file_t *f, void *ptr, int size);
27static int atfile_drv_op_lseek(iop_file_t *f, int offset, int mode);
28
29extern struct irx_export_table _exp_s147mdev;
30static iop_device_ops_t atfile_drv_ops = {
31 &atfile_drv_op_init,
32 &atfile_drv_op_deinit,
33 (void *)&atfile_drv_op_nulldev,
34 &atfile_drv_op_open,
35 &atfile_drv_op_close,
36 &atfile_drv_op_read,
37 &atfile_drv_op_write,
38 &atfile_drv_op_lseek,
39 (void *)&atfile_drv_op_nulldev,
40 (void *)&atfile_drv_op_nulldev,
41 (void *)&atfile_drv_op_nulldev,
42 (void *)&atfile_drv_op_nulldev,
43 (void *)&atfile_drv_op_nulldev,
44 (void *)&atfile_drv_op_nulldev,
45 (void *)&atfile_drv_op_nulldev,
46 (void *)&atfile_drv_op_nulldev,
47 (void *)&atfile_drv_op_nulldev,
48};
49static iop_device_t g_atfile_device;
50static iop_device_t *g_atfile_unit_info[10];
51
52int _start(int ac, char **av)
53{
54 (void)ac;
55 (void)av;
56 Kprintf("\ns147mdev.irx: System147 Multi Device File System Manager v%d.%d\n", 2, 1);
57 register_atfile_ioman_device("atfile", "Multi Device File System");
58 if ( RegisterLibraryEntries(&_exp_s147mdev) )
59 {
60 Kprintf("s147mdev.irx: RegisterLibraryEntries - Failed.\n");
61 return MODULE_NO_RESIDENT_END;
62 }
63 Kprintf("s147mdev.irx: RegisterLibraryEntries - OK.\n");
64 return MODULE_RESIDENT_END;
65}
66
67static int register_atfile_ioman_device(const char *atfile_name, const char *atfile_desc)
68{
69 int i;
70
71 for ( i = 0; i < 10; i += 1 )
72 g_atfile_unit_info[i] = 0;
73 g_atfile_device.name = atfile_name;
74 g_atfile_device.type = IOP_DT_FS;
75 g_atfile_device.version = 0;
76 g_atfile_device.desc = atfile_desc;
77 g_atfile_device.ops = &atfile_drv_ops;
78 DelDrv(atfile_name);
79 AddDrv(&g_atfile_device);
80 return 0;
81}
82
83int s147mdev_4_addfs(iop_device_t *drv, int unit10)
84{
85 int retres;
86
87 if ( unit10 < 0 || unit10 >= 100 )
88 {
89 Kprintf("s147mdev.irx: Invalid unit number\n");
90 return -1;
91 }
92 if ( !drv )
93 {
94 Kprintf("s147mdev.irx: Invalid device table\n");
95 return -1;
96 }
97 retres = drv->ops->init(drv);
98 if ( retres >= 0 )
99 g_atfile_unit_info[unit10 / 10] = drv;
100 return retres;
101}
102
103int s147mdev_5_delfs(int unit10)
104{
105 int retres;
106
107 if ( unit10 < 0 || unit10 >= 100 )
108 {
109 Kprintf("s147mdev.irx: Invalid unit number\n");
110 return -1;
111 }
112 retres = (g_atfile_unit_info[unit10 / 10]) ?
113 g_atfile_unit_info[unit10 / 10]->ops->deinit(g_atfile_unit_info[unit10 / 10]) :
114 0;
115 if ( retres >= 0 )
116 g_atfile_unit_info[unit10 / 10] = 0;
117 return retres;
118}
119
120static int atfile_drv_op_nulldev(const iop_file_t *f)
121{
122 int unit;
123
124 unit = f->unit;
125 // Unofficial: add bounds check here
126 if ( unit < 0 || unit >= 100 )
127 {
128 Kprintf("s147mdev.irx: Invalid unit number\n");
129 return -ENODEV;
130 }
131 if ( !g_atfile_unit_info[unit / 10] )
132 {
133 Kprintf("s147mdev.irx: Undefined unit number (%d), do nothing\n", unit);
134 return -ENODEV;
135 }
136 return 0;
137}
138
139static int atfile_drv_op_init(iop_device_t *dev)
140{
141 (void)dev;
142 return 0;
143}
144
145static int atfile_drv_op_deinit(iop_device_t *dev)
146{
147 (void)dev;
148 return 0;
149}
150
151static int atfile_drv_op_open(iop_file_t *f, const char *name, int flags)
152{
153 iop_file_t fstk;
154 int unit;
155 int retres;
156
157 unit = f->unit;
158 if ( unit < 0 || unit >= 100 )
159 {
160 Kprintf("s147mdev.irx: Invalid unit number\n");
161 return -ENODEV;
162 }
163 fstk.mode = f->mode;
164 fstk.unit = f->unit % 10;
165 fstk.device = f->device;
166 if ( !g_atfile_unit_info[unit / 10] )
167 {
168 Kprintf("s147mdev.irx: Undefined unit number (%d), do nothing\n", unit);
169 return -ENODEV;
170 }
171 retres = g_atfile_unit_info[unit / 10]->ops->open(&fstk, name, flags);
172 f->privdata = fstk.privdata;
173 return retres;
174}
175
176static int atfile_drv_op_close(iop_file_t *f)
177{
178 iop_file_t fstk;
179 int unit;
180
181 unit = f->unit;
182 if ( unit < 0 || unit >= 100 )
183 {
184 Kprintf("s147mdev.irx: Invalid unit number\n");
185 return -ENODEV;
186 }
187 fstk.mode = f->mode;
188 fstk.unit = f->unit % 10;
189 fstk.device = f->device;
190 fstk.privdata = f->privdata;
191 if ( !g_atfile_unit_info[unit / 10] )
192 {
193 Kprintf("s147mdev.irx: Undefined unit number (%d), do nothing\n", unit);
194 return -ENODEV;
195 }
196 return g_atfile_unit_info[unit / 10]->ops->close(&fstk);
197}
198
199static int atfile_drv_op_read(iop_file_t *f, void *ptr, int size)
200{
201 iop_file_t fstk;
202 int unit;
203
204 unit = f->unit;
205 if ( unit < 0 || unit >= 100 )
206 {
207 Kprintf("s147mdev.irx: Invalid unit number\n");
208 return -ENODEV;
209 }
210 fstk.mode = f->mode;
211 fstk.unit = f->unit % 10;
212 fstk.device = f->device;
213 fstk.privdata = f->privdata;
214 if ( !g_atfile_unit_info[unit / 10] )
215 {
216 Kprintf("s147mdev.irx: Undefined unit number (%d), do nothing\n", unit);
217 return -ENODEV;
218 }
219 return g_atfile_unit_info[unit / 10]->ops->read(&fstk, ptr, size);
220}
221
222static int atfile_drv_op_write(iop_file_t *f, void *ptr, int size)
223{
224 iop_file_t fstk;
225 int unit;
226
227 unit = f->unit;
228 if ( unit < 0 || unit >= 100 )
229 {
230 Kprintf("s147mdev.irx: Invalid unit number\n");
231 return -ENODEV;
232 }
233 fstk.mode = f->mode;
234 fstk.unit = f->unit % 10;
235 fstk.device = f->device;
236 fstk.privdata = f->privdata;
237 if ( !g_atfile_unit_info[unit / 10] )
238 {
239 Kprintf("s147mdev.irx: Undefined unit number (%d), do nothing\n", unit);
240 return -ENODEV;
241 }
242 return g_atfile_unit_info[unit / 10]->ops->write(&fstk, ptr, size);
243}
244
245static int atfile_drv_op_lseek(iop_file_t *f, int offset, int mode)
246{
247 iop_file_t fstk;
248 int unit;
249
250 unit = f->unit;
251 if ( unit < 0 || unit >= 100 )
252 {
253 Kprintf("s147mdev.irx: Invalid unit number\n");
254 return -ENODEV;
255 }
256 fstk.mode = f->mode;
257 fstk.unit = f->unit % 10;
258 fstk.device = f->device;
259 fstk.privdata = f->privdata;
260 if ( !g_atfile_unit_info[unit / 10] )
261 {
262 Kprintf("s147mdev.irx: Undefined unit number (%d), do nothing\n", unit);
263 return -ENODEV;
264 }
265 return g_atfile_unit_info[unit / 10]->ops->lseek(&fstk, offset, mode);
266}
#define ENODEV
Definition errno.h:57
unsigned int version
Definition ioman.h:68
struct _iop_device * device
Definition ioman.h:59
void * privdata
Definition ioman.h:61
int unit
Definition ioman.h:57
int mode
Definition ioman.h:55