[Contents] [Index] [Help] [Retrace] [browse <] [Browse >]

#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 */