void checkDeviceFlags(struct AFSBase *afsbase) { struct Volume *volume; struct IOHandle *ioh; volume = (struct Volume *)afsbase->device_list.lh_Head; while (volume->ln.ln_Succ != NULL) { ioh = &volume->ioh; if ((ioh->ioflags & IOHF_MEDIA_CHANGE) && (!volume->inhibitcounter)) { D(bug("[afs 0x%08lX] Media change signalled\n", volume)); if (diskPresent(afsbase, ioh)) { if (!volume->inhibitcounter) { D(bug("[afs 0x%08lX] Media inserted\n", volume)); newMedium(afsbase, volume); } ioh->ioflags |= IOHF_DISK_IN; } else { if (!volume->inhibitcounter) { flush(afsbase, volume); remDosVolume(afsbase, volume); } ioh->ioflags &= ~IOHF_DISK_IN; } ioh->ioflags &= ~IOHF_MEDIA_CHANGE; } volume = (struct Volume *)volume->ln.ln_Succ; } }
/******************************************* Name : initVolume Descr.: maybe a better name would be mountVolume allocate resources for a new mounted device Input : device - device pointer blockdevice - name of blockdevice unit - unit number of blockdevice devicedef - medium geometry data error - return error code Output: 0 on error (error set dos dos error); pointer to struct Volume on success ********************************************/ struct Volume *initVolume ( struct AFSBase *afsbase, struct Device *device, CONST_STRPTR blockdevice, ULONG unit, struct DosEnvec *devicedef, ULONG *error ) { struct Volume *volume; volume = AllocMem(sizeof(struct Volume),MEMF_PUBLIC | MEMF_CLEAR); if (volume != NULL) { volume->device = device; volume->ioh.blockdevice = blockdevice; volume->ioh.unit = unit; volume->ioh.flags = 0; volume->SizeBlock=devicedef->de_SizeBlock; if (devicedef->de_TableSize>=20) volume->bootblocks=devicedef->de_BootBlocks; else volume->bootblocks=devicedef->de_Reserved; volume->blockcache=initCache(afsbase, volume, devicedef->de_NumBuffers); if (volume->blockcache != NULL) { if (openBlockDevice(afsbase, &volume->ioh)!= NULL) { volume->countblocks = ( ( devicedef->de_HighCyl-devicedef->de_LowCyl+1 )*devicedef->de_Surfaces*devicedef->de_BlocksPerTrack ); volume->rootblock =(volume->countblocks-1+devicedef->de_Reserved)/2; volume->startblock= devicedef->de_LowCyl* devicedef->de_Surfaces* devicedef->de_BlocksPerTrack; volume->lastblock= ( (devicedef->de_HighCyl+1) *devicedef->de_Surfaces *devicedef->de_BlocksPerTrack )-1; check64BitSupport(afsbase, volume); volume->ah.volume=volume; if (mediumPresent(&volume->ioh)) { *error = newMedium(afsbase, volume); } else *error = 0; if ((*error == 0) || (*error == ERROR_NOT_A_DOS_DISK)) { D(bug("[afs] initVolume: BootBlocks=%d\n",volume->bootblocks)); D(bug("[afs] initVolume: RootBlock=%ld\n",volume->rootblock)); volume->ah.header_block = volume->rootblock; return volume; } } else { *error=ERROR_NO_FREE_STORE; } freeCache(afsbase, volume->blockcache); } else { *error=ERROR_NO_FREE_STORE; } FreeMem(volume,sizeof(struct Volume)); } else *error=ERROR_NO_FREE_STORE; return NULL; }