*copyc osd$default_pragmats
?? TITLE := 'RHFAM/VE : Store configuration data for configuration utility : R23D' ??
?? NEWTITLE := '  Common Decks' ??
MODULE rfm$config_utl_helper;
*copyc rfh$config_utl_helper
?? EJECT ??
*copyc rft$config_utl_pointers
?? EJECT ??
*copyc osp$set_status_abnormal
*copyc osp$append_status_parameter
*copyc oss$task_private
*copyc osv$task_private_heap
*copyc pmp$get_executing_task_gtid
*copyc rfe$condition_codes
*copyc rfp$verify_caller_capability
*copyc rfp$lock_table
*copyc rfp$unlock_table
*copyc rfv$status_table
*copyc tmv$null_global_task_id
?? TITLE := '  Global Variables' ??
?? EJECT ??
    VAR
        rfv$config_utl_pointers: [XDCL, oss$task_private] ^rft$config_utl_pointers := NIL;
?? TITLE := '  RFP$INITIALIZE_CONFIG_POINTERS' ??
?? EJECT ??
  PROCEDURE [XDCL, #GATE] rfp$initialize_config_pointers(install_request: BOOLEAN;
                                                     VAR save_info: rft$config_utl_pointers;
                                                     VAR status: ost$status);

*copyc rfh$initialize_config_pointers

    VAR
        capabilities: ^ARRAY [1 .. *] of ost$name,
        task_id: ost$global_task_id,
        save_area: ^rft$config_utl_pointers;

    status.normal := TRUE;

    PUSH capabilities: [1..1];
    capabilities^[1] := avc$network_operation;
    rfp$verify_caller_capability(capabilities, 'RHFAM_CONFIGURATION_UTILITY', status);
    IF  NOT status.normal  THEN
      RETURN;
    IFEND;
    IF  rfv$config_utl_pointers <> NIL  THEN
      osp$set_status_abnormal(rfc$product_id, rfe$multiple_config_command, '', status);
      RETURN;
    IFEND;
    ALLOCATE save_area IN osv$task_private_heap^;
    IF  save_area = NIL  THEN
      osp$set_status_abnormal(rfc$product_id, rfe$heap_exhausted, 'task private', status);
      osp$append_status_parameter(osc$status_parameter_delimiter, 'RFP$INITIALIZE_CONFIG_POINTERS', status);
      RETURN;
    IFEND;
    IF  (install_request)  THEN
      pmp$get_executing_task_gtid(task_id);
      rfp$lock_table(rfv$status_table.lock);
      IF  (rfv$status_table.install_in_progress_id <> tmv$null_global_task_id)  THEN
        osp$set_status_abnormal(rfc$product_id, rfe$concurrent_installation, '', status);
        rfp$unlock_table(rfv$status_table.lock);
        FREE save_area IN osv$task_private_heap^;
        RETURN;
      ELSE
        rfv$status_table.install_in_progress_id := task_id;
        rfp$unlock_table(rfv$status_table.lock);
      IFEND;
    IFEND;
    save_area^.install_request := install_request;
    save_area^.error_encountered := FALSE;
    save_area^.local_host_defined := FALSE;
    save_area^.autpg_encountered := FALSE;
    save_area^.deflp_encountered := FALSE;
    save_area^.remote_host_count := 0;
    save_area^.local_nad_count := 0;
    save_area^.remote_nad_count := 0;
    save_area^.remote_hosts := NIL;
    save_area^.local_nads := NIL;
    save_area^.remote_nads := NIL;
    save_area^.local_host := NIL;

    rfv$config_utl_pointers := save_area;
    save_info := save_area^;

  PROCEND rfp$initialize_config_pointers;
?? TITLE := '  RFP$PRESERVE_CONFIG_POINTERS' ??
?? EJECT ??
  PROCEDURE  [XDCL, #GATE] rfp$preserve_config_pointers(save_info: rft$config_utl_pointers);

*copyc rfh$preserve_config_pointers

    IF  rfv$config_utl_pointers <> NIL  THEN
      rfv$config_utl_pointers^ := save_info;
    IFEND;
  PROCEND rfp$preserve_config_pointers;
?? TITLE := '  RFP$RETRIEVE_CONFIG_POINTERS' ??
?? EJECT ??
  PROCEDURE  [XDCL, #GATE] rfp$retrieve_config_pointers(VAR save_info: rft$config_utl_pointers);

*copyc rfh$retrieve_config_pointers

    IF  rfv$config_utl_pointers <> NIL  THEN
      save_info := rfv$config_utl_pointers^;
    IFEND;
  PROCEND rfp$retrieve_config_pointers;
?? TITLE := '  RFP$RELEASE_CONFIG_POINTERS' ??
?? EJECT ??
  PROCEDURE  [XDCL, #GATE] rfp$release_config_pointers;

*copyc rfh$release_config_pointers

    VAR
        task_id: ost$global_task_id;

    IF  rfv$config_utl_pointers <> NIL  THEN
      IF  rfv$config_utl_pointers^.install_request  THEN
        pmp$get_executing_task_gtid(task_id);
        rfp$lock_table(rfv$status_table.lock);
        IF  rfv$status_table.install_in_progress_id = task_id  THEN
          rfv$status_table.install_in_progress_id := tmv$null_global_task_id;
        IFEND;
        rfp$unlock_table(rfv$status_table.lock);
      IFEND;
      FREE rfv$config_utl_pointers IN osv$task_private_heap^;
    IFEND;

  PROCEND rfp$release_config_pointers;
MODEND rfm$config_utl_helper;
