コード例 #1
0
ファイル: ami-disk.c プロジェクト: threader/e-uae-ppc-jit-nix
/*
 * 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;
}
コード例 #2
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;
}
コード例 #3
0
ファイル: misc.c プロジェクト: timofonic/dopus5allamigas
// 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;
}
コード例 #4
0
ファイル: fsdb_aros.cpp プロジェクト: Kalamatee/WinUAE
/* 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;
}
コード例 #5
0
ファイル: diskio.c プロジェクト: timofonic/dopus5allamigas
// 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;
}