PROCEDURE jmp$backup_output_files (
  comment_banner, comment_banners, cb: list of string 0..31 = $optional
  control_family, control_families, cf: list of name = $optional
  control_user, control_users, cu: list of name = $optional
  data_mode, dm: list of key
      (coded, c)
      (transparent, t)
    keyend = $optional
  device, devices, d: list of any of
      key
        automatic
      keyend
      name
    anyend = $optional
  external_characteristics, ec: list of any of
      key
        normal
      keyend
      string 0..6
    anyend = $optional
  forms_code, forms_codes, fc: list of any of
      key
        normal
      keyend
      string 0..6
    anyend = $optional
  login_account, login_accounts, la: list of name = $optional
  login_family, login_families, lf: list of name = $optional
  login_project, login_projects, lp: list of name = $optional
  login_user, login_users, lu: list of name = $optional
  name, names, n: list of name = $optional
  operator_family, operator_families, of: list of name = $optional
  operator_user, operator_users, ou: list of name = $optional
  output_class, output_classes, oc: list of name = $optional
  output_deferred_by_operator, odbo: boolean = $optional
  output_deferred_by_user, odbu: boolean = $optional
  output_destination, output_destinations, ode: list of any of
      name
      string 0..31
    anyend = $optional
  output_destination_usage, odu: list of any of
      key
        dual_state, ntf, private, public, qtf
      keyend
      name
    anyend = $optional
  output_priority, output_priorities, op: list of name = $optional
  output_state, output_states, os: any of
      key
        all
      keyend
      list of key
        (deferred, d)
        (queued, q)
        (completed, c)
      keyend
    anyend = $optional
  remote_host_directive, remote_host_directives, rhd: list of string 0..256 = $optional
  routing_banner, routing_banners, rb: list of string 0..31 = $optional
  site_information, si: list of string 0..256 = $optional
  station, stations, s: list of any of
      key
        automatic
      keyend
      name
    anyend = $optional
  system_job_name, system_job_names, sjn: list of name = $optional
  user_information, ui: list of string 0..256 = $optional
  vertical_print_density, vertical_print_densities, vpd: list of key
      six, eight, none
    keyend = $optional
  vfu_load_procedure, vfu_load_procedures, vlp: list of any of
      key
        none
      keyend
      name
    anyend = $optional
  maximum_selection, maxs: any of
      key
        all
      keyend
      integer 1..65535
    anyend = all
  vsn, vsns, v: list of any of
      name 1..6
      string 1..6
    anyend = $optional
  vsn_prefix, vp: any of
      name 1..5
      string 1..5
    anyend = $optional
  vsn_count, vc: integer 1..11881376 = 15
  increment_scheme, is: key
      (alphabetic, a)
      (decimal, d)
    keyend = decimal
  type, t: key
      mt9$800, mt9$1600, mt9$6250, mt18$38000
    keyend = mt9$1600
  delete_file, delete_files, df: boolean = true
  excluded_file_list, efl: (VAR) list 0..$max_list of name = $optional
  backup_file, bf: file = $optional
  output, o: file = $OUTPUT
  errors, e: file = $ERRORS
  status)

" Confirm that we are in the system_operator_utility with the system_administration and system_operation
" capabilities active.

  WHEN command_fault DO
    EXIT procedure WITH $status(FALSE 'OF' ofe$sou_not_active 'system_administration and system_operation')
  WHENEND

  VAR
    active_capabilities: file = $unique($local)
    ignore_status: status
    lines: list 0..$max_list of string
  VAREND

  system_operator_utility.display_active_capabilities output=active_capabilities
  get_line variable=lines input=active_capabilities
  detach_file file=active_capabilities status=ignore_status
  IF $NIL($select_wild_card_strings(lines '*system_administration*' basic)) OR ..
     $NIL($select_wild_card_strings(lines '*system_operation*' basic)) THEN
    EXIT procedure WITH $status(FALSE 'OF' ofe$sou_not_active 'system_administration and system_operation')
  IFEND
  CANCEL command_fault

  VAR
    constructed_vsn_list: list 1..$max_list of string 6
    queue_backup: file = $unique($local)
    vsn_list: list 1..$max_list of string 1..6
  VAREND

" Construct the list of VSNs for the backup tape set.

  IF $SPECIFIED(vsn) THEN
    IF $SPECIFIED(vsn_prefix) THEN
      EXIT procedure WITH $status(FALSE 'JM' jme$incompatible_vsn_params '')
    IFEND
    IF $NIL(vsn) THEN
      EXIT procedure with $status(FALSE 'JM' jme$empty_vsn_list '')
    IFEND
    vsn_list = $STRING(vsn)

    ELSEIF NOT $SPECIFIED(vsn_prefix) THEN
      IF NOT $SPECIFIED(backup_file) THEN
        EXIT procedure WITH $status(FALSE 'JM' jme$vsn_or_vsnp_or_bf_required '')
      IFEND
    ELSE
      pup$construct_volume_list vsn_count=vsn_count vsn_prefix=vsn_prefix increment_scheme=increment_scheme ..
            volume_list=constructed_vsn_list
      vsn_list = constructed_vsn_list
    IFEND

    $system.MANAGE_OUTPUT

      change_list_options output=output errors=errors

" Construct a list of system file names of the outputs to back up.

"$FORMAT=OFF"
      VAR
        all_known_outputs: list 0..$max_list of name
        chosen_states: list of key
          (deferred, d)
          (queued, q)
          (completed, c)
        keyend = (deferred queued completed)
        desired_outputs: list 0..$max_list of name
        desired_paths: list 0..$max_list of file
      VAREND
"$FORMAT=ON"

      IF $SPECIFIED(output_state) THEN
        IF $GENERIC_TYPE(output_state) <> KEY THEN
          chosen_states = output_state
        IFEND
      IFEND
      select_output output_state=(deferred queued completed) maximum_selection=all ..
           output_selection_list=all_known_outputs
      select_output comment_banner=comment_banner control_family=control_family control_user=control_user ..
           data_mode=data_mode device=device external_characteristics=external_characteristics ..
           forms_code=forms_code login_account=login_account login_family=login_family ..
           login_project=login_project login_user=login_user name=name operator_family=operator_family ..
           operator_user=operator_user output_class=output_class ..
           output_deferred_by_operator=output_deferred_by_operator ..
           output_deferred_by_user=output_deferred_by_user output_destination=output_destination ..
           output_destination_usage=output_destination_usage output_priority=output_priority ..
           output_state=chosen_states remote_host_directive=remote_host_directive ..
           routing_banner=routing_banner site_information=site_information station=station ..
           system_job_name=system_job_name user_information=user_information ..
           vertical_print_density=vertical_print_density vfu_load_procedure=vfu_load_procedure ..
           maximum_selection=maximum_selection output_selection_list=desired_outputs

      FOR EACH output_selected in desired_outputs DO
        change_output_attributes names=output_selected output_deferred_by_operator=true ..
              status=ignore_status
        IF NOT ignore_status.normal THEN
          desired_outputs=$DIFFERENCE(desired_outputs output_selected)
        IFEND
      FOREND
      display_output_attributes names=desired_outputs display_option=all output=output

" Backup the output files to tape. "

      desired_paths = $queued_output_path(desired_outputs)

      WHEN any_fault DO
        change_output_attributes names=desired_outputs output_deferred_by_operator=false
        EXIT_PROC
      WHENEND

      TASK ring=3
        IF NOT $SPECIFIED(backup_file) THEN
          request_magnetic_tape queue_backup recorded_vsn=vsn_list ring=true type=type
        ELSE
          queue_backup = backup_file
        IFEND
        BACKUP_PERMANENT_FILES backup_file=queue_backup list=output.$eoi

          FOR EACH output_path IN desired_paths DO
            backup_file file=output_path
          FOREND
        QUIT " backup_permanent_files "
        IF NOT $SPECIFIED(backup_file) THEN
          detach_file file=queue_backup
        IFEND
      TASKEND
      CANCEL any_fault

" Terminate or reactivate the outputs. "

      IF delete_files THEN
        terminate_output names=desired_outputs reason=operator_backup
      ELSE
        change_output_attributes names=desired_outputs output_deferred_by_operator=false
      IFEND

" Return a list of known outputs that were not backed up as the excluded_file_list value.

    IF $SPECIFIED(excluded_file_list) THEN
      excluded_file_list = $DIFFERENCE(all_known_outputs desired_outputs)
    IFEND

  QUIT

PROCEND jmp$backup_output_files
