/****************************************************************************/
/*                                                                          */
/*  RMX_IO.H:       Prototypes for iRMX BASIC and EXTENDED I/O system calls */
/*                  and definitions for special values and exception codes  */
/*                  used with and/or returned by them.                      */
/*                                                                          */
/*  LAST UPDATE:    December 22, 1991 [13:47:56]                            */
/*                                                                          */
/*  DEPENDENCIES:   See RMX_EXC.H.                                          */
/*                                                                          */
/****************************************************************************/

#ifndef _RMX_IO_H
#define _RMX_IO_H

#ifndef _RMX_EXC_H
#include <rmx_exc.h>
#endif

/* ENVIRONMENTAL EXCEPTION CODES */

#define E_FEXIST                0x0020
#define E_FNEXIST               0x0021
#define E_DEVFD                 0x0022
#define E_SUPPORT               0x0023
#define E_EMPTY_ENTRY           0x0024
#define E_DIR_END               0x0025
#define E_FACCESS               0x0026
#define E_FTYPE                 0x0027
#define E_SHARE                 0x0028
#define E_SPACE                 0x0029
#define E_IDDR                  0x002A
#define E_IO                    0x002B
#define E_FLUSHING              0x002C
#define E_ILLVOL                0x002D
#define E_DEV_OFF_LINE          0x002E
#define E_IFDR                  0x002F
#define E_FRAGMENTATION         0x0030
#define E_DIR_NOT_EMPTY         0x0031
#define E_NOT_FILE_CONN         0x0032
#define E_NOT_DEVICE_CONN       0x0033
#define E_CONN_NOT_OPEN         0x0034
#define E_CONN_OPEN             0x0035
#define E_BUFFERED_CONN         0x0036
#define E_OUTSTANDING_CONNS     0x0037
#define E_ALREADY_ATTACHED      0x0038
#define E_DEV_DETACHING         0x0039
#define E_NOT_SAME_DEVICE       0x003A
#define E_ILLOGICAL_RENAME      0x003B
#define E_STREAM_SPECIAL        0x003C
#define E_INVALID_FNODE         0x003D
#define E_PATHNAME_SYNTAX       0x003E
#define E_FNODE_LIMIT           0x003F

/* E_IO EXCEPTION CODE EXPANDED WITH UNIT STATUS CODES */

#define E_IO_UNCLASS            0x0050
#define E_IO_SOFT               0x0051
#define E_IO_HARD               0x0052
#define E_IO_OPRINT             0x0053
#define E_IO_WRPROT             0x0054
#define E_IO_NO_DATA            0x0055
#define E_IO_MODE               0x0056
#define E_IO_NO_SPARES          0x0057
#define E_IO_ALT_ASSIGNED       0x0058

/* PROGRAMMING EXCEPTIONS  */

#define E_NOUSER                0x8021
#define E_NOPREFIX              0x8022
#define E_BAD_BUFF              0x8023

/* BASIC LITERALS */

#define ADD_ACCESS              0x04
#define ALL_ACCESS              0x0F
#define APPEND_ACCESS           0x04
#define CHANGE_ACCESS           0x08
#define CONTIGUOUS_FILE         0xFFFF
#define DEFAULT_PREFIX          (RMXOBJ)0
#define DEFAULT_USER            (RMXOBJ)0
#define DELETE_ACCESS           0x01
#define LIST_ACCESS             0x02
#define MAY_CREATE              0
#define MUST_CREATE             1
#define OPEN_READ               1
#define OPEN_WRITE              2
#define OPEN_RW                 3
#define OSC                     0x1B,0x5D
#define READ_ACCESS             0x02
#define SEEK_BACKWARD           1
#define SEEK_ABSOLUTE           2
#define SEEK_FOREWARD_FROM_TOF  2
#define SEEK_FORWARD_FROM_TOF   2
#define SEEK_FOREWARD           3
#define SEEK_FORWARD            3
#define SEEK_BACKWARD_FROM_EOF  4
#define ST                      0x1B,0x5C
#define SUPER_USER              0
#define SYSTEM_MANAGER          0
#define UPDATE_ACCESS           0x08
#define VOLUME_GRANULARITY      0
#define WORLD_USER              65535

/* STRUCTURE DEFINITIONS AND DEFINITIONS FOR THEIR FIELDS */

#pragma noalign( _CONNECTION_ATTRIBS, _DIR_ENTRY, _DIR_ENTRY_IN_FILE )
#pragma noalign( _EXTENSION_DATA, _FILE_ATTRIBS, _FORMAT_TRACK_CMD )
#pragma noalign( _NOTIFY_CMD, _DISK_DRIVE_ATTRIBS, _TAPE_DRIVE_ATTRIBS )
#pragma noalign( _TERMINAL_ATTRIBS, _SIGNAL_PAIR, _READ_FILE_MARK_CMD )
#pragma noalign( _TERMINAL_STATUS, _USER_ID_LIST, _DATE_TIME, _IORS )

typedef struct _CONNECTION_ATTRIBS
    {
    RMXRET      status;
    U8          file_driver;
    U8          flags;
    U8          open_mode;
    U8          share_mode;
    U32         file_ptr;
    U8          access_rights;
    }                           CONNECTION_ATTRIBS;

#define PHYSICAL_FILE_DRIVER    1
#define STREAM_FILE_DRIVER      2
#define NAMED_FILE_DRIVER       4
#define REMOTE_FILE_DRIVER      5

#define PHYSICAL_FILE_DEVICE    1
#define STREAM_FILE_DEVICE      2
#define NAMED_FILE_DEVICE       8
#define REMOTE_FILE_DEVICE      16

#define ACTIVE_CONNECTION       0x02
#define DEVICE_CONNECTION       0x04

#define CONN_CLOSED             0
#define CONN_OPEN_FOR_READ      1
#define CONN_OPEN_FOR_WRITE     2
#define CONN_OPEN_FOR_RW        3

#define NO_SHARING              0
#define SHARE_READ              1
#define SHARE_WRITE             2
#define SHARE_RW                3

typedef struct _DIR_ENTRY
    {
    RMXRET      status;
    char        name[14];
    }                           DIR_ENTRY;
    
typedef struct _DIR_ENTRY_IN_FILE
    {
    U16         fnode;
    char        name[14];
    }                           DIR_ENTRY_IN_FILE;

typedef struct _EXTENSION_DATA
    {
    RMXRET      status;
    U8          entries;
    U8          ext_info[1];
    }                           EXTENSION_DATA;

typedef struct _FILE_ATTRIBS
    {
    RMXRET      status;
    U16         number_connections;
    U16         number_readers;
    U16         number_writers;
    U8          share;
    U8          named_file;
    char        device_name[14];
    U16         file_drivers;
    U8          functions;
    U8          flags;
    U16         device_granularity;
    U32         device_size;
    U16         device_connection;
    U16         file_id;
    U8          file_type;
    U8          file_granularity;
    U16         owner_id;
    U32         creation_time;
    U32         last_access_time;
    U32         last_modify_time;
    U32         file_size;
    U32         file_blocks;
    char        volume_name[6];
    U16         volume_granularity;
    U32         volume_size;
    U16         accessor_count;
    U8          first_access;
    U16         first_user_id;
    U8          second_access;
    U16         second_user_id;
    U8          third_access;
    U16         third_user_id;
    U8          volume_flags;
    }                           FILE_ATTRIBS;

#define F_READ                  0
#define F_WRITE                 1
#define F_SEEK                  2
#define F_SPECIAL               3
#define F_ATTACH_DEVICE         4
#define F_DETACH_DEVICE         5
#define F_OPEN                  6
#define F_CLOSE                 7

#define FS_FORMAT_TRACK         0
#define FS_QUERY                0
#define FS_SATISFY              1
#define FS_NOTIFY               2
#define FS_GET_DISK_TAPE_DATA   3
#define FS_GET_TERMINAL_ATTRIBS 4
#define FS_SET_TERMINAL_ATTRIBS 5
#define FS_SET_SIGNAL           6
#define FS_REWIND_TAPE          7
#define FS_READ_TAPE_FILE_MARK  8
#define FS_WRITE_TAPE_FILE_MARK 9
#define FS_RETENSION_TAPE       10
#define FS_GET_TERMINAL_STATUS  16
#define FS_CANCEL_TERMINAL_IO   17
#define FS_RESUME_TERMINAL_IO   18

#define DISKETTE_DRIVE          0x01
#define SINGLE_DENSITY          0x00
#define DOUBLE_DENSITY          0x02
#define SINGLE_SIDED            0x00
#define DOUBLE_SIDED            0x04
#define EIGHT_INCH_DISKETTE     0x00
#define FIVE_INCH_DISKETTE      0x08
#define STANDARD_DISKETTE       0x00
#define NON_STANDARD_DISKETTE   0x10
#define NOT_A_DISKETTE          0x10

#define FNODE_FILE              0
#define FREE_SPACE_MAP_FILE     1
#define FREE_FNODE_MAP_FILE     2
#define ACCOUNTING_INFO_FILE    3
#define BAD_BLOCK_MAP_FILE      4               /* TYPE 5 RESERVED */
#define DIRECTORY_FILE          6               /* TYPE 7 RESERVED */
#define DATA_FILE               8
#define VOLUME_LABEL_FILE       9

typedef struct _FORMAT_TRACK_CMD
    {
    U16         track_number;
    U16         interleave;
    U16         track_offset;
    U16         fill_char;
    }                           FORMAT_TRACK_CMD;

typedef struct _NOTIFY_CMD
    {
    RMXOBJ      mailbox;
    RMXOBJ      object;
    }                           NOTIFY_CMD;

typedef struct _DISK_DRIVE_ATTRIBS
    {
    U16         cylinders;
    U8          fixed;
    U8          removable;
    U8          sectors;
    U16         sector_size;
    U8          alternates;
    }                           DISK_DRIVE_ATTRIBS;

typedef struct _TAPE_DRIVE_ATTRIBS
    {
    U8          tape;
    U8          reserved[7];
    }                           TAPE_DRIVE_ATTRIBS;

#define UNIT_NOT_PRESENT        0
#define UNIT_PRESENT            1
#define TRACK_COUNT_MASK        0xF0

typedef struct _TERMINAL_ATTRIBS
    {
    U16         num_words;
    U16         num_used;
    U16         connection_flags;
    U16         terminal_flags;
    NATIVE_WORD in_baud_rate;
    NATIVE_WORD out_baud_rate;
    U16         scroll_lines;
    U16         x_y_size;
    U16         x_y_offset;
    U16         special_modes;
    U16         high_water_mark;
    U16         low_water_mark;
    U16         fc_on_char;
    U16         fc_off_char;
    U16         link_parameter;
    U16         spc_hi_water_mark;
    U8          special_char[4];
    }                           TERMINAL_ATTRIBS;

#define MASK_LINE_EDIT_MODE     0x03
#define TRANSPARENT_MODE        0x01
#define NORMAL_MODE             0x02
#define FLUSH_MODE              0x03

#define ECHO_INPUT              0x00
#define DO_NOT_ECHO_INPUT       0x04

#define CLEAR_INPUT_PARITY_BIT  0x00
#define PASS_INPUT_PARITY_BIT   0x08

#define CLEAR_OUTPUT_PARITY_BIT 0
#define PASS_OUTPUT_PARITY_BIT  0x10

#define ACCEPT_OSC_IN_INPUT     0
#define IGNORE_OSC_IN_INPUT     0x20

#define MASK_OSC_MODE           0xC0
#define ACT_ON_OSC              0x00
#define ACT_ON_OSC_IN_INPUT     0x40
#define ACT_ON_OSC_IN_OUTPUT    0x80
#define DO_NOT_ACT_ON_OSC       0xC0

#define FULL_DUPLEX             0x0001
#define HALF_DUPLEX             0x0003

#define VIDEO_DISPLAY_TERMINAL  0x0000
#define HARD_COPY_TERMINAL      0x0004

#define NO_MODEM_CONTROLS       0x0000
#define MODEM_CONTROLS          0x0008

#define MASK_INPUT_PARITY       0x0030
#define RESET_INPUT_PARITY_BIT  0x0000
#define LEAVE_INPUT_PARITY_BIT  0x0010
#define EVEN_PARITY_INPUT       0x0020
#define ODD_PARITY_INPUT        0x0030

#define MASK_OUTPUT_PARITY      0x00C0
#define RESET_OUTPUT_PARITY_BIT 0x0000
#define SET_OUTPUT_PARITY_BIT   0x0040
#define EVEN_PARITY_OUTPUT      0x0080
#define ODD_PARITY_OUTPUT       0x00C0
#define LEAVE_OUTPUT_PARITY_BIT 0x0100

#define DISABLE_TRANSLATION     0x0000
#define ENABLE_TRANSLATION      0x0200

#define HORIZONTAL_COORD_FIRST  0x0000
#define VERTICAL_COORD_FIRST    0x0400

#define INCREASE_LEFT_TO_RIGHT  0x0000
#define DECREASE_LEFT_TO_RIGHT  0x0800

#define INCREASE_TOP_TO_BOTTOM  0x0000
#define DECREASE_TOP_TO_BOTTOM  0x1000

#define AUTO_BAUD_RATE_SEARCH   1
#define INPUT_BAUD_FOR_OUTPUT   1

#define DISABLE_FLOW_CONTROL    0x0000
#define ENABLE_FLOW_CONTROL     0x0001

#define NO_SPECIAL_CHAR_MODE    0x0000
#define SPECIAL_CHAR_MODE       0x0002

#define NOT_BUFFERED_DEVICE     0x0000
#define BUFFERED_DEVICE         0x8000

#define LINK_PARAMETER_NOT_USED 0x0000
#define LINK_PARAMETER_USED     0x8000

#define MASK_LINK_PARITY        0x0003
#define LINK_NO_PARITY          0x0000
#define LINK_EVEN_PARITY        0x0002
#define LINK_ODD_PARITY         0x0003

#define MASK_LINK_CHAR_LENGTH   0x000C
#define LINK_SIX_BIT_CHARS      0x0000
#define LINK_SEVEN_BIT_CHARS    0x0004
#define LINK_EIGHT_BIT_CHARS    0x0008

#define MASK_LINK_STOP_BITS     0x0030
#define LINK_ONE_STOP_BIT       0x0000
#define LINK_ONE_P5_STOP_BITS   0x0010
#define LINK_TWO_STOP_BITS      0x0020

typedef struct _SIGNAL_PAIR
    {
    RMXOBJ      semaphore;
    U8          character;
    }                           SIGNAL_PAIR;

typedef struct _READ_FILE_MARK_CMD
    {
    U8          search;
    }                           READ_FILE_MARK_CMD;

#define SEARCH_BACKWARD         0x00FF
#define SEARCH_FOREWARD         0x0000
#define SEARCH_FORWARD          0x0000

typedef struct _TERMINAL_STATUS
    {
    U16         terminal_flags;
    U16         input_conn_flags;
    U16         input_state;
    RMXOBJ      input_conn;
    NATIVE_WORD input_count;
    NATIVE_WORD input_actual;
    U16         raw_buf_count;
    U8          typeahead_count;
    U8          num_input_requests;
    U16         output_conn_flags;
    U16         output_state;
    RMXOBJ      output_conn;
    U16         output_count;
    U16         output_actual;
    U16         out_buf_count;
    U8          num_output_requests;
    }                           TERMINAL_STATUS;

typedef struct _USER_ID_LIST
    {
    U16         list_length;
    U16         id_count;
    U16         id[3];
    }                           USER_ID_LIST;

typedef struct _DATE_TIME
    {
    U8          seconds;
    U8          minutes;
    U8          hours;
    U8          days;
    U8          months;
    U16         years;
    }                           DATE_TIME;

typedef struct _IORS
    {
    RMXRET      status;
    RMXRET      unit_status;
    NATIVE_WORD actual;

#if _ARCHITECTURE_ < 386
    U16         filler_1;
#endif

    U16         device;
    U8          unit;
    U8          function;
    U16         sub_function;
    U32         device_location;
    void far *  buffer;
    NATIVE_WORD xfer_count;

#if _ARCHITECTURE_ < 386
    U16         filler_2;
#endif

    void far *  auxiliary_data;
    struct _IORS far * next_iors;
    struct _IORS far * prev_iors;
    RMXOBJ      response_mbx;
    U8          completed;
    U8          filler_3;
    RMXOBJ      cancellation_id;
    RMXOBJ      connection;
    }                           IORS;

#define IO_UNCLASS              0
#define IO_SOFT                 1
#define IO_HARD                 2
#define IO_OPRINT               3
#define IO_WRPROT               4
#define IO_NO_DATA              5
#define IO_MODE                 6

/* ROUTINE PROTOTYPES */

#pragma fixedparams( RQAATTACHFILE, RQACHANGEACCESS, RQACLOSE )
#pragma fixedparams( RQACREATEDIRECTORY, RQACREATEFILE, RQADELETECONNECTION )
#pragma fixedparams( RQADELETEFILE, RQAGETCONNECTIONSTATUS )
#pragma fixedparams( RQAGETDIRECTORYENTRY, RQAGETEXTENSIONDATA )
#pragma fixedparams( RQAGETFILESTATUS, RQAGETPATHCOMPONENT, RQAOPEN )
#pragma fixedparams( RQAPHYSICALATTACHDEVICE, RQAPHYSICALDETACHDEVICE )
#pragma fixedparams( RQAREAD, RQARENAMEFILE, RQASEEK, RQASETEXTENSIONDATA )
#pragma fixedparams( RQASPECIAL, RQATRUNCATE, RQAUPDATE, RQAWRITE )
#pragma fixedparams( RQCREATEUSER, RQDELETEUSER, RQENCRYPT )
#pragma fixedparams( RQGETDEFAULTPREFIX, RQGETDEFAULTUSER, RQGETGLOBALTIME )
#pragma fixedparams( RQGETTIME, RQINSPECTUSER, RQSETDEFAULTPREFIX )
#pragma fixedparams( RQSETDEFAULTUSER, RQSETGLOBALTIME, RQSETTIME, RQWAITIO )

void        RQAATTACHFILE( RMXOBJ user_tkn, RMXOBJ prefix_tkn,
                RMXSTR *subpath_ptr, RMXOBJ mbx_tkn, RMXRET *status );
void        RQACHANGEACCESS( RMXOBJ user_tkn, RMXOBJ prefix_tkn,
                RMXSTR *subpath_ptr, U16 id, U8 access, RMXOBJ mbx_tkn,
                RMXRET *status );
void        RQACLOSE( RMXOBJ connection_tkn, RMXOBJ mbx_tkn, RMXRET *status );
void        RQACREATEDIRECTORY( RMXOBJ user_tkn, RMXOBJ prefix_tkn,
                RMXSTR *subpath_ptr, U8 access, RMXOBJ mbx_tkn,
                RMXRET *status );
void        RQACREATEFILE( RMXOBJ user_tkn, RMXOBJ prefix_tkn,
                RMXSTR *subpath_ptr, U8 access, U16 granularity, U32 size,
                U8 must_create, RMXOBJ mbx_tkn, RMXRET *status );
void        RQADELETECONNECTION( RMXOBJ connection_tkn, RMXOBJ mbx_tkn,
                RMXRET *status );
void        RQADELETEFILE( RMXOBJ user_tkn, RMXOBJ prefix_tkn,
                RMXSTR *subpath_ptr, RMXOBJ mbx_tkn, RMXRET *status );
void        RQAGETCONNECTIONSTATUS( RMXOBJ connection_tkn, RMXOBJ mbx_tkn,
                RMXRET *status );
void        RQAGETDIRECTORYENTRY( RMXOBJ connection_tkn, U16 entry_nr,
                RMXOBJ mbx_tkn, RMXRET *status );
void        RQAGETEXTENSIONDATA( RMXOBJ connection_tkn, RMXOBJ mbx_tkn,
                RMXRET *status );
void        RQAGETFILESTATUS( RMXOBJ connection_tkn, RMXOBJ mbx_tkn,
                RMXRET *status );
void        RQAGETPATHCOMPONENT( RMXOBJ connection_tkn, RMXOBJ mbx_tkn,
                RMXRET *status );
void        RQAOPEN( RMXOBJ connection_ptr, U8 mode, U8 share, RMXOBJ mbx_tkn,
                RMXRET *status );
void        RQAPHYSICALATTACHDEVICE( RMXSTR *dev_name_ptr, U8 driver_type,
                RMXOBJ mbx_tkn, RMXRET *status );
void        RQAPHYSICALDETACHDEVICE( RMXOBJ connection_ptr, U8 detach_type,
                RMXOBJ mbx_tkn, RMXRET *status );
void        RQAREAD( RMXOBJ connection_tkn, void *buffer_ptr,
                NATIVE_WORD count, RMXOBJ mbx_tkn, RMXRET *status );
void        RQARENAMEFILE( RMXOBJ connection_tkn, RMXOBJ user_tkn,
                RMXOBJ prefix_tkn, RMXSTR *subpath_ptr, RMXOBJ mbx_tkn,
                RMXRET *status );
void        RQASEEK( RMXOBJ connection_tkn, U8 offset_from, U32 offset,
                RMXOBJ mbx_tkn, RMXRET *status );
void        RQASETEXTENSIONDATA( RMXOBJ connection_tkn,
                EXTENSION_DATA *info_ptr, RMXOBJ mbx_tkn, RMXRET *status );
void        RQASPECIAL( RMXOBJ connection_tkn, U16 function_code,
                void *ioparam_ptr, RMXOBJ mbx_tkn, RMXRET *status );
void        RQATRUNCATE( RMXOBJ connection_tkn, RMXOBJ mbx_tkn,
                RMXRET *status );
void        RQAUPDATE( RMXOBJ connection_tkn, RMXOBJ mbx_tkn, RMXRET *status );
void        RQAWRITE( RMXOBJ connection_ptr, void *buffer_ptr,
                NATIVE_WORD count, RMXOBJ mbx_tkn, RMXRET *status );
RMXOBJ      RQCREATEUSER( USER_ID_LIST *info_ptr, RMXRET *status );
void        RQDELETEUSER( RMXOBJ user_tkn, RMXRET *status );
void        RQENCRYPT( RMXSTR *data_ptr, U8 *key_ptr, U8 *encrypted_data_ptr,
                RMXRET *status );
RMXOBJ      RQGETDEFAULTPREFIX( RMXOBJ job_tkn, RMXRET *status );
RMXOBJ      RQGETDEFAULTUSER( RMXOBJ job_tkn, RMXRET *status );
void        RQGETGLOBALTIME( DATE_TIME *info_ptr, RMXRET *status );
U32         RQGETTIME( RMXRET *status );
void        RQINSPECTUSER( RMXOBJ user_tkn, USER_ID_LIST *info_ptr,
                RMXRET *status );
void        RQSETDEFAULTPREFIX( RMXOBJ job_tkn, RMXOBJ prefix_tkn,
                RMXRET *status );
void        RQSETDEFAULTUSER( RMXOBJ job_tkn, RMXOBJ user_tkn,
                RMXRET *status );
void        RQSETGLOBALTIME( DATE_TIME *info_ptr, RMXRET *status );
void        RQSETTIME( U32 data_time, RMXRET *status );
U16         RQWAITIO( RMXOBJ connection_ptr, RMXOBJ mbx_tkn, U16 time_limit,
                RMXRET *status );

/*****************************************************************************/
/* Definitions for Extended I/O Subsystem                                    */
/*****************************************************************************/

/*  ENVIRONMENTAL EXCEPTIONS  */

#define E_LOG_NAME_SYNTAX       0x0040
#define E_CANNOT_CLOSE          0x0041
#define E_IOMEM                 0x0042
#define E_MEDIA                 0x0044
#define E_LOG_NAME_NEXIST       0x0045
#define E_NOT_OWNER             0x0046
#define E_IO_JOB                0x0047
#define E_UDF_FORMAT            0x0048
#define E_NAME_NEXIST           0x0049
#define E_UID_NEXIST            0x004A
#define E_PASSWORD_MISMATCH     0x004B
#define E_UDF_IO                0x004C

/*  PROGRAMMING EXCEPTIONS  */

#define E_NOT_LOG_NAME          0x8040
#define E_NOT_DEVICE            0x8041
#define E_NOT_CONNECTION        0x8042

/* BASIC LITERALS */

#define OPEN_READ_SHARE_RW      1
#define OPEN_WRITE_SHARE_RW     2
#define OPEN_RW_SHARE_RW        3
#define OPEN_READ_PRIVATE       4
#define OPEN_WRITE_PRIVATE      5
#define OPEN_RW_PRIVATE         6
#define OPEN_READ_SHARE_READ    7
#define OPEN_WRITE_SHARE_READ   8
#define OPEN_RW_SHARE_READ      9
#define OPEN_READ_SHARE_WRITE   10
#define OPEN_WRITE_SHARE_WRITE  11
#define OPEN_RW_SHARE_WRITE     12

/* STRUCTURE DEFINITIONS AND DEFINITIONS FOR THEIR FIELDS */

#pragma noalign( _JOB_EXIT_MSG, _DEVICE_ATTRIBS, _EXT_CONNECTION_ATTRIBS )
#pragma noalign( _EXT_FILE_ATTRIBS, _EXT_IORS, _DISK_LABEL_DATA )

typedef struct _JOB_EXIT_MSG
    {
    U16         termination_code;
    U16         user_fault_code;
    RMXOBJ      job;
    U8          return_data_len;
    U8          return_data[1];
    }                           JOB_EXIT_MSG;

#define TERMINATED_BY_EXIT      0
#define TERMINATED_BY_DELETE    1

typedef struct _DEVICE_ATTRIBS
    {
    char        device_name[15];
    U8          file_driver;
    U16         num_conns;
    U16         owner_id;
    }                           DEVICE_ATTRIBS;

typedef struct _EXT_CONNECTION_ATTRIBS
    {
    U8          file_driver;
    U8          flags;
    U8          open_mode;
    U8          share_mode;
    U32         file_ptr;
    U8          access;
    U8          number_buffers;
    U16         buffer_size;
    U8          seek;
    }                           EXT_CONNECTION_ATTRIBS;

typedef struct _EXT_FILE_ATTRIBS
    {
    U16         device_share;
    U16         number_connections;
    U16         number_readers;
    U16         number_writers;
    U8          share;
    U8          named_file;
    char        device_name[14];
    U16         file_drivers;
    U8          functions;
    U8          flags;
    U16         device_granularity;
    U32         device_size;
    U16         device_connection;
    U16         file_id;
    U8          file_type;
    U8          file_granularity;
    U16         owner_id;
    U32         creation_time;
    U32         last_access_time;
    U32         last_modify_time;
    U32         file_size;
    U32         file_blocks;
    char        volume_name[6];
    U16         volume_granularity;
    U32         volume_size;
    U16         accessor_count;
    U8          owner_access;
    }                           EXT_FILE_ATTRIBS;

typedef struct _EXT_IORS
    {
    NATIVE_WORD actual;

#if _ARCHITECTURE_ < 386
    U16         filler_1;
#endif

    U16         device;
    U8          unit;
    U8          function;
    U16         sub_function;
    U32         device_location;
    void far *  buffer;
    NATIVE_WORD xfer_count;

#if _ARCHITECTURE_ < 386
    U16         filler_2;
#endif

    void far *  auxiliary_data;
    }                           EXT_IORS;

typedef struct _DISK_LABEL_DATA
    {
    U16         label_data[8];
    }                           DISK_LABEL_DATA;

/* ROUTINE PROTOTYPES */

#pragma fixedparams( RQCREATEIOJOB, RQECREATEIOJOB, RQEXITIOJOB )
#pragma fixedparams( RQGETLOGICALDEVICESTATUS, RQGETUSERIDS )
#pragma fixedparams( RQHYBRIDDETACHDEVICE, RQLOGICALATTACHDEVICE )
#pragma fixedparams( RQLOGICALDETACHDEVICE, RQSATTACHFILE )
#pragma fixedparams( RQSCATALOGCONNECTION, RQSCHANGEACCESS, RQSCLOSE )
#pragma fixedparams( RQSCREATEDIRECTORY, RQSCREATEFILE, RQSDELETECONNECTION )
#pragma fixedparams( RQSDELETEFILE, RQSGETCONNECTIONSTATUS )
#pragma fixedparams( RQSGETDIRECTORYENTRY, RQSGETFILESTATUS )
#pragma fixedparams( RQSGETPATHCOMPONENT, RQSLOOKUPCONNECTION, RQSOPEN )
#pragma fixedparams( RQSREADMOVE, RQSRENAMEFILE, RQSSEEK, RQSSPECIAL )
#pragma fixedparams( RQSTRUNCATEFILE, RQSUNCATALOGCONNECTION )
#pragma fixedparams( RQSWRITEMOVE, RQSTARTIOJOB, RQVERIFYUSER )

RMXOBJ      RQCREATEIOJOB( NATIVE_WORD pool_min, NATIVE_WORD pool_max,
                EXCP_HANDLER_ATTRIBS *info_ptr, U16 job_flags,
                U8 task_priority, void (far *start_address)(void),
                RMXOBJ data_seg_tkn, void *stack_ptr, NATIVE_WORD stack_size,
                U16 task_flags, RMXOBJ mbx_tkn, RMXRET *status );
RMXOBJ      RQECREATEIOJOB( U32 pool_min, U32 pool_max,
                EXCP_HANDLER_ATTRIBS *info_ptr, U16 job_flags,
                U8 task_priority, void (far *start_address)(void),
                RMXOBJ data_seg_tkn, void *stack_ptr, NATIVE_WORD stack_size,
                U16 task_flags, RMXOBJ mbx_tkn, RMXRET *status );
void        RQEXITIOJOB( RMXRET fault_code, void *data_ptr, RMXRET *status );
void        RQGETLOGICALDEVICESTATUS( RMXSTR *logical_name_ptr,
                DEVICE_ATTRIBS *info_ptr, RMXRET *status );
void        RQGETUSERIDS( RMXSTR *name_ptr, USER_ID_LIST *info_ptr,
                RMXRET *status );
void        RQHYBRIDDETACHDEVICE( RMXSTR *logical_name_ptr, RMXRET *status );
void        RQLOGICALATTACHDEVICE( RMXSTR *logical_name_ptr,
                RMXSTR *dev_name_ptr, U8 driver_type, RMXRET *status );
void        RQLOGICALDETACHDEVICE( RMXSTR *logical_name_ptr, RMXRET *status );
RMXOBJ      RQSATTACHFILE( RMXSTR *path_ptr, RMXRET *status );
void        RQSCATALOGCONNECTION( RMXOBJ job_tkn, RMXOBJ connection_tkn,
                RMXSTR *logical_name_ptr, RMXRET *status );
void        RQSCHANGEACCESS( RMXSTR *path_ptr, U16 id, U8 access_code,
                RMXRET *status );
void        RQSCLOSE( RMXOBJ connection_tkn, RMXRET *status );
RMXOBJ      RQSCREATEDIRECTORY( RMXSTR * path_ptr, RMXRET *status );
RMXOBJ      RQSCREATEFILE( RMXSTR * path_ptr, RMXRET *status );
void        RQSDELETECONNECTION( RMXOBJ connection_tkn, RMXRET *status );
void        RQSDELETEFILE( RMXSTR *path_ptr, RMXRET *status );
void        RQSGETCONNECTIONSTATUS( RMXOBJ connection_tkn,
                EXT_CONNECTION_ATTRIBS *info_ptr, RMXRET *status );
void        RQSGETDIRECTORYENTRY( RMXSTR *path_ptr, U16 entry_nr,
                char *name_ptr, RMXRET *status );
void        RQSGETFILESTATUS( RMXSTR *path_ptr, EXT_FILE_ATTRIBS *info_ptr,
                RMXRET *status );
void        RQSGETPATHCOMPONENT( RMXOBJ connection_tkn, RMXSTR *name_ptr,
                RMXRET *status );
RMXOBJ      RQSLOOKUPCONNECTION( RMXSTR *logical_name_ptr, RMXRET *status );
void        RQSOPEN( RMXOBJ connection_tkn, U8 mode, U8 nr_buffers,
                RMXRET *status );
NATIVE_WORD RQSREADMOVE( RMXOBJ connection_tkn, void *buffer_ptr,
                NATIVE_WORD count, RMXRET *status );
void        RQSRENAMEFILE( RMXSTR *old_path_ptr, RMXSTR *new_path_ptr,
                RMXRET *status );
void        RQSSEEK( RMXOBJ connection_ptr, U8 mode, U32 move_size,
                RMXRET *status );
void        RQSSPECIAL( RMXOBJ connection_tkn, U16 function_code,
                void *data_ptr, EXT_IORS *info_ptr, RMXRET *status );
void        RQSTRUNCATEFILE( RMXOBJ connection_tkn, RMXRET *status );
void        RQSUNCATALOGCONNECTION( RMXOBJ job_tkn, RMXSTR *logical_name_ptr,
                RMXRET *status );
NATIVE_WORD RQSWRITEMOVE( RMXOBJ connection_tkn, void *buffer_ptr,
                NATIVE_WORD count, RMXRET *status );
void        RQSTARTIOJOB( RMXOBJ io_job_tkn, RMXRET *status );
void        RQVERIFYUSER( RMXOBJ user_tkn, RMXSTR *name_ptr,
                RMXSTR *password_ptr, RMXRET *status );

#endif /* ndef _RMX_IO_H */

