File indexing completed on 2024-06-16 05:02:00

0001 /*
0002  * This is based on work by D.J. Capelis, modified by Jan Kundrát.
0003  * http://stackoverflow.com/questions/69859/how-could-i-intercept-linux-sys-calls
0004  * */
0005 #define _GNU_SOURCE
0006 #include <dlfcn.h>
0007 #include <string.h>
0008 #include <sys/types.h>
0009 
0010 extern int errorno;
0011 
0012 int (*_open)(const char * pathname, int flags, ...);
0013 int (*_open64)(const char * pathname, int flags, ...);
0014 
0015 const char * dev_random = "/dev/random";
0016 const char * dev_urandom = "/dev/urandom";
0017 
0018 int open(const char * pathname, int flags, mode_t mode)
0019 {
0020     _open = (int (*)(const char * pathname, int flags, ...)) dlsym(RTLD_NEXT, "open");
0021     if (strcmp(pathname, dev_random) == 0)
0022         return _open(dev_urandom, flags, mode);
0023     else
0024         return _open(pathname, flags, mode);
0025 }
0026 
0027 int open64(const char * pathname, int flags, mode_t mode)
0028 {
0029     _open64 = (int (*)(const char * pathname, int flags, ...)) dlsym(RTLD_NEXT, "open64");
0030     if (strcmp(pathname, dev_random) == 0)
0031         return _open64(dev_urandom, flags, mode);
0032     else
0033         return _open64(pathname, flags, mode);
0034 }