Changeset d01564c in rtems-libbsd


Ignore:
Timestamp:
Oct 17, 2013, 8:38:34 AM (6 years ago)
Author:
Sebastian Huber <sebastian.huber@…>
Branches:
4.11, afaeccc05a556f6aa25ba044a7e49d6aa634a59e, freebsd-9.3, master
Children:
a9be4b0
Parents:
c333bab
git-author:
Sebastian Huber <sebastian.huber@…> (10/17/13 08:38:34)
git-committer:
Sebastian Huber <sebastian.huber@…> (10/31/13 12:18:48)
Message:

Move program control to thread structure

Files:
2 added
1 deleted
11 edited

Legend:

Unmodified
Added
Removed
  • Makefile

    rc333bab rd01564c  
    7171LIB_C_FILES += rtemsbsd/rtems/rtems-bsd-pci_bus.c
    7272LIB_C_FILES += rtemsbsd/rtems/rtems-bsd-pci_cfgreg.c
     73LIB_C_FILES += rtemsbsd/rtems/rtems-bsd-program.c
    7374LIB_C_FILES += rtemsbsd/rtems/rtems-bsd-rwlock.c
    7475LIB_C_FILES += rtemsbsd/rtems/rtems-bsd-shell.c
     
    8788LIB_C_FILES += rtemsbsd/rtems/rtems-bsd-timesupport.c
    8889LIB_C_FILES += rtemsbsd/rtems/rtems-bsd-vm_glue.c
    89 LIB_C_FILES += rtemsbsd/rtems/rtems-getprogname.c
    9090LIB_C_FILES += rtemsbsd/rtems/rtems-kvm.c
    9191LIB_C_FILES += rtemsbsd/rtems/rtems-net-setup.c
    92 LIB_C_FILES += rtemsbsd/rtems/rtems-shell.c
    9392LIB_C_FILES += rtemsbsd/rtems/rtems-syslog-initialize.c
    9493LIB_C_FILES += rtemsbsd/rtems/rtems-syspoll.c
  • freebsd-to-rtems.py

    rc333bab rd01564c  
    628628                'rtems/rtems-bsd-pci_bus.c',
    629629                'rtems/rtems-bsd-pci_cfgreg.c',
     630                'rtems/rtems-bsd-program.c',
    630631                'rtems/rtems-bsd-rwlock.c',
    631632                'rtems/rtems-bsd-shell.c',
     
    644645                'rtems/rtems-bsd-timesupport.c',
    645646                'rtems/rtems-bsd-vm_glue.c',
    646                 'rtems/rtems-getprogname.c',
    647647                'rtems/rtems-kvm.c',
    648648                'rtems/rtems-net-setup.c',
    649                 'rtems/rtems-shell.c',
    650649                'rtems/rtems-syslog-initialize.c',
    651650                'rtems/rtems-syspoll.c',
  • freebsd/include/err.h

    rc333bab rd01564c  
    4848#include <rtems/bsd/sys/_types.h>
    4949
    50 #ifdef __rtems__
    51 #include <setjmp.h>
    52 typedef struct  rtems_shell_globals_s {
    53   jmp_buf exit_jmp;
    54   int     exit_code;
    55 } rtems_shell_globals_t;
    56 extern rtems_shell_globals_t *rtems_shell_globals;
    57 void rtems_shell_exit (int code);
    58 
    59 #define exit rtems_shell_exit
    60 #endif
    61 
    62 
    6350__BEGIN_DECLS
    6451void    err(int, const char *, ...) __dead2 __printf0like(2, 3);
     
    7562void    warnx(const char *, ...) __printflike(1, 2);
    7663void    vwarnx(const char *, __va_list) __printflike(1, 0);
     64#ifndef __rtems__
    7765void    err_set_file(void *);
    7866void    err_set_exit(void (*)(int));
     67#endif /* __rtems__ */
    7968__END_DECLS
    8069
  • freebsd/lib/libc/gen/err.c

    rc333bab rd01564c  
    4747#include "libc_private.h"
    4848
     49#ifndef __rtems__
    4950static FILE *err_file; /* file to use for error output */
    5051static void (*err_exit)(int);
    51 
     52#else /* __rtems__ */
     53#include <machine/rtems-bsd-program.h>
     54#define err_file stderr
     55#define err_set_file(x) do { } while (0)
     56#endif /* __rtems__ */
     57
     58#ifndef __rtems__
    5259/*
    5360 * This is declared to take a `void *' so that the caller is not required
     
    6976        err_exit = ef;
    7077}
     78#endif /* __rtems__ */
    7179
    7280__weak_reference(_err, err);
     
    110118        }
    111119        fprintf(err_file, "%s\n", strerror(code));
     120#ifndef __rtems__
    112121        if (err_exit)
    113122                err_exit(eval);
     123#endif /* __rtems__ */
    114124        exit(eval);
    115125}
     
    133143                vfprintf(err_file, fmt, ap);
    134144        fprintf(err_file, "\n");
     145#ifndef __rtems__
    135146        if (err_exit)
    136147                err_exit(eval);
     148#endif /* __rtems__ */
    137149        exit(eval);
    138150}
  • freebsd/sbin/ifconfig/ifconfig.c

    rc333bab rd01564c  
    116116
    117117#ifdef __rtems__
    118 static int main_ifconfig(int argc, char *argv[]);
    119 static int rtems_shell_main_ifconfig(int argc, char *argv[])
    120 {
    121   rtems_shell_globals_t  ifconfig_globals;
    122   rtems_shell_globals = &ifconfig_globals;
    123   memset (rtems_shell_globals, 0, sizeof (ifconfig_globals));
    124   descr = NULL;
    125   descrlen = 64;
    126   newaddr = 1;
    127   supmedia = 0;
    128   printkeys = 0;       
    129   ifconfig_globals.exit_code = 1;
    130   if (setjmp (ifconfig_globals.exit_jmp) == 0)
    131     return main_ifconfig ( argc, argv);
    132   return ifconfig_globals.exit_code;
    133 }
    134 #endif
    135 
    136 #ifdef __rtems__
    137118static struct ifconfig_option *opts = NULL;
    138119
     
    183164
    184165#ifdef __rtems__
    185 int
    186 main_ifconfig(int argc, char *argv[])
    187 #else
     166#include <machine/rtems-bsd-program.h>
     167
     168static int main(int argc, char *argv[]);
     169
     170static int rtems_shell_main_ifconfig(int argc, char *argv[])
     171{
     172        descr = NULL;
     173        descrlen = 64;
     174        newaddr = 1;
     175        supmedia = 0;
     176        printkeys = 0;
     177
     178        return rtems_bsd_program_call_main("ifconfig", main, argc, argv);
     179}
     180#endif /* __rtems__ */
    188181int
    189182main(int argc, char *argv[])
    190 #endif
    191183{
    192184        int c, all, namesonly, downonly, uponly;
  • freebsd/sbin/ping/ping.c

    rc333bab rd01564c  
    219219
    220220#ifdef __rtems__
    221 static int main_ping(int argc, char *const *argv);
     221#include <machine/rtems-bsd-program.h>
     222
     223static int main(int argc, char **argv);
     224
    222225static int rtems_shell_main_ping(int argc, char *argv[])
    223226{
    224   rtems_shell_globals_t  ping_globals;
    225   rtems_shell_globals = &ping_globals;
    226   memset (rtems_shell_globals, 0, sizeof (ping_globals));
    227   BBELL = '\a';
    228   BSPACE = '\b';
    229   DOT = '.';
    230   icmp_type = ICMP_ECHO;
    231   icmp_type_rsp = ICMP_ECHOREPLY;
    232   phdr_len = 0;
    233   sweepmin = 0;
    234   sweepincr = 1;
    235   interval = 1000;
    236   waittime = MAXWAIT;
    237   nrcvtimeout = 0;
    238   tmin = 999999999.0;
    239   tmax = 0.0;
    240   tsum = 0.0;
    241   tsumsq = 0.0;
    242   ping_globals.exit_code = 1;
    243   if (setjmp (ping_globals.exit_jmp) == 0)
    244     return main_ping (argc, argv);
    245   return ping_globals.exit_code;
     227        BBELL = '\a';
     228        BSPACE = '\b';
     229        DOT = '.';
     230        icmp_type = ICMP_ECHO;
     231        icmp_type_rsp = ICMP_ECHOREPLY;
     232        phdr_len = 0;
     233        sweepmin = 0;
     234        sweepincr = 1;
     235        interval = 1000;
     236        waittime = MAXWAIT;
     237        nrcvtimeout = 0;
     238        tmin = 999999999.0;
     239        tmax = 0.0;
     240        tsum = 0.0;
     241        tsumsq = 0.0;
     242
     243        return rtems_bsd_program_call_main("ping", main, argc, argv);
    246244}
    247 #endif
    248 
    249 
    250 
     245#endif /* __rtems__ */
    251246int
    252 #ifdef __rtems__
    253 main_ping(argc, argv)
    254 #else
    255247main(argc, argv)
    256 #endif
    257248        int argc;
     249#ifndef __rtems__
    258250        char *const *argv;
     251#else /* __rtems__ */
     252        char **argv;
     253#endif /* __rtems__ */
    259254{
    260255        struct sockaddr_in from, sock_in;
  • freebsd/sbin/route/route.c

    rc333bab rd01564c  
    117117void usage(const char *) __dead2;
    118118
    119 #ifdef __rtems__
    120 
    121 static int main_route(int argc, char **argv);
    122 
    123 static int rtems_shell_main_route(int argc, char *argv[])
    124 {
    125   rtems_shell_globals_t  route_globals;
    126   rtems_shell_globals = &route_globals;
    127   memset (rtems_shell_globals, 0, sizeof (route_globals));
    128   route_globals.exit_code = 1;
    129   if (setjmp (route_globals.exit_jmp) == 0)
    130     return main_route ( argc, argv);
    131   return route_globals.exit_code;
    132 }
    133 
    134 #endif
    135 
    136 
    137119void
    138120usage(cp)
     
    148130
    149131#ifdef __rtems__
     132#include <machine/rtems-bsd-program.h>
     133
     134static int main(int argc, char **argv);
     135
     136static int rtems_shell_main_route(int argc, char *argv[])
     137{
     138        return rtems_bsd_program_call_main("route", main, argc, argv);
     139}
     140#endif /* __rtems__ */
    150141int
    151 main_route(argc, argv)
    152 #else
    153142main(argc, argv)
    154 #endif
    155143        int argc;
    156144        char **argv;
  • freebsd/sys/sys/proc.h

    rc333bab rd01564c  
    202202        rtems_chain_node td_node;
    203203        Thread_Control *td_thread;
     204        struct rtems_bsd_program_control *td_prog_ctrl;
    204205        char td_name [16];
    205206#endif /* __rtems__ */
  • freebsd/sys/sys/systm.h

    rc333bab rd01564c  
    154154struct _jmp_buf;
    155155
     156#ifndef __rtems__
    156157int     setjmp(struct _jmp_buf *);
    157158void    longjmp(struct _jmp_buf *, int) __dead2;
     159#endif /* __rtems__ */
    158160int     dumpstatus(vm_offset_t addr, off_t count);
    159161int     nullop(void);
  • freebsd/usr.bin/netstat/main.c

    rc333bab rd01564c  
    362362int     live;           /* true if we are examining a live system */
    363363
    364 
    365364#ifdef __rtems__
    366 static int main_netstat(int argc, char *argv[]);
     365#include <machine/rtems-bsd-program.h>
     366
     367static int main(int argc, char *argv[]);
     368
    367369static int rtems_shell_main_netstat(int argc, char *argv[])
    368370{
    369371  int i;
    370   rtems_shell_globals_t  netstat_globals;
    371   rtems_shell_globals = &netstat_globals;
    372   memset (rtems_shell_globals, 0, sizeof (netstat_globals));
    373372
    374373  i = 0;
     
    729728  noutputs = 0;
    730729
    731   netstat_globals.exit_code = 1;
    732   if (setjmp (netstat_globals.exit_jmp) == 0)
    733     return main_netstat (argc, argv);
    734   return netstat_globals.exit_code;
     730  return rtems_bsd_program_call_main("netstat", main, argc, argv);
    735731}
    736 #endif
    737 
     732#endif /* __rtems__ */
    738733int
    739 #ifdef __rtems__
    740 main_netstat(int argc, char *argv[])
    741 #else
    742734main(int argc, char *argv[])
    743 #endif
    744735{
    745736        struct protox *tp = NULL;  /* for printing cblocks & stats */
  • testsuite/syscalls01/test_main.c

    rc333bab rd01564c  
    3737#include <netinet/in.h>
    3838#include <arpa/inet.h>
     39#include <err.h>
    3940
    4041#include <assert.h>
     
    4546#include <string.h>
    4647#include <unistd.h>
     48
     49#define RTEMS_BSD_PROGRAM_NO_EXIT_WRAP
     50#define RTEMS_BSD_PROGRAM_NO_PRINTF_WRAP
     51#include <machine/rtems-bsd-program.h>
    4752
    4853#include <rtems/libcsupport.h>
     
    12021207}
    12031208
     1209static const char prog_name[] = "prog";
     1210
     1211static int
     1212invalid_prog(void *ctx)
     1213{
     1214        (void) ctx;
     1215
     1216        assert(0);
     1217}
     1218
     1219static int
     1220invalid_main(int argc, char **argv)
     1221{
     1222        (void) argc;
     1223        (void) argv;
     1224
     1225        assert(0);
     1226}
     1227
     1228static void *const some_context = (void *) 0xcafe;
     1229
     1230static int
     1231some_prog(void *ctx)
     1232{
     1233        assert(ctx == some_context);
     1234        assert(strcmp(rtems_bsd_program_get_name(), prog_name) == 0);
     1235        assert(rtems_bsd_program_get_context() == some_context);
     1236        errno = 0;
     1237        rtems_bsd_program_exit(456);
     1238}
     1239
     1240static const int some_argc = 1;
     1241
     1242static char *some_argv[] = { "a", NULL };
     1243
     1244static int
     1245some_main(int argc, char **argv)
     1246{
     1247        assert(argc == some_argc);
     1248        assert(argv == some_argv);
     1249        assert(strcmp(rtems_bsd_program_get_name(), prog_name) == 0);
     1250        errno = 0;
     1251        rtems_bsd_program_exit(789);
     1252}
     1253
     1254static void
     1255no_mem_bsd_program(int fd)
     1256{
     1257        (void) fd;
     1258
     1259        assert(rtems_bsd_program_call(prog_name, invalid_prog, NULL)
     1260            == EXIT_FAILURE);
     1261        assert(rtems_bsd_program_call_main(prog_name, invalid_main, some_argc,
     1262            some_argv) == EXIT_FAILURE);
     1263        assert(strcmp(rtems_bsd_program_get_name(), "?") == 0);
     1264        assert(rtems_bsd_program_get_context() == NULL);
     1265}
     1266
     1267static void
     1268test_bsd_program(void)
     1269{
     1270        rtems_resource_snapshot snapshot;
     1271        int exit_code;
     1272        void *greedy;
     1273        char *invalid_argv[2] = { "a", "b" };
     1274
     1275        assert(rtems_configuration_get_unified_work_area());
     1276
     1277        puts("test BSD program");
     1278
     1279        rtems_resource_snapshot_take(&snapshot);
     1280
     1281        do_no_mem_test(no_mem_bsd_program, -1);
     1282
     1283        greedy = rtems_workspace_greedy_allocate(NULL, 0);
     1284        no_mem_bsd_program(-1);
     1285        rtems_workspace_greedy_free(greedy);
     1286
     1287        errno = 0;
     1288        exit_code = rtems_bsd_program_call_main(prog_name, NULL, 1, invalid_argv);
     1289        assert(errno == EFAULT);
     1290        assert(exit_code == EXIT_FAILURE);
     1291
     1292        errno = EINVAL;
     1293        exit_code = rtems_bsd_program_call(prog_name, some_prog, some_context);
     1294        assert(errno == 0);
     1295        assert(exit_code == 456);
     1296        assert(strcmp(rtems_bsd_program_get_name(), "?") == 0);
     1297        assert(rtems_bsd_program_get_context() == NULL);
     1298
     1299        errno = EINVAL;
     1300        exit_code = rtems_bsd_program_call_main(prog_name, some_main,
     1301            some_argc, some_argv);
     1302        assert(errno == 0);
     1303        assert(exit_code == 789);
     1304        assert(strcmp(rtems_bsd_program_get_name(), "?") == 0);
     1305        assert(rtems_bsd_program_get_context() == NULL);
     1306
     1307        assert(rtems_resource_snapshot_check(&snapshot));
     1308}
     1309
     1310static void
     1311test_warn(void)
     1312{
     1313        puts("test warn");
     1314
     1315        errno = EAGAIN;
     1316        warn("%s", "warn");
     1317
     1318        errno = ENAMETOOLONG;
     1319        warn(NULL);
     1320
     1321        errno = 0;
     1322        warnc(EDOM, "%s", "warnc");
     1323
     1324        errno = 0;
     1325        warnc(ERANGE, NULL);
     1326
     1327        warnx("%s", "warnx");
     1328
     1329        warnx(NULL);
     1330}
     1331
     1332static int
     1333call_err(void *ctx)
     1334{
     1335        errno = EAGAIN;
     1336        err(10, "%s", "call_err");
     1337}
     1338
     1339static int
     1340call_err_null(void *ctx)
     1341{
     1342        errno = ENAMETOOLONG;
     1343        err(11, NULL);
     1344}
     1345
     1346static int
     1347call_errc(void *ctx)
     1348{
     1349        errc(12, EDOM, "%s", "call_errc");
     1350}
     1351
     1352static int
     1353call_errc_null(void *ctx)
     1354{
     1355        errc(13, ERANGE, NULL);
     1356}
     1357
     1358static int
     1359call_errx(void *ctx)
     1360{
     1361        errx(14, "%s", "call_errx");
     1362}
     1363
     1364static int
     1365call_errx_null(void *ctx)
     1366{
     1367        errx(15, NULL);
     1368}
     1369
     1370static void
     1371test_err(void)
     1372{
     1373        int exit_code;
     1374
     1375        puts("test err");
     1376
     1377        exit_code = rtems_bsd_program_call("err", call_err, NULL);
     1378        assert(exit_code == 10);
     1379
     1380        exit_code = rtems_bsd_program_call("err", call_err_null, NULL);
     1381        assert(exit_code == 11);
     1382
     1383        exit_code = rtems_bsd_program_call("errc", call_errc, NULL);
     1384        assert(exit_code == 12);
     1385
     1386        exit_code = rtems_bsd_program_call("errc", call_errc_null, NULL);
     1387        assert(exit_code == 13);
     1388
     1389        exit_code = rtems_bsd_program_call("errx", call_errx, NULL);
     1390        assert(exit_code == 14);
     1391
     1392        exit_code = rtems_bsd_program_call("errx", call_errx_null, NULL);
     1393        assert(exit_code == 15);
     1394}
     1395
    12041396static void
    12051397test_main(void)
     
    12221414        test_socket_recv_and_recvfrom_and_recvmsg();
    12231415
     1416        test_bsd_program();
     1417        test_warn();
     1418        test_err();
     1419
    12241420        puts("*** END OF " TEST_NAME " TEST ***");
    12251421        exit(0);
Note: See TracChangeset for help on using the changeset viewer.