?? RIGHT := 110 ??
*copyc osd$default_pragmats
?? NEWTITLE := 'NOS/VE Device Management' ??
MODULE dmm$validate_sfid_with_gfn;

{ PURPOSE:
{   The purpose of this module is to provide a mechanism for validating the
{   system_file_id prior to its usage.  It is used primarily on File_Server
{   files.
{ DESIGN:
{   The system_file_id and global_file_name are checked and status is returned.

?? TITLE := '  Declarations', EJECT ??
?? PUSH (LISTEXT := ON) ??
*copyc dfe$error_condition_codes
*copyc dmt$global_file_name
*copyc gft$system_file_identifier
*copyc gft$locked_file_desc_entry_p
*copyc oss$mainframe_paged_literal
*copyc ost$binary_unique_name
*copyc ost$name
*copyc ost$status
*copyc ost$string
*copyc ost$wait
*copyc pmt$processor_serial_number
?? POP ??
?? TITLE := '  External Procedures', EJECT ??
*copyc gfp$get_locked_fde_p
*copyc gfp$unlock_fde_p
*copyc osp$set_status_abnormal
?? TITLE := '  [XDCL, #GATE] dmp$validate_sfid_with_gfn', EJECT ??

{ Purpose:
{   This procedure takes an SFID and compares the Global_File_Name found in the associated
{   File_Descriptor_Entry with the Global_File_Name sent in as a parameter.  If the Global_File_Names match
{   a normal status is returned; if the Global_File_Names do not match, an abnormal status is returned.  The
{   text field of the abnormal status will contain the SFID in question and the Global_File_Names which do
{   not match.

  PROCEDURE [XDCL, #GATE] dmp$validate_sfid_with_gfn
    (    system_file_id: gft$system_file_identifier;
         global_file_name: dmt$global_file_name;
     VAR status: ost$status);


    TYPE
      sfid_converter = RECORD
        CASE boolean OF
        = FALSE =
          fill: 0..0ffffffff(16),
          sfid: gft$system_file_identifier,
        = TRUE =
          converted_sfid: integer,
        CASEND,
      RECEND;

    VAR
      converted_fde_gfn: ost$name,
      converted_params_gfn: ost$name,
      ignore_status: ost$status,
      p_fde: gft$locked_file_desc_entry_p,
      sfid_conv: sfid_converter,
      str: string (256),
      strlen: integer,
      wait: [STATIC, READ] ost$wait := osc$wait;


    status.normal := TRUE;
    gfp$get_locked_fde_p (system_file_id, p_fde);

    IF p_fde^.global_file_name <> global_file_name THEN
      sfid_conv.fill := 0;
      sfid_conv.sfid := system_file_id;
      convert_binary_unique_name (p_fde^.global_file_name, converted_fde_gfn);
      convert_binary_unique_name (global_file_name, converted_params_gfn);
      STRINGREP (str, strlen, 'REMOTE_SFID = ', sfid_conv.converted_sfid:#(16), '(16), GFN (FDE) = ',
            converted_fde_gfn, ', GFN (params) = ', converted_params_gfn, '; DMP$VALIDATE_SFID_WITH_GFN');
      osp$set_status_abnormal (dfc$file_server_id, dfe$sfid_gfn_mismatch, str, status);
    IFEND;

    gfp$unlock_fde_p (p_fde);

  PROCEND dmp$validate_sfid_with_gfn;
?? TITLE := '    Global Declarations For This Module', EJECT ??

  TYPE
    pmt_unique_name = record
      case boolean of
      = TRUE =
        value: ost$name,
      = FALSE =
        dollar_sign: string (1),
        sequence_number: string (7),
        processor_model_number: string (2),
        s: string (1),
        processor_serial_number: string (pmc$processor_serial_num_size),
        d: string (1),
        year: string (4),
        month: string (2),
        day: string (2),
        t: string (1),
        hour: string (2),
        minute: string (2),
        second: string (2),
      casend,
    recend,

    pmt_conversion_mask = record
      case boolean of
      = TRUE =
        integer_value: ost$processor_serial_number,
      = FALSE =
        bcd_value: packed array [1 .. pmc$processor_serial_num_size] of 0 .. 0f(16),
      casend,
    recend;

  VAR
  unique_name_mask: [STATIC, READ, oss$mainframe_paged_literal] string (256) := $CHAR (00) CAT $CHAR (01) CAT
          $CHAR (02) CAT $CHAR (03) CAT $CHAR (04) CAT $CHAR (05) CAT $CHAR (06) CAT $CHAR (07) CAT
          $CHAR (08) CAT $CHAR (09) CAT $CHAR (10) CAT $CHAR (11) CAT $CHAR (12) CAT $CHAR (13) CAT
          $CHAR (14) CAT $CHAR (15) CAT $CHAR (16) CAT $CHAR (17) CAT $CHAR (18) CAT $CHAR (19) CAT
          $CHAR (20) CAT $CHAR (21) CAT $CHAR (22) CAT $CHAR (23) CAT $CHAR (24) CAT $CHAR (25) CAT
          $CHAR (26) CAT $CHAR (27) CAT $CHAR (28) CAT $CHAR (29) CAT $CHAR (30) CAT $CHAR (31) CAT
          ' !"#$%&''()*+,-./9999999999:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_@ABCDEFGHIJKLMNOPQRSTUVWXYZ{|}^'
          CAT $CHAR (127) CAT $CHAR (128) CAT $CHAR (129) CAT $CHAR (130) CAT $CHAR (131) CAT $CHAR (132) CAT
          $CHAR (133) CAT $CHAR (134) CAT $CHAR (135) CAT $CHAR (136) CAT $CHAR (137) CAT $CHAR (138) CAT
          $CHAR (139) CAT $CHAR (140) CAT $CHAR (141) CAT $CHAR (142) CAT $CHAR (143) CAT $CHAR (144) CAT
          $CHAR (145) CAT $CHAR (146) CAT $CHAR (147) CAT $CHAR (148) CAT $CHAR (149) CAT $CHAR (150) CAT
          $CHAR (151) CAT $CHAR (152) CAT $CHAR (153) CAT $CHAR (154) CAT $CHAR (155) CAT $CHAR (156) CAT
          $CHAR (157) CAT $CHAR (158) CAT $CHAR (159) CAT $CHAR (160) CAT $CHAR (161) CAT $CHAR (162) CAT
          $CHAR (163) CAT $CHAR (164) CAT $CHAR (165) CAT $CHAR (166) CAT $CHAR (167) CAT $CHAR (168) CAT
          $CHAR (169) CAT $CHAR (170) CAT $CHAR (171) CAT $CHAR (172) CAT $CHAR (173) CAT $CHAR (174) CAT
          $CHAR (175) CAT $CHAR (176) CAT $CHAR (177) CAT $CHAR (178) CAT $CHAR (179) CAT $CHAR (180) CAT
          $CHAR (181) CAT $CHAR (182) CAT $CHAR (183) CAT $CHAR (184) CAT $CHAR (185) CAT $CHAR (186) CAT
          $CHAR (187) CAT $CHAR (188) CAT $CHAR (189) CAT $CHAR (190) CAT $CHAR (191) CAT $CHAR (192) CAT
          $CHAR (193) CAT $CHAR (194) CAT $CHAR (195) CAT $CHAR (196) CAT $CHAR (197) CAT $CHAR (198) CAT
          $CHAR (199) CAT $CHAR (200) CAT $CHAR (201) CAT $CHAR (202) CAT $CHAR (203) CAT $CHAR (204) CAT
          $CHAR (205) CAT $CHAR (206) CAT $CHAR (207) CAT $CHAR (208) CAT $CHAR (209) CAT $CHAR (210) CAT
          $CHAR (211) CAT $CHAR (212) CAT $CHAR (213) CAT $CHAR (214) CAT $CHAR (215) CAT $CHAR (216) CAT
          $CHAR (217) CAT $CHAR (218) CAT $CHAR (219) CAT $CHAR (220) CAT $CHAR (221) CAT $CHAR (222) CAT
          $CHAR (223) CAT $CHAR (224) CAT $CHAR (225) CAT $CHAR (226) CAT $CHAR (227) CAT $CHAR (228) CAT
          $CHAR (229) CAT $CHAR (230) CAT $CHAR (231) CAT $CHAR (232) CAT $CHAR (233) CAT $CHAR (234) CAT
          $CHAR (235) CAT $CHAR (236) CAT $CHAR (237) CAT $CHAR (238) CAT $CHAR (239) CAT $CHAR (240) CAT
          $CHAR (241) CAT $CHAR (242) CAT $CHAR (243) CAT $CHAR (244) CAT $CHAR (245) CAT $CHAR (246) CAT
          $CHAR (247) CAT $CHAR (248) CAT $CHAR (249) CAT $CHAR (250) CAT $CHAR (251) CAT $CHAR (252) CAT
          $CHAR (253) CAT $CHAR (254) CAT $CHAR (255),

    digits: [STATIC, READ, oss$mainframe_paged_literal] array [0 .. 15] of char := ['0', '1', '2', '3', '4',
          '5','6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'];

?? TITLE := '    CONVERT_BINARY_UNIQUE_NAME', EJECT ??
  PROCEDURE [INLINE] convert_binary_unique_name
    (    binary_name: ost$binary_unique_name;
     VAR name: ost$name);


    VAR
      number: integer,
      index: ost$string_index,
      converter: pmt_conversion_mask,
      generated_name: pmt_unique_name;


    generated_name.dollar_sign := '$';

    number := binary_name.sequence_number;
    FOR index := STRLENGTH (generated_name.sequence_number) DOWNTO 1 DO
      generated_name.sequence_number (index) := digits [number MOD 10];
      number := number DIV 10;
    FOREND;

    generated_name.processor_model_number (1) := digits [binary_name.model_number DIV 16];
    generated_name.processor_model_number (2) := digits [binary_name.model_number MOD 16];

    generated_name.s := 'S';

    converter.integer_value := binary_name.serial_number;
    FOR index := 1 TO pmc$processor_serial_num_size DO
      generated_name.processor_serial_number (index) := digits [converter.bcd_value [index]];
    FOREND;

    generated_name.d := 'D';

    number := binary_name.year;
    FOR index := STRLENGTH (generated_name.year) DOWNTO 1 DO
      generated_name.year (index) := digits [number MOD 10];
      number := number DIV 10;
    FOREND;

    generated_name.month (1) := digits [binary_name.month DIV 10];
    generated_name.month (2) := digits [binary_name.month MOD 10];

    generated_name.day (1) := digits [binary_name.day DIV 10];
    generated_name.day (2) := digits [binary_name.day MOD 10];

    generated_name.t := 'T';

    generated_name.hour (1) := digits [binary_name.hour DIV 10];
    generated_name.hour (2) := digits [binary_name.hour MOD 10];

    generated_name.minute (1) := digits [binary_name.minute DIV 10];
    generated_name.minute (2) := digits [binary_name.minute MOD 10];

    generated_name.second (1) := digits [binary_name.second DIV 10];
    generated_name.second (2) := digits [binary_name.second MOD 10];

    name := generated_name.value;

  PROCEND convert_binary_unique_name;
MODEND dmm$validate_sfid_with_gfn;
