PROCEDURE jmp$restore_job_files (
  control_family, control_families, cf: list of name = $optional
  control_user, control_users, cu: list of name = $optional
  job_category_name, job_category_names, jcn: list of name = $optional
  job_class, job_classes, jc: list of name = $optional
  job_deferred_by_user, jdbu: boolean = $optional
  job_qualifier, job_qualifiers, jq: list of name = $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
  site_information, si: list of string 0..256 = $optional
  user_information, ui: list of string 0..256 = $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
  vsn_suffix, vs: any = $optional
  increment_scheme, is: key
      (alphabetic, a)
      (decimal, d)
    keyend = decimal
  type, t: key
      mt9$800, mt9$1600, mt9$6250, mt18$38000
    keyend = mt9$1600
  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
  unload_volume, uv: boolean = TRUE
  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
    current_ring: integer 1..15 = $ring
    output_created: boolean = NOT $file(output assigned)
    queue_backup: file = $unique($local)
    vsn_list: list 1..$max_list of string 1..6
  VAREND

  WHEN ANY_FAULT DO
    IF NOT $SPECIFIED(backup_file) THEN
      detach_file file=queue_backup unload_volume=unload_volume status=ignore_status
    IFEND
    IF output_created THEN
      change_file_attributes file=output ring_attributes=(current_ring current_ring current_ring)
    IFEND
    EXIT_PROC
  WHENEND

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

  IF $specified(vsn) THEN
    IF $specified(vsn_prefix) OR $specified(vsn_suffix) 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) OR $specified(vsn_suffix)) THEN
    IF NOT $specified(backup_FILE) THEN
      EXIT PROCEDURE WITH $STATUS(FALSE 'JM' jme$vsn_vsnp_vsns_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

" Restore all the files on the specified backup tape set.

  TASK RING=3
    IF NOT $SPECIFIED(BACKUP_FILE) THEN
      request_magnetic_tape queue_backup recorded_vsn=vsn_list ring=false type=type
    ELSE
      queue_backup=backup_file
    IFEND
    RESTORE_PERMANENT_FILES list=output
      restore_all_files backup_file=queue_backup status=ignore_status
    QUIT " restore_permanent_files "
    IF NOT $SPECIFIED(backup_file) THEN
      detach_file file=queue_backup unload_volume=unload_volume status=ignore_status
    IFEND
    IF output_created THEN
      change_file_attributes file=output ring_attributes=(current_ring current_ring current_ring)
    IFEND
  TASKEND
  CANCEL ANY_FAULT
  $system.MANAGE_JOBS

    change_list_options output=output errors=errors

"$FORMAT=OFF"
    VAR
      activated_jobs: list 0..$max_list of name
      desired_jobs: list 0..$max_list of name
      selected_jobs: list 0..$max_list of name
      unwanted_jobs: list 0..$max_list of name
    VAREND
"$FORMAT=ON"

" Activate all jobs that were restored or otherwise inactive but present in the input queue catalogs.

    activate_job_files files_activated=activated_jobs

" Construct a list of system job names of the desired jobs to restore.

    select_jobs control_family=control_family control_user=control_user job_category_name=job_category_name ..
          job_class=job_class job_deferred_by_operator=TRUE ..
          job_deferred_by_user=job_deferred_by_user job_qualifier=job_qualifier login_account=login_account ..
          login_family=login_family login_project=login_project login_user=login_user name=name ..
          site_information=site_information user_information=user_information ..
          maximum_selection=maximum_selection job_selection_list=selected_jobs

    desired_jobs = $intersection(activated_jobs selected_jobs)
    unwanted_jobs = $difference(activated_jobs selected_jobs)

" Get rid of the unchosen jobs, and return their system job names as the excluded_file_list argument.

    IF NOT $NIL(unwanted_jobs) THEN
      terminate_jobs names=unwanted_jobs reason=none
    IFEND
    IF $SPECIFIED(excluded_file_list) THEN
      excluded_file_list = unwanted_jobs
    IFEND

" Emit job_queuing_started history statistics for the desired jobs and reenable them for initiation.

    IF NOT $NIL(desired_jobs) THEN
      log_restored_job_files files_restored=desired_jobs
      display_input_attributes names=desired_jobs display_option=all output=output.$eoi
      change_input_attributes names=desired_jobs job_deferred_by_operator=false
    IFEND

  QUIT " manage_jobs "

PROCEND jmp$restore_job_files
