Blame testglue.c

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