33#define MODNAME "fileXio"
34IRX_ID(
"IOX/File_Manager_Rpc", 1, 2);
36#define M_PRINTF(format, args...) \
37 printf(MODNAME ": " format, ##args)
40#define M_DEBUG M_PRINTF
42#define M_DEBUG(format, args...)
48#define MIN(a, b) (((a)<(b))?(a):(b))
49#define RDOWN_64(a) ((unsigned int)(a)&~0x3F)
51#define DEFAULT_RWSIZE 16384
52static void *rwbuf = NULL;
53static unsigned int RWBufferSize=DEFAULT_RWSIZE;
57static unsigned char fileXio_rpc_buffer[0x4C00]
__attribute__((__aligned__(4)));
64static int fileXio_GetDeviceList_RPC(
struct fileXioDevice* ee_devices,
int eecount);
65static int fileXio_CopyFile_RPC(
const char *src,
const char *dest,
int mode);
66static int fileXio_Read_RPC(
int infd,
char *read_buf,
int read_size,
void *intr_data);
67static int fileXio_Write_RPC(
int outfd,
const char *write_buf,
int write_size,
int mis,u8 *misbuf);
68static int fileXio_GetDir_RPC(
const char* pathname,
struct fileXioDirEntry dirEntry[],
unsigned int req_entries);
69static int fileXio_Mount_RPC(
const char* mountstring,
const char* mountpoint,
int flag);
70static int fileXio_chstat_RPC(
char *filename,
void* eeptr,
int mask);
71static int fileXio_getstat_RPC(
char *filename,
void* eeptr);
72static int fileXio_dread_RPC(
int fd,
void* eeptr);
75static void* fileXioRpc_Stop();
76static void* fileXioRpc_GetDeviceList(
unsigned int* sbuff);
77static void* fileXioRpc_Getdir(
unsigned int* sbuff);
78static void* fileXioRpc_Mount(
unsigned int* sbuff);
79static void* fileXioRpc_uMount(
unsigned int* sbuff);
80static void* fileXioRpc_CopyFile(
unsigned int* sbuff);
81static void* fileXioRpc_MkDir(
unsigned int* sbuff);
82static void* fileXioRpc_RmDir(
unsigned int* sbuff);
83static void* fileXioRpc_Remove(
unsigned int* sbuff);
84static void* fileXioRpc_Rename(
unsigned int* sbuff);
85static void* fileXioRpc_SymLink(
unsigned int* sbuff);
86static void* fileXioRpc_ReadLink(
unsigned int* sbuff);
87static void* fileXioRpc_ChDir(
unsigned int* sbuff);
88static void* fileXioRpc_Open(
unsigned int* sbuff);
89static void* fileXioRpc_Close(
unsigned int* sbuff);
90static void* fileXioRpc_Read(
unsigned int* sbuff);
91static void* fileXioRpc_Write(
unsigned int* sbuff);
92static void* fileXioRpc_Lseek(
unsigned int* sbuff);
93static void* fileXioRpc_Lseek64(
unsigned int* sbuff);
94static void* fileXioRpc_ChStat(
unsigned int* sbuff);
95static void* fileXioRpc_GetStat(
unsigned int* sbuff);
96static void* fileXioRpc_Format(
unsigned int* sbuff);
97static void* fileXioRpc_AddDrv(
unsigned int* sbuff);
98static void* fileXioRpc_DelDrv(
unsigned int* sbuff);
99static void* fileXioRpc_Sync(
unsigned int* sbuff);
100static void* fileXioRpc_Devctl(
unsigned int* sbuff);
101static void* fileXioRpc_Ioctl(
unsigned int* sbuff);
102static void* fileXioRpc_Ioctl2(
unsigned int* sbuff);
103static void* fileXioRpc_Dopen(
unsigned int* sbuff);
104static void* fileXioRpc_Dread(
unsigned int* sbuff);
105static void* fileXioRpc_Dclose(
unsigned int* sbuff);
106static void* filexioRpc_SetRWBufferSize(
void *sbuff);
107static void* fileXioRpc_Getdir(
unsigned int* sbuff);
111static void* fileXio_rpc_server(
int fno,
void *data,
int size);
112static void fileXio_Thread(
void* param);
114int _start(
int argc,
char *argv[])
123 param.thread = (
void*)fileXio_Thread;
125 param.stacksize = 0x8000;
128 th = CreateThread(¶m);
132 StartThread(th, NULL);
133 result=MODULE_RESIDENT_END;
135 else result=MODULE_NO_RESIDENT_END;
140static int fileXio_GetDeviceList_RPC(
struct fileXioDevice* ee_devices,
int eecount)
142 int device_count = 0;
145 while (device_count < eecount && devices[device_count])
148 strncpy(local_devices[device_count].name, device->name, 128);
149 local_devices[device_count].name[15] =
'\0';
150 local_devices[device_count].type = device->type;
151 local_devices[device_count].version = device->
version;
152 strncpy(local_devices[device_count].desc, device->desc, 128);
153 local_devices[device_count].desc[127] =
'\0';
161 dmaStruct.src = local_devices;
162 dmaStruct.dest = ee_devices;
163 dmaStruct.size =
sizeof(
struct fileXioDevice) * device_count;
168 sceSifSetDma(&dmaStruct, 1);
174static int fileXio_CopyFile_RPC(
const char *src,
const char *dest,
int mode)
177 int infd, outfd, size, remain, i;
179 if ((infd = iomanX_open(src, FIO_O_RDONLY, 0666)) < 0) {
182 if ((outfd = iomanX_open(dest, FIO_O_RDWR|FIO_O_CREAT|FIO_O_TRUNC, 0666)) < 0) {
186 size = iomanX_lseek(infd, 0, FIO_SEEK_END);
187 iomanX_lseek(infd, 0, FIO_SEEK_SET);
191 remain = size % RWBufferSize;
192 for (i = 0; (
unsigned int)i < (size / RWBufferSize); i++) {
193 iomanX_read(infd, rwbuf, RWBufferSize);
194 iomanX_write(outfd, rwbuf, RWBufferSize);
196 iomanX_read(infd, rwbuf, remain);
197 iomanX_write(outfd, rwbuf, remain);
202 iomanX_chstat(dest, &stat, 1);
207static int fileXio_Read_RPC(
int infd,
char *read_buf,
int read_size,
void *intr_data)
221 int read_buf2 = (int)read_buf;
228 erest = asize = abuffer = 0;
232 if ((read_buf2 & 0x3F) == 0)
235 srest=(int)RDOWN_64(read_buf2) - read_buf2 + 64;
237 abuffer = read_buf2 + srest;
238 aebuffer=(
void *)RDOWN_64(read_buf2 + read_size);
239 asize = (int)aebuffer - (
int)abuffer;
240 erest = (read_buf2 + read_size) - (
int)aebuffer;
244 if (srest!=(rlen=iomanX_read(infd, rests.sbuffer, srest)))
246 total += srest = (rlen>0 ? rlen:0);
256 readlen=MIN(RWBufferSize, (
unsigned int)asize);
258 while(sceSifDmaStat(status)>=0);
260 rlen=iomanX_read(infd, rwbuf, readlen);
262 if (rlen<=0)
goto EXIT;
263 dmaStruct.dest=(
void *)abuffer;
266 dmaStruct.src =rwbuf;
268 sceSifSetDma(&dmaStruct, 1);
275 dmaStruct.dest=(
void *)abuffer;
279 dmaStruct.src =rwbuf;
281 status=sceSifSetDma(&dmaStruct, 1);
287 rlen = iomanX_read(infd, rests.ebuffer, erest);
288 total += (rlen>0 ? rlen : 0);
294 rests.ebuf =aebuffer;
295 dmaStruct.src =&rests;
298 dmaStruct.dest=intr_data;
300 sceSifSetDma(&dmaStruct, 1);
305static int fileXio_Write_RPC(
int outfd,
const char *write_buf,
int write_size,
int mis,u8 *misbuf)
317 wlen=iomanX_write(outfd, misbuf, mis);
328 pos=(int)write_buf+mis;
331 writelen = MIN(RWBufferSize, (
unsigned int)left);
332 sceSifGetOtherData(&rdata, (
void *)pos, rwbuf, writelen, 0);
333 wlen=iomanX_write(outfd, rwbuf, writelen);
334 if (wlen != writelen){
349static int fileXio_GetDir_RPC(
const char* pathname,
struct fileXioDirEntry dirEntry[],
unsigned int req_entries)
358 M_DEBUG(
"GetDir Request '%s'\n",pathname);
362 fd = iomanX_dopen(pathname);
373 memset(&dirbuf, 0,
sizeof(dirbuf));
374 res = iomanX_dread(fd, &dirbuf);
382 if ((
unsigned int)matched_entries == req_entries)
385 return (matched_entries);
389 while(sceSifDmaStat(dmaID)>=0);
390 DirEntryCopy(&localDirEntry, &dirbuf);
393 dmaStruct.src = &localDirEntry;
394 dmaStruct.dest = &dirEntry[matched_entries];
399 dmaID = sceSifSetDma(&dmaStruct, 1);
409 return (matched_entries);
413static int fileXio_Mount_RPC(
const char* mountstring,
const char* mountpoint,
int flag)
416 M_DEBUG(
"Mount Request mountpoint:'%s' - '%s' - %d\n",mountpoint,mountstring,flag);
417 res = iomanX_mount(mountpoint, mountstring, flag, NULL, 0);
421static int fileXio_chstat_RPC(
char *filename,
void* eeptr,
int mask)
427 sceSifGetOtherData(&rdata, (
void *)eeptr, &localStat, 64, 0);
429 res = iomanX_chstat(filename, &localStat, mask);
433static int fileXio_getstat_RPC(
char *filename,
void* eeptr)
440 res = iomanX_getstat(filename, &localStat);
446 dmaStruct.src = &localStat;
447 dmaStruct.dest = eeptr;
452 sceSifSetDma(&dmaStruct, 1);
459static int fileXio_dread_RPC(
int fd,
void* eeptr)
466 res = iomanX_dread(fd, &localDir);
471 dmaStruct.src = &localDir;
472 dmaStruct.dest = eeptr;
473 dmaStruct.size = 64+256;
477 sceSifSetDma(&dmaStruct, 1);
484static void* fileXioRpc_Stop(
void)
486 M_DEBUG(
"Stop Request\n");
493static void* fileXioRpc_GetDeviceList(
unsigned int* sbuff)
498 ret=fileXio_GetDeviceList_RPC(
510static void* fileXioRpc_Getdir(
unsigned int* sbuff)
515 ret=fileXio_GetDir_RPC(
527static void* fileXioRpc_Mount(
unsigned int* sbuff)
532 M_DEBUG(
"Mount Request\n");
533 ret=fileXio_Mount_RPC(
546static void* fileXioRpc_uMount(
unsigned int* sbuff)
551 M_DEBUG(
"uMount Request\n");
552 ret=iomanX_umount(packet->mountpoint);
560static void* fileXioRpc_CopyFile(
unsigned int* sbuff)
565 ret=fileXio_CopyFile_RPC(
578static void* fileXioRpc_MkDir(
unsigned int* sbuff)
583 M_DEBUG(
"MkDir Request\n");
584 ret=iomanX_mkdir(packet->pathname, packet->mode);
591static void* fileXioRpc_RmDir(
unsigned int* sbuff)
596 M_DEBUG(
"RmDir Request\n");
597 ret=iomanX_rmdir(packet->pathname);
604static void* fileXioRpc_Remove(
unsigned int* sbuff)
609 M_DEBUG(
"Remove Request\n");
610 ret=iomanX_remove(packet->pathname);
618static void* fileXioRpc_Rename(
unsigned int* sbuff)
623 M_DEBUG(
"Rename Request\n");
624 ret=iomanX_rename(packet->source, packet->dest);
632static void* fileXioRpc_SymLink(
unsigned int* sbuff)
637 M_DEBUG(
"SymLink Request\n");
638 ret=iomanX_symlink(packet->source, packet->dest);
647static void* fileXioRpc_ReadLink(
unsigned int* sbuff)
652 M_DEBUG(
"ReadLink Request\n");
653 ret=iomanX_readlink(packet->source, packet->buffer, packet->buflen);
660void* fileXioRpc_ChDir(
unsigned int* sbuff)
663 M_DEBUG(
"ChDir Request '%s'\n", (
char*)sbuff);
664 ret=iomanX_chdir((
char*)sbuff);
673static void* fileXioRpc_Open(
unsigned int* sbuff)
678 M_DEBUG(
"Open Request '%s' f:0x%x m:0x%x\n", packet->pathname, packet->flags, packet->mode);
679 ret=iomanX_open(packet->pathname, packet->flags, packet->mode);
686static void* fileXioRpc_Close(
unsigned int* sbuff)
691 M_DEBUG(
"Close Request fd:%d\n", packet->fd);
692 ret=iomanX_close(packet->fd);
701static void* fileXioRpc_Read(
unsigned int* sbuff)
706 M_DEBUG(
"Read Request fd:%d, size:%d\n", packet->fd, packet->size);
707 ret=fileXio_Read_RPC(packet->fd, packet->buffer, packet->size, packet->intrData);
717static void* fileXioRpc_Write(
unsigned int* sbuff)
722 M_DEBUG(
"Write Request fd:%d, size:%d\n", packet->fd, packet->size);
723 ret=fileXio_Write_RPC(packet->fd, packet->buffer, packet->size,
724 packet->unalignedDataLen, packet->unalignedData);
733static void* fileXioRpc_Lseek(
unsigned int* sbuff)
738 M_DEBUG(
"Lseek Request fd:%d off:%d mode:%d\n", packet->fd, packet->offset, packet->whence);
739 ret=iomanX_lseek(packet->fd, (
long int)packet->offset, packet->whence);
748static void* fileXioRpc_Lseek64(
unsigned int* sbuff)
754 M_DEBUG(
"Lseek64 Request...\n");
756 long long offsetHI = packet->offset_hi;
757 offsetHI = offsetHI << 32;
758 long long offset = offsetHI | packet->offset_lo;
759 M_DEBUG(
"Lseek64 Request fd:%d off:%lld, mode:%d\n", packet->fd, offset, packet->whence);
761 ret=iomanX_lseek64(packet->fd, offset, packet->whence);
762 ret_packet->pos_lo = (u32)(ret & 0xffffffff);
763 ret_packet->pos_hi = (u32)((ret >> 32) & 0xffffffff);
772static void* fileXioRpc_ChStat(
unsigned int* sbuff)
777 M_DEBUG(
"ChStat Request '%s'\n", packet->pathname);
778 ret=fileXio_chstat_RPC(packet->pathname, packet->stat, packet->mask);
786static void* fileXioRpc_GetStat(
unsigned int* sbuff)
791 M_DEBUG(
"GetStat Request '%s'\n", packet->pathname);
792 ret=fileXio_getstat_RPC(packet->pathname, packet->stat);
802static void* fileXioRpc_Format(
unsigned int* sbuff)
807 M_DEBUG(
"Format Request dev:'%s' bd:'%s'\n", packet->device, packet->blockDevice);
808 ret=
iomanX_format(packet->device, packet->blockDevice, packet->args, packet->arglen);
814static void* fileXioRpc_AddDrv(
unsigned int* sbuff)
817 M_DEBUG(
"AddDrv Request\n");
825static void* fileXioRpc_DelDrv(
unsigned int* sbuff)
828 M_DEBUG(
"DelDrv Request\n");
837static void* fileXioRpc_Sync(
unsigned int* sbuff)
842 M_DEBUG(
"Sync Request\n");
843 ret=iomanX_sync(packet->device, packet->flags);
850static void* fileXioRpc_Devctl(
unsigned int* sbuff)
858 M_DEBUG(
"Devctl Request '%s' cmd:%d\n", packet->name, packet->cmd);
860 ret = iomanX_devctl(packet->name, packet->cmd, packet->arg, packet->arglen, ret_buf->buf, packet->buflen);
863 if(packet->buflen != 0)
865 dmatrans.src = ret_buf;
866 dmatrans.dest = packet->intr_data;
870 ret_buf->dest = packet->buf;
874 ret_buf->len = packet->buflen;
879 sceSifSetDma(&dmatrans, 1);
888static void* fileXioRpc_Ioctl(
unsigned int* sbuff)
893 M_DEBUG(
"Ioctl Request fd:%d cmd:%d\n", packet->fd, packet->cmd);
896 ret=iomanX_ioctl(packet->fd, packet->cmd, packet->arg);
902static void* fileXioRpc_Ioctl2(
unsigned int* sbuff)
910 M_DEBUG(
"ioctl2 Request fd:%d cmd:%d\n", packet->fd, packet->cmd);
912 ret = iomanX_ioctl2(packet->fd, packet->cmd, packet->arg, packet->arglen, ret_buf->buf, packet->buflen);
915 if(packet->buflen != 0)
917 dmatrans.src = ret_buf;
918 dmatrans.dest = packet->intr_data;
922 ret_buf->dest = packet->buf;
926 ret_buf->len = packet->buflen;
931 sceSifSetDma(&dmatrans, 1);
939static void* fileXioRpc_Dopen(
unsigned int* sbuff)
944 M_DEBUG(
"Dopen Request '%s'\n", packet->pathname);
945 ret=iomanX_dopen(packet->pathname);
950static void* fileXioRpc_Dread(
unsigned int* sbuff)
955 M_DEBUG(
"Dread Request fd:%d\n", packet->fd);
956 ret=fileXio_dread_RPC(packet->fd, packet->dirent);
961static void* fileXioRpc_Dclose(
unsigned int* sbuff)
966 M_DEBUG(
"Dclose Request fd:%d\n", packet->fd);
967 ret=iomanX_dclose(packet->fd);
977static void fileXio_Thread(
void* param)
983 M_PRINTF(
"fileXio: fileXio RPC Server v1.00\nCopyright (c) 2003 adresd\n");
984 M_DEBUG(
"fileXio: RPC Initialize\n");
988 RWBufferSize=DEFAULT_RWSIZE;
990 rwbuf = AllocSysMemory(ALLOC_FIRST, RWBufferSize, NULL);
994 M_DEBUG(
"Failed to allocate memory for RW buffer!\n");
999 sceSifSetRpcQueue(&qd, GetThreadId());
1000 sceSifRegisterRpc(&sd0, FILEXIO_IRX, &fileXio_rpc_server, fileXio_rpc_buffer, NULL, NULL, &qd);
1004static void* filexioRpc_SetRWBufferSize(
void *sbuff)
1010 FreeSysMemory(rwbuf);
1016 rwbuf=AllocSysMemory(ALLOC_FIRST, RWBufferSize, NULL);
1019 ((
int*)sbuff)[0] = rwbuf!=NULL?0:-
ENOMEM;
1023static void* fileXio_rpc_server(
int fno,
void *data,
int size)
1029 return fileXioRpc_Dopen((
unsigned*)data);
1031 return fileXioRpc_Dread((
unsigned*)data);
1032 case FILEXIO_DCLOSE:
1033 return fileXioRpc_Dclose((
unsigned*)data);
1035 return fileXioRpc_Mount((
unsigned*)data);
1036 case FILEXIO_UMOUNT:
1037 return fileXioRpc_uMount((
unsigned*)data);
1038 case FILEXIO_GETDIR:
1039 return fileXioRpc_Getdir((
unsigned*)data);
1040 case FILEXIO_COPYFILE:
1041 return fileXioRpc_CopyFile((
unsigned*)data);
1043 return fileXioRpc_Stop();
1045 return fileXioRpc_ChDir((
unsigned*)data);
1046 case FILEXIO_RENAME:
1047 return fileXioRpc_Rename((
unsigned*)data);
1049 return fileXioRpc_MkDir((
unsigned*)data);
1051 return fileXioRpc_RmDir((
unsigned*)data);
1052 case FILEXIO_REMOVE:
1053 return fileXioRpc_Remove((
unsigned*)data);
1055 return fileXioRpc_Open((
unsigned*)data);
1057 return fileXioRpc_Close((
unsigned*)data);
1059 return fileXioRpc_Read((
unsigned*)data);
1061 return fileXioRpc_Write((
unsigned*)data);
1063 return fileXioRpc_Lseek((
unsigned*)data);
1065 return fileXioRpc_Ioctl((
unsigned*)data);
1066 case FILEXIO_GETSTAT:
1067 return fileXioRpc_GetStat((
unsigned*)data);
1068 case FILEXIO_CHSTAT:
1069 return fileXioRpc_ChStat((
unsigned*)data);
1070 case FILEXIO_FORMAT:
1071 return fileXioRpc_Format((
unsigned*)data);
1072 case FILEXIO_ADDDRV:
1073 return fileXioRpc_AddDrv((
unsigned*)data);
1074 case FILEXIO_DELDRV:
1075 return fileXioRpc_DelDrv((
unsigned*)data);
1077 return fileXioRpc_Sync((
unsigned*)data);
1078 case FILEXIO_DEVCTL:
1079 return fileXioRpc_Devctl((
unsigned*)data);
1080 case FILEXIO_SYMLINK:
1081 return fileXioRpc_SymLink((
unsigned*)data);
1082 case FILEXIO_READLINK:
1083 return fileXioRpc_ReadLink((
unsigned*)data);
1084 case FILEXIO_IOCTL2:
1085 return fileXioRpc_Ioctl2((
unsigned*)data);
1086 case FILEXIO_LSEEK64:
1087 return fileXioRpc_Lseek64((
unsigned*)data);
1088 case FILEXIO_GETDEVICELIST:
1089 return fileXioRpc_GetDeviceList((
unsigned*)data);
1090 case FILEXIO_SETRWBUFFSIZE:
1091 return filexioRpc_SetRWBufferSize(data);
1100 dirEntry->fileSize = internalDirEntry->stat.size;
1101 dirEntry->fileProperties = internalDirEntry->stat.attr;
1102 strncpy(dirEntry->filename,internalDirEntry->name,127);
1103 dirEntry->filename[127] =
'\0';
int CpuResumeIntr(int state)
int CpuSuspendIntr(int *state)
int iomanX_format(const char *dev, const char *blockdev, void *arg, int arglen)
kbd_dev * devices[PS2KBD_MAXDEV]