1------------------------------------------------------------------------------
2--                                                                          --
3--            FLORIST (FSU Implementation of POSIX.5) COMPONENTS            --
4--                                                                          --
5--      P O S I X . C O N F I G U R A B L E _ S Y S T E M _ L I M I T S     --
6--                                                                          --
7--                                  B o d y                                 --
8--                                                                          --
9--                                                                          --
10--             Copyright (C) 1996-1997 Florida State University             --
11--                     Copyright (C) 1998-2014, AdaCore                     --
12--                                                                          --
13--  This file is a component of FLORIST, an  implementation of an  Ada API  --
14--  for the POSIX OS services, for use with  the  GNAT  Ada  compiler  and  --
15--  the FSU Gnu Ada Runtime Library (GNARL).   The  interface  is intended  --
16--  to be close to that specified in  IEEE STD  1003.5: 1990  and IEEE STD  --
17--  1003.5b: 1996.                                                          --
18--                                                                          --
19--  FLORIST is free software;  you can  redistribute  it and/or  modify it  --
20--  under terms of the  GNU  General  Public  License as  published by the  --
21--  Free Software Foundation;  either version  2, or (at  your option) any  --
22--  later version.  FLORIST is distributed  in  the hope  that  it will be  --
23--  useful, but WITHOUT ANY WARRANTY;  without  even the implied  warranty  --
24--  of MERCHANTABILITY or FITNESS FOR A PARTICULAR  PURPOSE.  See  the GNU  --
25--  General Public License for more details.  You  should have  received a  --
26--  copy of the GNU General Public License  distributed  with  GNARL;  see  --
27--  file  COPYING.  If not,  write to  the  Free  Software  Foundation, 59  --
28--  Temple Place - Suite 330, Boston, MA 02111-1307, USA.                   --
29--                                                                          --
30--                                                                          --
31--                                                                          --
32--                                                                          --
33--                                                                          --
34--                                                                          --
35--                                                                          --
36--                                                                          --
37------------------------------------------------------------------------------
38
39with POSIX;
40
41package body POSIX.Configurable_System_Limits is
42
43   package PO renames POSIX.Options;
44   package PL renames POSIX.Limits;
45   use POSIX.C;
46
47   function sysconf (c_name : int) return long;
48   pragma Import (C, sysconf, sysconf_LINKNAME);
49
50   generic
51      type Support_Subtype is range <>;
52      Name : int;
53   function Limit return Support_Subtype;
54
55   function Limit return Support_Subtype is
56      Result : long;
57   begin
58      Result := sysconf (Name);
59      if Result = -1 then
60         return Support_Subtype'Last;
61      end if;
62      return Support_Subtype (Result);
63   end Limit;
64
65   function Asynchronous_IO_Is_Supported
66     return PO.Asynchronous_IO_Support is
67   begin
68      return sysconf (SC_ASYNCHRONOUS_IO) = 1;
69   end Asynchronous_IO_Is_Supported;
70
71   function File_Synchronization_Is_Supported
72     return PO.File_Synchronization_Support is
73   begin
74      return sysconf (SC_FSYNC) = 1;
75   end File_Synchronization_Is_Supported;
76
77   function Job_Control_Supported
78     return Job_Control_Support is
79   begin
80      return sysconf (SC_JOB_CONTROL) = 1;
81   end Job_Control_Supported;
82
83   function Memory_Mapped_Files_Are_Supported
84     return PO.Memory_Mapped_Files_Support is
85   begin
86      return sysconf (SC_MAPPED_FILES) = 1;
87   end Memory_Mapped_Files_Are_Supported;
88
89   function Memory_Locking_Is_Supported
90     return PO.Memory_Locking_Support is
91   begin
92      return sysconf (SC_MEMLOCK) = 1;
93   end Memory_Locking_Is_Supported;
94
95   function Memory_Range_Locking_Is_Supported
96     return PO.Memory_Range_Locking_Support is
97   begin
98      return sysconf (SC_MEMLOCK_RANGE) = 1;
99   end Memory_Range_Locking_Is_Supported;
100
101   function Memory_Protection_Is_Supported
102      return PO.Memory_Protection_Support is
103   begin
104      return sysconf (SC_MEMORY_PROTECTION) = 1;
105   end Memory_Protection_Is_Supported;
106
107   function Message_Queues_Are_Supported
108      return PO.Message_Queues_Support is
109   begin
110      return sysconf (SC_MESSAGE_PASSING) = 1;
111   end Message_Queues_Are_Supported;
112
113   function Mutex_Priority_Ceiling_Is_Supported
114      return PO.Mutex_Priority_Ceiling_Support is
115   begin
116      return sysconf (SC_THREAD_PRIO_PROTECT) = 1;
117   end Mutex_Priority_Ceiling_Is_Supported;
118
119   function Mutex_Priority_Inheritance_Is_Supported
120      return PO.Mutex_Priority_Inheritance_Support is
121   begin
122      return sysconf (SC_THREAD_PRIO_INHERIT) = 1;
123   end Mutex_Priority_Inheritance_Is_Supported;
124
125   function Mutexes_Are_Supported
126      return PO.Mutexes_Support is
127   begin
128      return True;
129   end Mutexes_Are_Supported;
130
131   function Prioritized_IO_Is_Supported
132      return PO.Prioritized_IO_Support is
133   begin
134      return sysconf (SC_PRIORITIZED_IO) = 1;
135   end Prioritized_IO_Is_Supported;
136
137   function Priority_Process_Scheduling_Is_Supported
138      return PO.Priority_Process_Scheduling_Support is
139   begin
140      return sysconf (SC_PRIORITY_SCHEDULING) = 1;
141   end Priority_Process_Scheduling_Is_Supported;
142
143   function Priority_Task_Scheduling_Is_Supported
144      return PO.Priority_Task_Scheduling_Support is
145   begin
146      return sysconf (SC_THREAD_PRIORITY_SCHEDULING) = 1;
147   end Priority_Task_Scheduling_Is_Supported;
148
149   function Realtime_Signals_Are_Supported
150      return PO.Realtime_Signals_Support is
151   begin
152      return sysconf (SC_REALTIME_SIGNALS) = 1;
153   end Realtime_Signals_Are_Supported;
154
155   function Saved_IDs_Supported
156      return PO.Saved_IDs_Support is
157   begin
158      return sysconf (SC_SAVED_IDS) = 1;
159   end Saved_IDs_Supported;
160
161   function Semaphores_Are_Supported
162      return PO.Semaphores_Support is
163   begin
164      return sysconf (SC_SEMAPHORES) = 1;
165   end Semaphores_Are_Supported;
166
167   function Shared_Memory_Objects_Are_Supported
168      return PO.Shared_Memory_Objects_Support is
169   begin
170      return sysconf (SC_SHARED_MEMORY_OBJECTS) = 1;
171   end Shared_Memory_Objects_Are_Supported;
172
173   function Process_Shared_Is_Supported
174      return PO.Process_Shared_Support is
175   begin
176      return sysconf (SC_THREAD_PROCESS_SHARED) = 1;
177   end Process_Shared_Is_Supported;
178
179   function Synchronized_IO_Is_Supported
180      return PO.Synchronized_IO_Support is
181   begin
182      return sysconf (SC_SYNCHRONIZED_IO) = 1;
183   end Synchronized_IO_Is_Supported;
184
185   function Timers_Are_Supported
186      return PO.Timers_Support is
187   begin
188      return sysconf (SC_TIMERS) = 1;
189   end Timers_Are_Supported;
190
191   function System_POSIX_Version
192      return POSIX_Version is
193   begin
194      return POSIX_Version (sysconf (SC_VERSION));
195   end System_POSIX_Version;
196
197   function System_POSIX_Ada_Version
198      return POSIX_Version is
199   begin
200      return POSIX_Ada_Version;
201   end System_POSIX_Ada_Version;
202
203   function ALM is new Limit
204     (PL.Argument_List_Maxima, SC_ARG_MAX);
205   function Argument_List_Maximum
206     return POSIX.Limits.Argument_List_Maxima renames ALM;
207
208   function AIOM is new Limit
209     (PL.Asynchronous_IO_Maxima, SC_AIO_MAX);
210   function Asynchronous_IO_Maximum
211      return PL.Asynchronous_IO_Maxima renames AIOM;
212
213   function AIOPDM is new Limit
214     (PL.Asynchronous_IO_Priority_Delta_Maxima, SC_AIO_PRIO_DELTA_MAX);
215   function Asynchronous_IO_Priority_Delta_Maximum
216      return PL.Asynchronous_IO_Priority_Delta_Maxima renames AIOPDM;
217
218   function CPM is new Limit
219     (PL.Child_Processes_Maxima, SC_CHILD_MAX);
220   function Child_Processes_Maximum
221      return PL.Child_Processes_Maxima renames CPM;
222
223   function GM is new Limit
224     (PL.Groups_Maxima, SC_NGROUPS_MAX);
225   function Groups_Maximum
226      return PL.Groups_Maxima renames GM;
227
228   function LIOM is new Limit
229     (PL.List_IO_Maxima, SC_AIO_LISTIO_MAX);
230   function List_IO_Maximum
231      return PL.List_IO_Maxima renames LIOM;
232
233   function OMQM is new Limit
234     (PL.Open_Message_Queues_Maxima, SC_MQ_OPEN_MAX);
235   function Open_Message_Queues_Maximum
236      return PL.Open_Message_Queues_Maxima renames OMQM;
237
238   function MPM is new Limit
239     (PL.Message_Priority_Maxima, SC_MQ_PRIO_MAX);
240   function Message_Priority_Maximum
241      return PL.Message_Priority_Maxima renames MPM;
242
243   function OFM is new Limit
244     (PL.Open_Files_Maxima, SC_OPEN_MAX);
245   function Open_Files_Maximum
246      return PL.Open_Files_Maxima renames OFM;
247
248   function PSR is new Limit
249     (PL.Page_Size_Range, SC_PAGESIZE);
250   function Page_Size
251      return PL.Page_Size_Range renames PSR;
252
253   function QSM is new Limit
254     (PL.Queued_Signals_Maxima, SC_SIGQUEUE_MAX);
255   function Queued_Signals_Maximum
256      return PL.Queued_Signals_Maxima renames QSM;
257
258   function RSM is new Limit
259     (PL.Realtime_Signals_Maxima, SC_RTSIG_MAX);
260   function Realtime_Signals_Maximum
261      return PL.Realtime_Signals_Maxima renames RSM;
262
263   function SEM is new Limit
264     (PL.Semaphores_Maxima, SC_SEM_NSEMS_MAX);
265   function Semaphores_Maximum
266      return PL.Semaphores_Maxima renames SEM;
267
268   function SVM is new Limit
269     (PL.Semaphores_Value_Maxima, SC_SEM_VALUE_MAX);
270   function Semaphores_Value_Maximum
271      return PL.Semaphores_Value_Maxima renames SVM;
272
273   function STM is new Limit
274     (PL.Streams_Maxima, SC_STREAM_MAX);
275   function Stream_Maximum
276      return PL.Streams_Maxima renames STM;
277
278   function TM is new Limit
279     (PL.Timers_Maxima, SC_TIMER_MAX);
280   function Timers_Maximum
281     return PL.Timers_Maxima renames TM;
282
283   function TOM is new Limit
284     (PL.Timer_Overruns_Maxima, SC_DELAYTIMER_MAX);
285   function Timer_Overruns_Maximum
286     return PL.Timer_Overruns_Maxima renames TOM;
287
288   function TZSM is new Limit
289     (PL.Time_Zone_String_Maxima, SC_TZNAME_MAX);
290   function Time_Zone_String_Maximum
291     return PL.Time_Zone_String_Maxima renames TZSM;
292
293   --  additions from POSIX.5c [D2]
294
295   --  POSIX.5c/D4 extensions
296
297   function Internet_Datagram_Is_Supported
298     return POSIX.Options.Internet_Datagram_Support is
299   begin
300      return sysconf (SC_PII_INTERNET_DGRAM) = 1;
301   end Internet_Datagram_Is_Supported;
302
303   function Internet_Protocol_Is_Supported
304     return POSIX.Options.Internet_Protocol_Support is
305   begin
306      return sysconf (SC_PII_INTERNET) = 1;
307   end Internet_Protocol_Is_Supported;
308
309   function Internet_Stream_Is_Supported
310     return POSIX.Options.Internet_Stream_Support is
311   begin
312      return sysconf (SC_PII_INTERNET_STREAM) = 1;
313   end Internet_Stream_Is_Supported;
314
315   function ISO_OSI_Protocol_Is_Supported
316     return POSIX.Options.ISO_OSI_Protocol_Support is
317   begin
318      return sysconf (SC_PII_OSI) = 1;
319   end ISO_OSI_Protocol_Is_Supported;
320
321   function Network_Management_Is_Supported
322     return POSIX.Options.Network_Management_Support is
323   begin
324      return sysconf (SC_POSIX_PII_NET_SUPPORT) = 1;
325   end Network_Management_Is_Supported;
326
327   function OSI_Connectionless_Is_Supported
328     return POSIX.Options.OSI_Connectionless_Support is
329   begin
330      return sysconf (SC_PII_OSI_CLTS) = 1;
331   end OSI_Connectionless_Is_Supported;
332
333   function OSI_Connection_Is_Supported
334     return POSIX.Options.OSI_Connection_Support is
335   begin
336      return sysconf (SC_PII_OSI_COTS) = 1;
337   end OSI_Connection_Is_Supported;
338
339   function OSI_Minimal_Is_Supported
340     return POSIX.Options.OSI_Minimal_Support is
341   begin
342      return sysconf (SC_PII_OSI_M) = 1;
343   end OSI_Minimal_Is_Supported;
344
345   function Poll_Is_Supported
346     return POSIX.Options.Poll_Support is
347   begin
348      return sysconf (SC_POLL) = 1;
349   end Poll_Is_Supported;
350
351   function Select_Is_Supported
352     return POSIX.Options.Select_Support is
353   begin
354      return sysconf (SC_SELECT) = 1;
355   end Select_Is_Supported;
356
357   function Sockets_DNI_Is_Supported
358     return POSIX.Options.Sockets_DNI_Support is
359   begin
360      return sysconf (SC_PII_SOCKET) = 1;
361   end Sockets_DNI_Is_Supported;
362
363   function XTI_DNI_Is_Supported
364     return POSIX.Options.XTI_DNI_Support is
365   begin
366      return sysconf (SC_PII_XTI) = 1;
367   end XTI_DNI_Is_Supported;
368
369   function SIOVM is new Limit
370     (PL.Socket_IO_Vector_Maxima, SC_UIO_MAXIOV);
371   function Socket_IO_Vector_Maximum
372     return POSIX.Limits.Socket_IO_Vector_Maxima renames SIOVM;
373
374end  POSIX.Configurable_System_Limits;
375