хочу переопределить функции чтения данных из сокета, для чего создаю подгружаемую библиотеку .so, но она не создаётся из-за ошибки.
при компиляции данного кода ( командой gcc -fPIC -c -Wall dll.c ) у меня ошибка:
dll.c: In function 'init_wrappers' :
dll.c:91 'RTLD_NEXT' undeclared (first use in this function)
dll.c:91 (Each undeclared identifier is reported only once
dll.c:91 for each function it appears in.)#include <sys/types.h>
#include <sys/socket.h>
#include <errno.h>
#include <dlfcn.h>
#include <stdio.h>
int j;
ssize_t (*_recvmsg)(int sockfd, struct msghdr *msg, int flags);
ssize_t (*_recvfrom)(int sockfd, void *buf, size_t len, int flags, struct sockaddr *src_addr, socklen_t *addrlen);
ssize_t (*_recv)(int sockfd, void *buf, size_t len, int flags);
ssize_t recvmsg(int sockfd, struct msghdr *msg, int flags)
{
ssize_t error;
char* data;
error = _recvmsg(sockfd, msg, flags);
if (error > 0)
{
size_t i;
struct iovec *iovec;
for (i = 0; i < msg->msg_iovlen; ++i)
{
iovec = &msg->msg_iov[i];
data = iovec->iov_base ;
for (j = 0; j < iovec->iov_len ; j++)
{
if (data[i]=='l')
if (data[i+1]=='p')
if (data[i+2]=='a')
if (data[i+3]=='d')
{ errno = EPERM ; error = -1 ;}
}
}
}
return error;
}
ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags, struct sockaddr *src_addr, socklen_t *addrlen)
{
ssize_t error;
char* data;
data = buf ;
error = _recvfrom(sockfd, buf, len, flags, src_addr, addrlen);
if ( error > 0 )
for ( j = 0 ; j < len ; j++ )
{
if (data[i]=='l')
if (data[i+1]=='p')
if (data[i+2]=='a')
if (data[i+3]=='d')
{ errno = EPERM ; error = -1 ;}
}
return error;
}
ssize_t recv(int sockfd, void *buf, size_t len, int flags)
{
ssize_t error;
char* data;
data = buf ;
error = _recv(sockfd, buf, len, flags);
if ( error > 0 )
for ( j = 0 ; j < len ; j++ )
{
if (data[i]=='l')
if (data[i+1]=='p')
if (data[i+2]=='a')
if (data[i+3]=='d')
{ errno = EPERM ; error = -1 ;}
}
return error;
}
int init_wrappers()
{
void *ptr;
if ((ptr = dlsym(RTLD_NEXT, "recvmsg")) == NULL)
{
fprintf(stderr, "dlsym() 1 failed");
return -1;
}
_recvmsg = ptr;
if ((ptr = dlsym(RTLD_NEXT, "recvfrom")) == NULL)
{
fprintf(stderr, "dlsym() 2 failed");
return -1;
}
_recvfrom = ptr;
if ((ptr = dlsym(RTLD_NEXT, "recv")) == NULL)
{
fprintf(stderr, "dlsym() 3 failed");
return -1;
}
_recv = ptr;
return 0;
}
__attribute__((constructor))
void init()
{
if (init_wrappers())
{
exit(-1);
}
}
вроде необходимая библиотека подключена, почему он не видит RTLD_NEXT