#ifndef DOS_DOSEXTENS_H
#define DOS_DOSEXTENS_H
/*
** $Filename: dos/dosextens.h $
** $Release: 2.04 Includes, V37.4 $
** $Revision: 36.38 $
** $Date: 91/11/08 $
**
** DOS structures not needed for the casual AmigaDOS user
**
** (C) Copyright 1985-1999 Amiga, Inc.
** All Rights Reserved
*/
#ifndef EXEC_TASKS_H
#include "exec/tasks.h"
#endif
#ifndef EXEC_PORTS_H
#include "exec/ports.h"
#endif
#ifndef EXEC_LIBRARIES_H
#include "exec/libraries.h"
#endif
#ifndef EXEC_SEMAPHORES_H
#include "exec/semaphores.h"
#endif
#ifndef DEVICES_TIMER_H
#include "devices/timer.h"
#endif
#ifndef DOS_DOS_H
#include "dos/dos.h"
#endif
/* All DOS processes have this structure */
/* Create and Device Proc returns pointer to the MsgPort in this structure */
/* dev_proc = (struct Process *) (DeviceProc(..) - sizeof(struct Task)); */
struct Process {
struct Task pr_Task;
struct MsgPort pr_MsgPort; /* This is BPTR address from DOS functions */
WORD pr_Pad; /* Remaining variables on 4 byte boundaries */
BPTR pr_SegList; /* Array of seg lists used by this process */
LONG pr_StackSize; /* Size of process stack in bytes */
APTR pr_GlobVec; /* Global vector for this process (BCPL) */
LONG pr_TaskNum; /* CLI task number of zero if not a CLI */
BPTR pr_StackBase; /* Ptr to high memory end of process stack */
LONG pr_Result2; /* Value of secondary result from last call */
BPTR pr_CurrentDir; /* Lock associated with current directory */
BPTR pr_CIS; /* Current CLI Input Stream */
BPTR pr_COS; /* Current CLI Output Stream */
APTR pr_ConsoleTask; /* Console handler process for current window*/
APTR pr_FileSystemTask; /* File handler process for current drive */
BPTR pr_CLI; /* pointer to CommandLineInterface */
APTR pr_ReturnAddr; /* pointer to previous stack frame */
APTR pr_PktWait; /* Function to be called when awaiting msg */
APTR pr_WindowPtr; /* Window for error printing */
/* following definitions are new with 2.0 */
BPTR pr_HomeDir; /* Home directory of executing program */
LONG pr_Flags; /* flags telling dos about process */
void (*pr_ExitCode)(); /* code to call on exit of program or NULL */
LONG pr_ExitData; /* Passed as an argument to pr_ExitCode. */
UBYTE *pr_Arguments; /* Arguments passed to the process at start */
struct MinList pr_LocalVars; /* Local environment variables */
ULONG pr_ShellPrivate; /* for the use of the current shell */
BPTR pr_CES; /* Error stream - if NULL, use pr_COS */
}; /* Process */
/*
* Flags for pr_Flags
*/
#define PRB_FREESEGLIST 0
#define PRF_FREESEGLIST 1
#define PRB_FREECURRDIR 1
#define PRF_FREECURRDIR 2
#define PRB_FREECLI 2
#define PRF_FREECLI 4
#define PRB_CLOSEINPUT 3
#define PRF_CLOSEINPUT 8
#define PRB_CLOSEOUTPUT 4
#define PRF_CLOSEOUTPUT 16
#define PRB_FREEARGS 5
#define PRF_FREEARGS 32
/* The long word address (BPTR) of this structure is returned by
* Open() and other routines that return a file. You need only worry
* about this struct to do async io's via PutMsg() instead of
* standard file system calls */
struct FileHandle {
struct Message *fh_Link; /* EXEC message */
struct MsgPort *fh_Port; /* Reply port for the packet */
struct MsgPort *fh_Type; /* Port to do PutMsg() to
* Address is negative if a plain file */
LONG fh_Buf;
LONG fh_Pos;
LONG fh_End;
LONG fh_Funcs;
#define fh_Func1 fh_Funcs
LONG fh_Func2;
LONG fh_Func3;
LONG fh_Args;
#define fh_Arg1 fh_Args
LONG fh_Arg2;
}; /* FileHandle */
/* This is the extension to EXEC Messages used by DOS */
struct DosPacket {
struct Message *dp_Link; /* EXEC message */
struct MsgPort *dp_Port; /* Reply port for the packet */
/* Must be filled in each send. */
LONG dp_Type; /* See ACTION_... below and
* 'R' means Read, 'W' means Write to the
* file system */
LONG dp_Res1; /* For file system calls this is the result
* that would have been returned by the
* function, e.g. Write ('W') returns actual
* length written */
LONG dp_Res2; /* For file system calls this is what would
* have been returned by IoErr() */
/* Device packets common equivalents */
#define dp_Action dp_Type
#define dp_Status dp_Res1
#define dp_Status2 dp_Res2
#define dp_BufAddr dp_Arg1
LONG dp_Arg1;
LONG dp_Arg2;
LONG dp_Arg3;
LONG dp_Arg4;
LONG dp_Arg5;
LONG dp_Arg6;
LONG dp_Arg7;
}; /* DosPacket */
/* A Packet does not require the Message to be before it in memory, but
* for convenience it is useful to associate the two.
* Also see the function init_std_pkt for initializing this structure */
struct StandardPacket {
struct Message sp_Msg;
struct DosPacket sp_Pkt;
}; /* StandardPacket */
/* Packet types */
#define ACTION_NIL 0
#define ACTION_STARTUP 0
#define ACTION_GET_BLOCK 2 /* OBSOLETE */
#define ACTION_SET_MAP 4
#define ACTION_DIE 5
#define ACTION_EVENT 6
#define ACTION_CURRENT_VOLUME 7
#define ACTION_LOCATE_OBJECT 8
#define ACTION_RENAME_DISK 9
#define ACTION_WRITE 'W'
#define ACTION_READ 'R'
#define ACTION_FREE_LOCK 15
#define ACTION_DELETE_OBJECT 16
#define ACTION_RENAME_OBJECT 17
#define ACTION_MORE_CACHE 18
#define ACTION_COPY_DIR 19
#define ACTION_WAIT_CHAR 20
#define ACTION_SET_PROTECT 21
#define ACTION_CREATE_DIR 22
#define ACTION_EXAMINE_OBJECT 23
#define ACTION_EXAMINE_NEXT 24
#define ACTION_DISK_INFO 25
#define ACTION_INFO 26
#define ACTION_FLUSH 27
#define ACTION_SET_COMMENT 28
#define ACTION_PARENT 29
#define ACTION_TIMER 30
#define ACTION_INHIBIT 31
#define ACTION_DISK_TYPE 32
#define ACTION_DISK_CHANGE 33
#define ACTION_SET_DATE 34
#define ACTION_SCREEN_MODE 994
#define ACTION_READ_RETURN 1001
#define ACTION_WRITE_RETURN 1002
#define ACTION_SEEK 1008
#define ACTION_FINDUPDATE 1004
#define ACTION_FINDINPUT 1005
#define ACTION_FINDOUTPUT 1006
#define ACTION_END 1007
#define ACTION_SET_FILE_SIZE 1022 /* fast file system only in 1.3 */
#define ACTION_WRITE_PROTECT 1023 /* fast file system only in 1.3 */
/* new 2.0 packets */
#define ACTION_SAME_LOCK 40
#define ACTION_CHANGE_SIGNAL 995
#define ACTION_FORMAT 1020
#define ACTION_MAKE_LINK 1021
/**/
/**/
#define ACTION_READ_LINK 1024
#define ACTION_FH_FROM_LOCK 1026
#define ACTION_IS_FILESYSTEM 1027
#define ACTION_CHANGE_MODE 1028
/**/
#define ACTION_COPY_DIR_FH 1030
#define ACTION_PARENT_FH 1031
#define ACTION_EXAMINE_ALL 1033
#define ACTION_EXAMINE_FH 1034
#define ACTION_LOCK_RECORD 2008
#define ACTION_FREE_RECORD 2009
#define ACTION_ADD_NOTIFY 4097
#define ACTION_REMOVE_NOTIFY 4098
/* Tell a file system to serialize the current volume. This is typically
* done by changing the creation date of the disk. This packet does not take
* any arguments. NOTE: be prepared to handle failure of this packet for
* V37 ROM filesystems.
*/
#define ACTION_SERIALIZE_DISK 4200
/*
* A structure for holding error messages - stored as array with error == 0
* for the last entry.
*/
struct ErrorString {
LONG *estr_Nums;
UBYTE *estr_Strings;
};
/* DOS library node structure.
* This is the data at positive offsets from the library node.
* Negative offsets from the node is the jump table to DOS functions
* node = (struct DosLibrary *) OpenLibrary( "dos.library" .. ) */
struct DosLibrary {
struct Library dl_lib;
struct RootNode *dl_Root; /* Pointer to RootNode, described below */
APTR dl_GV; /* Pointer to BCPL global vector */
LONG dl_A2; /* BCPL standard register values */
LONG dl_A5;
LONG dl_A6;
struct ErrorString *dl_Errors; /* PRIVATE pointer to array of error msgs */
struct timerequest *dl_TimeReq; /* PRIVATE pointer to timer request */
struct Library *dl_UtilityBase; /* PRIVATE ptr to utility library */
struct Library *dl_IntuitionBase; /* PRIVATE ptr to intuition library */
}; /* DosLibrary */
/* */
struct RootNode {
BPTR rn_TaskArray; /* [0] is max number of CLI's
* [1] is APTR to process id of CLI 1
* [n] is APTR to process id of CLI n */
BPTR rn_ConsoleSegment; /* SegList for the CLI */
struct DateStamp rn_Time; /* Current time */
LONG rn_RestartSeg; /* SegList for the disk validator process */
BPTR rn_Info; /* Pointer to the Info structure */
BPTR rn_FileHandlerSegment; /* segment for a file handler */
struct MinList rn_CliList; /* new list of all CLI processes */
/* the first cpl_Array is also rn_TaskArray */
struct MsgPort *rn_BootProc; /* private ptr to msgport of boot fs */
BPTR rn_ShellSegment; /* seglist for Shell (for NewShell) */
LONG rn_Flags; /* dos flags */
}; /* RootNode */
#define RNB_WILDSTAR 24
#define RNF_WILDSTAR (1L<<24)
#define RNB_PRIVATE1 1 /* private for dos */
#define RNF_PRIVATE1 2
/* ONLY to be allocated by DOS! */
struct CliProcList {
struct MinNode cpl_Node;
LONG cpl_First; /* number of first entry in array */
struct MsgPort **cpl_Array;
/* [0] is max number of CLI's in this entry (n)
* [1] is CPTR to process id of CLI cpl_First
* [n] is CPTR to process id of CLI cpl_First+n-1
*/
};
struct DosInfo {
BPTR di_McName; /* PRIVATE: system resident module list */
#define di_ResList di_McName
BPTR di_DevInfo; /* Device List */
BPTR di_Devices; /* Currently zero */
BPTR di_Handlers; /* Currently zero */
APTR di_NetHand; /* Network handler processid; currently zero */
struct SignalSemaphore di_DevLock; /* do NOT access directly! */
struct SignalSemaphore di_EntryLock; /* do NOT access directly! */
struct SignalSemaphore di_DeleteLock; /* do NOT access directly! */
}; /* DosInfo */
/* structure for the Dos resident list. Do NOT allocate these, use */
/* AddSegment(), and heed the warnings in the autodocs! */
struct Segment {
BPTR seg_Next;
LONG seg_UC;
BPTR seg_Seg;
UBYTE seg_Name[4]; /* actually the first 4 chars of BSTR name */
};
#define CMD_SYSTEM -1
#define CMD_INTERNAL -2
#define CMD_DISABLED -999
/* DOS Processes started from the CLI via RUN or NEWCLI have this additional
* set to data associated with them */
struct CommandLineInterface {
LONG cli_Result2; /* Value of IoErr from last command */
BSTR cli_SetName; /* Name of current directory */
BPTR cli_CommandDir; /* Head of the path locklist */
LONG cli_ReturnCode; /* Return code from last command */
BSTR cli_CommandName; /* Name of current command */
LONG cli_FailLevel; /* Fail level (set by FAILAT) */
BSTR cli_Prompt; /* Current prompt (set by PROMPT) */
BPTR cli_StandardInput; /* Default (terminal) CLI input */
BPTR cli_CurrentInput; /* Current CLI input */
BSTR cli_CommandFile; /* Name of EXECUTE command file */
LONG cli_Interactive; /* Boolean; True if prompts required */
LONG cli_Background; /* Boolean; True if CLI created by RUN */
BPTR cli_CurrentOutput; /* Current CLI output */
LONG cli_DefaultStack; /* Stack size to be obtained in long words */
BPTR cli_StandardOutput; /* Default (terminal) CLI output */
BPTR cli_Module; /* SegList of currently loaded command */
}; /* CommandLineInterface */
/* This structure can take on different values depending on whether it is
* a device, an assigned directory, or a volume. Below is the structure
* reflecting volumes only. Following that is the structure representing
* only devices. Following that is the unioned structure representing all
* the values
*/
/* structure representing a volume */
struct DeviceList {
BPTR dl_Next; /* bptr to next device list */
LONG dl_Type; /* see DLT below */
struct MsgPort * dl_Task; /* ptr to handler task */
BPTR dl_Lock; /* not for volumes */
struct DateStamp dl_VolumeDate; /* creation date */
BPTR dl_LockList; /* outstanding locks */
LONG dl_DiskType; /* 'DOS', etc */
LONG dl_unused;
BSTR dl_Name; /* bptr to bcpl name */
};
/* device structure (same as the DeviceNode structure in filehandler.h) */
struct DevInfo {
BPTR dvi_Next;
LONG dvi_Type;
APTR dvi_Task;
BPTR dvi_Lock;
BSTR dvi_Handler;
LONG dvi_StackSize;
LONG dvi_Priority;
LONG dvi_Startup;
BPTR dvi_SegList;
BPTR dvi_GlobVec;
BSTR dvi_Name;
};
/* combined structure for devices, assigned directories, volumes */
struct DosList {
BPTR dol_Next; /* bptr to next device on list */
LONG dol_Type; /* see DLT below */
struct MsgPort *dol_Task; /* ptr to handler task */
BPTR dol_Lock;
union {
struct {
BSTR dol_Handler; /* file name to load if seglist is null */
LONG dol_StackSize; /* stacksize to use when starting process */
LONG dol_Priority; /* task priority when starting process */
ULONG dol_Startup; /* startup msg: FileSysStartupMsg for disks */
BPTR dol_SegList; /* already loaded code for new task */
BPTR dol_GlobVec; /* BCPL global vector to use when starting
* a process. -1 indicates a C/Assembler
* program. */
} dol_handler;
struct {
struct DateStamp dol_VolumeDate; /* creation date */
BPTR dol_LockList; /* outstanding locks */
LONG dol_DiskType; /* 'DOS', etc */
} dol_volume;
struct {
UBYTE *dol_AssignName; /* name for non-or-late-binding assign */
struct AssignList *dol_List; /* for multi-directory assigns (regular) */
} dol_assign;
} dol_misc;
BSTR dol_Name; /* bptr to bcpl name */
};
/* structure used for multi-directory assigns. AllocVec()ed. */
struct AssignList {
struct AssignList *al_Next;
BPTR al_Lock;
};
/* definitions for dl_Type */
#define DLT_DEVICE 0
#define DLT_DIRECTORY 1 /* assign */
#define DLT_VOLUME 2
#define DLT_LATE 3 /* late-binding assign */
#define DLT_NONBINDING 4 /* non-binding assign */
#define DLT_PRIVATE -1 /* for internal use only */
/* structure return by GetDeviceProc() */
struct DevProc {
struct MsgPort *dvp_Port;
BPTR dvp_Lock;
ULONG dvp_Flags;
struct DosList *dvp_DevNode; /* DON'T TOUCH OR USE! */
};
/* definitions for dvp_Flags */
#define DVPB_UNLOCK 0
#define DVPF_UNLOCK (1L << DVPB_UNLOCK)
#define DVPB_ASSIGN 1
#define DVPF_ASSIGN (1L << DVPB_ASSIGN)
/* Flags to be passed to LockDosList(), etc */
#define LDB_DEVICES 2
#define LDF_DEVICES (1L << LDB_DEVICES)
#define LDB_VOLUMES 3
#define LDF_VOLUMES (1L << LDB_VOLUMES)
#define LDB_ASSIGNS 4
#define LDF_ASSIGNS (1L << LDB_ASSIGNS)
#define LDB_ENTRY 5
#define LDF_ENTRY (1L << LDB_ENTRY)
#define LDB_DELETE 6
#define LDF_DELETE (1L << LDB_DELETE)
/* you MUST specify one of LDF_READ or LDF_WRITE */
#define LDB_READ 0
#define LDF_READ (1L << LDB_READ)
#define LDB_WRITE 1
#define LDF_WRITE (1L << LDB_WRITE)
/* actually all but LDF_ENTRY (which is used for internal locking) */
#define LDF_ALL (LDF_DEVICES|LDF_VOLUMES|LDF_ASSIGNS)
/* a lock structure, as returned by Lock() or DupLock() */
struct FileLock {
BPTR fl_Link; /* bcpl pointer to next lock */
LONG fl_Key; /* disk block number */
LONG fl_Access; /* exclusive or shared */
struct MsgPort * fl_Task; /* handler task's port */
BPTR fl_Volume; /* bptr to DLT_VOLUME DosList entry */
};
/* error report types for ErrorReport() */
#define REPORT_STREAM 0 /* a stream */
#define REPORT_TASK 1 /* a process - unused */
#define REPORT_LOCK 2 /* a lock */
#define REPORT_VOLUME 3 /* a volume node */
#define REPORT_INSERT 4 /* please insert volume */
/* Special error codes for ErrorReport() */
#define ABORT_DISK_ERROR 296 /* Read/write error */
#define ABORT_BUSY 288 /* You MUST replace... */
/* types for initial packets to shells from run/newcli/execute/system. */
/* For shell-writers only */
#define RUN_EXECUTE -1
#define RUN_SYSTEM -2
#define RUN_SYSTEM_ASYNCH -3
/* Types for fib_DirEntryType. NOTE that both USERDIR and ROOT are */
/* directories, and that directory/file checks should use <0 and >=0. */
/* This is not necessarily exhaustive! Some handlers may use other */
/* values as needed, though <0 and >=0 should remain as supported as */
/* possible. */
#define ST_ROOT 1
#define ST_USERDIR 2
#define ST_SOFTLINK 3 /* looks like dir, but may point to a file! */
#define ST_LINKDIR 4 /* hard link to dir */
#define ST_FILE -3 /* must be negative for FIB! */
#define ST_LINKFILE -4 /* hard link to file */
#define ST_PIPEFILE -5 /* for pipes that support ExamineFH */
#endif /* DOS_DOSEXTENS_H */