?? NEWTITLE := '  NOS/VE Set Management ' ??
MODULE stm$ring2_purge_set;
?? RIGHT := 110 ??

{ PURPOSE:
{   This contains the ring 2 processor for the purge set function.
{
{ DESIGN:
{   This runs in ring 2 (223 - ring brackets)

?? NEWTITLE := 'Global Declarations Referenced by This Module', EJECT ??
?? PUSH (LISTEXT := ON) ??
*copyc ste$error_condition_codes
*copyc dmt$active_volume_table_index
*copyc gft$system_file_identifier
*copyc ost$status
*copyc stt$active_set_entry
?? POP ??
*copyc dmp$change_set_name
*copyc osp$set_status_abnormal
*copyc stp$destroy_vst
*copyc stp$dm_check_if_files_on_vol
*copyc stp$members_on_set
*copyc stp$obtain_vst_header
*copyc stp$open_vst
*copyc stp$remove_set_from_ast
*copyc stp$remove_set_from_jast
*copyc stp$remove_set_from_vst
*copyc stp$return_opened_vst
?? OLDTITLE ??
?? NEWTITLE := '  [XDCL, #GATE] stp$ring2_purge_set', EJECT ??
*copyc sth$ring2_purge_set

  PROCEDURE [XDCL, #GATE] stp$ring2_purge_set (set_name: stt$set_name;
        master_vol: rmt$recorded_vsn;
        master_avt_index: dmt$active_volume_table_index;
        ast_index: stt$ast_index;
        ast_entry: stt$active_set_entry;
    VAR status: ost$status);

    VAR
      local_status: ost$status,
      master_vst_segment_pointer: mmt$segment_pointer,
      masters_sfid: gft$system_file_identifier,
      p_master_vst: ^stt$vol_set_table,
      p_pf_root: ^pft$root,
      purge_set_status: ost$status;

{   GET THE MASTER VOLUME OPEN
    stp$open_vst (master_vol, TRUE, masters_sfid, master_vst_segment_pointer, purge_set_status);
    IF purge_set_status.normal THEN
      p_master_vst := master_vst_segment_pointer.cell_pointer;
      ring2_verify_purge_set (set_name, master_vol, p_master_vst, ast_index, ast_entry, purge_set_status);
      IF purge_set_status.normal THEN
{
{       remove all trace of the set.
        stp$remove_set_from_jast (set_name, purge_set_status);
        stp$remove_set_from_vst (p_master_vst, purge_set_status);
        stp$remove_set_from_ast (ast_index, purge_set_status);
        IF purge_set_status.normal THEN
{           notify device management that the volume is no longer in a set.
          dmp$change_set_name (master_vol, osc$null_name, purge_set_status);
        IFEND;
      IFEND;
      stp$return_opened_vst (masters_sfid, master_vst_segment_pointer, local_status);
      IF purge_set_status.normal THEN
        stp$destroy_vst (master_vol, local_status {??} );
      IFEND;
    IFEND;
    status := purge_set_status;

  PROCEND stp$ring2_purge_set;
?? OLDTITLE ??
?? NEWTITLE := '  ring2_verify_purge_set', EJECT ??

  PROCEDURE ring2_verify_purge_set (set_name: stt$set_name;
        master_vol: rmt$recorded_vsn;
        p_vst: ^stt$vol_set_table;
        ast_index: stt$ast_index;
        ast_entry: stt$active_set_entry;
    VAR purge_set_status: ost$status);

{  PURPOSE:
{    This procedure does the verification of the purge set request that can
{    only be done at ring 2, because the volume must be open.
{  CONDITIONS:
{    ste$master_ast_mismatch
{    ste$vol_on_set
{    ste$files_on_vol

    VAR
      files_on_vol: boolean,
      internal_vsn: dmt$internal_vsn,
      master_in_set: boolean,
      master_vst_vsn: rmt$recorded_vsn,
      masters_set: stt$set_name,
      masters_unique_set: stt$unique_set_name,
      members_on_set: boolean,
      volume_status_in_set: stt$vol_status_in_set;

    purge_set_status.normal := TRUE;
{
{   A self check for sets.
    stp$obtain_vst_header (p_vst, master_vst_vsn, internal_vsn, master_in_set, masters_set,
          masters_unique_set, volume_status_in_set);
    IF master_in_set THEN
      IF masters_unique_set <> ast_entry.unique_set_name THEN
        osp$set_status_abnormal (stc$set_management_id, ste$master_ast_mismatch, master_vol,
              purge_set_status);
        RETURN;
      IFEND;
    IFEND;

    { there must be no member volumes on the set }
    stp$members_on_set (ast_index, members_on_set);
    IF members_on_set THEN
      osp$set_status_abnormal (stc$set_management_id, ste$vol_on_set, set_name, purge_set_status);
    ELSE
      { there must be no files on the master volume.
      stp$dm_check_if_files_on_vol (master_vol, files_on_vol);
      IF files_on_vol THEN
        osp$set_status_abnormal (stc$set_management_id, ste$files_on_vol, master_vol, purge_set_status);
      IFEND;
    IFEND;

  PROCEND ring2_verify_purge_set;
?? OLDTITLE ??
MODEND stm$ring2_purge_set;
