29#include "pfs_fioctl.h"
32IRX_ID(
"pfs_driver", PFS_MAJOR, PFS_MINOR);
78char *pfsFilename = NULL;
80extern u32 pfsMetaSize;
87static int printPfsArgError(
void);
88static int allocateMountBuffer(
int size);
93static int printPfsArgError(
void)
95 PFS_PRINTF(PFS_DRV_NAME
" ERROR: Usage: %s [-m <maxmount>] [-o <maxopen>] [-n <numbuffer>]\n", pfsFilename);
97 return MODULE_NO_RESIDENT_END;
100static int allocateMountBuffer(
int size)
104 pfsMountBuf = pfsAllocMem(tsize);
108 memset(pfsMountBuf, 0, tsize);
113static int freeMountBuffer()
115 pfsFreeMem(pfsMountBuf);
126 if((u32)unit>=pfsConfig.maxMount)
129 if(!(pfsMountBuf[unit].flags & PFS_MOUNT_BUSY))
132 return &pfsMountBuf[unit];
136int PFS_ENTRYPOINT(
int argc,
char *argv[],
void *startaddr,
ModuleInfo_t *mi)
138int PFS_ENTRYPOINT(
int argc,
char *argv[])
153 for ( i = 0; i < pfsConfig.maxOpen; i += 1 )
155 if ( pfsFileSlots[i].clink )
157 PFS_PRINTF(PFS_DRV_NAME
": error: can't stop module(fd busy)\n");
158 return MODULE_REMOVABLE_END;
161 iomanX_DelDrv(pfsFioDev.name);
163 pfsFreeMem(pfsFileSlots);
165 PFS_PRINTF(PFS_DRV_NAME
": stopped module\n");
166 return MODULE_NO_RESIDENT_END;
170 PFS_PRINTF(PFS_DRV_NAME
" Playstation Filesystem Driver v%d.%d\nps2fs: (c) 2003 Sjeep, Vector and Florin Sasu\n", PFS_MAJOR, PFS_MINOR);
173 filename = strrchr(argv[0],
'/');
175 pfsFilename = filename;
177 pfsFilename = argv[0];
185 if(argv[0][0] !=
'-')
188 if(!strcmp(argv[0],
"-m"))
191 return printPfsArgError();
194 number = strtol(argv[0], 0, 10);
197 pfsConfig.maxMount = number;
199 else if(!strcmp(argv[0],
"-o"))
202 return printPfsArgError();
205 number = strtol(argv[0], NULL, 10);
208 pfsConfig.maxOpen = number;
210 else if(!strcmp(argv[0],
"-n"))
213 return printPfsArgError();
216 number = strtol(argv[0], NULL, 10);
222 PFS_PRINTF(PFS_DRV_NAME
" ERROR: Number of buffers is larger than 127!\n");
227 return printPfsArgError();
233 PFS_PRINTF(PFS_DRV_NAME
" Max mount: %ld, Max open: %ld, Number of buffers: %d\n", pfsConfig.maxMount,
234 pfsConfig.maxOpen, numBuf);
237 reqBuf = (pfsConfig.maxOpen * 2) + 8;
239 PFS_PRINTF(PFS_DRV_NAME
" Warning: %d buffers may be needed, but only %d buffers are allocated\n", reqBuf, numBuf);
241 if(allocateMountBuffer(pfsConfig.maxMount) < 0)
242 return MODULE_NO_RESIDENT_END;
246 pfsFileSlots = pfsAllocMem(size);
247 ret = (pfsFileSlots == NULL) ? -
ENOMEM : 0;
250 PFS_PRINTF(PFS_DRV_NAME
" Error: Failed to allocate memory for file descriptors!\n");
251 return MODULE_NO_RESIDENT_END;
254 memset(pfsFileSlots, 0, size);
256 if(pfsCacheInit(numBuf, pfsMetaSize) < 0)
257 return MODULE_NO_RESIDENT_END;
259 iomanX_DelDrv(pfsFioDev.name);
260 if(iomanX_AddDrv(&pfsFioDev) == 0) {
261#if defined(PFS_XOSD_VER)
262 PFS_PRINTF(PFS_DRV_NAME
" version %04x driver start. This is OSD LBA48 VERSION !!!!!!!!!!!\n", IRX_VER(PFS_MAJOR, PFS_MINOR));
263#elif defined(PFS_OSD_VER)
264 PFS_PRINTF(PFS_DRV_NAME
" version %04x driver start. This is OSD version!\n", IRX_VER(PFS_MAJOR, PFS_MINOR));
266 PFS_PRINTF(PFS_DRV_NAME
" version %04x driver start.\n", IRX_VER(PFS_MAJOR, PFS_MINOR));
269 if (mi && ((mi->
newflags & 2) != 0))
272 return MODULE_RESIDENT_END;
275 return MODULE_NO_RESIDENT_END;