
/*--------------------------------------------------------------------*/
/*--- Intercepts for various libc functions we want to capture     ---*/
/*--- (mostly for threading purposes).              vg_intercept.c ---*/
/*--------------------------------------------------------------------*/

/*
   This file is part of Valgrind, a dynamic binary instrumentation
   framework.

   Copyright (C) 2000-2005 Julian Seward 
      jseward@acm.org

   This program is free software; you can redistribute it and/or
   modify it under the terms of the GNU General Public License as
   published by the Free Software Foundation; either version 2 of the
   License, or (at your option) any later version.

   This program is distributed in the hope that it will be useful, but
   WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   General Public License for more details.

   You should have received a copy of the GNU General Public License
   along with this program; if not, write to the Free Software
   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
   02111-1307, USA.

   The GNU General Public License is contained in the file COPYING.
*/


/* ---------------------------------------------------------------------
   ALL THE CODE IN THIS FILE RUNS ON THE SIMULATED CPU.  It is
   intended for various reasons as drop-in replacements for libc
   functions.  These functions are not called directly - they're the
   targets of code redirection.  They're named weirdly so that the
   intercept code can find them when the shared object is initially
   loaded.
   ------------------------------------------------------------------ */

/*
   The gory details: Symbols in this file are mangled by a preprocessor
   to produce a special symbol name.  All symbols that need this handling
   should be passed to a special VG_INTERCEPT macro.  This macro takes
   two arguments: a library name and a function name.  These specify the
   function and the library that contains it that we need to intercept.
   For example:
   
     int VG_INTERCEPT(soname:libc.so.6, raise)(int sig) { ... }

   This example says that the "raise" function in the shared object
   libc.so.6 should be intercepted and redirected to the following piece
   of code.

   Internally, what's happening here is that this intercept gets turned
   into a special magic symbol name, with the ':' and '.' parts replaced
   by escapes, and a special prefix stuck on front.  When we slurp in
   an object file, we scan the symbol table for the magic prefixes,
   demangle any symbols found and set up the intercepts that way.

   This is the safest way to do this, because we're not relying on
   intercepts being set up by code that may be called after other code
   that need the intercepts has had a chance to run.
 */

#include "valgrind.h"
#include "core.h"
#include <unistd.h>
#include <signal.h>

int VG_INTERCEPT(soname:libc.so.6, raise)(int sig)
{
   return kill(getpid(), sig);
}

int VG_INTERCEPT(soname:libc.so.6, __libc_raise)(int)
   __attribute__((alias(VG_INTERCEPT_ALIAS(soname:libc.so.6, raise)),
                  visibility("protected")));

int VG_INTERCEPT(soname:libc.so.6, __GI_raise)(int)
   __attribute__((alias(VG_INTERCEPT_ALIAS(soname:libc.so.6, raise)),
                  visibility("protected")));

int VG_INTERCEPT(soname:libc.so.6, __raise)(int)
   __attribute__((alias(VG_INTERCEPT_ALIAS(soname:libc.so.6, raise)),
                  visibility("protected")));

/* Don't alias, so there's no chance that "gsignal" will appear in a
   message instead of "raise" */
int VG_INTERCEPT(soname:libc.so.6, gsignal)(int sig)
{
   return VG_INTERCEPT(soname:libc.so.6, raise)(sig);
}

int VG_INTERCEPT(soname:libc.so.6, __libc_gsignal)(int)
   __attribute__((alias(VG_INTERCEPT_ALIAS(soname:libc.so.6, gsignal)),
                  visibility("protected")));

int VG_INTERCEPT(soname:libc.so.6, __GI_gsignal)(int)
   __attribute__((alias(VG_INTERCEPT_ALIAS(soname:libc.so.6, gsignal)),
                  visibility("protected")));

int VG_INTERCEPT(soname:libc.so.6, __gsignal)(int)
   __attribute__((alias(VG_INTERCEPT_ALIAS(soname:libc.so.6, gsignal)),
                  visibility("protected")));

/* ---------------------------------------------------------------------
   Hook for running __libc_freeres once the program exits.
   ------------------------------------------------------------------ */

void VG_WRAPPER(freeres)( void )
{
   int res;
#ifndef __UCLIBC__
   extern void __libc_freeres(void);
   __libc_freeres();
#endif
   VALGRIND_MAGIC_SEQUENCE(res, 0 /* default */,
                           VG_USERREQ__LIBC_FREERES_DONE, 0, 0, 0, 0);
   /*NOTREACHED*/
   *(int *)0 = 'x';
}

/*--------------------------------------------------------------------*/
/*--- end                                           vg_intercept.c ---*/
/*--------------------------------------------------------------------*/

