|
Packit |
62fe53 |
#include <stdio.h>
|
|
Packit |
62fe53 |
#include <string.h>
|
|
Packit |
62fe53 |
#ifndef NO_UNISTD_H
|
|
Packit |
62fe53 |
#include <sys/unistd.h>
|
|
Packit |
62fe53 |
#endif
|
|
Packit |
62fe53 |
|
|
Packit |
62fe53 |
/* A simple glue file for embedded targets so we can get the real exit
|
|
Packit |
62fe53 |
status from the program. This assumes we're using GNU ld and can use
|
|
Packit |
62fe53 |
the -wrap option, and that write(1, ...) does something useful. */
|
|
Packit |
62fe53 |
|
|
Packit |
62fe53 |
/* There is a bunch of weird cruft with #ifdef UNDERSCORES. This is needed
|
|
Packit |
62fe53 |
because currently GNU ld doesn't deal well with a.out targets and
|
|
Packit |
62fe53 |
the -wrap option. When GNU ld is fixed, this should definitely be
|
|
Packit |
62fe53 |
removed. Note that we actually wrap __exit, not _exit on a target
|
|
Packit |
62fe53 |
that has UNDERSCORES defined. On non-UNDERSCORE targets, we
|
|
Packit |
62fe53 |
wrap _exit separately; it's actually a different function. */
|
|
Packit |
62fe53 |
|
|
Packit |
62fe53 |
#ifdef WRAP_M68K_AOUT
|
|
Packit |
62fe53 |
#define REAL_EXIT(code) asm ( "trap %0" : : "i" (0) );
|
|
Packit |
62fe53 |
#define REAL_ABORT() REAL_EXIT(6)
|
|
Packit |
62fe53 |
#define ORIG_EXIT _exit
|
|
Packit |
62fe53 |
#define ORIG_ABORT abort
|
|
Packit |
62fe53 |
#else
|
|
Packit |
62fe53 |
#ifdef UNDERSCORES
|
|
Packit |
62fe53 |
#define REAL_EXIT _real___exit
|
|
Packit |
62fe53 |
#define REAL_MAIN _real__main
|
|
Packit |
62fe53 |
#define REAL_ABORT _real__abort
|
|
Packit |
62fe53 |
#define ORIG_EXIT _wrap___exit
|
|
Packit |
62fe53 |
#define ORIG_ABORT _wrap__abort
|
|
Packit |
62fe53 |
#define ORIG_MAIN _wrap__main
|
|
Packit |
62fe53 |
#else
|
|
Packit |
62fe53 |
#define REAL_EXIT __real_exit
|
|
Packit |
62fe53 |
#ifndef VXWORKS
|
|
Packit |
62fe53 |
#define REAL__EXIT __real__exit
|
|
Packit |
62fe53 |
#endif
|
|
Packit |
62fe53 |
#define REAL_MAIN __real_main
|
|
Packit |
62fe53 |
#define REAL_ABORT __real_abort
|
|
Packit |
62fe53 |
#define ORIG_EXIT __wrap_exit
|
|
Packit |
62fe53 |
#define ORIG__EXIT __wrap__exit
|
|
Packit |
62fe53 |
#define ORIG_ABORT __wrap_abort
|
|
Packit |
62fe53 |
#define ORIG_MAIN __wrap_main
|
|
Packit |
62fe53 |
|
|
Packit |
62fe53 |
#endif
|
|
Packit |
62fe53 |
|
|
Packit |
62fe53 |
extern void abort (void);
|
|
Packit |
62fe53 |
extern void exit (int);
|
|
Packit |
62fe53 |
|
|
Packit |
62fe53 |
#endif
|
|
Packit |
62fe53 |
|
|
Packit |
62fe53 |
#ifdef REAL_MAIN
|
|
Packit |
62fe53 |
extern void REAL_EXIT ();
|
|
Packit |
62fe53 |
extern void REAL_ABORT ();
|
|
Packit |
62fe53 |
extern int REAL_MAIN (int argc, char **argv, char **envp);
|
|
Packit |
62fe53 |
#endif
|
|
Packit |
62fe53 |
#ifdef REAL__EXIT
|
|
Packit |
62fe53 |
extern void REAL__EXIT ();
|
|
Packit |
62fe53 |
#endif
|
|
Packit |
62fe53 |
|
|
Packit |
62fe53 |
static int done_exit_message = 0;
|
|
Packit |
62fe53 |
int ___constval = 1;
|
|
Packit |
62fe53 |
|
|
Packit |
62fe53 |
#ifdef VXWORKS
|
|
Packit |
62fe53 |
static void __runexit();
|
|
Packit |
62fe53 |
#endif
|
|
Packit |
62fe53 |
|
|
Packit |
62fe53 |
static char *
|
|
Packit |
62fe53 |
write_int(val, ptr)
|
|
Packit |
62fe53 |
int val;
|
|
Packit |
62fe53 |
char *ptr;
|
|
Packit |
62fe53 |
{
|
|
Packit |
62fe53 |
char c;
|
|
Packit |
62fe53 |
if (val<0) {
|
|
Packit |
62fe53 |
*(ptr++) = '-';
|
|
Packit |
62fe53 |
val = -val;
|
|
Packit |
62fe53 |
}
|
|
Packit |
62fe53 |
if (val>9) {
|
|
Packit |
62fe53 |
ptr = write_int (val/10, ptr);
|
|
Packit |
62fe53 |
}
|
|
Packit |
62fe53 |
c = (val%10)+'0';
|
|
Packit |
62fe53 |
*(ptr++) = c;
|
|
Packit |
62fe53 |
return ptr;
|
|
Packit |
62fe53 |
}
|
|
Packit |
62fe53 |
|
|
Packit |
62fe53 |
void
|
|
Packit |
62fe53 |
ORIG_EXIT (code)
|
|
Packit |
62fe53 |
int code;
|
|
Packit |
62fe53 |
{
|
|
Packit |
62fe53 |
char buf[30];
|
|
Packit |
62fe53 |
char *ptr;
|
|
Packit |
62fe53 |
|
|
Packit |
62fe53 |
#ifdef VXWORKS
|
|
Packit |
62fe53 |
__runexit ();
|
|
Packit |
62fe53 |
#endif
|
|
Packit |
62fe53 |
strcpy (buf, "\n*** EXIT code ");
|
|
Packit |
62fe53 |
ptr = write_int (code, buf + strlen(buf));
|
|
Packit |
62fe53 |
*(ptr++) = '\n';
|
|
Packit |
62fe53 |
write (1, buf, ptr-buf);
|
|
Packit |
62fe53 |
done_exit_message = 1;
|
|
Packit |
62fe53 |
REAL_EXIT (code);
|
|
Packit |
62fe53 |
while (___constval);
|
|
Packit |
62fe53 |
}
|
|
Packit |
62fe53 |
|
|
Packit |
62fe53 |
#ifdef ORIG__EXIT
|
|
Packit |
62fe53 |
void
|
|
Packit |
62fe53 |
ORIG__EXIT (code)
|
|
Packit |
62fe53 |
int code;
|
|
Packit |
62fe53 |
{
|
|
Packit |
62fe53 |
char buf[30];
|
|
Packit |
62fe53 |
char *ptr;
|
|
Packit |
62fe53 |
|
|
Packit |
62fe53 |
/* Since exit may call _exit, we need to avoid a second message. */
|
|
Packit |
62fe53 |
if (! done_exit_message)
|
|
Packit |
62fe53 |
{
|
|
Packit |
62fe53 |
strcpy (buf, "\n*** EXIT code ");
|
|
Packit |
62fe53 |
ptr = write_int (code, buf + strlen(buf));
|
|
Packit |
62fe53 |
*(ptr++) = '\n';
|
|
Packit |
62fe53 |
write (1, buf, ptr-buf);
|
|
Packit |
62fe53 |
}
|
|
Packit |
62fe53 |
|
|
Packit |
62fe53 |
REAL__EXIT (code);
|
|
Packit |
62fe53 |
while (___constval);
|
|
Packit |
62fe53 |
}
|
|
Packit |
62fe53 |
#endif
|
|
Packit |
62fe53 |
|
|
Packit |
62fe53 |
void
|
|
Packit |
62fe53 |
ORIG_ABORT ()
|
|
Packit |
62fe53 |
{
|
|
Packit |
62fe53 |
write (1, "\n*** EXIT code 4242\n", 20);
|
|
Packit |
62fe53 |
REAL_ABORT ();
|
|
Packit |
62fe53 |
while (___constval);
|
|
Packit |
62fe53 |
abort ();
|
|
Packit |
62fe53 |
}
|
|
Packit |
62fe53 |
|
|
Packit |
62fe53 |
#ifdef REAL_MAIN
|
|
Packit |
62fe53 |
int
|
|
Packit |
62fe53 |
ORIG_MAIN (argc, argv, envp)
|
|
Packit |
62fe53 |
int argc;
|
|
Packit |
62fe53 |
char **argv;
|
|
Packit |
62fe53 |
char **envp;
|
|
Packit |
62fe53 |
{
|
|
Packit |
62fe53 |
#ifdef WRAP_FILE_ARGS
|
|
Packit |
62fe53 |
extern int __argc;
|
|
Packit |
62fe53 |
extern char *__args[];
|
|
Packit |
62fe53 |
|
|
Packit |
62fe53 |
exit (REAL_MAIN (__argc,__args,envp));
|
|
Packit |
62fe53 |
#else
|
|
Packit |
62fe53 |
exit (REAL_MAIN (argc, argv, envp));
|
|
Packit |
62fe53 |
#endif
|
|
Packit |
62fe53 |
while (___constval);
|
|
Packit |
62fe53 |
}
|
|
Packit |
62fe53 |
#endif
|
|
Packit |
62fe53 |
|
|
Packit |
62fe53 |
#ifdef VXWORKS
|
|
Packit |
62fe53 |
void
|
|
Packit |
62fe53 |
_exit (status)
|
|
Packit |
62fe53 |
int status;
|
|
Packit |
62fe53 |
{
|
|
Packit |
62fe53 |
REAL_EXIT (status);
|
|
Packit |
62fe53 |
}
|
|
Packit |
62fe53 |
|
|
Packit |
62fe53 |
typedef (*PFV)(void);
|
|
Packit |
62fe53 |
|
|
Packit |
62fe53 |
static PFV __list[32];
|
|
Packit |
62fe53 |
static int __listcnt = 0;
|
|
Packit |
62fe53 |
static int __running = 0;
|
|
Packit |
62fe53 |
|
|
Packit |
62fe53 |
int
|
|
Packit |
62fe53 |
atexit (PFV func)
|
|
Packit |
62fe53 |
{
|
|
Packit |
62fe53 |
__list[__listcnt++] = func;
|
|
Packit |
62fe53 |
}
|
|
Packit |
62fe53 |
|
|
Packit |
62fe53 |
static void
|
|
Packit |
62fe53 |
__runexit ()
|
|
Packit |
62fe53 |
{
|
|
Packit |
62fe53 |
int i;
|
|
Packit |
62fe53 |
if (__running++)
|
|
Packit |
62fe53 |
return;
|
|
Packit |
62fe53 |
|
|
Packit |
62fe53 |
for (i = 0; i < __listcnt; i++)
|
|
Packit |
62fe53 |
__list[i]();
|
|
Packit |
62fe53 |
__running = 0;
|
|
Packit |
62fe53 |
}
|
|
Packit |
62fe53 |
#endif
|