#include <signal.h>
#include <stdio.h>

extern void wine_debug(unsigned int*);


#ifdef linux
#include <linux/sched.h>
#include <asm/system.h>
#endif

struct sigaction segv_act;

#ifdef linux

struct sigcontext_struct {
	unsigned short sc_gs, __gsh;
	unsigned short sc_fs, __fsh;
	unsigned short sc_es, __esh;
	unsigned short sc_ds, __dsh;
	unsigned long sc_edi;
	unsigned long sc_esi;
	unsigned long sc_ebp;
	unsigned long sc_esp;
	unsigned long sc_ebx;
	unsigned long sc_edx;
	unsigned long sc_ecx;
	unsigned long sc_eax;
	unsigned long sc_trapno;
	unsigned long sc_err;
	unsigned long sc_eip;
	unsigned short sc_cs, __csh;
	unsigned long sc_eflags;
	unsigned long esp_at_signal;
	unsigned short sc_ss, __ssh;
	unsigned long i387;
	unsigned long oldmask;
	unsigned long cr2;
};
#endif

#ifdef linux
static void win_fault(int signal, struct sigcontext_struct context){
        struct sigcontext_struct *scp = &context;
#else
static void win_fault(int signal, int code, struct sigcontext *scp){
#endif

	wine_debug((unsigned int *) scp);  /* Enter our debugger */
}

char realtext[] = "This is what should really be printed\n";

int 
main(){
	char * pnt;
#ifdef linux
	segv_act.sa_handler = (__sighandler_t) win_fault;
	/* Point to the top of the stack, minus 4 just in case, and make
	   it aligned  */
	sigaction(SIGSEGV, &segv_act, NULL);
#endif
#ifdef __NetBSD__
        struct sigstack ss;
        sigset_t sig_mask;
        
        ss.ss_sp = (char *) (((unsigned int)(cstack + sizeof(cstack) - 4)) & ~3);
        ss.ss_onstack = 0;
        if (sigstack(&ss, NULL) < 0) {
                perror("sigstack");
                exit(1);
        }
        sigemptyset(&sig_mask);
        segv_act.sa_handler = (__sighandler_t) win_fault;
	segv_act.sa_flags = SA_ONSTACK;
        segv_act.sa_mask = sig_mask;
	if (sigaction(SIGBUS, &segv_act, NULL) < 0) {
                perror("sigaction");
                exit(1);
        }
#endif

	fprintf(stderr,"%x\n", realtext);

	/* Now force a segmentation fault */
	pnt = (char *) 0xc0000000;

	fprintf(stderr,"%s", pnt);
	return 0;

}


unsigned int * wine_files = NULL;

GetEntryPointFromOrdinal(int wpnt, int ordinal) {}
