MODULE iim$route;
*copyc osd$default_pragmats
{ PURPOSE:
{   The purpose of this module is to provide a ring 3 interface for
{   the interactive executive task.  All procs must validate that they
{   are being called from the system job. The functions supplied are:
{       iip$route - route a new interactive job.
{       iip$interactive_shutdown - signal all interactive jobs to suspend.
?? PUSH (LISTEXT := OFF) ??
*copyc ost$user_identification
*copyc clc$standard_file_names
*copyc osc$dual_state_interactive
*copyc jmt$system_supplied_name
*copyc jmp$list_jobs_via_mode
*copyc pmp$log
*copyc jmp$get_job_internal_info
*copyc iit$interactive_signal_type
*copyc tmc$signal_identifiers
*copyc iip$report_status_error
*copyc pmp$send_signal
*copyc jmp$system_job
*copyc jmp$submit_job
*copyc amp$open
*copyc amp$put_next
*copyc amp$close
*copyc amp$return
*copyc clp$trimmed_string_size
?? POP ??

  PROCEDURE [XDCL, #GATE] iip$route (user_id: ost$user_identification;
        user_supplied_job_name: jmt$user_supplied_name;
        system_job_parameters: jmt$system_job_parameters;
    VAR status: ost$status);

    VAR
      job_submission_options_p: ^jmt$job_submission_options,
      system_supplied_job_name: jmt$system_supplied_name;

    status.normal := TRUE;

{ submit the job

    PUSH job_submission_options_p: [1 .. 7];
    job_submission_options_p^ [1].key := jmc$user_job_name;
    job_submission_options_p^ [1].user_job_name := user_supplied_job_name;
    job_submission_options_p^ [2].key := jmc$system_job_parameters;
    PUSH job_submission_options_p^ [2].system_job_parameters;
    job_submission_options_p^ [2].system_job_parameters^ :=
          system_job_parameters;
    job_submission_options_p^ [3].key := jmc$origin_application_name;
    job_submission_options_p^ [3].origin_application_name := osc$dual_state_interactive;
    job_submission_options_p^ [4].key := jmc$login_command_supplied;
    job_submission_options_p^ [4].login_command_supplied := FALSE;
    job_submission_options_p^ [5].key := jmc$immediate_init_candidate;
    job_submission_options_p^ [5].immediate_init_candidate := TRUE;
    job_submission_options_p^ [6].key := jmc$login_family;
    job_submission_options_p^ [6].login_family := user_id.family;
    job_submission_options_p^ [7].key := jmc$login_user;
    job_submission_options_p^ [7].login_user := user_id.user;

    jmp$submit_job (clc$null_file, job_submission_options_p,
          system_supplied_job_name, status);
  PROCEND iip$route;
?? EJECT ??

  PROCEDURE [XDCL, #GATE] iip$interactive_shutdown (VAR status: ost$status);

    VAR
      jsns: array [1 .. 1024] of jmt$system_supplied_name,
      i,
      count: integer,
      job_info: jmt$job_internal_information,
      jmsg: string (30),
      signal: pmt$signal,
      isig: ^iit$interactive_signal;

    IF NOT jmp$system_job () THEN
      RETURN;
    IFEND;

    jmp$list_jobs_via_mode (jmc$interactive_connected, jsns, count, status);
    IF NOT status.normal THEN
      iip$report_status_error (status, 'interactive shutdown');
      RETURN;
    IFEND;

    signal.identifier := ifc$signal_id;
    isig := #LOC (signal.contents);
    isig^ := iic$exec_says_disconnect;
    jmsg := ' IF SHUTDOWN:';

  /send_to_jobs/
    FOR i := 1 TO count DO
      jmsg (15, 5) := jsns [i];
      pmp$log (jmsg, status);
      jmp$get_job_internal_info (jsns [i], job_info, status);
      IF NOT status.normal THEN
        iip$report_status_error (status, 'IF get internal info');
        CYCLE /send_to_jobs/;
      IFEND;
      IF NOT job_info.timesharing_job THEN
        pmp$send_signal (job_info.jmtr_global_taskid, signal, status);
        IF NOT status.normal THEN
          iip$report_status_error (status, 'IF send signal');
          CYCLE /send_to_jobs/;
        IFEND;
      IFEND;
    FOREND /send_to_jobs/;
  PROCEND iip$interactive_shutdown;
MODEND iim$route
