/* frame.c */
/* 
 * Provides the missing symbols __(de)register_frame_info
 * which might be missing due to egcs binary/library incompatibilities
 * by defining _weak_ symbols with this name.
 * A warning is printed to the syslog, if these routines get called
 */
/* (w) by Kurt Garloff <kurt@garloff.de>, 98/08 */
/* Copyright: GNU GPL */

#include <stdio.h>
#include <syslog.h>
#include <sys/types.h>
#include <unistd.h>
#include <fcntl.h>

char printbuf[64];

char* get_proc_name ()
{
   pid_t pid = getpid ();
   char nm[64]; int file;
   sprintf (nm, "/proc/%i/cmdline", pid);
   file = open (nm, O_RDONLY);
   memset (printbuf, 0, 64);
   read (file, printbuf, 64);
   return printbuf;
}

#pragma weak __register_frame_info
void __register_frame_info ()
{
   register int adr;
   openlog (get_proc_name(), LOG_PID, LOG_LOCAL0);
   asm ("movl 4(%%ebp),%0 \n"
	: "=r" (adr)
	);
   syslog (LOG_WARNING, "__register_frame_info called: %08x !\n", adr);
}

#pragma weak __deregister_frame_info
void __deregister_frame_info ()
{
   register int adr;
   asm ("movl 4(%%ebp),%0 \n"
	: "=r" (adr)
	);
   syslog (LOG_WARNING, "__deregister_frame_info called: %08x !\n", adr);
   closelog ();
}

