PS2SDK
PS2 Homebrew Libraries
Loading...
Searching...
No Matches
fileXio_rpc.c
Go to the documentation of this file.
1/*
2# _____ ___ ____ ___ ____
3# ____| | ____| | | |____|
4# | ___| |____ ___| ____| | \ PS2DEV Open Source Project.
5#-----------------------------------------------------------------------
6# Copyright 2001-2004, 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
16#include <tamtypes.h>
17#include <kernel.h>
18#include <sifrpc.h>
19#include <stdio.h>
20#include <string.h>
21#include <stdlib.h>
22#include <stdarg.h>
23#include <sys/fcntl.h>
24#include <sys/stat.h>
25#include <ps2sdkapi.h>
26
27#define NEWLIB_PORT_AWARE
28#include <fileXio_rpc.h>
29#include <errno.h>
30
31extern int _iop_reboot_count;
32
33void _ps2sdk_fileXio_init();
34void _ps2sdk_fileXio_deinit();
35
36#ifdef F___cd0
38#else
39extern SifRpcClientData_t __cd0;
40#endif
41
42#ifdef F___sbuff
43unsigned int __sbuff[0x1300] __attribute__((aligned (64)));
44#else
45extern unsigned int __sbuff[0x1300] __attribute__((aligned (64)));
46#endif
47
48#ifdef F___intr_data
49int __intr_data[0xC00] __attribute__((aligned(64)));
50#else
51extern int __intr_data[0xC00] __attribute__((aligned(64)));
52#endif
53
54#ifdef F___fileXioInited
55int __fileXioInited = 0;
56#else
57extern int __fileXioInited;
58#endif
59
60#ifdef F___fileXioBlockMode
61int __fileXioBlockMode;
62#else
63extern int __fileXioBlockMode;
64#endif
65
66#ifdef F___fileXioCompletionSema
67int __fileXioCompletionSema = -1;
68#else
69extern int __fileXioCompletionSema;
70#endif
71
72#ifdef F___lock_sema_id
73int __lock_sema_id = -1;
74#else
75extern int __lock_sema_id;
76#endif
77
78static inline void _fxio_intr(void)
79{
80 iSignalSema(__fileXioCompletionSema);
81}
82
83static inline int _lock(void)
84{
85 return(WaitSema(__lock_sema_id));
86}
87
88static inline int _unlock(void)
89{
90 return(SignalSema(__lock_sema_id));
91}
92
93#ifdef F_fileXioInit
94int fileXioInit(void)
95{
96 int res;
97 ee_sema_t sp;
98 static int _rb_count = 0;
99
100 if(_rb_count != _iop_reboot_count)
101 {
102 _rb_count = _iop_reboot_count;
103
104 fileXioExit();
105 }
106
107 if(__fileXioInited)
108 {
109 return 0;
110 }
111
112 sp.init_count = 1;
113 sp.max_count = 1;
114 sp.option = 0;
115 __lock_sema_id = CreateSema(&sp);
116
117 while(((res = sceSifBindRpc(&__cd0, FILEXIO_IRX, 0)) >= 0) && (__cd0.server == NULL))
118 nopdelay();
119
120 if(res < 0)
121 return res;
122
123 sp.init_count = 1;
124 sp.max_count = 1;
125 sp.option = 0;
126 __fileXioCompletionSema = CreateSema(&sp);
127 if (__fileXioCompletionSema < 0)
128 return -1;
129
130 __fileXioInited = 1;
131 __fileXioBlockMode = FXIO_WAIT;
132
133 _ps2sdk_fileXio_init();
134
135 return 0;
136}
137#endif
138
139#ifdef F_fileXioExit
140void fileXioExit(void)
141{
142 if(__fileXioInited)
143 {
144 if(__lock_sema_id >= 0) DeleteSema(__lock_sema_id);
145 if(__fileXioCompletionSema >= 0) DeleteSema(__fileXioCompletionSema);
146
147 memset(&__cd0, 0, sizeof(__cd0));
148
149 _ps2sdk_fileXio_deinit();
150 __fileXioInited = 0;
151 }
152}
153#endif
154
155#ifdef F_fileXioStop
156void fileXioStop(void)
157{
158 if(fileXioInit() < 0)
159 return;
160
161 sceSifCallRpc(&__cd0, FILEXIO_STOP, 0, __sbuff, 0, __sbuff, 0, 0, 0);
162
163 return;
164}
165#endif
166
167#ifdef F_fileXioGetDeviceList
168int fileXioGetDeviceList(struct fileXioDevice deviceEntry[], unsigned int req_entries)
169{
170 int rv;
171 struct fxio_devlist_packet *packet=(struct fxio_devlist_packet*)__sbuff;
172
173 if(fileXioInit() < 0)
174 return -ENOPKG;
175
176 _lock();
177 WaitSema(__fileXioCompletionSema);
178
179 packet->deviceEntry = deviceEntry;
180 packet->reqEntries = req_entries;
181
182 // This will get the directory contents, and fill dirEntry via DMA
183 if((rv = sceSifCallRpc(&__cd0, FILEXIO_GETDEVICELIST, __fileXioBlockMode, __sbuff, sizeof(struct fxio_devlist_packet), __sbuff, 4, (void *)&_fxio_intr, NULL)) >= 0)
184 {
185 if(__fileXioBlockMode == FXIO_NOWAIT) { rv = 0; }
186 else { rv = __sbuff[0]; }
187 }
188 else
189 SignalSema(__fileXioCompletionSema);
190
191 _unlock();
192 return(rv);
193}
194#endif
195
196#ifdef F_fileXioGetdir
197int fileXioGetdir(const char* pathname, struct fileXioDirEntry dirEntry[], unsigned int req_entries)
198{
199 int rv;
200 struct fxio_getdir_packet *packet=(struct fxio_getdir_packet*)__sbuff;
201
202 if(fileXioInit() < 0)
203 return -ENOPKG;
204
205 _lock();
206 WaitSema(__fileXioCompletionSema);
207
208 // copy the requested pathname to the rpc buffer
209 strncpy(packet->pathname, pathname, sizeof(packet->pathname));
210
211 sceSifWriteBackDCache(dirEntry, (sizeof(struct fileXioDirEntry) * req_entries));
212
213 packet->dirEntry = dirEntry;
214 packet->reqEntries = req_entries;
215
216 // This will get the directory contents, and fill dirEntry via DMA
217 if((rv = sceSifCallRpc(&__cd0, FILEXIO_GETDIR, __fileXioBlockMode, __sbuff, sizeof(struct fxio_getdir_packet), __sbuff, 4, (void *)&_fxio_intr, NULL)) >= 0)
218 {
219 if(__fileXioBlockMode == FXIO_NOWAIT) { rv = 0; }
220 else { rv = __sbuff[0]; }
221 }
222 else
223 SignalSema(__fileXioCompletionSema);
224
225 _unlock();
226 return(rv);
227}
228#endif
229
230#ifdef F_fileXioMount
231int fileXioMount(const char* mountpoint, const char* mountstring, int flag)
232{
233 int rv;
234 struct fxio_mount_packet *packet=(struct fxio_mount_packet*)__sbuff;
235
236 if(fileXioInit() < 0)
237 return -ENOPKG;
238
239 _lock();
240 WaitSema(__fileXioCompletionSema);
241
242 strncpy(packet->blockdevice, mountstring, sizeof(packet->blockdevice));
243 strncpy(packet->mountpoint, mountpoint, sizeof(packet->mountpoint));
244 packet->flags = flag;
245
246 if((rv = sceSifCallRpc(&__cd0, FILEXIO_MOUNT, __fileXioBlockMode, __sbuff, sizeof(struct fxio_mount_packet), __sbuff, 4, (void *)&_fxio_intr, NULL)) >= 0)
247 {
248 if(__fileXioBlockMode == FXIO_NOWAIT) { rv = 0; }
249 else { rv = __sbuff[0]; }
250 }
251 else
252 SignalSema(__fileXioCompletionSema);
253
254 _unlock();
255 return(rv);
256}
257#endif
258
259#ifdef F_fileXioUmount
260int fileXioUmount(const char* mountpoint)
261{
262 int rv;
263 struct fxio_unmount_packet *packet=(struct fxio_unmount_packet*)__sbuff;
264
265 if(fileXioInit() < 0)
266 return -ENOPKG;
267
268 _lock();
269 WaitSema(__fileXioCompletionSema);
270
271 strncpy(packet->mountpoint, mountpoint, sizeof(packet->mountpoint));
272
273 if((rv = sceSifCallRpc(&__cd0, FILEXIO_UMOUNT, __fileXioBlockMode, __sbuff, sizeof(struct fxio_unmount_packet), __sbuff, 4, (void *)&_fxio_intr, NULL)) >= 0)
274 {
275 if(__fileXioBlockMode == FXIO_NOWAIT) { rv = 0; }
276 else { rv = __sbuff[0]; }
277 }
278 else
279 SignalSema(__fileXioCompletionSema);
280
281 _unlock();
282 return(rv);
283}
284#endif
285
286#ifdef F_fileXioCopyfile
287int fileXioCopyfile(const char* source, const char* dest, int mode)
288{
289 int rv;
290 struct fxio_copyfile_packet *packet=(struct fxio_copyfile_packet*)__sbuff;
291
292 if(fileXioInit() < 0)
293 return -ENOPKG;
294
295 _lock();
296 WaitSema(__fileXioCompletionSema);
297
298 strncpy(packet->source, source, sizeof(packet->source));
299 strncpy(packet->dest, dest, sizeof(packet->dest));
300 packet->mode = mode;
301
302 if((rv = sceSifCallRpc(&__cd0, FILEXIO_COPYFILE, __fileXioBlockMode, __sbuff, sizeof(struct fxio_copyfile_packet), __sbuff, 4, (void *)&_fxio_intr, NULL)) >= 0)
303 {
304 if(__fileXioBlockMode == FXIO_NOWAIT) { rv = 0; }
305 else { rv = __sbuff[0]; }
306 }
307 else
308 SignalSema(__fileXioCompletionSema);
309
310 _unlock();
311 return(rv);
312}
313#endif
314
315#ifdef F_fileXioMkdir
316int fileXioMkdir(const char* pathname, int mode)
317{
318 int rv;
319 struct fxio_mkdir_packet *packet=(struct fxio_mkdir_packet*)__sbuff;
320
321 if(fileXioInit() < 0)
322 return -ENOPKG;
323
324 _lock();
325 WaitSema(__fileXioCompletionSema);
326
327 strncpy(packet->pathname, pathname, sizeof(packet->pathname));
328 packet->mode = mode;
329
330 if((rv = sceSifCallRpc(&__cd0, FILEXIO_MKDIR, __fileXioBlockMode, __sbuff, sizeof(struct fxio_mkdir_packet), __sbuff, 4, (void *)&_fxio_intr, NULL)) >= 0)
331 {
332 if(__fileXioBlockMode == FXIO_NOWAIT) { rv = 0; }
333 else { rv = __sbuff[0]; }
334 }
335 else
336 SignalSema(__fileXioCompletionSema);
337
338 _unlock();
339 return(rv);
340}
341#endif
342
343#ifdef F_fileXioRmdir
344int fileXioRmdir(const char* pathname)
345{
346 int rv;
347 struct fxio_pathsel_packet *packet=(struct fxio_pathsel_packet*)__sbuff;
348
349 if(fileXioInit() < 0)
350 return -ENOPKG;
351
352 _lock();
353 WaitSema(__fileXioCompletionSema);
354
355 strncpy(packet->pathname, pathname, sizeof(packet->pathname));
356
357 if((rv = sceSifCallRpc(&__cd0, FILEXIO_RMDIR, __fileXioBlockMode, __sbuff, sizeof(struct fxio_pathsel_packet), __sbuff, 4, (void *)&_fxio_intr, NULL)) >= 0)
358 {
359 if(__fileXioBlockMode == FXIO_NOWAIT) { rv = 0; }
360 else { rv = __sbuff[0]; }
361 }
362 else
363 SignalSema(__fileXioCompletionSema);
364
365 _unlock();
366 return(rv);
367}
368#endif
369
370#ifdef F_fileXioRemove
371int fileXioRemove(const char* pathname)
372{
373 int rv;
374 struct fxio_pathsel_packet *packet=(struct fxio_pathsel_packet*)__sbuff;
375
376 if(fileXioInit() < 0)
377 return -ENOPKG;
378
379 _lock();
380 WaitSema(__fileXioCompletionSema);
381
382 strncpy(packet->pathname, pathname, sizeof(packet->pathname));
383
384 if((rv = sceSifCallRpc(&__cd0, FILEXIO_REMOVE, __fileXioBlockMode, __sbuff, sizeof(struct fxio_pathsel_packet), __sbuff, 4, (void *)&_fxio_intr, NULL)) >= 0)
385 {
386 if(__fileXioBlockMode == FXIO_NOWAIT) { rv = 0; }
387 else { rv = __sbuff[0]; }
388 }
389 else
390 SignalSema(__fileXioCompletionSema);
391
392 _unlock();
393 return(rv);
394}
395#endif
396
397#ifdef F_fileXioRename
398int fileXioRename(const char* source, const char* dest)
399{
400 int rv;
401 struct fxio_rename_packet *packet=(struct fxio_rename_packet*)__sbuff;
402
403 if(fileXioInit() < 0)
404 return -ENOPKG;
405
406 _lock();
407 WaitSema(__fileXioCompletionSema);
408
409 strncpy(packet->source, source, sizeof(packet->source));
410 strncpy(packet->dest, dest, sizeof(packet->dest));
411
412 if((rv = sceSifCallRpc(&__cd0, FILEXIO_RENAME, __fileXioBlockMode, __sbuff, sizeof(struct fxio_rename_packet), __sbuff, 4, (void *)&_fxio_intr, NULL)) >= 0)
413 {
414 if(__fileXioBlockMode == FXIO_NOWAIT) { rv = 0; }
415 else { rv = __sbuff[0]; }
416 }
417 else
418 SignalSema(__fileXioCompletionSema);
419
420 _unlock();
421 return(rv);
422}
423#endif
424
425#ifdef F_fileXioSymlink
426int fileXioSymlink(const char* source, const char* dest)
427{
428 int rv;
429 struct fxio_rename_packet *packet=(struct fxio_rename_packet*)__sbuff;
430
431 if(fileXioInit() < 0)
432 return -ENOPKG;
433
434 _lock();
435 WaitSema(__fileXioCompletionSema);
436
437 strncpy(packet->source, source, sizeof(packet->source));
438 strncpy(packet->dest, dest, sizeof(packet->dest));
439
440 if((rv = sceSifCallRpc(&__cd0, FILEXIO_SYMLINK, __fileXioBlockMode, __sbuff, sizeof(struct fxio_rename_packet), __sbuff, 4, (void *)&_fxio_intr, NULL)) >= 0)
441 {
442 if(__fileXioBlockMode == FXIO_NOWAIT) { rv = 0; }
443 else { rv = __sbuff[0]; }
444 }
445 else
446 SignalSema(__fileXioCompletionSema);
447
448 _unlock();
449 return(rv);
450}
451#endif
452
453#ifdef F_fileXioReadlink
454int fileXioReadlink(const char* source, char* buf, unsigned int buflen)
455{
456 int rv;
457 struct fxio_readlink_packet *packet=(struct fxio_readlink_packet*)__sbuff;
458
459 if(fileXioInit() < 0)
460 return -ENOPKG;
461
462 _lock();
463 WaitSema(__fileXioCompletionSema);
464
465 if( !IS_UNCACHED_SEG(buf))
466 sceSifWriteBackDCache(buf, buflen);
467
468 strncpy(packet->source, source, sizeof(packet->source));
469 packet->buffer = buf;
470 packet->buflen = buflen;
471
472 if((rv = sceSifCallRpc(&__cd0, FILEXIO_READLINK, __fileXioBlockMode, __sbuff, sizeof(struct fxio_readlink_packet), __sbuff, 4, (void *)&_fxio_intr, NULL)) >= 0)
473 {
474 if(__fileXioBlockMode == FXIO_NOWAIT) { rv = 0; }
475 else { rv = __sbuff[0]; }
476 }
477 else
478 SignalSema(__fileXioCompletionSema);
479
480 _unlock();
481 return(rv);
482}
483#endif
484
485#ifdef F_fileXioChdir
486int fileXioChdir(const char* pathname)
487{
488 int rv;
489 struct fxio_pathsel_packet *packet=(struct fxio_pathsel_packet*)__sbuff;
490
491 if(fileXioInit() < 0)
492 return -ENOPKG;
493
494 _lock();
495 WaitSema(__fileXioCompletionSema);
496
497 strncpy(packet->pathname, pathname, sizeof(packet->pathname));
498
499 if((rv = sceSifCallRpc(&__cd0, FILEXIO_CHDIR, __fileXioBlockMode, __sbuff, sizeof(struct fxio_pathsel_packet), __sbuff, 4, (void *)&_fxio_intr, NULL)) >= 0)
500 {
501 if(__fileXioBlockMode == FXIO_NOWAIT) { rv = 0; }
502 else { rv = __sbuff[0]; }
503 }
504 else
505 SignalSema(__fileXioCompletionSema);
506
507 _unlock();
508 return(rv);
509}
510#endif
511
512#ifdef F_fileXioOpen
513int fileXioOpen(const char* source, int flags, ...)
514{
515 int rv, mode;
516 struct fxio_open_packet *packet=(struct fxio_open_packet*)__sbuff;
517 va_list alist;
518
519 va_start(alist, flags);
520 mode = va_arg(alist, int); //Retrieve the mode argument, regardless of whether it is expected or not.
521 va_end(alist);
522
523 if(fileXioInit() < 0)
524 return -ENOPKG;
525
526 _lock();
527 WaitSema(__fileXioCompletionSema);
528
529 strncpy(packet->pathname, source, sizeof(packet->pathname));
530 packet->flags = flags;
531 packet->mode = mode;
532 if((rv = sceSifCallRpc(&__cd0, FILEXIO_OPEN, __fileXioBlockMode, __sbuff, sizeof(struct fxio_open_packet), __sbuff, 4, (void *)&_fxio_intr, NULL)) >= 0)
533 {
534 if(__fileXioBlockMode == FXIO_NOWAIT) { rv = 0; }
535 else { rv = __sbuff[0]; }
536 }
537 else
538 SignalSema(__fileXioCompletionSema);
539
540 _unlock();
541 return(rv);
542}
543#endif
544
545#ifdef F_fileXioClose
546int fileXioClose(int fd)
547{
548 int rv;
549 struct fxio_close_packet *packet=(struct fxio_close_packet*)__sbuff;
550
551 if(fileXioInit() < 0)
552 return -ENOPKG;
553
554 _lock();
555 WaitSema(__fileXioCompletionSema);
556
557 packet->fd = fd;
558
559 if((rv = sceSifCallRpc(&__cd0, FILEXIO_CLOSE, __fileXioBlockMode, __sbuff, sizeof(struct fxio_close_packet), __sbuff, 4, (void *)&_fxio_intr, NULL)) >= 0)
560 {
561 if(__fileXioBlockMode == FXIO_NOWAIT) { rv = 0; }
562 else { rv = __sbuff[0]; }
563 }
564 else
565 SignalSema(__fileXioCompletionSema);
566
567 _unlock();
568 return(rv);
569}
570#endif
571
572#ifdef F_fileXioRead
573static inline void recv_intr(void *data_raw)
574{
575 rests_pkt *rests = UNCACHED_SEG(data_raw);
576
577 if(rests->ssize) memcpy(rests->sbuf, rests->sbuffer, rests->ssize);
578 if(rests->esize) memcpy(rests->ebuf, rests->ebuffer, rests->esize);
579
580 iSignalSema(__fileXioCompletionSema);
581}
582
583int fileXioRead(int fd, void *buf, int size)
584{
585 int rv;
586 struct fxio_read_packet *packet=(struct fxio_read_packet*)__sbuff;
587
588 if(fileXioInit() < 0)
589 return -ENOPKG;
590
591 _lock();
592 WaitSema(__fileXioCompletionSema);
593
594 packet->fd = fd;
595 packet->buffer = buf;
596 packet->size = size;
597 packet->intrData = __intr_data;
598
599 if (!IS_UNCACHED_SEG(buf))
600 sceSifWriteBackDCache(buf, size);
601
602 if((rv = sceSifCallRpc(&__cd0, FILEXIO_READ, __fileXioBlockMode, __sbuff, sizeof(struct fxio_read_packet), __sbuff, 4, &recv_intr, __intr_data)) >= 0)
603 {
604 if(__fileXioBlockMode == FXIO_NOWAIT) { rv = 0; }
605 else { rv = __sbuff[0]; }
606 }
607 else
608 SignalSema(__fileXioCompletionSema);
609
610 _unlock();
611 return(rv);
612}
613#endif
614
615#ifdef F_fileXioWrite
616int fileXioWrite(int fd, const void *buf, int size)
617{
618 unsigned int miss;
619 int rv;
620 struct fxio_write_packet *packet=(struct fxio_write_packet*)__sbuff;
621
622 if(fileXioInit() < 0)
623 return -ENOPKG;
624
625 _lock();
626 WaitSema(__fileXioCompletionSema);
627
628 if((unsigned int)buf & 0x3F)
629 {
630 miss = 64 - ((unsigned int)buf & 0x3F);
631 if(miss > (unsigned int)size) miss = size;
632 } else {
633 miss = 0;
634 }
635
636 packet->fd = fd;
637 packet->buffer = buf;
638 packet->size = size;
639 packet->unalignedDataLen = miss;
640
641 memcpy(packet->unalignedData, buf, miss);
642
643 if(!IS_UNCACHED_SEG(buf))
644 sceSifWriteBackDCache((void*)buf, size);
645
646 if((rv = sceSifCallRpc(&__cd0, FILEXIO_WRITE, __fileXioBlockMode, __sbuff, sizeof(struct fxio_write_packet), __sbuff, 4, (void *)&_fxio_intr, NULL)) >= 0)
647 {
648 if(__fileXioBlockMode == FXIO_NOWAIT) { rv = 0; }
649 else { rv = __sbuff[0]; }
650 }
651 else
652 SignalSema(__fileXioCompletionSema);
653
654 _unlock();
655 return(rv);
656}
657#endif
658
659#ifdef F_fileXioLseek
660int fileXioLseek(int fd, int offset, int whence)
661{
662 int rv;
663 struct fxio_lseek_packet *packet=(struct fxio_lseek_packet*)__sbuff;
664
665 if(fileXioInit() < 0)
666 return -ENOPKG;
667
668 _lock();
669 WaitSema(__fileXioCompletionSema);
670
671 packet->fd = fd;
672 packet->offset = (u32)offset;
673 packet->whence = whence;
674
675 if((rv = sceSifCallRpc(&__cd0, FILEXIO_LSEEK, __fileXioBlockMode, __sbuff, sizeof(struct fxio_lseek_packet), __sbuff, 4, (void *)&_fxio_intr, NULL)) >= 0)
676 {
677 if(__fileXioBlockMode == FXIO_NOWAIT) { rv = 0; }
678 else { rv = __sbuff[0]; }
679 }
680 else
681 SignalSema(__fileXioCompletionSema);
682
683 _unlock();
684 return(rv);
685}
686#endif
687
688#ifdef F_fileXioLseek64
689//
690// NOTE: 64-bit
691//
692s64 fileXioLseek64(int fd, s64 offset, int whence)
693{
694 s64 rv;
695 struct fxio_lseek64_packet *packet=(struct fxio_lseek64_packet*)__sbuff;
696 struct fxio_lseek64_return_pkt *ret_packet=(struct fxio_lseek64_return_pkt*)__sbuff;
697
698 if(fileXioInit() < 0)
699 return -ENOPKG;
700
701 _lock();
702 WaitSema(__fileXioCompletionSema);
703
704 packet->fd = fd;
705 packet->offset_lo = (u32)(offset & 0xffffffff);
706 packet->offset_hi = (u32)((offset >> 32) & 0xffffffff);
707 packet->whence = whence;
708
709 if((rv = sceSifCallRpc(&__cd0, FILEXIO_LSEEK64, __fileXioBlockMode, __sbuff, sizeof(struct fxio_lseek64_packet), __sbuff, 8, (void *)&_fxio_intr, NULL)) >= 0)
710 {
711 if(__fileXioBlockMode == FXIO_NOWAIT) { rv = 0; }
712 else {
713 s64 rvHI = ret_packet->pos_hi;
714 rvHI = rvHI << 32;
715 rv = rvHI | ret_packet->pos_lo;
716 }
717 }
718 else
719 SignalSema(__fileXioCompletionSema);
720
721 _unlock();
722
723 return(rv);
724}
725#endif
726
727#ifdef F_fileXioChStat
728int fileXioChStat(const char *name, iox_stat_t *stat, int mask)
729{
730 int rv;
731 struct fxio_chstat_packet *packet=(struct fxio_chstat_packet*)__sbuff;
732
733 if(fileXioInit() < 0)
734 return -ENOPKG;
735
736 _lock();
737 WaitSema(__fileXioCompletionSema);
738
739 strncpy(packet->pathname, name, sizeof(packet->pathname));
740 packet->stat = stat;
741 packet->mask = mask;
742
743 if(!IS_UNCACHED_SEG(stat))
744 sceSifWriteBackDCache(stat, sizeof(iox_stat_t));
745
746 if((rv = sceSifCallRpc(&__cd0, FILEXIO_CHSTAT, __fileXioBlockMode, __sbuff, sizeof(struct fxio_chstat_packet), __sbuff, 4, (void *)&_fxio_intr, NULL)) >= 0)
747 {
748 if(__fileXioBlockMode == FXIO_NOWAIT) { rv = 0; }
749 else { rv = __sbuff[0]; }
750 }
751 else
752 SignalSema(__fileXioCompletionSema);
753
754 _unlock();
755 return(rv);
756}
757#endif
758
759#ifdef F_fileXioGetStat
760int fileXioGetStat(const char *name, iox_stat_t *stat)
761{
762 int rv;
763 struct fxio_getstat_packet *packet=(struct fxio_getstat_packet*)__sbuff;
764
765 if(fileXioInit() < 0)
766 return -ENOPKG;
767
768 _lock();
769 WaitSema(__fileXioCompletionSema);
770
771 strncpy(packet->pathname, name, sizeof(packet->pathname));
772 packet->stat = stat;
773
774 if(!IS_UNCACHED_SEG(stat))
775 sceSifWriteBackDCache(stat, sizeof(iox_stat_t));
776
777 if((rv = sceSifCallRpc(&__cd0, FILEXIO_GETSTAT, __fileXioBlockMode, __sbuff, sizeof(struct fxio_getstat_packet), __sbuff, 4, (void *)&_fxio_intr, NULL)) >= 0)
778 {
779 if(__fileXioBlockMode == FXIO_NOWAIT) { rv = 0; }
780 else { rv = __sbuff[0]; }
781 }
782 else
783 SignalSema(__fileXioCompletionSema);
784
785 _unlock();
786 return(rv);
787}
788#endif
789
790#ifdef F_fileXioFormat
791int fileXioFormat(const char *dev, const char *blockdev, const void *args, int arglen)
792{
793 int rv;
794 struct fxio_format_packet *packet=(struct fxio_format_packet*)__sbuff;
795
796 if(fileXioInit() < 0)
797 return -ENOPKG;
798
799 _lock();
800 WaitSema(__fileXioCompletionSema);
801
802 strncpy(packet->device, dev, sizeof(packet->device));
803 if(blockdev)
804 strncpy(packet->blockDevice, blockdev, sizeof(packet->blockDevice));
805
806 if((unsigned int)arglen > sizeof(packet->args)) arglen = sizeof(packet->args);
807 memcpy(packet->args, args, arglen);
808 packet->arglen = arglen;
809
810 if((rv = sceSifCallRpc(&__cd0, FILEXIO_FORMAT, __fileXioBlockMode, __sbuff, sizeof(struct fxio_format_packet), __sbuff, 4, (void *)&_fxio_intr, NULL)) >= 0)
811 {
812 if(__fileXioBlockMode == FXIO_NOWAIT) { rv = 0; }
813 else { rv = __sbuff[0]; }
814 }
815 else
816 SignalSema(__fileXioCompletionSema);
817
818 _unlock();
819 return(rv);
820}
821#endif
822
823#ifdef F_fileXioSync
824int fileXioSync(const char *devname, int flag)
825{
826 int rv;
827 struct fxio_sync_packet *packet=(struct fxio_sync_packet*)__sbuff;
828
829 if(fileXioInit() < 0)
830 return -ENOPKG;
831
832 _lock();
833 WaitSema(__fileXioCompletionSema);
834
835 strncpy(packet->device, devname, sizeof(packet->device));
836 packet->flags = flag;
837
838 if((rv = sceSifCallRpc(&__cd0, FILEXIO_SYNC, __fileXioBlockMode, __sbuff, sizeof(struct fxio_sync_packet), __sbuff, 4, (void *)&_fxio_intr, NULL)) >= 0)
839 {
840 if(__fileXioBlockMode == FXIO_NOWAIT) { rv = 0; }
841 else { rv = __sbuff[0]; }
842 }
843 else
844 SignalSema(__fileXioCompletionSema);
845
846 _unlock();
847 return(rv);
848}
849#endif
850
851#ifdef F_fileXioDopen
852int fileXioDopen(const char *name)
853{
854 int rv;
855 struct fxio_pathsel_packet *packet=(struct fxio_pathsel_packet*)__sbuff;
856
857 if(fileXioInit() < 0)
858 return -ENOPKG;
859
860 _lock();
861 WaitSema(__fileXioCompletionSema);
862
863 strncpy(packet->pathname, name, sizeof(packet->pathname));
864 if((rv = sceSifCallRpc(&__cd0, FILEXIO_DOPEN, __fileXioBlockMode, __sbuff, sizeof(struct fxio_pathsel_packet), __sbuff, 4, (void *)&_fxio_intr, NULL)) >= 0)
865 {
866 if(__fileXioBlockMode == FXIO_NOWAIT) { rv = 0; }
867 else { rv = __sbuff[0]; }
868 }
869 else
870 SignalSema(__fileXioCompletionSema);
871
872 _unlock();
873 return(rv);
874}
875#endif
876
877#ifdef F_fileXioDclose
878int fileXioDclose(int fd)
879{
880 int rv;
881 struct fxio_close_packet *packet=(struct fxio_close_packet*)__sbuff;
882
883 if(fileXioInit() < 0)
884 return -ENOPKG;
885
886 _lock();
887 WaitSema(__fileXioCompletionSema);
888
889 packet->fd = fd;
890 if((rv = sceSifCallRpc(&__cd0, FILEXIO_DCLOSE, __fileXioBlockMode, __sbuff, sizeof(struct fxio_close_packet), __sbuff, 4, (void *)&_fxio_intr, NULL)) >= 0)
891 {
892 if(__fileXioBlockMode == FXIO_NOWAIT) { rv = 0; }
893 else { rv = __sbuff[0]; }
894 }
895 else
896 SignalSema(__fileXioCompletionSema);
897
898 _unlock();
899 return(rv);
900}
901#endif
902
903#ifdef F_fileXioDread
904int fileXioDread(int fd, iox_dirent_t *dirent)
905{
906 int rv;
907 struct fxio_dread_packet *packet=(struct fxio_dread_packet*)__sbuff;
908
909 if(fileXioInit() < 0)
910 return -ENOPKG;
911
912 _lock();
913 WaitSema(__fileXioCompletionSema);
914
915 packet->fd = fd;
916 packet->dirent = dirent;
917
918 if (!IS_UNCACHED_SEG(dirent))
919 sceSifWriteBackDCache(dirent, sizeof(iox_dirent_t));
920
921 if((rv = sceSifCallRpc(&__cd0, FILEXIO_DREAD, __fileXioBlockMode, __sbuff, sizeof(struct fxio_dread_packet), __sbuff, 4, (void *)&_fxio_intr, NULL)) >= 0)
922 {
923 if(__fileXioBlockMode == FXIO_NOWAIT) { rv = 0; }
924 else { rv = __sbuff[0]; }
925 }
926 else
927 SignalSema(__fileXioCompletionSema);
928
929 _unlock();
930 return(rv);
931}
932#endif
933
934static inline void fxio_ctl_intr(void *data_raw)
935{
936 struct fxio_ctl_return_pkt *pkt = UNCACHED_SEG(data_raw);
937
938 memcpy(pkt->dest, pkt->buf, pkt->len);
939
940 iSignalSema(__fileXioCompletionSema);
941}
942
943#ifdef F_fileXioDevctl
944int fileXioDevctl(const char *name, int cmd, void *arg, unsigned int arglen, void *buf, unsigned int buflen)
945{
946 struct fxio_devctl_packet *packet = (struct fxio_devctl_packet *)__sbuff;
947 int rv;
948
949 if(fileXioInit() < 0)
950 return -ENOPKG;
951
952 _lock();
953 WaitSema(__fileXioCompletionSema);
954
955 if(arglen > CTL_BUF_SIZE) arglen = CTL_BUF_SIZE;
956 if(buflen > CTL_BUF_SIZE) buflen = CTL_BUF_SIZE;
957 strncpy(packet->name, name, CTL_BUF_SIZE);
958 packet->name[CTL_BUF_SIZE-1] = '\0';
959 memcpy(packet->arg, arg, arglen);
960
961 packet->cmd = cmd;
962 packet->arglen = arglen;
963 packet->buf = buf;
964 packet->buflen = buflen;
965 packet->intr_data = __intr_data;
966
967 sceSifWriteBackDCache(buf, buflen);
968
969 if(buflen)
970 rv = sceSifCallRpc(&__cd0, FILEXIO_DEVCTL, __fileXioBlockMode, packet, sizeof(struct fxio_devctl_packet), __sbuff, 4, &fxio_ctl_intr, __intr_data);
971 else
972 rv = sceSifCallRpc(&__cd0, FILEXIO_DEVCTL, __fileXioBlockMode, packet, sizeof(struct fxio_devctl_packet), __sbuff, 4, (void *)&_fxio_intr, NULL);
973
974 if(rv >= 0)
975 {
976 if(__fileXioBlockMode == FXIO_NOWAIT) { rv = 0; }
977 else { rv = __sbuff[0]; }
978 }
979 else
980 SignalSema(__fileXioCompletionSema);
981
982 _unlock();
983 return(rv);
984}
985#endif
986
987#ifdef F_fileXioIoctl
988int fileXioIoctl(int fd, int cmd, void *arg){
989 struct fxio_ioctl_packet *packet = (struct fxio_ioctl_packet *)__sbuff;
990 int rv;
991
992 if(fileXioInit() < 0)
993 return -ENOPKG;
994
995 _lock();
996 WaitSema(__fileXioCompletionSema);
997
998 memcpy(packet->arg, arg, IOCTL_BUF_SIZE);
999
1000 packet->fd = fd;
1001 packet->cmd = cmd;
1002
1003 if((rv = sceSifCallRpc(&__cd0, FILEXIO_IOCTL, __fileXioBlockMode, packet, sizeof(struct fxio_ioctl_packet), __sbuff, 4, (void *)&_fxio_intr, NULL)) >= 0)
1004 {
1005 if(__fileXioBlockMode == FXIO_NOWAIT) { rv = 0; }
1006 else { rv = __sbuff[0]; }
1007 }
1008 else
1009 SignalSema(__fileXioCompletionSema);
1010
1011 _unlock();
1012 return(rv);
1013}
1014#endif
1015
1016#ifdef F_fileXioIoctl2
1017int fileXioIoctl2(int fd, int command, void *arg, unsigned int arglen, void *buf, unsigned int buflen)
1018{
1019 struct fxio_ioctl2_packet *packet = (struct fxio_ioctl2_packet *)__sbuff;
1020 int rv;
1021
1022 if(fileXioInit() < 0)
1023 return -ENOPKG;
1024
1025 _lock();
1026 WaitSema(__fileXioCompletionSema);
1027
1028 if(arglen > CTL_BUF_SIZE) arglen = CTL_BUF_SIZE;
1029 if(buflen > CTL_BUF_SIZE) buflen = CTL_BUF_SIZE;
1030 memcpy(packet->arg, arg, arglen);
1031
1032 packet->fd = fd;
1033 packet->cmd = command;
1034 packet->arglen = arglen;
1035 packet->buf = buf;
1036 packet->buflen = buflen;
1037 packet->intr_data = __intr_data;
1038
1039 sceSifWriteBackDCache(buf, buflen);
1040
1041 if(buflen)
1042 rv = sceSifCallRpc(&__cd0, FILEXIO_IOCTL2, __fileXioBlockMode, packet, sizeof(struct fxio_ioctl2_packet), __sbuff, 4, &fxio_ctl_intr, __intr_data);
1043 else
1044 rv = sceSifCallRpc(&__cd0, FILEXIO_IOCTL2, __fileXioBlockMode, packet, sizeof(struct fxio_ioctl2_packet), __sbuff, 4, (void *)&_fxio_intr, NULL);
1045
1046 if(rv >= 0)
1047 {
1048 if(__fileXioBlockMode == FXIO_NOWAIT) { rv = 0; }
1049 else { rv = __sbuff[0]; }
1050 }
1051 else
1052 SignalSema(__fileXioCompletionSema);
1053
1054 _unlock();
1055 return(rv);
1056}
1057#endif
1058
1059#ifdef F_fileXioWaitAsync
1060int fileXioWaitAsync(int mode, int *retVal)
1061{
1062 if(fileXioInit() < 0)
1063 return -ENOPKG;
1064
1065 if(__fileXioBlockMode != FXIO_NOWAIT) return 0;
1066
1067 switch(mode)
1068 {
1069 case FXIO_WAIT:
1070
1071 WaitSema(__fileXioCompletionSema);
1072 SignalSema(__fileXioCompletionSema);
1073
1074 if(retVal != NULL)
1075 *retVal = *(int *)UNCACHED_SEG(&__sbuff[0]);
1076
1077 return FXIO_COMPLETE;
1078
1079 case FXIO_NOWAIT:
1080
1081 if(PollSema(__fileXioCompletionSema) < 0)
1082 return FXIO_INCOMPLETE;
1083
1084 SignalSema(__fileXioCompletionSema);
1085
1086 if(retVal != NULL)
1087 *retVal = *(int *)UNCACHED_SEG(&__sbuff[0]);
1088
1089 return FXIO_COMPLETE;
1090
1091 default:
1092 return -1;
1093 }
1094}
1095#endif
1096
1097#ifdef F_fileXioSetBlockMode
1098void fileXioSetBlockMode(int blocking)
1099{
1100 __fileXioBlockMode = blocking;
1101}
1102#endif
1103
1104#ifdef F_fileXioSetRWBufferSize
1105int fileXioSetRWBufferSize(int size){
1106 struct fxio_rwbuff *packet = (struct fxio_rwbuff *)__sbuff;
1107 int rv;
1108
1109 if(fileXioInit() < 0)
1110 return -ENOPKG;
1111
1112 _lock();
1113 WaitSema(__fileXioCompletionSema);
1114
1115 packet->size = size;
1116
1117 if((rv = sceSifCallRpc(&__cd0, FILEXIO_SETRWBUFFSIZE, 0, packet, sizeof(struct fxio_rwbuff), __sbuff, 4, (void *)&_fxio_intr, NULL)) >= 0)
1118 {
1119 rv = __sbuff[0];
1120 }
1121 else
1122 SignalSema(__fileXioCompletionSema);
1123
1124 _unlock();
1125 return(rv);
1126}
1127#endif
#define ENOPKG
Definition errno.h:145
Definition fileXio.h:100
typedef __attribute__
Definition tlbfunc.c:60