*copyc osd$default_pragmats
MODULE ifm$handle_signal;

?? PUSH (LISTEXT := OFF) ??
*copyc ife$error_codes
*copyc ifk$keypoints
*copyc iit$interactive_signal_type
*copyc tmc$signal_identifiers
*copyc iit$connection_description

  PROCEDURE [XREF] iip$process_reconnect_request (gtid: ost$global_task_id);
*copyc iiv$interactive_terminated
*copyc ifc$interrupt
*copyc iip$begin_condition
*copyc iip$report_status_error
*copyc iip$send_output_message
*copyc iiv$int_task_open_file_count
*copyc iiv$connection_desc_ptr
*copyc jmv$terminal_io_disabled
*copyc jmv$user_breaks_enabled
*copyc ost$global_task_id
*copyc osp$set_status_abnormal
*copyc pmt$signal
*copyc pmp$dispose_interactive_cond
*copyc pmp$log
*copyc iip$disconnect_reconnect
*copyc pmp$exit
*copyc pmp$signal_all_child_tasks
?? POP ??

{
{   The purpose of this module is to define the signal handler for all
{ interactive signals.
{

  PROCEDURE [XDCL, #GATE] ifp$handle_signal (originator: ost$global_task_id;
        signal: pmt$signal);

    VAR
      lsig: pmt$signal,
      long_wait: boolean,
      psig: ^iit$interactive_signal,
      prs: ^iit$reconnect_job,
      prreq: ^iit$reconnect_request,
      i: integer,
      status: ost$status;


    psig := #LOC (signal.contents);
    CASE psig^ OF
    = iic$jm_send_data =
      iip$send_output_message (FALSE, status);
    = iic$pause_break =
      iip$begin_condition (ifc$pause_break, status);
      IF (NOT jmv$terminal_io_disabled) AND jmv$user_breaks_enabled THEN
        pmp$dispose_interactive_cond (ifc$pause_break);
      IFEND;
    = iic$terminate_break =
      iip$begin_condition (ifc$terminate_break, status);
      IF (NOT jmv$terminal_io_disabled) AND jmv$user_breaks_enabled THEN
        pmp$dispose_interactive_cond (ifc$terminate_break);
      IFEND;
    = iic$resume_task =
      lsig.identifier := ifc$signal_id;
      psig := #LOC (lsig.contents);
      psig^ := iic$resume_task;
      pmp$signal_all_child_tasks (signal, status);
    = iic$terminal_disconnect =
      iip$begin_condition (ifc$terminal_connection_broken, status);
      pmp$dispose_interactive_cond (ifc$terminal_connection_broken);
    = iic$terminal_reconnect =
      iip$begin_condition (ifc$job_reconnect, status);
      pmp$dispose_interactive_cond (ifc$job_reconnect);
    = iic$disconnect_request =
      iip$disconnect_job (iic$dont_end_connection, iic$start_new_job, status);
    = iic$reconnect_job =
      prs := #LOC (signal.contents);
      iip$reconnect_job (prs^.acn, prs^.reject_caused_reconnect);
    = iic$exec_says_disconnect =
      pmp$log ('IF: EXEC DISCONNECT', status);
      iip$disconnect_job (iic$dont_end_connection, iic$dont_start_new_job,
            status);
    = iic$jmtr_start_timeout =
      iip$timeout_suspended_job;
    = iic$reconnect_request =
      prreq := #LOC (signal.contents);
      iip$process_reconnect_request (prreq^.gtid);
    = iic$interrupt =
      pmp$dispose_interactive_cond (ifc$interrupt);
    ELSE
      status.condition := ORD (psig^);
      iip$report_status_error (status, 'invoke if signal handler');
    CASEND;

  PROCEND ifp$handle_signal;

MODEND ifm$handle_signal
