📄 cdromfslib.c
字号:
#include <private/cdromFsVersionP.h> /* CDROMFS_VERSION SPR#78687 */#include <cdromFsLib.h>#include <private/cdromFsLibP.h> /* Must be after cdromFsLib.h *//* For common source with VxWorks AE */#ifdef _WRS_VXWORKS_5_X /* Built for Veloce T2.2 */#undef VXWORKS_AE /* Not built for VxWorks AE */#elif !defined(KHEAP_ALLOC) /* Built for T2 VxWorks 5.4 */#undef VXWORKS_AE /* Not built for VxWorks AE */#define KHEAP_ALLOC malloc#define KHEAP_FREE free#else /* VxWorks AE */#define VXWORKS_AE /* Built for VxWorks AE */#include <objLib.h> /* objOwnerSet() */#include <pdLlib.h> /* pdIdKernelGet() */#endif /* VxWorks AE *//* defines */#define SIZE64/* DEBUG */#ifdef DEBUG#undef NDEBUG /* assert() is active */#define ERR_SET_SELF /* Display errnoSet() calls */#undef LOCAL#define LOCAL int cdromFsDbg = 0; u_char dbgvBuf[2048];#define DBG_MSG(level)\ if ((level)<=cdromFsDbg) printf#define DBG_COP_TO_BUF(str, len)\ {\ bzero (dbgvBuf, sizeof(dbgvBuf));\ bcopy ((str), dbgvBuf, (len));\ }extern void d (FAST void *adrs, int nunits, int width);#else /* DEBUG */#define NDEBUG /* assert() is inactive */#undef ERR_SET_SELF /* Do not display errnoSet calls */#define DBG_MSG(level) if (0) printf#define DBG_COP_TO_BUF(str, len) (str,len)#endif /* DEBUG */#include <assert.h> /* This must follow the ifdef DEBUG *//* sybsystem version fields SPR#78687 */#define SUBSYSTEM_VERSION_MAJOR(VERSION) LMSB(VERSION)#define SUBSYSTEM_VERSION_MINOR(VERSION) LNMSB(VERSION)#define SUBSYSTEM_VERSION_PATCH(VERSION) LNLSB(VERSION)#define SUBSYSTEM_VERSION_BUILD(VERSION) LLSB(VERSION)/* paramaters (Can be changed) */#define CDROM_LIB_MAX_PT_SIZE (4*64 KB) /* maximum path table size supported *//* constants (Cannot be changed or no need to change) */#define SLASH '/'#define BACK_SLASH '\\'#define POINT '.'#define SEMICOL ';'/* SEC_BUF struct constant */#define CDROM_COM_BUF_SIZE 3 /* sectors to read via single access *//* * All character variables in the module are defined as u_char (*). * Following macros are defined to prevent compilation warnings */#define bzero(a,b) bzero ((char *)(a), (b))#define bcopy(a,b,c) bcopy ((char *)(a), (char *)(b), (c))#define strncpy(a,b,c) strncpy ((char *)(a), (char *)(b), (c))#define strcpy(a,b) strcpy ((char *)(a), (char *)(b))#define strncmp(a,b,c) strncmp ((char *)(a), (char *)(b), (c))#define strcmp(a,b) strcmp ((char *)(a), (char *)(b))#define strchr(a,b) strchr ((char *)(a), (b))#define strspn(a,b) strspn ((char *)(a), (char *)(b))/* * Under development all errors are not set to <errno> directly, but * logged on the console with some comments */#ifdef ERR_SET_SELF#define errnoSet(a) errnoSetOut (__LINE__, (u_char *)#a, (a))#endif/* Macros *//* data fields in buffer may not be bounded correctly */#define C_BUF_TO_SHORT(dest, source, start)\ {\ CDROM_SHORT buf;\ bcopy ((u_char *)(source)+ (start), (u_char *)&buf, sizeof(buf));\ (dest) = buf;\ }#define C_BUF_TO_LONG(dest, source, start)\ {\ CDROM_LONG buf;\ bcopy ((u_char *)(source)+ (start), (u_char *)&buf, sizeof(buf));\ (dest) = buf;\ }#define LAST_BITS(val,bitNum) ((~((u_long)(-1)<<(bitNum)))&((u_long)val)) /* Rounded up number of as per b */#define A_PER_B(a,b) (((a)+(b)-1)/(a))/* to get some fields from path table records */#define PT_REC_SIZE(size, pPT) ((size) = ((u_char)(*(pPT)+(*(pPT)&1))+ISO_PT_REC_DI))#define PT_PARENT_REC(prev, pPT)\ C_BUF_TO_SHORT (prev, pPT, ISO_PT_REC_PARENT_DIR_N)/* to assign secBuf as empty */#define LET_SECT_BUF_EMPTY(pSecBuf) ((pSecBuf)->numSects = 0)/* Logical expressions */#define IF_A_THEN_B(A,B) (~((A) && ~(B)))/* typedefs */#ifdef SIZE64typedef long long fsize_t;#elsetypedef size_t fsize_t;#endif /* SIZE64 */typedef u_short CDROM_SHORT; /* 2-bytes fields */typedef u_long CDROM_LONG; /* 4-bytes fields *//* globals */STATUS cdromFsInit (void);/* cdrom file system number in driver table */int cdromFsDrvNum = ERROR;/* locals */#ifdef DEBUG/* * Pointers to structs for symbolic debugging use * * If you need to display a struct, set one of these pointers and then * print it. */T_ISO_VD_HEAD * pCdromFsDbgTIsoVdHead; /* VD header */T_ISO_VD_DATE_TIME * pCdromFsDbgTIsoVdDateTime; /* VolDesc date/time */T_ISO_PVD_SVD * pCdromFsDbgTIsoPvdSvd; /* Prim/Sup Volume Descriptor */SEC_BUF * pCdromFsDbgSecBuf; /* Sector buf (Disk cache) */CDROM_VOL_DESC * pCdromFsDbgVolDesc; /* Mounted CD volume */T_CDROMFS_VD_LST * pCdromFsDbgTCdromfsVdLst; /* VolDesc of mounted volume */T_FILE_DATE_TIME * pCdromFsDbgTFileDateTime; /* Directory date/time */T_CDROM_FILE * pCdromFsCdromFile; /* File descriptor */#endif/* forward declarations */#ifdef ERR_SET_SELFLOCAL VOID errnoSetOut(int line, const u_char * str, int err);#endifLOCAL T_CDROM_FILE_ID cdromFsFDAlloc (CDROM_VOL_DESC_ID pVolDesc);LOCAL void cdromFsFDFree (T_CDROM_FILE_ID pFD);LOCAL STATUS cdromFsSectBufAlloc (CDROM_VOL_DESC_ID pVolDesc, SEC_BUF_ID pSecBuf, int numSectInBuf);LOCAL STATUS cdromFsSectBufAllocBySize (CDROM_VOL_DESC_ID pVolDesc, SEC_BUF_ID pSecBuf, int size);LOCAL void cdromFsSectBufFree (SEC_BUF_ID pSecBuf);LOCAL u_char * cdromFsGetLS (CDROM_VOL_DESC_ID pVolDesc, u_long LSNum, u_long maxLBs, SEC_BUF_ID secBuf);LOCAL u_char * cdromFsGetLB (T_CDROMFS_VD_LST_ID pVDLst, u_long LBNum, u_long maxLBs, SEC_BUF_ID secBuf);LOCAL u_char * cdromFsDIRGet (T_CDROM_FILE_ID pFD);LOCAL u_char * cdromFsPTGet (T_CDROMFS_VD_LST_ID pVdLst, SEC_BUF_ID pSecBuf);LOCAL u_long cdromFsNextPTRec (u_char ** ppPT, u_long offset, u_long PTSize);LOCAL u_char cdromFsShiftCount (u_long source, u_long dest);LOCAL STATUS cdromFsVDAddToList (CDROM_VOL_DESC_ID pVolDesc, const u_char * pVDData,#ifdef CDROMFS_MULTI_SESSION_SUPPORT u_long SesiPseudoLBNum,#endif /* CDROMFS_MULTI_SESSION_SUPPORT */ u_long VDPseudoLBNum, u_short uniCodeLev, u_char VDSizeToLSSizeShift);LOCAL void cdromFsVolUnmount (CDROM_VOL_DESC_ID pVolDesc);LOCAL STATUS cdromFsVolMount (CDROM_VOL_DESC_ID pVolDesc);LOCAL time_t cdromFsDirDateTime2Long (const T_FILE_DATE_TIME * pDateTime);LOCAL STATUS cdromFsFillFDForDir (T_CDROMFS_VD_LST_ID pVDList, T_CDROM_FILE_ID pFD, u_char * pPTRec, u_int dirRecNumInPT);LOCAL STATUS cdromFsFillFDForFile (T_CDROMFS_VD_LST_ID pVDList, T_CDROM_FILE_ID pFD);#ifdef CDROMFS_MODE_AUTO_COMBINE_VOLUME_DESCRIPTORSLOCAL u_long cdromFsFindDirEntered (const u_char * pPTRec, u_short LBSize);LOCAL u_long cdromFsAddRecsToFD (u_char * RecpPTRec, u_int RecStartOff, u_char * FdpPTRec, u_int FdStartOff, u_int numOfRecCopy, u_int destSize);#endif /* CDROMFS_MODE_AUTO_COMBINE_VOLUME_DESCRIPTORS */LOCAL int cdromFsStrUpcaseCmp (const u_char * string1, const u_char * string2);LOCAL STATUS cdromFsFindFileInDir (T_CDROMFS_VD_LST_ID pVDList, T_CDROM_FILE_ID pFD, const u_char * name, u_char * pPTRec, u_int dirRecNumInPT);LOCAL int cdromFsFilenameLength (const u_char * name);LOCAL int cdromFsFilenameCompare (const u_char * name, const u_char * string, u_int stringLen, BOOL upCase);#ifdef CDROMFS_MODE_AUTO_COMBINE_VOLUME_DESCRIPTORSLOCAL int cdromFsDirEntryCompare (const u_char * name1, const u_char * name2, u_int name1Len, u_int name2Len, BOOL upCase);#endif /* CDROMFS_MODE_AUTO_COMBINE_VOLUME_DESCRIPTORS */LOCAL int cdromFsFindDirOnLevel (T_CDROMFS_VD_LST_ID pVDList, const u_char * name, u_char * pPT, u_int parDirNum, u_int * pPathLev, u_char ** ppRecord);#ifdef CDROMFS_MODE_AUTO_COMBINE_VOLUME_DESCRIPTORSLOCAL STATUS cdromFsDirEntriesOtherVDAdd (T_CDROMFS_VD_LST_ID pVDList, const u_char * path, T_CDROM_FILE_ID pFD);#endif /* CDROMFS_MODE_AUTO_COMBINE_VOLUME_DESCRIPTORS */LOCAL STATUS cdromFsFindPathInDirHierar(T_CDROMFS_VD_LST_ID pVDList, const u_char * path, T_CDROM_FILE_ID pFD, int options);LOCAL T_CDROM_FILE_ID cdromFsFindPath (CDROM_VOL_DESC_ID pVolDesc, const u_char * path, int options);LOCAL STATUS cdromFsFillStat (T_CDROM_FILE_ID fd,struct stat * arg);#if 0 /* NOT USED until record format files supported */LOCAL STATUS cdromFsCountMdu (T_CDROM_FILE_ID fd, int prevabsoff);#endif /* NOT USED until record format files supported */LOCAL STATUS cdromFsFillPos (T_CDROM_FILE_ID fd,u_char *PrevDirPtr, short i, int len, int NewOffs);LOCAL STATUS cdromFsSkipDirRec (T_CDROM_FILE_ID fd, u_char flags);LOCAL STATUS cdromFsDirBound (T_CDROM_FILE_ID fd);LOCAL void cdromFsSkipGap (T_CDROM_FILE_ID fd , u_long * fsLb, long absPos);LOCAL void cdromFsFixFsect (T_CDROM_FILE_ID fd);LOCAL STATUS cdromFsVolLock (CDROM_VOL_DESC_ID pVolDesc, int errorValue, BOOL mountIfNotMounted);LOCAL T_CDROM_FILE_ID cdromFsOpen (CDROM_VOL_DESC_ID pVolDesc, const u_char * path, int options);LOCAL STATUS cdromFsClose (T_CDROM_FILE_ID pFD);LOCAL STATUS cdromFsReadOnlyError (void);LOCAL STATUS cdromFsLabelGet (T_CDROM_FILE_ID fd, char * pLabel);LOCAL STATUS cdromFsSeek (T_CDROM_FILE_ID fd, fsize_t posArg);LOCAL STATUS cdromFsDirSeek (T_CDROM_FILE_ID fd, DIR * pDir);LOCAL u_char * cdromFsUnicodeStrncpy (u_char * dstString, size_t dstLen, const u_char * srcString, size_t srcLen);LOCAL STATUS cdromFsDirRead (T_CDROM_FILE_ID fd, DIR * pDir);#ifdef CDROMFS_MULTI_SESSION_SUPPORTLOCAL STATUS cdromFsTocRead (CDROM_VOL_DESC_ID pVolDesc, CDROM_TRACK_RECORD * pCdStatus);#endif /* CDROMFS_MULTI_SESSION_SUPPORT */LOCAL STATUS cdromFsIoctl (T_CDROM_FILE_ID fd, int function, int arg);LOCAL STATUS cdromFsRead (int desc, u_char * buffer, size_t maxBytes);LOCAL STATUS cdromFsReadyChange (CDROM_VOL_DESC_ID pVDList);LOCAL STATUS cdromFsVolDescGet (T_CDROMFS_VD_LST_ID pVDList, T_ISO_PVD_SVD * pVolDescOut);LOCAL CDROM_VOL_DESC_ID cdromFsDevDelete (void * arg, STATUS retStat);#ifdef DEBUG#ifdef CDROMFS_MULTI_SESSION_SUPPORTvoid cdromFsTocPrint (CDROM_TRACK_RECORD * pCdStatus);#endif /* CDROMFS_MULTI_SESSION_SUPPORT */void cdromFsDiskDirDateTimePrint (const T_FILE_DATE_TIME * pDateTime);const u_char * cdromFsDiskDirPrint (const u_char * pDirRec, T_CDROMFS_VD_LST_ID pVDList);T_CDROM_FILE_ID cdromFsFDPrint (T_CDROM_FILE_ID pFD, BOOL printEAR, u_char * message, u_long line);const u_char * cdromFsDiskPTPrint (const u_char * pPTRec);LOCAL time_t cdromFsVDDateTime2Long (const T_ISO_VD_DATE_TIME * pDateTime);void cdromFsDiskVDDateTimePrint (const T_ISO_VD_DATE_TIME * pDateTime);void cdromFsDiskEARPrint (const u_char * pEAR);LOCAL STATUS cdromFsSectBufAllocByLB (T_CDROMFS_VD_LST_ID pVDList, SEC_BUF_ID pSecBuf, int numLB);int cdDump (CDROM_VOL_DESC_ID pVolDesc, u_long LBRead);#endif /* DEBUG *//***************************************************************************** cdromFsInit - initialize cdromFsLib** This routine initializes cdromFsLib. It must be called exactly* once before calling any other routine in cdromFsLib.** RETURNS: OK or ERROR, if driver can not be installed.** ERRNO: S_iosLib_DRIVER_GLUT** SEE ALSO: cdromFsDevCreate(), iosLib.h*/STATUS cdromFsInit (void) { if (cdromFsDrvNum != ERROR) { return OK; /* SPR#78456 */ } /* install cdromFs into driver table */ cdromFsDrvNum = iosDrvInstall ( (FUNCPTR) cdromFsReadOnlyError, /* pointer to driver create func */ (FUNCPTR) cdromFsReadOnlyError, /* pointer to driver delete func */ (FUNCPTR) cdromFsOpen, /* pointer to driver open func */ (FUNCPTR) cdromFsClose, /* pointer to driver close func */ (FUNCPTR) cdromFsRead, /* pointer to driver read func */ (FUNCPTR) cdromFsReadOnlyError, /* pointer to driver write func */ (FUNCPTR) cdromFsIoctl /* pointer to driver ioctl func */ ); if (cdromFsDrvNum == ERROR) { printf ("cdromFsLib: iosDrvInstall failed\n"); /* SPR#32715, SPR#32726 */ }#ifdef DEBUG else { DBG_MSG (1)("%d. cdromFsLib: Initialized\n", __LINE__); }#endif /* DEBUG */ return (cdromFsDrvNum == ERROR ? ERROR : OK); /* SPR#78456 */ } /* cdromFsInit() */#ifdef ERR_SET_SELF/***************************************************************************** errnoSetOut - put error message** This routine is called instead of errnoSet() during module creation.** RETURNS: N/A*/LOCAL VOID errnoSetOut ( int line, const u_char * str, int err ) { printf ("ERROR: line %d : %s = 0x%x\n", line, str, err); errno = err; }#endif /* ERR_SET_SELF *//***************************************************************************** cdromFsFDAlloc - allocate file descriptor structure** This routine allocates a file descriptor structure and initializes some* of its base members, such as 'magic' and 'sectBuf'. Later, you can use* this file descriptor structure when opening a file. However, be aware that* the file descriptor allocated here is not yet connected to the volume's file* descriptor list. To free the file descriptor structure allocated here,* use cdromFsFDFree ().** RETURNS: ptr to FD or NULL.** ERRNO: S_memLib_NOT_ENOUGH_MEMORY*/LOCAL T_CDROM_FILE_ID cdromFsFDAlloc ( CDROM_VOL_DESC_ID pVolDesc /* processed volume */ ) { T_CDROM_FILE_ID pFD = KHEAP_ALLOC (sizeof(T_CDROM_FILE)); if (pFD == NULL) return NULL; bzero (pFD, sizeof (T_CDROM_FILE));
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -