DataMuseum.dk

Presents historical artifacts from the history of:

Rational R1000/400

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about Rational R1000/400

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - download

⟦9269481d2⟧ Ada Source

    Length: 27648 (0x6c00)
    Types: Ada Source
    Notes: 03_class, FILE, R1k_Segment, e3_tag, generic, package Remote_Operations, pragma Module_Name 4 4128, pragma Segmented_Heap Context, pragma Subsystem Tools_Integration, seg_0039ca

Derivation

└─⟦8527c1e9b⟧ Bits:30000544 8mm tape, Rational 1000, Arrival backup of disks in PAM's R1000
    └─ ⟦5a81ac88f⟧ »Space Info Vol 1« 
        └─⟦this⟧ 

E3 Source Code



with Profile;
with Calendar;
with Simple_Status;
with Device_Independent_Io;

package Remote_Operations is

    subtype Error_Status is Simple_Status.Condition;

    ---------------------------
    -- CONNECTION MANAGEMENT --
    ---------------------------
    --
    -- Connections are implicitly established and recorded in an active
    -- connection pool during the target operations listed below.  The
    -- connection management operations listed here provide a means of
    -- directly querying and modifying the active connection pool.  When
    -- a new connection is required after the open connection limit has
    -- been reached, the least recently used connection is displaced by
    -- the new connection.
    --
    -- The active connection pool is maintained on a per login session
    -- basis.  When a particular job ACQUIRE's access to a new target
    -- context, a CONTEXT object is created, recorded in the active
    -- connection pool, and marked 'in use'.  When the job RELEASE's
    -- access on the object, it is made available to other jobs on the
    -- session via the active connection pool and the target connection
    -- is left open.  When a job DESTROY's a context object, the target
    -- connection is closed and the object is removed from the active
    -- connection pool.


    type Context is private;
    --
    -- Represents the context of a particular connection within the
    -- active connection pool.  Objects of this type are logically
    -- composed of a set of fields that uniquely name a particular
    -- remote operations server on a given machine.

    Nil_Context : constant Context;


    procedure Acquire (A_Context : out Context;
                       Status    : out Error_Status;
                       Machine   :     String;  
                       Instance  :     String := "");

    procedure Acquire (A_Context : out Context;
                       Status    : out Error_Status;
                       Machine   :     String;  
                       User      :     String;
                       Password  :     String;
                       Session   :     String;
                       Instance  :     String := "");
    --
    -- Acquires a connection context for the given <machine, user, session,
    -- instance> quadruple.  All subsequent target operations that use
    -- this CONTEXT will be executed on the target server running on
    -- MACHINE on behalf of USER for the given INSTANCE.  The values for
    -- password and session are derived implicitly from the given
    -- values.


    type Connection_Timeout is new Duration;
    --
    -- Determines how long an open connection is allowed to
    -- persist in the active connection pool when not in use.

    None            : constant Connection_Timeout := Connection_Timeout'Last;
    After_Operation : constant Connection_Timeout := 0.0;
    Default         : constant Connection_Timeout := -1.0;

    procedure Release (A_Context    : in out Context;
                       Status       : out    Error_Status;
                       Idle_Timeout :        Connection_Timeout :=  
                          Remote_Operations.Default);
    --
    -- Returns A_CONTEXT back to the active connection pool.  IDLE_TIMEOUT
    -- can be used to reset the timeout value for A_CONTEXT.  Subsequent
    -- operations that require the same context will reuse A_CONTEXT if
    -- the request occurs before IDLE_TIMEOUT.

    procedure Destroy (A_Context : in out Context;  
                       Status    : out    Error_Status);
    --
    -- Explicitly disconnects A_CONTEXT and removes it from the
    -- active connection pool.  When not IS_CONNECTED (A_CONTEXT),
    -- a STATUS value of NOT_CONNECTED is returned.

\x0c
    function Is_Nil (A_Context : Context) return Boolean;
    --
    -- Indicates whether A_CONTEXT has been initialized.

    function Machine (Of_Context : Context) return String;
    --
    -- Returns the machine name associated with of OF_CONTEXT.  When
    -- IS_NIL (OF_CONTEXT), "" is returned.

    function User (Of_Context : Context) return String;
    --
    -- Returns the username associated with of OF_CONTEXT.  When
    -- IS_NIL (OF_CONTEXT), "" is returned.

    function Password (Of_Context : Context) return String;
    --
    -- Returns the password associated with of OF_CONTEXT.  When
    -- IS_NIL (OF_CONTEXT), "" is returned.

    function Session (Of_Context : Context) return String;
    --
    -- Returns the session associated with of OF_CONTEXT.  When
    -- IS_NIL (OF_CONTEXT), "" is returned.

    function Instance (Of_Context : Context) return String;
    --
    -- Returns the instance associated with of OF_CONTEXT.  When
    -- IS_NIL (OF_CONTEXT), "" is returned.


    function Is_Connected (A_Context : Context) return Boolean;
    --
    -- Indicates whether A_CONTEXT is currently a member of
    -- the active connection pool and is still connected to
    -- MACHINE (A_CONTEXT).

    function Timeout (Of_Context : Context) return Connection_Timeout;
    --
    -- Indicates the number of seconds remaining before
    -- OF_CONTEXT will reach its idle timeout.  Returns 0.0
    -- when not IS_CONNECTED (OF_CONTEXT).

\x0c
    ---------------------
    -- FILE MANAGEMENT --
    ---------------------
    --
    -- Each of the file management operations listed below operates
    -- in the naming context established during ACQUIRE (i.e. the
    -- user's home directory.  N.B. This naming context is not affected
    -- by command execution.  Whenever an error prevents the successful
    -- completion of a given operation, an error status and diagnostic
    -- message are constructed and returned to the caller.  This status
    -- information is suitable for display to a user.
    --
    -- For a listing of the error status values returned through these
    -- interfaces, see the file management error statuses listed at the
    -- end of this package


    subtype Form_Options is String;
    --
    -- Represents the options that can be applied in the context of
    -- a particular file manipulation operation.
    --!!! DETAILS: [TO BE SPECIFIED] (ACLs, File Format, et al) !!!

    subtype Rational_Pathname is String;
    --
    -- Represents a Rational object naming expression.

    Nil_Device : constant Rational_Pathname := "!MACHINE.DEVICES.NIL";

    subtype Remote_Pathname is String;
    --
    -- Represents a valid unambiguous naming expression on a given
    -- remote machine.  The format and semantics for parameters of
    -- this type are dependent on the remote machine type.

    procedure Create_Directory (In_Context         :     Context;
                                With_Name          :     Remote_Pathname;
                                Status             : out Error_Status;
                                Create_Directories :     Boolean      := True;
                                Options            :     Form_Options := "");
    --
    -- Creates a remote directory named WITH_NAME on remote
    -- machine IN_CONTEXT.  When CREATE_DIRECTORIES, any naming
    -- components in the prefix of WITH_NAME are created implicitly.

    procedure Create_File (In_Context         :     Context;
                           With_Name          :     Remote_Pathname;
                           Status             : out Error_Status;
                           Create_Directories :     Boolean      := True;
                           Options            :     Form_Options := "");
    --
    -- Creates a remote file named WITH_NAME on remote machine
    -- IN_CONTEXT.  When CREATE_DIRECTORIES is True, any directories
    -- missing from the pathname of the remote file are created
    -- implicitly.

    procedure Put (From_File  :     Rational_Pathname;
                   To_File    :     Remote_Pathname;
                   In_Context :     Context;
                   Status     : out Error_Status;
                   Append     :     Boolean      := False;
                   Options    :     Form_Options := "");
    --
    -- Copies the contents of local_file FROM_FILE to the remote file
    -- TO_FILE on machine IN_CONTEXT.  When TO_FILE already exists, its
    -- contents are overlayed.  When TO_FILE does not exist, it will be
    -- CREATE_FILE'd with parameter CREATE_DIRECTORIES => FALSE and then
    -- copied.

    procedure Put (From_File  :     Device_Independent_Io.File_Type;
                   To_File    :     Remote_Pathname;
                   In_Context :     Context;
                   Status     : out Error_Status;
                   Append     :     Boolean      := False;
                   Options    :     Form_Options := "");
    --
    -- PRECONDITION: Dio.Is_Open (From_File) and then
    --               Dio.Mode (From_File) = Dio.In_File
    --
    -- Copies the contents of FROM_FILE to the remote file TO_FILE on
    -- machine IN_CONTEXT.  When TO_FILE already exists, its contents
    -- are overlayed.  When TO_FILE does not exist, it will be CREATE'd
    -- with parameter CREATE_DIRECTORIES => FALSE and then copied.

    procedure Get (From_File  :     Remote_Pathname;
                   In_Context :     Context;
                   To_File    :     Rational_Pathname;
                   Status     : out Error_Status;
                   Append     :     Boolean      := False;
                   Options    :     Form_Options := "");
    --
    -- Copies the contents of remote file FROM_FILE on remote machine
    -- IN_CONTEXT into local file TO_FILE.

    procedure Get (From_File  :     Remote_Pathname;
                   In_Context :     Context;
                   To_File    :     Device_Independent_Io.File_Type;
                   Status     : out Error_Status;
                   Options    :     Form_Options := "");
    --
    -- PRECONDITION: Dio.Is_Open (To_File) and then
    --               Dio.Mode (To_File) = Dio.Out_File
    --
    -- Copies the contents of remote file FROM_FILE on remote machine
    -- IN_CONTEXT into local file TO_FILE.

    procedure Update_Time (Of_File    :     Remote_Pathname;
                           In_Context :     Context;
                           Result     : out Calendar.Time;
                           Status     : out Error_Status;
                           Options    :     Form_Options := "");
    --
    -- Returns the time that remote file OF_FILE on remote machine
    -- IN_CONTEXT was last modified.

    procedure File_Exists (The_File   :     Remote_Pathname;
                           In_Context :     Context;
                           Status     : out Error_Status;
                           Exists     : out Boolean);
    --
    -- Returns whether the remote file THE_FILE exists on the remote machine
    -- IN_CONTEXT.

    procedure Copy (From_File  :     Remote_Pathname;
                    To_File    :     Remote_Pathname;
                    In_Context :     Context;
                    Status     : out Error_Status;
                    Options    :     Form_Options := "");
    --
    -- Copies remote file FROM_FILE to remote file TO_FILE.  Both
    -- files must be on the same remote machine IN_CONTEXT.

    procedure Link (From_File  :     Remote_Pathname;
                    To_File    :     Remote_Pathname;
                    In_Context :     Context;
                    Status     : out Error_Status;
                    Options    :     Form_Options := "");
    --
    -- Creates a link remote file FROM_FILE to remote file TO_FILE.
    -- Both files must be on the same remote machine IN_CONTEXT.
    -- May not be supported on all remote platforms.

    procedure Delete_Directory (In_Context :     Context;
                                With_Name  :     Remote_Pathname;
                                Status     : out Error_Status;
                                Recursive  :     Boolean      := True;
                                Options    :     Form_Options := "");
    --
    -- Removes the remote directory WITH_NAME on remote machine
    -- IN_CONTEXT.  When RECURSIVE is True, the named directory
    -- and its contents are deleted; otherwise, the directory
    -- must be empty.

    procedure Delete_File (In_Context :     Context;
                           With_Name  :     Remote_Pathname;
                           Status     : out Error_Status;
                           Options    :     Form_Options := "");
    --
    -- Removes the remote file FILE from remote machine IN_CONTEXT.

    procedure Expunge (In_Context :     Context;
                       Object     :     Remote_Pathname;
                       Status     : out Error_Status;
                       Options    :     Form_Options := "");
    --
    -- Assures that deleted versions or retained copies of OBJECT
    -- are destroyed on IN_CONTEXT.

    procedure Move (From_File  :     Remote_Pathname;
                    To_File    :     Remote_Pathname;
                    In_Context :     Context;
                    Status     : out Error_Status;
                    Options    :     Form_Options := "");
    --
    -- This operation is functionally equivalent to Copy/Delete, but may
    -- perform more efficiently on some targets.

\x0c
    -----------------------
    -- COMMAND EXECUTION --
    -----------------------

    subtype Command_Input is String;
    --
    -- Represents a sequence of one or more commands in the command
    -- language of the given remote machine.  The format and semantics
    -- for parameters of this type are dependent on the remote machine
    -- type.

    type Command_Timeout is new Duration;

    Wait_Forever : constant Command_Timeout := Command_Timeout'Last;

    procedure Execute (Command    :     Command_Input;
                       In_Context :     Context;
                       Status     : out Error_Status;
                       Timeout    :     Command_Timeout :=  
                          Remote_Operations.Wait_Forever);
    --
    -- Executes the command string COMMAND on remote machine IN_CONTEXT.
    -- The standard input, output, and error files of the remote command
    -- are logically mapped to the Io.Current_Input, Io.Current_Output,
    -- and Io.Current_Error respectively.

    procedure Execute (Command    :     Command_Input;
                       In_Context :     Context;
                       Input      :     Rational_Pathname :=
                          Remote_Operations.Nil_Device;  
                       Output     :     Rational_Pathname;  
                       Error      :     Rational_Pathname;  
                       Status     : out Error_Status;
                       Timeout    :     Command_Timeout   :=  
                          Remote_Operations.Wait_Forever);
    --
    -- Executes the command string COMMAND on remote machine IN_CONTEXT.
    -- The standard output and error files of the remote command are
    -- copied into OUTPUT and ERROR respectively.

    procedure Execute (Command    :     Command_Input;
                       In_Context :     Context;
                       Input      :     Device_Independent_Io.File_Type;
                       Output     :     Device_Independent_Io.File_Type;
                       Error      :     Device_Independent_Io.File_Type;
                       Status     : out Error_Status;
                       Timeout    :     Command_Timeout :=  
                          Remote_Operations.Wait_Forever);
    --
    -- PRECONDITION: Dio.Is_Open (Input) and then
    --               Dio.Is_Open (Output) and then
    --               Dio.Is_Open (Error) and then
    --               Dio.Mode    (Input)  = Dio.In_File and then
    --               Dio.Mode    (Output) = Dio.Out_File and then
    --               Dio.Mode    (Error)  = Dio.Out_File
    --
    -- Executes the command string COMMAND on remote machine IN_CONTEXT.
    -- The standard output and error files of the remote command are
    -- copied into OUTPUT and ERROR respectively.

    type Command_Response is  
       (Nil,             -- Reset the timeout clock and continue.
        Read_Input,      -- Call the Read_Input formal and continue.
        Abort_Command    -- Terminate the command job.
        );

    generic

        type Execution_State is limited private;
        --
        -- Can be used to associated state information with a
        -- particular command sequence.

        with procedure Process_Output (Text     :        String;
                                       Severity :        Profile.Msg_Kind;
                                       State    : in out Execution_State;
                                       Response : in out Command_Response);
        --
        -- Called for each buffer of command output generated during
        -- the calls to EXECUTE below.  TEXT contains the raw output
        -- received during command execution, and the client is
        -- responsible for processing any format effectors that may
        -- appear in the buffer.

        with procedure Read_Input (State    : in out Execution_State;
                                   Buffer   : out    String;
                                   Last     : out    Natural;
                                   Response : in out Command_Response);
        --
        -- Called on demand whenever the response to a timeout event
        -- indicates that input should be read.  This operation is
        -- called repeatedly until RESPONSE /= READ_INPUT.

        with procedure Timeout_Handler (State    : in out Execution_State;
                                        Response : in out Command_Response);
        --
        -- Called when the specified timeout interval has been reached
        -- without response from the given command.

    procedure Execution_Generic (Command    :        Command_Input;
                                 In_Context :        Context;
                                 State      : in out Execution_State;
                                 Status     : out    Error_Status;
                                 Timeout    :        Command_Timeout :=  
                                    Remote_Operations.Wait_Forever);


    -------------------------
    -- ERROR STATUS VALUES --
    -------------------------

    type Error_Kinds is range 0 .. 255;

    function Error_Kind (Of_Status : Error_Status) return Error_Kinds;
    --
    -- Returns the associated Error_Kinds value for OF_STATUS.  When   -- OF_STATUS does not indicate an error condition, NOT_AN_ERROR is
    -- returned.  When OF_STATUS indicates an error but has no
    -- associated Error_Kinds value, UNKNOWN_ERROR is returned.

    Not_An_Error  : constant Error_Kinds := Error_Kinds'First;
    Unknown_Error : constant Error_Kinds := Error_Kinds'Last;

    Connection_Error   : constant Error_Kinds := 001;
    Bad_User           : constant Error_Kinds := 002;
    Access_Error       : constant Error_Kinds := 003;
    Device_Error       : constant Error_Kinds := 004;
    Lock_Error         : constant Error_Kinds := 005;
    Name_Error         : constant Error_Kinds := 006;
    Policy_Error       : constant Error_Kinds := 007;
    Status_Error       : constant Error_Kinds := 008;
    Storage_Error      : constant Error_Kinds := 009;
    Unsupported        : constant Error_Kinds := 010;
    Use_Error          : constant Error_Kinds := 011;
    Command_Error      : constant Error_Kinds := 012;
    Command_Terminated : constant Error_Kinds := 013;
    Command_Timed_Out  : constant Error_Kinds := 014;
    Execution_Error    : constant Error_Kinds := 015;
    Resource_Limit     : constant Error_Kinds := 016;
    Internal_Error     : constant Error_Kinds := 017;


    -----------------------------------
    -- SERVER VERSIONS AND PLATFORMS --
    -----------------------------------

    type Revision_Ids is range 0 .. 255;
    Nil_Revision_Id : constant Revision_Ids := Revision_Ids'First;

    Major : constant := 1;
    Minor : constant := 2;
    type Version_Ids is array (Major .. Minor) of Revision_Ids;
    Nil_Version_Id : constant Version_Ids :=  
       Version_Ids'(Major => Nil_Revision_Id,  
                    Minor => Nil_Revision_Id);

    function Image (Of_Version : Version_Ids) return String;
    --
    -- Returns the image of OF_VERSION with a period ('.') separator
    -- between the major and minor revision identifiers.  When
    -- OF_VERSION = NIL_VERSION, "???" is returned.

    function Server_Version (Of_Context : Context) return Version_Ids;
    --
    -- Returns the target server version associated with OF_CONTEXT.
    -- When IS_NIL (OF_CONTEXT), NIL_VERSION_ID is returned.

    function Server_Version (Of_Context : Context) return String;
    --
    -- Returns IMAGE (SERVER_VERSION (OF_CONTEXT)).


    type Platforms is range 0 .. 255;
    Unknown : constant Platforms := Platforms'First;

    Sun    : constant Platforms := 001;
    Apollo : constant Platforms := 002;
    Ibm    : constant Platforms := 003;
    Hp     : constant Platforms := 004;
    Vax    : constant Platforms := 005;

    function Image (Of_Platform : Platforms) return String;
    --
    -- Returns an image of the platform name indicated by
    -- OF_PLATFORM.  Returns "Unknown" when OF_PLATFORM = UNKNOWN.

    function Platform (Of_Context : Context) return Platforms;
    --
    -- Returns the target platform associated with OF_CONTEXT.
    -- When IS_NIL (OF_CONTEXT), UNKNOWN is returned.

    function Platform (Of_Context : Context) return String;
    --
    -- Returns IMAGE (PLATFORM (OF_CONTEXT)).


    pragma Subsystem (Tools_Integration);
    pragma Module_Name (4, 4128);
    pragma Bias_Key (29);

private

    type Context_Data;

    type Context is access Context_Data;
    pragma Segmented_Heap (Context);

    Nil_Context : constant Context := null;

end Remote_Operations;

E3 Meta Data

    nblk1=1a
    nid=0
    hdr6=34
        [0x00] rec0=1a rec1=00 rec2=01 rec3=036
        [0x01] rec0=18 rec1=00 rec2=02 rec3=044
        [0x02] rec0=16 rec1=00 rec2=03 rec3=028
        [0x03] rec0=00 rec1=00 rec2=1a rec3=026
        [0x04] rec0=18 rec1=00 rec2=04 rec3=016
        [0x05] rec0=1c rec1=00 rec2=05 rec3=024
        [0x06] rec0=17 rec1=00 rec2=06 rec3=042
        [0x07] rec0=19 rec1=00 rec2=07 rec3=04a
        [0x08] rec0=13 rec1=00 rec2=08 rec3=02a
        [0x09] rec0=14 rec1=00 rec2=09 rec3=03a
        [0x0a] rec0=14 rec1=00 rec2=0a rec3=088
        [0x0b] rec0=16 rec1=00 rec2=0b rec3=06a
        [0x0c] rec0=18 rec1=00 rec2=0c rec3=01a
        [0x0d] rec0=14 rec1=00 rec2=0d rec3=02e
        [0x0e] rec0=1b rec1=00 rec2=0e rec3=01a
        [0x0f] rec0=14 rec1=00 rec2=0f rec3=05e
        [0x10] rec0=13 rec1=00 rec2=10 rec3=046
        [0x11] rec0=18 rec1=00 rec2=11 rec3=052
        [0x12] rec0=13 rec1=00 rec2=12 rec3=010
        [0x13] rec0=17 rec1=00 rec2=13 rec3=002
        [0x14] rec0=13 rec1=00 rec2=14 rec3=00e
        [0x15] rec0=01 rec1=00 rec2=19 rec3=03e
        [0x16] rec0=1a rec1=00 rec2=15 rec3=044
        [0x17] rec0=00 rec1=00 rec2=18 rec3=016
        [0x18] rec0=1b rec1=00 rec2=16 rec3=06a
        [0x19] rec0=15 rec1=00 rec2=17 rec3=000
    tail 0x21500089a808c8381d105 0x42a00088462069e03