int far pascal __loadds FS_FINDCLOSE(struct fsfsi far * pfsfsi, struct fsfsd far * pfsfsd) { PVOLINFO pVolInfo; PFINDINFO pFindInfo = (PFINDINFO)pfsfsd; if (f32Parms.fMessageActive & LOG_FS) Message("FS_FINDCLOSE"); pVolInfo = GetVolInfo(pfsfsi->fsi_hVPB); if (pFindInfo->pInfo) { if (RemoveFindEntry(pVolInfo, pFindInfo->pInfo)) free(pFindInfo->pInfo); pFindInfo->pInfo = NULL; } return 0; }
/** * @brief Interface for getting Audio/Video data between processes * * * @param field The operation field, the value should be AV_OP_XXX_XXX defined at Appro_interface.h * @param serial frame serial number , used when locking frame data * @param ptr frame information data structure defined at Appro_interface.h * * @return the value should be RET_XXXXX defined at Appro_interface.h * * @pre Must have called ApproDrvInit() and func_get_mem() * */ int GetAVData( unsigned int field, int serial, AV_DATA * ptr ) { int ret=RET_SUCCESS; if(virptr == NULL) return RET_ERROR_OP; switch(field){ case AV_OP_GET_MJPEG_SERIAL: if(serial != -1){ ret = RET_INVALID_PRM; } else { FrameInfo_t curframe = GetCurrentFrame(FMT_MJPEG); if(curframe.serial_no < 0){ ret = RET_NO_VALID_DATA; } else { int cnt = 0; ptr->serial = curframe.serial_no; ptr->size = curframe.size; ptr->width = curframe.width; ptr->height = curframe.height; ptr->timestamp = curframe.timestamp; for (cnt = 0; cnt < FMT_MAX_NUM; cnt++ ) { ptr->ref_serial[cnt] = curframe.ref_serial[cnt]; } } } break; case AV_OP_WAIT_NEW_MJPEG_SERIAL: if(serial != -1){ ret = RET_INVALID_PRM; } else { FrameInfo_t curframe = WaitNewFrame(FMT_MJPEG); if(curframe.serial_no < 0){ ret = RET_NO_VALID_DATA; } else { ptr->serial = curframe.serial_no; ptr->size = curframe.size; ptr->width = curframe.width; ptr->height = curframe.height; } } break; case AV_OP_LOCK_MJPEG: if(serial == -1){ ret = RET_INVALID_PRM; } else { FrameInfo_t frame; if(serial < 0){ ret = RET_INVALID_PRM; } else { int cnt = 0; frame.serial_no = serial; frame.format = FMT_MJPEG; ret = LockFrame(&frame); switch(ret){ case -98: ret = RET_OVERWRTE; break; case -99: ret = RET_NO_MEM; break; case 0: ptr->serial = serial; ptr->size = frame.size; ptr->width = frame.width; ptr->height = frame.height; ptr->quality = frame.quality; ptr->flags = frame.flags; ptr->timestamp = frame.timestamp; for (cnt = 0; cnt < FMT_MAX_NUM; cnt++ ) { ptr->ref_serial[cnt] = frame.ref_serial[cnt]; } ptr->ptr = (unsigned char *)virptr + frame.offset; break; default: ret = RET_UNKNOWN_ERROR; break; } } } break; case AV_OP_UNLOCK_MJPEG: if(serial == -1){ ret = RET_INVALID_PRM; } else { FrameInfo_t frame; if(serial < 0){ ret = RET_INVALID_PRM; } else { frame.serial_no = serial; frame.format = FMT_MJPEG; UnlockFrame(&frame); } } break; case AV_OP_GET_MPEG4_SERIAL: if(serial != -1){ ret = RET_INVALID_PRM; } else { FrameInfo_t curframe = GetCurrentFrame(FMT_MPEG4); if(curframe.serial_no < 0){ ret = RET_NO_VALID_DATA; } else { int cnt = 0; ptr->serial = curframe.serial_no; ptr->size = curframe.size; ptr->width = curframe.width; ptr->height = curframe.height; ptr->flags = curframe.flags; ptr->timestamp = curframe.timestamp; ptr->temporalId = curframe.temporalId; for (cnt = 0; cnt < FMT_MAX_NUM; cnt++ ) { ptr->ref_serial[cnt] = curframe.ref_serial[cnt]; } } } break; case AV_OP_GET_MPEG4_CIF_SERIAL: if(serial != -1){ ret = RET_INVALID_PRM; } else { FrameInfo_t curframe = GetCurrentFrame(FMT_MPEG4_EXT); if(curframe.serial_no < 0){ ret = RET_NO_VALID_DATA; } else { int cnt = 0; ptr->serial = curframe.serial_no; ptr->size = curframe.size; ptr->width = curframe.width; ptr->height = curframe.height; ptr->flags = curframe.flags; ptr->timestamp = curframe.timestamp; ptr->temporalId = curframe.temporalId; for (cnt = 0; cnt < FMT_MAX_NUM; cnt++ ) { ptr->ref_serial[cnt] = curframe.ref_serial[cnt]; } } } break; case AV_OP_WAIT_NEW_MPEG4_SERIAL: if(serial != -1){ ret = RET_INVALID_PRM; } else { FrameInfo_t curframe = WaitNewFrame(FMT_MPEG4); if(curframe.serial_no < 0){ ret = RET_NO_VALID_DATA; } else { ptr->serial = curframe.serial_no; ptr->size = curframe.size; ptr->width = curframe.width; ptr->height = curframe.height; ptr->flags = curframe.flags; ptr->temporalId = curframe.temporalId; } } break; case AV_OP_WAIT_NEW_MPEG4_CIF_SERIAL: if(serial != -1){ ret = RET_INVALID_PRM; } else { FrameInfo_t curframe = WaitNewFrame(FMT_MPEG4); if(curframe.serial_no < 0){ ret = RET_NO_VALID_DATA; } else { ptr->serial = curframe.serial_no; ptr->size = curframe.size; ptr->width = curframe.width; ptr->height = curframe.height; ptr->flags = curframe.flags; ptr->temporalId = curframe.temporalId; } } break; case AV_OP_LOCK_MP4: if(serial == -1){ ret = RET_INVALID_PRM; } else { FrameInfo_t frame; if(serial < 0){ ret = RET_INVALID_PRM; } else { int cnt = 0; frame.serial_no = serial; frame.format = FMT_MPEG4; ret = LockFrame(&frame); switch(ret){ case -99: ret = RET_OVERWRTE; printf("RET_OVERWRTE\n"); break; case -100: ret = RET_NO_MEM; printf("RET_NO_MEM\n"); break; case -101: ret = RET_ERROR_OP; printf("RET_ERROR_OP: serial: %d\n",serial); break; case -98: ret = RET_NO_VALID_DATA; //printf("RET_NO_VALID_DATA\n"); break; case 0: ptr->serial = serial; ptr->size = frame.size; ptr->width = frame.width; ptr->height = frame.height; ptr->quality = frame.quality; ptr->flags = frame.flags; ptr->frameType = frame.frameType; ptr->timestamp = frame.timestamp; ptr->temporalId = frame.temporalId; for (cnt = 0; cnt < FMT_MAX_NUM; cnt++ ) { ptr->ref_serial[cnt] = frame.ref_serial[cnt]; } ptr->ptr = (unsigned char *)virptr + frame.offset; break; default: ret = RET_UNKNOWN_ERROR; printf("RET_UNKNOWN_ERROR\n"); break; } } } break; case AV_OP_LOCK_MP4_CIF: if(serial == -1){ ret = RET_INVALID_PRM; } else { FrameInfo_t frame; if(serial < 0){ ret = RET_INVALID_PRM; } else { int cnt = 0; frame.serial_no = serial; frame.format = FMT_MPEG4_EXT; ret = LockFrame(&frame); switch(ret){ case -99: ret = RET_OVERWRTE; printf("RET_OVERWRTE\n"); break; case -100: ret = RET_NO_MEM; printf("RET_NO_MEM\n"); break; case -101: ret = RET_ERROR_OP; printf("RET_ERROR_OP: serial: %d\n",serial); break; case -98: ret = RET_NO_VALID_DATA; //printf("RET_NO_VALID_DATA\n"); break; case 0: ptr->serial = serial; ptr->size = frame.size; ptr->width = frame.width; ptr->height = frame.height; ptr->quality = frame.quality; ptr->flags = frame.flags; ptr->frameType = frame.frameType; ptr->timestamp = frame.timestamp; ptr->temporalId = frame.temporalId; for (cnt = 0; cnt < FMT_MAX_NUM; cnt++ ) { ptr->ref_serial[cnt] = frame.ref_serial[cnt]; } ptr->ptr = (unsigned char *)virptr + frame.offset; break; default: ret = RET_UNKNOWN_ERROR; printf("RET_UNKNOWN_ERROR\n"); break; } } } break; case AV_OP_UNLOCK_MP4: if(serial == -1){ ret = RET_INVALID_PRM; } else { FrameInfo_t frame; if(serial < 0){ ret = RET_INVALID_PRM; } else { frame.serial_no = serial; frame.format = FMT_MPEG4; UnlockFrame(&frame); } } break; case AV_OP_UNLOCK_MP4_CIF: if(serial == -1){ ret = RET_INVALID_PRM; } else { FrameInfo_t frame; if(serial < 0){ ret = RET_INVALID_PRM; } else { frame.serial_no = serial; frame.format = FMT_MPEG4_EXT; UnlockFrame(&frame); } } break; case AV_OP_LOCK_MP4_VOL: { FrameInfo_t frame; ret = GetVolInfo(&frame,FMT_MPEG4); if( ret > 0 ) { memcpy( VolInfo,((unsigned char *)virptr + frame.offset),ret); } ptr->ptr = VolInfo; ptr->size = ret; ret = RET_SUCCESS; break; } case AV_OP_GET_MEDIA_INFO: { FrameInfo_t frame; ptr->flags = GetMediaInfo(&frame); ret = RET_SUCCESS; break; } case AV_OP_LOCK_MP4_CIF_VOL: { FrameInfo_t frame; ret = GetVolInfo(&frame,FMT_MPEG4_EXT); if( ret > 0 ) { memcpy( VolInfo_cif,((unsigned char *)virptr + frame.offset),ret); } ptr->ptr = VolInfo_cif; ptr->size = ret; ret = RET_SUCCESS; break; } case AV_OP_UNLOCK_MP4_VOL: ret = RET_SUCCESS; break; case AV_OP_UNLOCK_MP4_CIF_VOL: ret = RET_SUCCESS; break; case AV_OP_LOCK_MP4_IFRAME: { FrameInfo_t curframe; LockMpeg4IFrame(&curframe, FMT_MPEG4); if(curframe.serial_no == -1){ ret = RET_NO_VALID_DATA; } else if(curframe.serial_no == -2){ ret = RET_NO_MEM; } else { int cnt = 0; ptr->serial = curframe.serial_no; ptr->size = curframe.size; ptr->width = curframe.width; ptr->height = curframe.height; ptr->quality = curframe.quality; ptr->flags = curframe.flags; ptr->frameType = curframe.frameType; ptr->timestamp = curframe.timestamp; ptr->temporalId = curframe.temporalId; for (cnt = 0; cnt < FMT_MAX_NUM; cnt++ ) { ptr->ref_serial[cnt] = curframe.ref_serial[cnt]; } ptr->ptr = (unsigned char *)virptr + curframe.offset; ret = RET_SUCCESS; } break; } case AV_OP_LOCK_MP4_CIF_IFRAME: { FrameInfo_t curframe; LockMpeg4IFrame(&curframe,FMT_MPEG4_EXT); if(curframe.serial_no == -1){ ret = RET_NO_VALID_DATA; } else if(curframe.serial_no == -2){ ret = RET_NO_MEM; } else { int cnt = 0; ptr->serial = curframe.serial_no; ptr->size = curframe.size; ptr->width = curframe.width; ptr->height = curframe.height; ptr->quality = curframe.quality; ptr->flags = curframe.flags; ptr->frameType = curframe.frameType; ptr->timestamp = curframe.timestamp; ptr->temporalId = curframe.temporalId; for (cnt = 0; cnt < FMT_MAX_NUM; cnt++ ) { ptr->ref_serial[cnt] = curframe.ref_serial[cnt]; } ptr->ptr = (unsigned char *)virptr + curframe.offset; ret = RET_SUCCESS; } break; } case AV_OP_LOCK_ULAW: if(serial == -1){ ret = RET_INVALID_PRM; } else { FrameInfo_t frame; if(serial < 0){ ret = RET_INVALID_PRM; } else { int cnt = 0; frame.serial_no = serial; frame.format = FMT_AUDIO; ret = LockFrame(&frame); switch(ret){ case -97: case -98: ret = RET_NO_VALID_DATA; break; case -99: ret = RET_NO_MEM; break; case 0: ptr->serial = serial; ptr->size = frame.size; ptr->width = frame.width; ptr->height = frame.height; ptr->quality = frame.quality; ptr->flags = frame.flags; ptr->timestamp = frame.timestamp; ptr->temporalId = frame.temporalId; for (cnt = 0; cnt < FMT_MAX_NUM; cnt++ ) { ptr->ref_serial[cnt] = frame.ref_serial[cnt]; } ptr->ptr = (unsigned char *)virptr + frame.offset; break; default: ret = RET_UNKNOWN_ERROR; break; } } } break; case AV_OP_UNLOCK_ULAW: if(serial == -1){ ret = RET_INVALID_PRM; } else { FrameInfo_t frame; if(serial < 0){ ret = RET_INVALID_PRM; } else { frame.serial_no = serial; frame.format = FMT_AUDIO; UnlockFrame(&frame); } } break; case AV_OP_GET_ULAW_SERIAL: if(serial != -1){ ret = RET_INVALID_PRM; } else { FrameInfo_t curframe = GetCurrentFrame(FMT_AUDIO); if(curframe.serial_no < 0){ ret = RET_NO_VALID_DATA; } else { int cnt = 0; ptr->serial = curframe.serial_no; ptr->size = curframe.size; ptr->width = curframe.width; ptr->height = curframe.height; ptr->timestamp = curframe.timestamp; ptr->temporalId = curframe.temporalId; for (cnt = 0; cnt < FMT_MAX_NUM; cnt++ ) { ptr->ref_serial[cnt] = curframe.ref_serial[cnt]; } } } break; case AV_OP_WAIT_NEW_ULAW_SERIAL: if(serial != -1){ ret = RET_INVALID_PRM; } else { FrameInfo_t curframe = WaitNewFrame(FMT_AUDIO); if(curframe.serial_no < 0){ ret = RET_NO_VALID_DATA; } else { ptr->serial = curframe.serial_no; ptr->size = curframe.size; ptr->width = curframe.width; ptr->height = curframe.height; } } break; default: ret = RET_INVALID_COMMAND; dbg("Command field = %d\n", field); break; } return ret; }
int far pascal __loadds FS_FINDFIRST(struct cdfsi far * pcdfsi, /* pcdfsi */ struct cdfsd far * pcdfsd, /* pcdfsd */ char far * pName, /* pName */ unsigned short usCurDirEnd, /* iCurDirEnd */ unsigned short usAttr, /* attr */ struct fsfsi far * pfsfsi, /* pfsfsi */ struct fsfsd far * pfsfsd, /* pfsfsd */ char far * pData, /* pData */ unsigned short cbData, /* cbData */ unsigned short far * pcMatch, /* pcMatch */ unsigned short usLevel, /* level */ unsigned short usFlags) /* flags */ { PVOLINFO pVolInfo; PFINDINFO pFindInfo = (PFINDINFO)pfsfsd; USHORT rc; USHORT usIndex; USHORT usNeededLen; USHORT usNumClusters; ULONG ulCluster; ULONG ulDirCluster; PSZ pSearch; PFINFO pNext; ULONG ulNeededSpace; USHORT usEntriesWanted; EAOP EAOP; PROCINFO ProcInfo; if (f32Parms.fMessageActive & LOG_FS) Message("FS_FINDFIRST for %s attr %X, Level %d, cbData %u, MaxEntries %u", pName, usAttr, usLevel, cbData, *pcMatch); usEntriesWanted = *pcMatch; *pcMatch = 0; if (strlen(pName) > FAT32MAXPATH) { rc = ERROR_FILENAME_EXCED_RANGE; goto FS_FINDFIRSTEXIT; } memset(pfsfsd, 0, sizeof (struct fsfsd)); pVolInfo = GetVolInfo(pfsfsi->fsi_hVPB); if (IsDriveLocked(pVolInfo)) { rc = ERROR_DRIVE_LOCKED; goto FS_FINDFIRSTEXIT; } switch (usLevel) { case FIL_STANDARD : usNeededLen = sizeof (FILEFNDBUF) - CCHMAXPATHCOMP; break; case FIL_QUERYEASIZE : usNeededLen = sizeof (FILEFNDBUF2) - CCHMAXPATHCOMP; break; case FIL_QUERYEASFROMLIST : usNeededLen = sizeof (EAOP) + sizeof (FILEFNDBUF3) + sizeof (ULONG); break; default : rc = ERROR_NOT_SUPPORTED; goto FS_FINDFIRSTEXIT; } if (usFlags == FF_GETPOS) usNeededLen += sizeof (ULONG); if (cbData < usNeededLen) { rc = ERROR_BUFFER_OVERFLOW; goto FS_FINDFIRSTEXIT; } rc = MY_PROBEBUF(PB_OPWRITE, pData, cbData); if (rc) { Message("FAT32: Protection VIOLATION in FS_FINDFIRST! (SYS%d)", rc); return rc; } if (usLevel == FIL_QUERYEASFROMLIST) { memcpy(&EAOP, pData, sizeof (EAOP)); rc = MY_PROBEBUF(PB_OPREAD, (PBYTE)EAOP.fpGEAList, (USHORT)EAOP.fpGEAList->cbList); if (rc) goto FS_FINDFIRSTEXIT; } memset(pData, 0, cbData); usNumClusters = 0; ulDirCluster = FindDirCluster(pVolInfo, pcdfsi, pcdfsd, pName, usCurDirEnd, RETURN_PARENT_DIR, &pSearch); if (ulDirCluster == FAT_EOF) { rc = ERROR_PATH_NOT_FOUND; goto FS_FINDFIRSTEXIT; } ulCluster = ulDirCluster; while (ulCluster && ulCluster != FAT_EOF) { usNumClusters++; ulCluster = GetNextCluster( pVolInfo, ulCluster); } ulNeededSpace = sizeof (FINFO) + (usNumClusters - 1) * sizeof (ULONG); ulNeededSpace += pVolInfo->usClusterSize; GetProcInfo(&ProcInfo, sizeof ProcInfo); pFindInfo->pInfo = (PFINFO)malloc((size_t)ulNeededSpace); if (!pFindInfo->pInfo) { rc = ERROR_NOT_ENOUGH_MEMORY; goto FS_FINDFIRSTEXIT; } memset(pFindInfo->pInfo, 0, (size_t)ulNeededSpace); if (!pVolInfo->pFindInfo) pVolInfo->pFindInfo = pFindInfo->pInfo; else { pNext = (PFINFO)pVolInfo->pFindInfo; while (pNext->pNextEntry) pNext = (PFINFO)pNext->pNextEntry; pNext->pNextEntry = pFindInfo->pInfo; } memcpy(&pFindInfo->pInfo->EAOP, &EAOP, sizeof (EAOP)); pFindInfo->usEntriesPerCluster = pVolInfo->usClusterSize / sizeof (DIRENTRY); pFindInfo->usClusterIndex = 0; pFindInfo->pInfo->rgClusters[0] = ulDirCluster; pFindInfo->usTotalClusters = usNumClusters; pFindInfo->pInfo->pDirEntries = (PDIRENTRY)(&pFindInfo->pInfo->rgClusters[usNumClusters]); if (f32Parms.fMessageActive & LOG_FIND) Message("pInfo at %lX, pDirEntries at %lX", pFindInfo->pInfo, pFindInfo->pInfo->pDirEntries); pFindInfo->pInfo->pNextEntry = NULL; memcpy(&pFindInfo->pInfo->ProcInfo, &ProcInfo, sizeof (PROCINFO)); strcpy(pFindInfo->pInfo->szSearch, pSearch); FSH_UPPERCASE(pFindInfo->pInfo->szSearch, sizeof pFindInfo->pInfo->szSearch, pFindInfo->pInfo->szSearch); pFindInfo->ulMaxEntry = ((ULONG)pVolInfo->usClusterSize / sizeof (DIRENTRY)) * usNumClusters; if (!GetCluster(pVolInfo, pFindInfo, 0)) { rc = ERROR_SYS_INTERNAL; goto FS_FINDFIRSTEXIT; } pFindInfo->ulCurEntry = 0; if (usAttr & 0x0040) { pFindInfo->fLongNames = TRUE; usAttr &= ~0x0040; } else pFindInfo->fLongNames = FALSE; pFindInfo->bMustAttr = (BYTE)(usAttr >> 8); usAttr |= (FILE_READONLY | FILE_ARCHIVED); usAttr &= (FILE_READONLY | FILE_HIDDEN | FILE_SYSTEM | FILE_DIRECTORY | FILE_ARCHIVED); pFindInfo->bAttr = (BYTE)~usAttr; if (usLevel == FIL_QUERYEASFROMLIST) { memcpy(pData, &pFindInfo->pInfo->EAOP, sizeof (EAOP)); pData += sizeof (EAOP); cbData -= sizeof (EAOP); } rc = 0; for (usIndex = 0; usIndex < usEntriesWanted; usIndex++) { PULONG pulOrdinal; if (usFlags == FF_GETPOS) { if (cbData < sizeof (ULONG)) { rc = ERROR_BUFFER_OVERFLOW; break; } pulOrdinal = (PULONG)pData; pData += sizeof (ULONG); cbData -= sizeof (ULONG); } rc = FillDirEntry(pVolInfo, &pData, &cbData, pFindInfo, usLevel); if (!rc || (rc == ERROR_EAS_DIDNT_FIT && usIndex == 0)) { if (usFlags == FF_GETPOS) *pulOrdinal = pFindInfo->ulCurEntry - 1; } if (rc) break; } if ((rc == ERROR_NO_MORE_FILES || rc == ERROR_BUFFER_OVERFLOW || rc == ERROR_EAS_DIDNT_FIT) && usIndex > 0) rc = 0; if (rc == ERROR_EAS_DIDNT_FIT && usIndex == 0) usIndex = 1; *pcMatch = usIndex; FS_FINDFIRSTEXIT: if (f32Parms.fMessageActive & LOG_FS) Message("FS_FINDFIRST returned %d (%d entries)", rc, *pcMatch); if (rc && rc != ERROR_EAS_DIDNT_FIT) { FS_FINDCLOSE(pfsfsi, pfsfsd); } return rc; }
int far pascal __loadds FS_FINDNEXT( struct fsfsi far * pfsfsi, /* pfsfsi */ struct fsfsd far * pfsfsd, /* pfsfsd */ char far * pData, /* pData */ unsigned short cbData, /* cbData */ unsigned short far * pcMatch, /* pcMatch */ unsigned short usLevel, /* level */ unsigned short usFlags /* flag */ ) { PVOLINFO pVolInfo; PFINDINFO pFindInfo = (PFINDINFO)pfsfsd; USHORT rc; USHORT usIndex; USHORT usNeededLen; USHORT usEntriesWanted; if (f32Parms.fMessageActive & LOG_FS) Message("FS_FINDNEXT, level %u, cbData %u, MaxEntries %u", usLevel, cbData, *pcMatch); usEntriesWanted = *pcMatch; *pcMatch = 0; pVolInfo = GetVolInfo(pfsfsi->fsi_hVPB); if (IsDriveLocked(pVolInfo)) { rc = ERROR_DRIVE_LOCKED; goto FS_FINDNEXTEXIT; } switch (usLevel) { case FIL_STANDARD : usNeededLen = sizeof (FILEFNDBUF) - CCHMAXPATHCOMP; break; case FIL_QUERYEASIZE : usNeededLen = sizeof (FILEFNDBUF2) - CCHMAXPATHCOMP; break; case FIL_QUERYEASFROMLIST : usNeededLen = sizeof (EAOP) + sizeof (FILEFNDBUF3) + sizeof (ULONG); break; default : rc = ERROR_NOT_SUPPORTED; goto FS_FINDNEXTEXIT; } if (usFlags == FF_GETPOS) usNeededLen += sizeof (ULONG); if (cbData < usNeededLen) { rc = ERROR_BUFFER_OVERFLOW; goto FS_FINDNEXTEXIT; } rc = MY_PROBEBUF(PB_OPWRITE, pData, cbData); if (rc) { Message("FAT32: Protection VIOLATION in FS_FINDNEXT!"); return rc; } if (usLevel == FIL_QUERYEASFROMLIST) { memcpy(&pFindInfo->pInfo->EAOP, pData, sizeof (EAOP)); rc = MY_PROBEBUF(PB_OPREAD, (PBYTE)pFindInfo->pInfo->EAOP.fpGEAList, (USHORT)pFindInfo->pInfo->EAOP.fpGEAList->cbList); if (rc) goto FS_FINDNEXTEXIT; } memset(pData, 0, cbData); if (usLevel == FIL_QUERYEASFROMLIST) { memcpy(pData, &pFindInfo->pInfo->EAOP, sizeof (EAOP)); pData += sizeof (EAOP); cbData -= sizeof (EAOP); } rc = 0; for (usIndex = 0; usIndex < usEntriesWanted; usIndex++) { PULONG pulOrdinal = NULL; if (usFlags == FF_GETPOS) { if (cbData < sizeof (ULONG)) { rc = ERROR_BUFFER_OVERFLOW; break; } pulOrdinal = (PULONG)pData; pData += sizeof (ULONG); cbData -= sizeof (ULONG); } rc = FillDirEntry(pVolInfo, &pData, &cbData, pFindInfo, usLevel); if (!rc || (rc == ERROR_EAS_DIDNT_FIT && usIndex == 0)) { if (usFlags == FF_GETPOS) *pulOrdinal = pFindInfo->ulCurEntry - 1; } if (rc) break; } if ((rc == ERROR_NO_MORE_FILES || rc == ERROR_BUFFER_OVERFLOW || rc == ERROR_EAS_DIDNT_FIT) && usIndex > 0) rc = 0; if (rc == ERROR_EAS_DIDNT_FIT && usIndex == 0) usIndex = 1; *pcMatch = usIndex; FS_FINDNEXTEXIT: if (f32Parms.fMessageActive & LOG_FS) Message("FS_FINDNEXT returned %d (%d entries)", rc, *pcMatch); return rc; }
int far pascal __loadds FS_MOUNT(unsigned short usFlag, /* flag */ struct vpfsi far * pvpfsi, /* pvpfsi */ struct vpfsd far * pvpfsd, /* pvpfsd */ unsigned short hVBP, /* hVPB */ char far * pBoot /* pBoot */) { PBOOTSECT pSect; PVOLINFO pVolInfo; PVOLINFO pNext, pPrev; USHORT usVolCount; USHORT hDupVBP; USHORT rc; P_DriverCaps pDevCaps; P_VolChars pVolChars; _asm push es; //_asm push bx; if (f32Parms.fMessageActive & LOG_FS) Message("FS_MOUNT for %c (%d):, flag = %d", pvpfsi->vpi_drive + 'A', pvpfsi->vpi_unit, usFlag); switch (usFlag) { case MOUNT_MOUNT : if (FSH_FINDDUPHVPB(hVBP, &hDupVBP)) hDupVBP = 0; pSect = (PBOOTSECT)pBoot; if (memicmp(pSect->FileSystem, "FAT32", 5)) { rc = ERROR_VOLUME_NOT_MOUNTED; goto FS_MOUNT_EXIT; } if (pSect->bpb.BytesPerSector != SECTOR_SIZE) { rc = ERROR_VOLUME_NOT_MOUNTED; goto FS_MOUNT_EXIT; } if(( ULONG )pSect->bpb.BytesPerSector * pSect->bpb.SectorsPerCluster > MAX_CLUSTER_SIZE ) { rc = ERROR_VOLUME_NOT_MOUNTED; goto FS_MOUNT_EXIT; } pvpfsi->vpi_vid = pSect->ulVolSerial; pvpfsi->vpi_bsize = pSect->bpb.BytesPerSector; pvpfsi->vpi_totsec = pSect->bpb.BigTotalSectors; pvpfsi->vpi_trksec = pSect->bpb.SectorsPerTrack; pvpfsi->vpi_nhead = pSect->bpb.Heads; memset(pvpfsi->vpi_text, 0, sizeof pvpfsi->vpi_text); memcpy(pvpfsi->vpi_text, pSect->VolumeLabel, sizeof pSect->VolumeLabel); pVolInfo = gdtAlloc(STORAGE_NEEDED, FALSE); if (!pVolInfo) { rc = ERROR_NOT_ENOUGH_MEMORY; goto FS_MOUNT_EXIT; } rc = FSH_FORCENOSWAP(SELECTOROF(pVolInfo)); if (rc) FatalMessage("FSH_FORCENOSWAP on VOLINFO Segment failed, rc=%u", rc); memset(pVolInfo, 0, (size_t)STORAGE_NEEDED); InitCache(ulCacheSectors); memcpy(&pVolInfo->BootSect, pSect, sizeof (BOOTSECT)); pVolInfo->ulActiveFatStart = pSect->bpb.ReservedSectors; if (pSect->bpb.ExtFlags & 0x0080) pVolInfo->ulActiveFatStart += pSect->bpb.BigSectorsPerFat * (pSect->bpb.ExtFlags & 0x000F); pVolInfo->ulStartOfData = pSect->bpb.ReservedSectors + pSect->bpb.BigSectorsPerFat * pSect->bpb.NumberOfFATs; pVolInfo->pBootFSInfo = (PBOOTFSINFO)(pVolInfo + 1); pVolInfo->pbFatSector = (PBYTE)(pVolInfo->pBootFSInfo + 1); pVolInfo->ulCurFatSector = -1L; pVolInfo->usClusterSize = pSect->bpb.BytesPerSector * pSect->bpb.SectorsPerCluster; pVolInfo->ulTotalClusters = (pSect->bpb.BigTotalSectors - pVolInfo->ulStartOfData) / pSect->bpb.SectorsPerCluster; pVolInfo->hVBP = hVBP; pVolInfo->hDupVBP = hDupVBP; pVolInfo->bDrive = pvpfsi->vpi_drive; pVolInfo->bUnit = pvpfsi->vpi_unit; pVolInfo->pNextVolInfo = NULL; pVolInfo->fFormatInProgress = FALSE; if (usDefaultRASectors == 0xFFFF) pVolInfo->usRASectors = (pVolInfo->usClusterSize / SECTOR_SIZE ) * 2; else pVolInfo->usRASectors = usDefaultRASectors; #if 1 if( pVolInfo->usRASectors > MAX_RASECTORS ) pVolInfo->usRASectors = MAX_RASECTORS; #else if (pVolInfo->usRASectors > (pVolInfo->usClusterSize / SECTOR_SIZE) * 4) pVolInfo->usRASectors = (pVolInfo->usClusterSize / SECTOR_SIZE ) * 4; #endif if (pSect->bpb.FSinfoSec != 0xFFFF) { ReadSector(pVolInfo, pSect->bpb.FSinfoSec, 1, pVolInfo->pbFatSector, DVIO_OPNCACHE); memcpy(pVolInfo->pBootFSInfo, pVolInfo->pbFatSector + FSINFO_OFFSET, sizeof (BOOTFSINFO)); } else memset(pVolInfo->pBootFSInfo, 0, sizeof (BOOTFSINFO)); *((PVOLINFO *)(pvpfsd->vpd_work)) = pVolInfo; if (!pGlobVolInfo) { pGlobVolInfo = pVolInfo; usVolCount = 1; } else { pNext = pGlobVolInfo; usVolCount = 1; if (pNext->bDrive == pvpfsi->vpi_drive && !pVolInfo->hDupVBP) pVolInfo->hDupVBP = pNext->hVBP; while (pNext->pNextVolInfo) { pNext = (PVOLINFO)pNext->pNextVolInfo; if (pNext->bDrive == pvpfsi->vpi_drive && !pVolInfo->hDupVBP) pVolInfo->hDupVBP = pNext->hVBP; usVolCount++; } pNext->pNextVolInfo = pVolInfo; usVolCount++; } if (f32Parms.fMessageActive & LOG_FS) Message("%u Volumes mounted!", usVolCount); rc = CheckWriteProtect(pVolInfo); if (rc && rc != ERROR_WRITE_PROTECT) { Message("Cannot access drive, rc = %u", rc); goto FS_MOUNT_EXIT; } if (rc == ERROR_WRITE_PROTECT) pVolInfo->fWriteProtected = TRUE; pVolInfo->fDiskCleanOnMount = pVolInfo->fDiskClean = GetDiskStatus(pVolInfo); if (!pVolInfo->fDiskCleanOnMount) Message("DISK IS DIRTY!"); if (pVolInfo->fWriteProtected) pVolInfo->fDiskCleanOnMount = TRUE; if (!pVolInfo->hDupVBP && (f32Parms.fCalcFree || pVolInfo->pBootFSInfo->ulFreeClusters == 0xFFFFFFFF || /*!pVolInfo->fDiskClean ||*/ pVolInfo->BootSect.bpb.FSinfoSec == 0xFFFF)) GetFreeSpace(pVolInfo); pDevCaps = pvpfsi->vpi_pDCS; pVolChars = pvpfsi->vpi_pVCS; if (pDevCaps->Capabilities & GDC_DD_Read2) Message("Read2 supported"); if (pDevCaps->Capabilities & GDC_DD_DMA_Word) Message("DMA on word alligned buffers supported"); if (pDevCaps->Capabilities & GDC_DD_DMA_Byte) Message("DMA on byte alligned buffers supported"); if (pDevCaps->Capabilities & GDC_DD_Mirror) Message("Disk Mirroring supported"); if (pDevCaps->Capabilities & GDC_DD_Duplex) Message("Disk Duplexing supported"); if (pDevCaps->Capabilities & GDC_DD_No_Block) Message("Strategy2 does not block"); if (pDevCaps->Capabilities & GDC_DD_16M) Message(">16M supported"); if (pDevCaps->Strategy2) { Message("Strategy2 address at %lX", pDevCaps->Strategy2); Message("ChgPriority address at %lX", pDevCaps->ChgPriority); pVolInfo->pfnStrategy = (STRATFUNC)pDevCaps->Strategy2; pVolInfo->pfnPriority = (STRATFUNC)pDevCaps->ChgPriority; } rc = 0; break; case MOUNT_ACCEPT : if (FSH_FINDDUPHVPB(hVBP, &hDupVBP)) hDupVBP = 0; if (pvpfsi->vpi_bsize != SECTOR_SIZE) { rc = ERROR_VOLUME_NOT_MOUNTED; goto FS_MOUNT_EXIT; } pVolInfo = gdtAlloc(STORAGE_NEEDED, FALSE); if (!pVolInfo) { rc = ERROR_NOT_ENOUGH_MEMORY; goto FS_MOUNT_EXIT; } rc = FSH_FORCENOSWAP(SELECTOROF(pVolInfo)); if (rc) FatalMessage("FSH_FORCENOSWAP on VOLINFO Segment failed, rc=%u", rc); memset(pVolInfo, 0, (size_t)STORAGE_NEEDED); //InitCache(ulCacheSectors); memset(&pVolInfo->BootSect, 0, sizeof (BOOTSECT)); pVolInfo->BootSect.bpb.BigTotalSectors = pvpfsi->vpi_totsec; pVolInfo->BootSect.bpb.BytesPerSector = pvpfsi->vpi_bsize; pVolInfo->fWriteProtected = FALSE; pVolInfo->fDiskCleanOnMount = FALSE; pVolInfo->hVBP = hVBP; pVolInfo->hDupVBP = hDupVBP; pVolInfo->bDrive = pvpfsi->vpi_drive; pVolInfo->bUnit = pvpfsi->vpi_unit; pVolInfo->pNextVolInfo = NULL; // the volume is being formatted pVolInfo->fFormatInProgress = TRUE; // fake values assuming sector == cluster pVolInfo->usClusterSize = pvpfsi->vpi_bsize; pVolInfo->ulTotalClusters = pvpfsi->vpi_totsec; pVolInfo->usRASectors = usDefaultRASectors; // undefined pVolInfo->ulStartOfData = 0; //*((PVOLINFO *)(pvpfsd->vpd_work)) = pVolInfo; if (!pGlobVolInfo) { pGlobVolInfo = pVolInfo; usVolCount = 1; } else { pNext = pGlobVolInfo; usVolCount = 1; if (pNext->bDrive == pvpfsi->vpi_drive && !pVolInfo->hDupVBP) pVolInfo->hDupVBP = pNext->hVBP; while (pNext->pNextVolInfo) { pNext = (PVOLINFO)pNext->pNextVolInfo; if (pNext->bDrive == pvpfsi->vpi_drive && !pVolInfo->hDupVBP) pVolInfo->hDupVBP = pNext->hVBP; usVolCount++; } pNext->pNextVolInfo = pVolInfo; usVolCount++; } if (f32Parms.fMessageActive & LOG_FS) Message("%u Volumes mounted!", usVolCount); pDevCaps = pvpfsi->vpi_pDCS; pVolChars = pvpfsi->vpi_pVCS; if (pDevCaps->Capabilities & GDC_DD_Read2) Message("Read2 supported"); if (pDevCaps->Capabilities & GDC_DD_DMA_Word) Message("DMA on word alligned buffers supported"); if (pDevCaps->Capabilities & GDC_DD_DMA_Byte) Message("DMA on byte alligned buffers supported"); if (pDevCaps->Capabilities & GDC_DD_Mirror) Message("Disk Mirroring supported"); if (pDevCaps->Capabilities & GDC_DD_Duplex) Message("Disk Duplexing supported"); if (pDevCaps->Capabilities & GDC_DD_No_Block) Message("Strategy2 does not block"); if (pDevCaps->Capabilities & GDC_DD_16M) Message(">16M supported"); if (pDevCaps->Strategy2) { Message("Strategy2 address at %lX", pDevCaps->Strategy2); Message("ChgPriority address at %lX", pDevCaps->ChgPriority); pVolInfo->pfnStrategy = (STRATFUNC)pDevCaps->Strategy2; pVolInfo->pfnPriority = (STRATFUNC)pDevCaps->ChgPriority; } rc = 0; break; case MOUNT_VOL_REMOVED: case MOUNT_RELEASE: pVolInfo = GetVolInfo(hVBP); if (!pVolInfo) { rc = ERROR_VOLUME_NOT_MOUNTED; goto FS_MOUNT_EXIT; } //if (!pVolInfo->hDupVBP) //{ usFlushVolume( pVolInfo, FLUSH_DISCARD, TRUE, PRIO_URGENT ); if (f32Parms.usDirtySectors) // vs UpdateFSInfo(pVolInfo); // MarkDiskStatus(pVolInfo, TRUE); //} // delete pVolInfo from the list if (pGlobVolInfo) { pNext = pPrev = pGlobVolInfo; // search for pVolInfo in the list while (pNext != pVolInfo) { pPrev = pNext; pNext = (PVOLINFO)pNext->pNextVolInfo; } // found if (pNext == pVolInfo) { if (pPrev == pVolInfo) // the very 1st list item pGlobVolInfo = NULL; else { // delete it pNext = pNext->pNextVolInfo; pPrev->pNextVolInfo = pNext; } usVolCount--; } } RemoveVolume(pVolInfo); freeseg(pVolInfo); rc = 0; break; default : rc = ERROR_NOT_SUPPORTED; break; } FS_MOUNT_EXIT: if (f32Parms.fMessageActive & LOG_FS) Message("FS_MOUNT returned %u\n", rc); //_asm int 3 //_asm pop bx; _asm pop es; return rc; }
int far pascal FS_MOUNT(unsigned short usFlag, /* flag */ struct vpfsi far * pvpfsi, /* pvpfsi */ struct vpfsd far * pvpfsd, /* pvpfsd */ unsigned short hVBP, /* hVPB */ char far * pBoot /* pBoot */) { PBOOTSECT pSect; PVOLINFO pVolInfo; PVOLINFO pNext; USHORT usVolCount; USHORT hDupVBP; USHORT rc; P_DriverCaps pDevCaps; P_VolChars pVolChars; if (f32Parms.fMessageActive & LOG_FS) Message("FS_MOUNT for %c (%d):, flag = %d", pvpfsi->vpi_drive + 'A', pvpfsi->vpi_unit, usFlag); switch (usFlag) { case MOUNT_MOUNT : if (FSH_FINDDUPHVPB(hVBP, &hDupVBP)) hDupVBP = 0; pSect = (PBOOTSECT)pBoot; if (memicmp(pSect->FileSystem, "FAT32", 5)) { rc = ERROR_VOLUME_NOT_MOUNTED; goto FS_MOUNT_EXIT; } if (pSect->bpb.BytesPerSector != SECTOR_SIZE) { rc = ERROR_VOLUME_NOT_MOUNTED; goto FS_MOUNT_EXIT; } pvpfsi->vpi_vid = pSect->ulVolSerial; pvpfsi->vpi_bsize = pSect->bpb.BytesPerSector; pvpfsi->vpi_totsec = pSect->bpb.BigTotalSectors; pvpfsi->vpi_trksec = pSect->bpb.SectorsPerTrack; pvpfsi->vpi_nhead = pSect->bpb.Heads; memset(pvpfsi->vpi_text, 0, sizeof pvpfsi->vpi_text); memcpy(pvpfsi->vpi_text, pSect->VolumeLabel, sizeof pSect->VolumeLabel); pVolInfo = gdtAlloc(STORAGE_NEEDED, FALSE); if (!pVolInfo) { rc = ERROR_NOT_ENOUGH_MEMORY; goto FS_MOUNT_EXIT; } rc = FSH_FORCENOSWAP(SELECTOROF(pVolInfo)); if (rc) FatalMessage("FSH_FORCENOSWAP on VOLINFO Segment failed, rc=%u", rc); memset(pVolInfo, 0, (size_t)STORAGE_NEEDED); InitCache(ulCacheSectors); memcpy(&pVolInfo->BootSect, pSect, sizeof (BOOTSECT)); pVolInfo->ulActiveFatStart = pSect->bpb.ReservedSectors; if (pSect->bpb.ExtFlags & 0x0080) pVolInfo->ulActiveFatStart += pSect->bpb.BigSectorsPerFat * (pSect->bpb.ExtFlags & 0x000F); pVolInfo->ulStartOfData = pSect->bpb.ReservedSectors + pSect->bpb.BigSectorsPerFat * pSect->bpb.NumberOfFATs; pVolInfo->pBootFSInfo = (PBOOTFSINFO)(pVolInfo + 1); pVolInfo->pbFatSector = (PBYTE)(pVolInfo->pBootFSInfo + 1); pVolInfo->ulCurFatSector = -1L; pVolInfo->usClusterSize = pSect->bpb.BytesPerSector * pSect->bpb.SectorsPerCluster; pVolInfo->ulTotalClusters = (pSect->bpb.BigTotalSectors - pVolInfo->ulStartOfData) / pSect->bpb.SectorsPerCluster; pVolInfo->hVBP = hVBP; pVolInfo->hDupVBP = hDupVBP; pVolInfo->bDrive = pvpfsi->vpi_drive; pVolInfo->bUnit = pvpfsi->vpi_unit; pVolInfo->pNextVolInfo = NULL; if (usDefaultRASectors == 0xFFFF) pVolInfo->usRASectors = (pVolInfo->usClusterSize * 2) / SECTOR_SIZE; else pVolInfo->usRASectors = usDefaultRASectors; if (pVolInfo->usRASectors > (pVolInfo->usClusterSize * 4) / SECTOR_SIZE) pVolInfo->usRASectors = (pVolInfo->usClusterSize * 4) / SECTOR_SIZE; if (pSect->bpb.FSinfoSec != 0xFFFF) { ReadSector(pVolInfo, pSect->bpb.FSinfoSec, 1, pVolInfo->pbFatSector, DVIO_OPNCACHE); memcpy(pVolInfo->pBootFSInfo, pVolInfo->pbFatSector + FSINFO_OFFSET, sizeof (BOOTFSINFO)); } else memset(pVolInfo->pBootFSInfo, 0, sizeof (BOOTFSINFO)); *((PVOLINFO *)(pvpfsd->vpd_work)) = pVolInfo; if (!pGlobVolInfo) { pGlobVolInfo = pVolInfo; usVolCount = 1; } else { pNext = pGlobVolInfo; usVolCount = 1; if (pNext->bDrive == pvpfsi->vpi_drive && !pVolInfo->hDupVBP) pVolInfo->hDupVBP = pNext->hVBP; while (pNext->pNextVolInfo) { pNext = (PVOLINFO)pNext->pNextVolInfo; if (pNext->bDrive == pvpfsi->vpi_drive && !pVolInfo->hDupVBP) pVolInfo->hDupVBP = pNext->hVBP; usVolCount++; } pNext->pNextVolInfo = pVolInfo; usVolCount++; } if (f32Parms.fMessageActive & LOG_FS) Message("%u Volumes mounted!", usVolCount); rc = CheckWriteProtect(pVolInfo); if (rc && rc != ERROR_WRITE_PROTECT) { Message("Cannot access drive, rc = %u", rc); goto FS_MOUNT_EXIT; } if (rc == ERROR_WRITE_PROTECT) pVolInfo->fWriteProtected = TRUE; pVolInfo->fDiskCleanOnMount = pVolInfo->fDiskClean = GetDiskStatus(pVolInfo); if (!pVolInfo->fDiskCleanOnMount) Message("DISK IS DIRTY!"); if (pVolInfo->fWriteProtected) pVolInfo->fDiskCleanOnMount = TRUE; if (!pVolInfo->hDupVBP && (pVolInfo->pBootFSInfo->ulFreeClusters == 0xFFFFFFFF || !pVolInfo->fDiskClean || pVolInfo->BootSect.bpb.FSinfoSec == 0xFFFF)) GetFreeSpace(pVolInfo); pDevCaps = pvpfsi->vpi_pDCS; pVolChars = pvpfsi->vpi_pVCS; if (pDevCaps->Capabilities & GDC_DD_Read2) Message("Read2 supported"); if (pDevCaps->Capabilities & GDC_DD_DMA_Word) Message("DMA on word alligned buffers supported"); if (pDevCaps->Capabilities & GDC_DD_DMA_Byte) Message("DMA on byte alligned buffers supported"); if (pDevCaps->Capabilities & GDC_DD_Mirror) Message("Disk Mirroring supported"); if (pDevCaps->Capabilities & GDC_DD_Duplex) Message("Disk Duplexing supported"); if (pDevCaps->Capabilities & GDC_DD_No_Block) Message("Strategy2 does not block"); if (pDevCaps->Capabilities & GDC_DD_16M) Message(">16M supported"); if (pDevCaps->Strategy2) { Message("Strategy2 address at %lX", pDevCaps->Strategy2); Message("ChgPriority address at %lX", pDevCaps->ChgPriority); pVolInfo->pfnStrategy = (STRATFUNC)pDevCaps->Strategy2; pVolInfo->pfnPriority = (STRATFUNC)pDevCaps->ChgPriority; } rc = 0; break; case MOUNT_VOL_REMOVED: case MOUNT_RELEASE: pVolInfo = GetVolInfo(hVBP); if (!pVolInfo->hDupVBP) UpdateFSInfo(pVolInfo); RemoveVolume(pVolInfo); freeseg(pVolInfo); rc = 0; break; default : rc = ERROR_NOT_SUPPORTED; break; } FS_MOUNT_EXIT: if (f32Parms.fMessageActive & LOG_FS) Message("FS_MOUNT returned %u\n", rc); return rc; }
static int glob3(Char *pathbuf, Char *pathbuf_last, Char *pathend, Char *pathend_last, Char *pattern, Char *pattern_last, Char *restpattern, Char *restpattern_last, glob_t *pglob, size_t *limitp) { register Direntry_t *dp; DIR *dirp; int err; int nocase; char buf[MAXPATHLEN]; /* * The readdirfunc declaration can't be prototyped, because it is * assigned, below, to two functions which are prototyped in glob.h * and dirent.h as taking pointers to differently typed opaque * structures. */ Direntry_t *(*readdirfunc)(DIR*); if (pathend > pathend_last) return (1); *pathend = BG_EOS; errno = 0; #ifdef VMS { Char *q = pathend; if (q - pathbuf > 5) { q -= 5; if (q[0] == '.' && tolower(q[1]) == 'd' && tolower(q[2]) == 'i' && tolower(q[3]) == 'r' && q[4] == '/') { q[0] = '/'; q[1] = BG_EOS; pathend = q+1; } } } #endif #ifdef MACOS_TRADITIONAL if ((!*pathbuf) && (g_matchVol)) { FSSpec spec; short index; StrFileName vol_name; /* unsigned char[64] on MacOS */ err = 0; nocase = ((pglob->gl_flags & GLOB_NOCASE) != 0); /* Get and match a list of volume names */ for (index = 0; !GetVolInfo(index+1, true, &spec); ++index) { register U8 *sc; register Char *dc; name_f_FSSpec(vol_name, &spec); /* Initial BG_DOT must be matched literally. */ if (*vol_name == BG_DOT && *pattern != BG_DOT) continue; dc = pathend; sc = (U8 *) vol_name; while (dc < pathend_last && (*dc++ = *sc++) != BG_EOS) ; if (dc >= pathend_last) { *dc = BG_EOS; err = 1; break; } if (!match(pathend, pattern, restpattern, nocase)) { *pathend = BG_EOS; continue; } err = glob2(pathbuf, pathbuf_last, --dc, pathend_last, restpattern, restpattern_last, pglob, limitp); if (err) break; } return(err); } else { /* open dir */ #endif /* MACOS_TRADITIONAL */ if ((dirp = g_opendir(pathbuf, pglob)) == NULL) { /* TODO: don't call for ENOENT or ENOTDIR? */ if (pglob->gl_errfunc) { if (g_Ctoc(pathbuf, buf, sizeof(buf))) return (GLOB_ABEND); if (pglob->gl_errfunc(buf, errno) || (pglob->gl_flags & GLOB_ERR)) return (GLOB_ABEND); } return(0); } err = 0; nocase = ((pglob->gl_flags & GLOB_NOCASE) != 0); /* Search directory for matching names. */ if (pglob->gl_flags & GLOB_ALTDIRFUNC) readdirfunc = (Direntry_t *(*)(DIR *))pglob->gl_readdir; else readdirfunc = my_readdir; while ((dp = (*readdirfunc)(dirp))) { register U8 *sc; register Char *dc; /* Initial BG_DOT must be matched literally. */ if (dp->d_name[0] == BG_DOT && *pattern != BG_DOT) continue; dc = pathend; sc = (U8 *) dp->d_name; while (dc < pathend_last && (*dc++ = *sc++) != BG_EOS) ; if (dc >= pathend_last) { *dc = BG_EOS; err = 1; break; } if (!match(pathend, pattern, restpattern, nocase)) { *pathend = BG_EOS; continue; } err = glob2(pathbuf, pathbuf_last, --dc, pathend_last, restpattern, restpattern_last, pglob, limitp); if (err) break; } if (pglob->gl_flags & GLOB_ALTDIRFUNC) (*pglob->gl_closedir)(dirp); else PerlDir_close(dirp); return(err); #ifdef MACOS_TRADITIONAL } #endif }
/* * Execute command. */ void DoCommand( Client_t *cli) { int rc; char *cmd_name; char *lasts; char *msg; rc = 0; SetErrno = 0; msg = cli->cmdbuf; /* * Extract command name. */ /* LINTED improper pointer/integer combination */ cmd_name = strtok_r(msg, " ", &lasts); if (strcmp(cmd_name, SAMRFT_CMD_CONNECT) == 0) { SendReply(cli, "%s %d %d", SAMRFT_CMD_CONNECT, 0, 0); } else if (strcmp(cmd_name, SAMRFT_CMD_CONFIG) == 0) { char *hostname; int blksize; int tcpwindowsize; hostname = getString(&lasts); blksize = GetCfgBlksize(); tcpwindowsize = GetCfgTcpWindowsize(); SamStrdup(cli->hostname, hostname); rc = CreateCrew(cli, 1, blksize); SendReply(cli, "%s %d %d %d %d", SAMRFT_CMD_CONFIG, rc, 1, blksize, tcpwindowsize); } else if (strcmp(cmd_name, SAMRFT_CMD_OPEN) == 0) { char *filename; int oflag; SamrftCreateAttr_t creat; filename = getString(&lasts); oflag = getInteger(&lasts); if (getInteger(&lasts)) { (void) memset((char *)&creat, 0, sizeof (SamrftCreateAttr_t)); creat.mode = getInteger(&lasts); creat.uid = getInteger(&lasts); creat.gid = getInteger(&lasts); rc = OpenFile(cli, filename, oflag, &creat); } else { rc = OpenFile(cli, filename, oflag, NULL); } SendReply(cli, "%s %d %d", SAMRFT_CMD_OPEN, rc, errno); } else if (strcmp(cmd_name, SAMRFT_CMD_DPORT) == 0) { struct sockaddr_in data; int seqnum; char *addr = (char *)&data.sin_addr; char *port = (char *)&data.sin_port; (void) memset((char *)&data, 0, sizeof (struct sockaddr_in)); data.sin_family = AF_INET; seqnum = getInteger(&lasts); /* * Addr. */ addr[0] = getInteger(&lasts); addr[1] = getInteger(&lasts); addr[2] = getInteger(&lasts); addr[3] = getInteger(&lasts); /* * Port. */ port[0] = getInteger(&lasts); port[1] = getInteger(&lasts); rc = InitDataConnection(cli, "r", seqnum, data.sin_family, (struct sockaddr *)&data); SendReply(cli, "%s %d %d", SAMRFT_CMD_DPORT, rc, errno); } else if (strcmp(cmd_name, SAMRFT_CMD_DPORT6) == 0) { struct sockaddr_in6 data; struct sockaddr_in *data4 = (struct sockaddr_in *)&data; int i; int seqnum; char *addr; char *port; (void) memset((char *)&data, 0, sizeof (struct sockaddr_in6)); seqnum = getInteger(&lasts); /* * Address family. */ data.sin6_family = getInteger(&lasts); if (data.sin6_family == AF_INET6) { addr = (char *)&data.sin6_addr; port = (char *)&data.sin6_port; } else { addr = (char *)&data4->sin_addr; port = (char *)&data4->sin_port; } /* * Addr. */ for (i = 0; i < 16; i++) { addr[i] = getInteger(&lasts); } /* * Port. */ port[0] = getInteger(&lasts); port[1] = getInteger(&lasts); rc = InitDataConnection(cli, "r", seqnum, data.sin6_family, (struct sockaddr *)&data); SendReply(cli, "%s %d %d", SAMRFT_CMD_DPORT6, rc, errno); } else if (strcmp(cmd_name, SAMRFT_CMD_STOR) == 0) { fsize_t nbytes; nbytes = getLongLong(&lasts); rc = ReceiveData(cli, nbytes); } else if (strcmp(cmd_name, SAMRFT_CMD_SEND) == 0) { size_t nbytes; nbytes = getInteger(&lasts); rc = ReceiveData(cli, nbytes); SendReply(cli, "%s %d %d", SAMRFT_CMD_SEND, rc, errno); } else if (strcmp(cmd_name, SAMRFT_CMD_RECV) == 0) { size_t nbytes; nbytes = getInteger(&lasts); /* * Process receive command from client. Send data from local * file over data sockets to the client process. */ rc = SendData(cli, nbytes); SendReply(cli, "%s %d %d", SAMRFT_CMD_RECV, rc, errno); } else if (strcmp(cmd_name, SAMRFT_CMD_SEEK) == 0) { off64_t setpos; int whence; off64_t offset; setpos = getLongLong(&lasts); whence = getInteger(&lasts); rc = SeekFile(cli, setpos, whence, &offset); SendReply(cli, "%s %d %d %lld", SAMRFT_CMD_SEEK, rc, errno, offset); } else if (strcmp(cmd_name, SAMRFT_CMD_FLOCK) == 0) { int type; type = getInteger(&lasts); rc = FlockFile(cli, type); SendReply(cli, "%s %d %d", SAMRFT_CMD_FLOCK, rc, errno); } else if (strcmp(cmd_name, SAMRFT_CMD_ARCHIVEOP) == 0) { char *path; char *ops; path = getString(&lasts); ops = getString(&lasts); rc = sam_archive(path, ops); SendReply(cli, "%s %d %d", SAMRFT_CMD_ARCHIVEOP, rc, errno); } else if (strcmp(cmd_name, SAMRFT_CMD_CLOSE) == 0) { rc = CloseFile(cli); SendReply(cli, "%s %d %d", SAMRFT_CMD_CLOSE, rc, errno); } else if (strcmp(cmd_name, SAMRFT_CMD_UNLINK) == 0) { char *name; name = getString(&lasts); rc = UnlinkFile(cli, name); SendReply(cli, "%s %d %d", SAMRFT_CMD_UNLINK, rc, errno); } else if (strcmp(cmd_name, SAMRFT_CMD_DISCONN) == 0) { Trace(TR_DEBUG, "RFT disconnect, no reply: '%s'", cli->cmdbuf); CleanupCrew(cli); cli->disconnect = 1; /* * No reply. */ } else if (strcmp(cmd_name, SAMRFT_CMD_ISMOUNTED) == 0) { int mounted; char *mount_point; mount_point = getString(&lasts); mounted = IsMounted(cli, mount_point); SendReply(cli, "%s %d", SAMRFT_CMD_ISMOUNTED, mounted); } else if (strcmp(cmd_name, SAMRFT_CMD_STAT) == 0) { struct stat64 buf; char *filename; filename = getString(&lasts); (void) memset(&buf, 0, sizeof (buf)); rc = stat64(filename, &buf); SendReply(cli, "%s %d %d %d %d %d %lld", SAMRFT_CMD_STAT, rc, errno, buf.st_mode, buf.st_uid, buf.st_gid, buf.st_size); } else if (strcmp(cmd_name, SAMRFT_CMD_STATVFS) == 0) { struct statvfs64 buf; char *mount_point; int offlineFiles; fsize_t offlineFileSize; mount_point = getString(&lasts); offlineFiles = getInteger(&lasts); (void) memset(&buf, 0, sizeof (buf)); rc = statvfs64(mount_point, &buf); if (rc == 0 && (strcmp(buf.f_basetype, "samfs") == 0) && offlineFiles == B_TRUE) { offlineFileSize = DiskVolsOfflineFiles(mount_point); /* * Adjust capacity to include size of offline files. */ buf.f_blocks += offlineFileSize / buf.f_frsize; } SendReply(cli, "%s %d %d %lld %lld %ld %s", SAMRFT_CMD_STATVFS, rc, errno, buf.f_bfree, buf.f_blocks, buf.f_frsize, buf.f_basetype); } else if (strcmp(cmd_name, SAMRFT_CMD_SPACEUSED) == 0) { char *path; fsize_t spaceUsed; path = getString(&lasts); spaceUsed = DiskVolsAccumSpaceUsed(path); SendReply(cli, "%s %d %d %lld", SAMRFT_CMD_SPACEUSED, rc, errno, spaceUsed); } else if (strcmp(cmd_name, SAMRFT_CMD_MKDIR) == 0) { char *dirname; int mode, uid, gid; dirname = getString(&lasts); mode = getInteger(&lasts); uid = getInteger(&lasts); gid = getInteger(&lasts); rc = MkDir(cli, dirname, mode, uid, gid); SendReply(cli, "%s %d %d", SAMRFT_CMD_MKDIR, rc, errno); } else if (strcmp(cmd_name, SAMRFT_CMD_OPENDIR) == 0) { char *dirname; int dirp; dirname = getString(&lasts); rc = OpenDir(cli, dirname, &dirp); SendReply(cli, "%s %d %d %d", SAMRFT_CMD_OPENDIR, rc, errno, dirp); } else if (strcmp(cmd_name, SAMRFT_CMD_READDIR) == 0) { int dirp; SamrftReaddirInfo_t dir_info; dirp = getInteger(&lasts); rc = ReadDir(cli, dirp, &dir_info); if (rc == 0) { SendReply(cli, "%s %d %d %s %d", SAMRFT_CMD_READDIR, rc, errno, dir_info.name, dir_info.isdir); } else { SendReply(cli, "%s %d %d", SAMRFT_CMD_READDIR, rc, errno); } } else if (strcmp(cmd_name, SAMRFT_CMD_CLOSEDIR) == 0) { int dirp; dirp = getInteger(&lasts); CloseDir(cli, dirp); SendReply(cli, "%s %d %d", SAMRFT_CMD_CLOSEDIR, 0, 0); } else if (strcmp(cmd_name, SAMRFT_CMD_RMDIR) == 0) { char *dirname; dirname = getString(&lasts); rc = RmDir(cli, dirname); SendReply(cli, "%s %d %d", SAMRFT_CMD_CLOSEDIR, rc, errno); } else if (strcmp(cmd_name, SAMRFT_CMD_LOADVOL) == 0) { struct sam_rminfo rb; int oflag; /* * Create sam_rminfo structure used to create * a removable-media file. */ (void) memset(&rb, 0, sizeof (rb)); rb.flags = getInteger(&lasts); (void) strncpy(rb.file_id, getString(&lasts), sizeof (rb.file_id)); (void) strncpy(rb.owner_id, getString(&lasts), sizeof (rb.owner_id)); (void) strncpy(rb.group_id, getString(&lasts), sizeof (rb.group_id)); rb.n_vsns = 1; (void) strncpy(rb.media, getString(&lasts), sizeof (rb.media)); (void) strncpy(rb.section[0].vsn, getString(&lasts), sizeof (rb.section[0].vsn)); oflag = getInteger(&lasts); rc = LoadVol(cli, &rb, oflag); SendReply(cli, "%s %d %d", SAMRFT_CMD_LOADVOL, rc, errno); } else if (strcmp(cmd_name, SAMRFT_CMD_GETVOLINFO) == 0) { struct sam_rminfo getrm; int eq; rc = GetVolInfo(cli, &getrm, &eq); SendReply(cli, "%s %d %d %d %lld %d", SAMRFT_CMD_GETVOLINFO, rc, errno, getrm.block_size, getrm.position, eq); } else if (strcmp(cmd_name, SAMRFT_CMD_SEEKVOL) == 0) { int block; block = getInteger(&lasts); rc = SeekVol(cli, block); SendReply(cli, "%s %d %d", SAMRFT_CMD_SEEKVOL, rc, errno); } else if (strcmp(cmd_name, SAMRFT_CMD_UNLOADVOL) == 0) { struct sam_ioctl_rmunload unload; /* * Create sam_rmunload structure used to unload * a removable-media file. */ (void) memset(&unload, 0, sizeof (unload)); unload.flags = getInteger(&lasts); rc = UnloadVol(cli, &unload); SendReply(cli, "%s %d %d %lld", SAMRFT_CMD_UNLOADVOL, rc, errno, unload.position); } else { Trace(TR_ERR, "Unknown RFT command: %s", cmd_name); } }