?? RIGHT := 110 ??
*copyc osd$default_pragmats
?? TITLE := 'NOS/VE File Server: Server: df_server_requests ', EJECT ??
MODULE dmm$df_server_requests;
{
{  This module contains the device manager code to support the server side of the
{  file server.
{  All that is required on the server side is code required to extract
{  information from the system file table which is needed on the client mainframe.
{  The system file table on the server is build through the normal attach
{  process and contains no indication that the file is being used by a
{  client mainframe.
{
?? NEWTITLE := '  Global Declarations ', EJECT ??
?? PUSH (LISTEXT := ON) ??
*copyc i#call_monitor
*copyc dft$rpc_parameters
*copyc dft$server_file_output
*copyc dmt$df_allocate_file_space
*copyc dmt$df_reallocate_file_space
*copyc dmt$df_set_eoi
*copyc dmt$error_condition_codes
*copyc gft$file_desc_entry_p
*copyc gft$system_file_identifier
*copyc jmt$active_job_list
*copyc mmt$rb_set_get_segment_length
*copyc ost$status
*copyc pft$p_file_server_buffers
*copyc sft$file_space_limit_kind
?? POP ??
*copyc dmp$allocate_file_space_r1
*copyc dmp$get_disk_file_descriptor_p
*copyc dmp$preset_conversion
*copyc dmp$reallocate_file_space
*copyc dmp$validate_sfid_with_gfn
*copyc gfp$get_eoi_from_fde
*copyc gfp$verify_get_fde_p
*copyc syp$core_hang_if_system_jrt_set
*copyc syp$set_status_from_mtr_status
?? TITLE := '  [XDCL, #GATE]  dmp$r1_df_server_allocate_space', EJECT ??

  PROCEDURE [XDCL, #GATE] dmp$r1_df_server_allocate_space
    (VAR p_param_received_from_client {Input} : dft$p_receive_parameters;
     VAR p_data_from_client {Input} : dft$p_receive_data;
     VAR p_send_to_client_params {^Output} : dft$p_send_parameters;
     VAR p_send_to_client_data {^Output} : dft$p_send_data;
     VAR send_parameters_size: dft$send_parameter_size;
     VAR send_data_size: dft$send_data_size;
     VAR status: ost$status);

    CONST
      null_ajl_ordinal = jmc$max_ajl_ord;

    VAR
      dfd_p: ^dmt$disk_file_descriptor,
      fde_p: gft$file_desc_entry_p,
      p_input_parameters: ^dmt$df_allocate_file_space_inp,
      p_output_parameters: ^dmt$df_allocate_file_space_inp,
      sfid_valid: boolean;

    send_parameters_size := 0;
    send_data_size := 0;
    NEXT p_input_parameters IN p_param_received_from_client;

    gfp$verify_get_fde_p (p_input_parameters^.sfid, fde_p, status);
    IF NOT status.normal THEN
      RETURN;
    IFEND;

    dmp$allocate_file_space_r1 (p_input_parameters^.sfid, p_input_parameters^.byte_offset,
          p_input_parameters^.bytes_to_allocate, 0, osc$nowait, sfc$no_limit, status);
    syp$core_hang_if_system_jrt_set (dfc$tjr_server_allocate_space);
    RESET p_send_to_client_params;
    NEXT p_output_parameters IN p_send_to_client_params;
    send_parameters_size := #SIZE (p_output_parameters^);

    p_output_parameters^.byte_offset := p_input_parameters^.byte_offset;
    p_output_parameters^.bytes_to_allocate := p_input_parameters^.bytes_to_allocate;
    IF status.normal THEN
      dmp$get_disk_file_descriptor_p (fde_p, dfd_p);
      p_output_parameters^.total_allocated_length := dfd_p^.highest_offset_allocated;
    IFEND;

  PROCEND dmp$r1_df_server_allocate_space;

?? TITLE := '  [XDCL, #GATE]  dfp$reallocate_filespace_server', EJECT ??

  PROCEDURE [XDCL, #GATE] dfp$reallocate_filespace_server
    (VAR p_param_received_from_client {Input} : dft$p_receive_parameters;
     VAR p_data_from_client {Input} : dft$p_receive_data;
     VAR p_send_to_client_params {^Output} : dft$p_send_parameters;
     VAR p_send_to_client_data {^Output} : dft$p_send_data;
     VAR send_parameters_size: dft$send_parameter_size;
     VAR send_data_size: dft$send_data_size;
     VAR status: ost$status);

    VAR
      p_input_parameters: ^dmt$df_reallocate_filespace_inp;

    send_parameters_size := 0;
    send_data_size := 0;
    NEXT p_input_parameters IN p_param_received_from_client;
    dmp$validate_sfid_with_gfn (p_input_parameters^.sfid, p_input_parameters^.global_file_name, status);
    IF status.normal THEN
      dmp$reallocate_file_space (p_input_parameters^.sfid, TRUE, status);
    IFEND;
    syp$core_hang_if_system_jrt_set (dfc$tjr_server_reallocate_space);

  PROCEND dfp$reallocate_filespace_server;

?? TITLE := '  [XDCL, #GATE]  dmp$df_server_set_eoi', EJECT ??

  PROCEDURE [XDCL, #GATE] dmp$df_server_set_eoi
    (VAR p_param_received_from_client {Input} : dft$p_receive_parameters;
     VAR p_data_from_client {Input} : dft$p_receive_data;
     VAR p_send_to_client_params {^Output} : dft$p_send_parameters;
     VAR p_send_to_client_data {^Output} : dft$p_send_data;
     VAR send_parameters_size: dft$send_parameter_size;
     VAR send_data_size: dft$send_data_size;
     VAR status: ost$status);

    VAR
      p_input_parameters: ^dmt$df_set_eoi_inp,
      request_block: mmt$rb_set_get_segment_length;

    send_parameters_size := 0;
    send_data_size := 0;
    NEXT p_input_parameters IN p_param_received_from_client;
    gfp$verify_get_fde_p (p_input_parameters^.sfid, request_block.fde_p, status);
    IF NOT status.normal THEN
      RETURN;
    IFEND;

    request_block.request_code := syc$rc_set_get_segment_length;
    request_block.subfunction_code := mmc$sf_set_segment_length_fde_p;
    request_block.segment_length := p_input_parameters^.segment_length;

    i#call_monitor (#LOC (request_block), #SIZE (request_block));

    syp$core_hang_if_system_jrt_set (dfc$tjr_server_set_eoi);

  PROCEND dmp$df_server_set_eoi;

?? TITLE := '  [XDCL, #GATE] dmp$fetch_server_sft_info ', EJECT ??
*copyc dmh$fetch_server_sft_info

  PROCEDURE [XDCL, #GATE] dmp$fetch_server_sft_info
    (    system_file_id: gft$system_file_identifier;
     VAR info: dft$server_file_output;
     VAR p_file_server_buffers: pft$p_file_server_buffers;
     VAR status: ost$status);

    VAR
      dfd_p: ^dmt$disk_file_descriptor,
      fde_p: gft$file_desc_entry_p,
      sfid_valid: boolean;

    gfp$verify_get_fde_p (system_file_id, fde_p, status);
    IF NOT status.normal THEN
      RETURN;
    IFEND;
    dmp$get_disk_file_descriptor_p (fde_p, dfd_p);

    info.bytes_per_allocation:= dfd_p^.bytes_per_allocation;
    info.eoi_byte_address := gfp$get_eoi_from_fde (fde_p);
    info.file_limit := fde_p^.file_limit;
    info.preset_value := dmp$preset_conversion (fde_p^.preset_value);
    info.remote_sfid := system_file_id;
    info.requested_transfer_size := dfd_p^.requested_transfer_size;

    IF fde_p^.queue_ordinal > mmc$pq_shared_last_sys THEN
      info.shared_queue := fde_p^.queue_ordinal - mmc$pq_shared_last_sys;
    ELSE
      info.shared_queue := mmc$null_shared_queue;
    IFEND;

    info.total_allocated_length := dfd_p^.highest_offset_allocated;

  PROCEND dmp$fetch_server_sft_info;
?? OLDTITLE, OLDTITLE ??
MODEND dmm$df_server_requests;
