?? RIGHT := 110 ??
?? NEWTITLE := 'PACKAGE_SOFTWARE Utility: Module RAM$TEST_PERMITS.' ??
MODULE ram$test_permits;

{ PURPOSE:
{   This module contains the procedure to test the permits on a
{   catalog or a file.
{
{ DESIGN:
{   If a file or catalog permit exists that should not exist,
{   VALIDATION_ERRORS is set to TRUE and passed back to the caller.
{   The compiled module resides in RAF$LIBRARY.
{
{ NOTES:
{
{

?? NEWTITLE := 'Global Declarations Referenced by This Module', EJECT ??
?? PUSH (LISTEXT := ON) ??
*copyc rae$package_software_cc
*copyc ost$status
*copyc rat$subproduct_info_types
*copyc rat$validation_selections
?? POP ??
*copyc osp$append_status_file
*copyc osp$set_status_abnormal
*copyc pfp$find_direct_info_record
*copyc pfp$find_permit_array
*copyc osp$generate_error_message

?? TITLE := 'Global Declarations Declared by This Module', EJECT ??

?? TITLE := '[XDCL] rap$test_permits', EJECT ??

{ PURPOSE:
{   This procedure tests for the indicated catalog or file
{   permits.
{
{ DESIGN:
{   If a file or catalog permit exists that should not exist,
{   VALIDATION_ERRORS is set to TRUE and passed back to the caller.
{
{ NOTES:
{
{

  PROCEDURE [XDCL] rap$test_permits
    (    validation_selections: rat$validation_selections;
         element_ref_p: ^fst$file_reference;
         info_record_p: pft$p_info_record;
         info_offset: pft$info_offset;
     VAR validation_errors: boolean;
     VAR status: ost$status);


    VAR
      i: pft$array_index,
      ignore_status: ost$status,
      message_status: ost$status,
      permits_p: pft$p_permit_array,
      permit_info_record_p: pft$p_info_record;

    status.normal := TRUE;

    IF (rac$no_permits IN validation_selections) OR (rac$no_private_permits IN validation_selections) OR
          (rac$warning_public_permits IN validation_selections) THEN

      pfp$find_direct_info_record (^info_record_p^.body, info_offset, permit_info_record_p, status);
      IF NOT status.normal THEN
        RETURN;
      IFEND;

      pfp$find_permit_array (permit_info_record_p, permits_p, status);
      IF NOT status.normal THEN
        RETURN;
      IFEND;

      IF permits_p = NIL THEN
        RETURN;
      IFEND;

      IF rac$no_permits IN validation_selections THEN
        osp$set_status_abnormal ('RA', rae$no_permits_allowed, '', message_status);
        osp$append_status_file (osc$status_parameter_delimiter, element_ref_p^, message_status);
        osp$generate_error_message (message_status, ignore_status);
        validation_errors := TRUE;
      IFEND;

      IF rac$no_private_permits IN validation_selections THEN
        FOR i := LOWERBOUND (permits_p^) TO UPPERBOUND (permits_p^) DO
          IF NOT (permits_p^ [i].group.group_type = pfc$public) THEN
            osp$set_status_abnormal ('RA', rae$no_private_permits_allowed, '', message_status);
            osp$append_status_file (osc$status_parameter_delimiter, element_ref_p^, message_status);
            osp$generate_error_message (message_status, ignore_status);
            validation_errors := TRUE;
          IFEND;
        FOREND;
      IFEND;

      IF rac$warning_public_permits IN validation_selections THEN
        FOR i := LOWERBOUND (permits_p^) TO UPPERBOUND (permits_p^) DO
          IF permits_p^ [i].group.group_type = pfc$public THEN
            osp$set_status_abnormal ('RA', rae$warning_public_permits, '', message_status);
            osp$append_status_file (osc$status_parameter_delimiter, element_ref_p^, message_status);
            osp$generate_error_message (message_status, ignore_status);
            validation_errors := TRUE;
          IFEND;
        FOREND;
      IFEND;
    IFEND;

  PROCEND rap$test_permits;

MODEND ram$test_permits;
