Patch from open source community for CryptoPkg to allow it to build for ARM using...
[mirror_edk2.git] / CryptoPkg / Library / BaseCryptLib / SysCall / CrtWrapper.c
1 /** @file\r
2   C Run-Time Libraries (CRT) Wrapper Implementation for OpenSSL-based\r
3   Cryptographic Library.\r
4 \r
5 Copyright (c) 2009 - 2010, Intel Corporation. All rights reserved.<BR>\r
6 This program and the accompanying materials\r
7 are licensed and made available under the terms and conditions of the BSD License\r
8 which accompanies this distribution.  The full text of the license may be found at\r
9 http://opensource.org/licenses/bsd-license.php\r
10 \r
11 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
12 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
13 \r
14 **/\r
15 \r
16 #include <OpenSslSupport.h>\r
17 \r
18 int errno = 0;\r
19 \r
20 typedef\r
21 INTN\r
22 (*SORT_COMPARE)(\r
23   IN  VOID  *Buffer1,\r
24   IN  VOID  *Buffer2\r
25   );\r
26 \r
27 //\r
28 // Duplicated from EDKII BaseSortLib for qsort() wrapper\r
29 //\r
30 STATIC\r
31 VOID\r
32 QuickSortWorker (\r
33   IN OUT    VOID          *BufferToSort,\r
34   IN CONST  UINTN         Count,\r
35   IN CONST  UINTN         ElementSize,\r
36   IN        SORT_COMPARE  CompareFunction,\r
37   IN        VOID          *Buffer\r
38   )\r
39 {\r
40   VOID        *Pivot;\r
41   UINTN       LoopCount;\r
42   UINTN       NextSwapLocation;\r
43 \r
44   ASSERT(BufferToSort    != NULL);\r
45   ASSERT(CompareFunction != NULL);\r
46   ASSERT(Buffer          != NULL);\r
47 \r
48   if (Count < 2 || ElementSize  < 1) {\r
49     return;\r
50   }\r
51 \r
52   NextSwapLocation = 0;\r
53 \r
54   //\r
55   // Pick a pivot (we choose last element)\r
56   //\r
57   Pivot = ((UINT8 *)BufferToSort + ((Count - 1) * ElementSize));\r
58 \r
59   //\r
60   // Now get the pivot such that all on "left" are below it\r
61   // and everything "right" are above it\r
62   //\r
63   for (LoopCount = 0; LoopCount < Count - 1;  LoopCount++)\r
64   {\r
65     //\r
66     // If the element is less than the pivot\r
67     //\r
68     if (CompareFunction ((VOID *)((UINT8 *)BufferToSort + ((LoopCount) * ElementSize)), Pivot) <= 0) {\r
69       //\r
70       // Swap\r
71       //\r
72       CopyMem (Buffer, (UINT8 *)BufferToSort + (NextSwapLocation * ElementSize), ElementSize);\r
73       CopyMem ((UINT8 *)BufferToSort + (NextSwapLocation * ElementSize), (UINT8 *)BufferToSort + ((LoopCount) * ElementSize), ElementSize);\r
74       CopyMem ((UINT8 *)BufferToSort + ((LoopCount) * ElementSize), Buffer, ElementSize);\r
75 \r
76       //\r
77       // Increment NextSwapLocation\r
78       //\r
79       NextSwapLocation++;\r
80     }\r
81   }\r
82   //\r
83   // Swap pivot to it's final position (NextSwapLocaiton)\r
84   //\r
85   CopyMem (Buffer, Pivot, ElementSize);\r
86   CopyMem (Pivot, (UINT8 *)BufferToSort + (NextSwapLocation * ElementSize), ElementSize);\r
87   CopyMem ((UINT8 *)BufferToSort + (NextSwapLocation * ElementSize), Buffer, ElementSize);\r
88 \r
89   //\r
90   // Now recurse on 2 paritial lists.  Neither of these will have the 'pivot' element.\r
91   // IE list is sorted left half, pivot element, sorted right half...\r
92   //\r
93   QuickSortWorker (\r
94     BufferToSort,\r
95     NextSwapLocation,\r
96     ElementSize,\r
97     CompareFunction,\r
98     Buffer\r
99     );\r
100 \r
101   QuickSortWorker (\r
102     (UINT8 *)BufferToSort + (NextSwapLocation + 1) * ElementSize,\r
103     Count - NextSwapLocation - 1,\r
104     ElementSize,\r
105     CompareFunction,\r
106     Buffer\r
107     );\r
108 \r
109   return;\r
110 }\r
111 \r
112 //---------------------------------------------------------\r
113 // Standard C Run-time Library Interface Wrapper\r
114 //---------------------------------------------------------\r
115 \r
116 //\r
117 // -- String Manipulation Routines --\r
118 //\r
119 \r
120 /* Scan a string for the last occurrence of a character */\r
121 char *strrchr (const char *str, int c)\r
122 {\r
123   char * save;\r
124 \r
125   for (save = NULL; ; ++str) {\r
126     if (*str == c) {\r
127       save = (char *)str;\r
128     }\r
129     if (*str == 0) {\r
130       return (save);\r
131     }\r
132   }\r
133 }\r
134 \r
135 /* Read formatted data from a string */\r
136 int sscanf (const char *buffer, const char *format, ...)\r
137 {\r
138   //\r
139   // Null sscanf() function implementation to satisfy the linker, since\r
140   // no direct functionality logic dependency in present UEFI cases.\r
141   //\r
142   return 0;\r
143 }\r
144 \r
145 //\r
146 // -- Character Classification Routines --\r
147 //\r
148 \r
149 /* Determines if a particular character is a decimal-digit character */\r
150 int isdigit (int c)\r
151 {\r
152   //\r
153   // <digit> ::= [0-9]\r
154   //\r
155   return (('0' <= (c)) && ((c) <= '9'));\r
156 }\r
157 \r
158 /* Determine if an integer represents character that is a hex digit */\r
159 int isxdigit (int c)\r
160 {\r
161   //\r
162   // <hexdigit> ::= [0-9] | [a-f] | [A-F]\r
163   //\r
164   return ((('0' <= (c)) && ((c) <= '9')) ||\r
165           (('a' <= (c)) && ((c) <= 'f')) ||\r
166           (('A' <= (c)) && ((c) <= 'F')));\r
167 }\r
168 \r
169 /* Determines if a particular character represents a space character */\r
170 int isspace (int c)\r
171 {\r
172   //\r
173   // <space> ::= [ ]\r
174   //\r
175   return ((c) == ' ');\r
176 }\r
177 \r
178 /* Determine if a particular character is an alphanumeric character */\r
179 int isalnum (int c)\r
180 {\r
181   //\r
182   // <alnum> ::= [0-9] | [a-z] | [A-Z]\r
183   //\r
184   return ((('0' <= (c)) && ((c) <= '9')) ||\r
185           (('a' <= (c)) && ((c) <= 'z')) ||\r
186           (('A' <= (c)) && ((c) <= 'Z')));\r
187 }\r
188 \r
189 /* Determines if a particular character is in upper case */\r
190 int isupper (int c)\r
191 {\r
192   //\r
193   // <uppercase letter> := [A-Z]\r
194   //\r
195   return (('A' <= (c)) && ((c) <= 'Z'));\r
196 }\r
197 \r
198 //\r
199 // -- Data Conversion Routines --\r
200 //\r
201 \r
202 /* Convert strings to a long-integer value */\r
203 long strtol (const char *nptr, char **endptr, int base)\r
204 {\r
205   //\r
206   // Null strtol() function implementation to satisfy the linker, since there is\r
207   // no direct functionality logic dependency in present UEFI cases.\r
208   //\r
209   return 0;\r
210 }\r
211 \r
212 /* Convert strings to an unsigned long-integer value */\r
213 unsigned long strtoul (const char *nptr, char **endptr, int base)\r
214 {\r
215   //\r
216   // Null strtoul() function implementation to satisfy the linker, since there is\r
217   // no direct functionality logic dependency in present UEFI cases.\r
218   //\r
219   return 0;\r
220 }\r
221 \r
222 /* Convert character to lowercase */\r
223 int tolower (int c)\r
224 {\r
225   if (('A' <= (c)) && ((c) <= 'Z')) {\r
226     return (c - ('A' - 'a'));\r
227   }\r
228   return (c);\r
229 }\r
230 \r
231 //\r
232 // -- Searching and Sorting Routines --\r
233 //\r
234 \r
235 /* Performs a quick sort */\r
236 void qsort (void *base, size_t num, size_t width, int (*compare)(const void *, const void *))\r
237 {\r
238   VOID  *Buffer;\r
239 \r
240   ASSERT (base    != NULL);\r
241   ASSERT (compare != NULL);\r
242 \r
243   Buffer = AllocatePool (width);\r
244   ASSERT (Buffer != NULL);\r
245 \r
246   //\r
247   // Re-use PerformQuickSort() function Implementation in EDKII BaseSortLib.\r
248   //\r
249   QuickSortWorker (base, (UINTN)num, (UINTN)width, (SORT_COMPARE)compare, Buffer);\r
250 \r
251   FreePool (Buffer);\r
252   return;\r
253 }\r
254 \r
255 //\r
256 // -- Process and Environment Control Routines --\r
257 //\r
258 \r
259 /* Get a value from the current environment */\r
260 char *getenv (const char *varname)\r
261 {\r
262   //\r
263   // Null getenv() function implementation to satisfy the linker, since there is\r
264   // no direct functionality logic dependency in present UEFI cases.\r
265   //\r
266   return NULL;\r
267 }\r
268 \r
269 //\r
270 // -- Stream I/O Routines --\r
271 //\r
272 \r
273 /* Write formatted output using a pointer to a list of arguments */\r
274 int vfprintf (FILE *stream, const char *format, VA_LIST arg)\r
275 {\r
276   return 0;\r
277 }\r
278 \r
279 /* Write data to a stream */\r
280 size_t fwrite (const void *buffer, size_t size, size_t count, FILE *stream)\r
281 {\r
282   return 0;\r
283 }\r
284 \r
285 //\r
286 //  -- Dummy OpenSSL Support Routines --\r
287 //\r
288 \r
289 int BIO_printf (void *bio, const char *format, ...)\r
290 {\r
291   return 0;\r
292 }\r
293 \r
294 int BIO_snprintf(char *buf, size_t n, const char *format, ...)\r
295 {\r
296   return 0;\r
297 }\r
298 \r
299 void *UI_OpenSSL(void)\r
300 {\r
301   return NULL;\r
302 }\r
303 \r
304 int X509_load_cert_file (VOID *ctx, const char *file, int type)\r
305 {\r
306   return 0;\r
307 }\r
308 \r
309 int X509_load_crl_file (VOID *ctx, const char *file, int type)\r
310 {\r
311   return 0;\r
312 }\r
313 \r
314 int chmod (const char *c, mode_t m)\r
315 {\r
316   return -1;\r
317 }\r
318 \r
319 int close (int f)\r
320 {\r
321   return -1;\r
322 }\r
323 \r
324 void closelog (void)\r
325 {\r
326 \r
327 }\r
328 \r
329 void exit (int e)\r
330 {\r
331 \r
332 }\r
333 \r
334 int fclose (FILE *f)\r
335 {\r
336   return 0;\r
337 }\r
338 \r
339 FILE *fopen (const char *c, const char *m)\r
340 {\r
341   return NULL;\r
342 }\r
343 \r
344 size_t fread (void *b, size_t c, size_t i, FILE *f)\r
345 {\r
346   return 0;\r
347 }\r
348 \r
349 int fprintf (FILE *f, const char *s, ...)\r
350 {\r
351   return 0;\r
352 }\r
353 \r
354 uid_t getuid (void)\r
355 {\r
356   return 0;\r
357 }\r
358 \r
359 uid_t geteuid (void)\r
360 {\r
361   return 0;\r
362 }\r
363 \r
364 gid_t getgid (void)\r
365 {\r
366   return 0;\r
367 }\r
368 \r
369 gid_t getegid (void)\r
370 {\r
371   return 0;\r
372 }\r
373 \r
374 off_t lseek (int a, off_t o, int d)\r
375 {\r
376   return 0;\r
377 }\r
378 \r
379 void openlog (const char *c, int a, int b)\r
380 {\r
381 \r
382 }\r
383 \r
384 ssize_t read (int f, void *b, size_t c)\r
385 {\r
386   return 0;\r
387 }\r
388 \r
389 int stat (const char *c, struct stat *s)\r
390 {\r
391   return -1;\r
392 }\r
393 \r
394 int strcasecmp (const char *c, const char *s)\r
395 {\r
396   return 0;\r
397 }\r
398 \r
399 int strncasecmp (const char *c, const char *s, size_t l)\r
400 {\r
401   return 0;\r
402 }\r
403 \r
404 void syslog (int a, const char *c, ...)\r
405 {\r
406 \r
407 }\r
408 \r
409 ssize_t write (int f, const void *b, size_t l)\r
410 {\r
411   return 0;\r
412 }\r