/* * Prevents DOS to access a DFx device. */ static int dev_inhibit (char *dev, int on) { char buff[10]; char *s; struct MsgPort *DevPort; if (!*dev) return 0; s = dev; while(*s++); if (s[-2] == ':') strcpy (buff, dev); else sprintf (buff, "%s:", dev); if ((DevPort = (struct MsgPort*) DeviceProc ((STRPTR)buff))) { if (on) { DoPkt (DevPort, ACTION_INHIBIT, DOSTRUE, 0, 0, 0, 0); return 1; } else DoPkt (DevPort, ACTION_INHIBIT, DOSFALSE, 0, 0, 0, 0); } return 0; }
// Get the root of a pathname int get_path_root(char *path,char *root_name,struct DateStamp *date) { struct DevProc *proc; D_S(struct InfoData, info) struct DosList *dos; // Get device process if (!(proc=GetDeviceProc(path,0))) return 0; // Send info packet #ifdef __AROS__ if (((struct Library *)DOSBase)->lib_Version<50) { //Info(proc->dvp_Lock,info); BPTR lock; if (!(lock=Lock(path,SHARED_LOCK))) { FreeDeviceProc(proc); return 0; } Info(lock,info); UnLock(lock); } else #endif DoPkt(proc->dvp_Port,ACTION_DISK_INFO,MKBADDR(info),0,0,0,0); // Get DOS list pointer if (!(dos=(struct DosList *)BADDR(info->id_VolumeNode))) { FreeDeviceProc(proc); return 0; } // Get root device name if (root_name) { if (dos->dol_Name) BtoCStr(dos->dol_Name,root_name,32); else *root_name=0; } // Copy datestamp if buffer supplied if (date) *date=dos->dol_misc.dol_volume.dol_VolumeDate; // Free device process FreeDeviceProc(proc); // Return disk state return info->id_DiskState; }
// Get disk info LONG GetDiskInfo(char *device,struct InfoData *info) { struct DevProc *proc; struct DosList *dos; LONG res=0; // Get device proc if (!(proc=GetDeviceProc(device,0))) return 0; // Send packet #ifdef __AROS__ if (((struct Library *)DOSBase)->lib_Version<50) { //res=Info(proc->dvp_Lock,info); BPTR lock; if ((lock=Lock(device,SHARED_LOCK))) { res=Info(lock,info); UnLock(lock); } } else #endif res=DoPkt(proc->dvp_Port,ACTION_DISK_INFO,MKBADDR(info),0,0,0,0); // Clear "in use" flag to indicate formatting by default info->id_InUse=0; // Get doslist pointer if ((dos=DeviceFromHandler(proc->dvp_Port,NULL))) { // Invalid device? if (!GetDeviceUnit(dos->dol_misc.dol_handler.dol_Startup,NULL,NULL)) { // Disk can't be formatted info->id_InUse=1; } } // Free device proc FreeDeviceProc(proc); return res; }
/* TODO: 64bit sizes !? */ uae_s64 int my_fsize (struct my_openfile_s *mos) { struct FileInfoBlock * fib=NULL; BPTR lock=NULL; uae_s64 size; if(!(fib=(struct FileInfoBlock *) AllocDosObject(DOS_FIB, NULL)) || !Examine(lock, fib)) { bug("[JUAE:A-FSDB] %s: failed to examine lock @ 0x%p [fib @ 0x%p]\n", __PRETTY_FUNCTION__, lock, fib); size=-1; goto EXIT; } /* test for 64 bit filesize */ if(fib->fib_Size >= 0x7FFFFFFF) { bug("[JUAE:A-FSDB] %s: WARNING: filesize >2GB detected. This has never been tested!\n", __PRETTY_FUNCTION__); UQUAD *size_ptr=(UQUAD *)DoPkt(((struct FileLock *)lock)->fl_Task, ACTION_GET_FILE_SIZE64, (IPTR)lock, 0, 0, 0, 0); if (size_ptr) { size=(uae_s64) *size_ptr; } else { bug("[JUAE:A-FSDB] %s: ERROR: DoPkt return NULL!\n"); size=-1; } goto EXIT; } /* extend 32-bit */ size=(uae_s64) fib->fib_Size; EXIT: DebOut("size: %d\n", size); FreeDosObject(DOS_FIB, fib); return size; }
// Open a disk for IO DiskHandle *LIBFUNC L_OpenDisk( REG(a0, char *disk), REG(a1, struct MsgPort *port)) { DiskHandle *handle; struct DosList *dl; unsigned long blocks; char *ptr; // Allocate handle if (!(handle=AllocVec(sizeof(DiskHandle),MEMF_CLEAR))) return 0; // Copy name, strip colon stccpy(handle->dh_name,disk,31); if ((ptr=strchr(handle->dh_name,':'))) *ptr=0; // Lock DOS list dl=LockDosList(LDF_DEVICES|LDF_READ); // Find entry if (!(dl=FindDosEntry(dl,handle->dh_name,LDF_DEVICES))) { // Not found UnLockDosList(LDF_DEVICES|LDF_READ); FreeVec(handle); return 0; } // Add colon back on strcat(handle->dh_name,":"); // Get pointer to startup message and geometry handle->dh_startup=(struct FileSysStartupMsg *)BADDR(dl->dol_misc.dol_handler.dol_Startup); handle->dh_geo=(struct DosEnvec *)BADDR(handle->dh_startup->fssm_Environ); // Shortcuts to root block and blocksize blocks=handle->dh_geo->de_BlocksPerTrack* handle->dh_geo->de_Surfaces* (handle->dh_geo->de_HighCyl-handle->dh_geo->de_LowCyl+1); handle->dh_root=(blocks-1+handle->dh_geo->de_Reserved)>>1; handle->dh_blocksize=handle->dh_geo->de_SizeBlock<<2; // Get real device name L_BtoCStr((BPTR)handle->dh_startup->fssm_Device,handle->dh_device,32); // Get information #ifdef __AROS__ if (((struct Library *)DOSBase)->lib_Version<50) { //handle->dh_result=Info(dl->dol_Lock,&handle->dh_info); BPTR lock; handle->dh_result=0; if ((lock=Lock(handle->dh_name,SHARED_LOCK))) { handle->dh_result=Info(lock,&handle->dh_info); UnLock(lock); } } else #endif handle->dh_result=DoPkt(dl->dol_Task,ACTION_DISK_INFO,MKBADDR(&handle->dh_info),0,0,0,0); // Unlock dos list UnLockDosList(LDF_DEVICES|LDF_READ); // Create message port if needed if (!port) { if (!(handle->dh_port=CreateMsgPort())) { FreeVec(handle); return 0; } port=handle->dh_port; } // Create IO request if (!(handle->dh_io=(struct IOExtTD *)CreateIORequest(port,sizeof(struct IOExtTD)))) { if (handle->dh_port) DeleteMsgPort(handle->dh_port); FreeVec(handle); return 0; } // Open device if (OpenDevice( handle->dh_device, handle->dh_startup->fssm_Unit, (struct IORequest *)handle->dh_io, handle->dh_startup->fssm_Flags)) { // Failed to open L_CloseDisk(handle); return 0; } return handle; }