This file is indexed.

/usr/share/ada/adainclude/pcscada/pcsc-scard-conversion.adb is in libpcscada3-dev 0.7.2-1.

This file is owned by root:root, with mode 0o644.

The actual contents of the file can be viewed below.

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
--
--  Copyright (c) 2008-2009,
--  Reto Buerki <reet@codelabs.ch>
--
--  This file is part of PCSC/Ada.
--
--  PCSC/Ada is free software; you can redistribute it and/or modify
--  it under the terms of the GNU Lesser General Publ License as published
--  by the Free Software Foundation; either version 2.1 of the License, or
--  (at your option) any later version.
--
--  PCSC/Ada is distributed in the hope that it will be useful,
--  but WITHOUT ANY WARRANTY; without even the implied warranty of
--  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
--  GNU Lesser General Public License for more details.
--
--  You should have received a copy of the GNU Lesser General Public License
--  along with PCSC/Ada; if not, write to the Free Software
--  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
--  MA  02110-1301  USA
--

with Ada.Strings.Maps;
with Ada.Characters.Latin_1;

with GNAT.String_Split;

package body PCSC.SCard.Conversion is

   use Interfaces.C;

   -------------------------------------------------------------------------

   procedure Free (Name : in out Thin.READERSTATE_Array) is
   begin
      for Index in Name'Range loop
         Strings.Free (Name (Index).szReader);
      end loop;
   end Free;

   -------------------------------------------------------------------------

   function Slice_Readerstring (To_Slice : String) return Reader_ID_Set
   is
      use type GNAT.String_Split.Slice_Number;

      Readers : Reader_ID_Set;
      Lines   : GNAT.String_Split.Slice_Set;
   begin
      --  Slice readers into parts.
      --  Who uses '\0' as separator anyway?

      GNAT.String_Split.Create
        (S          => Lines,
         From       => To_Slice (To_Slice'First .. To_Slice'Last),
         Separators => Ada.Strings.Maps.To_Set (Ada.Characters.Latin_1.NUL),
         Mode       => GNAT.String_Split.Single);

      --  Minus two because \0\0 is used as termination.

      for J in 1 .. GNAT.String_Split.Slice_Count (Lines) - 2 loop
         Readers.Data.Append (New_Item => To_Unbounded_String
                              (GNAT.String_Split.Slice (Lines, J)));
      end loop;

      return Readers;

   end Slice_Readerstring;

   -------------------------------------------------------------------------

   function To_Ada (C_Protocol : Thin.DWORD) return Proto is
   begin
      for P in Proto'Range loop
         if C_Proto (P) = C_Protocol then

            --  Return active Proto

            return P;
         end if;
      end loop;

      --  Return 'Undefined' if no active proto found

      return Proto_Undefined;
   end To_Ada;

   -------------------------------------------------------------------------

   function To_Ada (C_Cardstate : Thin.DWORD) return Card_States_Set is
      States : Card_States_Set;
   begin
      for P in C_Card_State'Range loop
         if (C_Cardstate and C_Card_State (P)) /= 0 then
            States.Data.Append (New_Item => P);
         end if;
      end loop;
      return States;
   end To_Ada;

   -------------------------------------------------------------------------

   function To_Ada (C_Readerstate : Thin.DWORD) return Reader_States_Set is
      States : Reader_States_Set;
   begin
      for P in C_Reader_State'Range loop
         if (C_Readerstate and C_Reader_State (P)) /= 0 then
            States.Data.Append (New_Item => P);
         end if;
      end loop;
      return States;
   end To_Ada;

   -------------------------------------------------------------------------

   function To_C
     (Conditions : Reader_Condition_Set)
      return Thin.READERSTATE_Array
   is
      use VORCP;

      Position : Cursor := Conditions.Data.First;
      C_States : Thin.READERSTATE_Array
        (size_t (1) .. size_t (Conditions.Data.Last_Index));

      function Create_Readerstate
        (Condition : Reader_Condition;
         State     : Thin.DWORD)
         return Thin.READERSTATE;
      --  Helper function to create a new Thin.READERSTATE object from
      --  Reader_Condition

      function Create_Readerstate
        (Condition : Reader_Condition;
         State     : Thin.DWORD)
         return Thin.READERSTATE
      is
         Current_State : Thin.DWORD := State;
         Temp          : Interfaces.Unsigned_64;
      begin

         --  Add event counter in the upper word of dwCurrentState

         Current_State := State and 16#FFFF#;
         Temp          := Interfaces.Unsigned_64 (Condition.Event_Counter);
         Current_State := Current_State or Thin.DWORD
           (Interfaces.Shift_Left (Value  => Temp,
                                   Amount => 16));

         return Thin.READERSTATE'
           (szReader       => Strings.New_String
              (To_String (Condition.Name)),
            dwCurrentState => Current_State,
            cbAtr          => Condition.Card_ATR.Data'Length,
            rgbAtr         => Thin.Byte_Array (Condition.Card_ATR.Data),
            others         => <>);
      end Create_Readerstate;

   begin
      while Has_Element (Position) loop
         declare
            Item     : constant Reader_Condition := Element (Position);
            C_RState : Thin.DWORD                := 0;
         begin
            for S in Natural range Item.Current_State.First_Index ..
              Item.Current_State.Last_Index loop
               C_RState := C_RState or C_Reader_State
                 (Item.Current_State.Get (Index => S));
            end loop;

            C_States (size_t (To_Index (Position))) := Create_Readerstate
              (Condition => Item,
               State     => C_RState);

            Next (Position);
         end;
      end loop;

      return C_States;
   end To_C;

   -------------------------------------------------------------------------

   function To_Chars_Ptr (Reader : Reader_ID) return Strings.chars_ptr is
   begin
      return Strings.New_String (To_String (Reader));
   end To_Chars_Ptr;

end PCSC.SCard.Conversion;