Back to home page

LXR

 
 

    


File indexing completed on 2025-05-11 08:24:32

0001 /* SPDX-License-Identifier: BSD-2-Clause */
0002 
0003 /*
0004  * Copyright (c) 2014 Chris Johns <chrisj@rtems.org>.  All rights reserved.
0005  *
0006  * Redistribution and use in source and binary forms, with or without
0007  * modification, are permitted provided that the following conditions
0008  * are met:
0009  * 1. Redistributions of source code must retain the above copyright
0010  *    notice, this list of conditions and the following disclaimer.
0011  * 2. Redistributions in binary form must reproduce the above copyright
0012  *    notice, this list of conditions and the following disclaimer in the
0013  *    documentation and/or other materials provided with the distribution.
0014  *
0015  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
0016  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
0017  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
0018  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
0019  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
0020  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
0021  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
0022  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
0023  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
0024  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
0025  * POSSIBILITY OF SUCH DAMAGE.
0026  */
0027 
0028 #include "dl-o2.h"
0029 
0030 #include <dlfcn.h>
0031 
0032 #include <rtems/test-printer.h>
0033 
0034 #define printf(...) rtems_printf(&rtems_test_printer, __VA_ARGS__);
0035 
0036 typedef int (*func1_t)(int argc, const char* argv[]);
0037 
0038 static void* find_sym(const char* name)
0039 {
0040   void* sym = dlsym(RTLD_DEFAULT, name);
0041   if (sym == NULL)
0042     printf("dlsym failed: not found: %s\n", name);
0043   return sym;
0044 }
0045 
0046 static int dl_o1_callback(const char* message, int count)
0047 {
0048   printf("dl_o1_callback: %s\n", message);
0049   return count + 1;
0050 }
0051 
0052 /*
0053  * Yes a decl in the source. This is a modules main and I could not find which
0054  * header main is defined in.
0055  */
0056 int rtems_main (int argc, const char* argv[]);
0057 
0058 #define PDOUBLE(_d) ((int) (_d)), (int) ((_d) * 100.0) % 100
0059 
0060 int rtems_main (int argc, const char* argv[])
0061 {
0062   func1_t f1;
0063   double  f2_ret;
0064   int     arg;
0065   int     ret;
0066 
0067   printf("Loaded module: argc:%d [%s]\n", argc, __FILE__);
0068   for (arg = 0; arg < argc; ++arg)
0069     printf("  %d: %s\n", arg, argv[arg]);
0070 
0071   f1 = find_sym ("dl_o2_func1");
0072   if (f1 == NULL)
0073     return 0;
0074 
0075   if (f1 (argc, argv) != argc)
0076   {
0077     printf("rtems_main: dl_o2_func1 returned bad value\n");
0078     return 0;
0079   }
0080 
0081   f2_ret = dl_o2_func2 (7.1, 33.0);
0082   printf("rtems_main: dl_o2_func2 returned: %d.%02d\n",
0083          PDOUBLE(f2_ret));
0084   if (f2_ret != (7.1 * 33.0))
0085   {
0086     printf("rtems_main: dl_o2_func2 returned a bad\n");
0087     return 0;
0088   }
0089 
0090   ret = dl_o2_func3 (dl_o1_callback, 1);
0091   printf ("rtems_main: callback count: %d\n", ret);
0092 
0093   return argc;
0094 }