2013-10-11 65 views
1

我連接到使用以下connect()呼叫遠程主機連接調用:重寫使用LD_PRELOAD

result = connect(sockfd, (struct sockaddr *)&address, len); 

其中地址表示sockaddr_in結構,澆鑄到sockaddr *connect()執行的目的。然而,使用庫注入我能夠通過定義自己的連接功能,可覆蓋連接調用:

int connect (int fd, __CONST_SOCKADDR_ARG addr, socklen_t len) 
{ 
    // My code in between 
} 

不過,我無法將第二個參數(在__CONST_SOCAKADDR_ARG)投射到sockaddr_in指針或sockaddr對這一問題。 __CONST_SOCKADDR_ARG宏展開爲const struct sockaddr *。下面的代碼行:

struct sockaddr_in* providedIPv4AddressStructure = (struct sockaddr_in*) addr; 

讓我以下錯誤指示:

error: cannot convert to a pointer type 

,當然還有:

warning: initialization from incompatible pointer type [enabled by default] 

任何人有關於如何正確施放__CONST_SOCAKADDR_ARGsockaddr_in *任何提示?

謝謝!

+0

爲什麼要改變第二對Arg的'常量' – EJP

+0

我實際上是試圖重寫? :int connect(int socket,const struct sockaddr * address,socklen_t address_len);' '定義在''中。所以我的問題是:「如何正確地將一個const指針轉換爲一個非const指針(例如,在我的例子中'const sockaddr *'到'sockaddr *')? –

+1

是的,這是從'socket.h'獲取的: '#define __CONST_SOCKADDR_ARG const struct sockaddr *' –

回答

1

無法重現:

#include <netinet/in.h> 
#include <arpa/inet.h> 
#include <sys/socket.h> 

int main() { 
    __CONST_SOCKADDR_ARG p; 
    struct sockaddr_in *q; 

    q = (struct sockaddr_in *) p; 
} 

沒有錯誤,從未使用的變量只警告:

$ gcc -std=c11 -Wall -pedantic test.c 
test.c: In function ‘main’: 
test.c:7:25: warning: variable ‘q’ set but not used [-Wunused-but-set-variable] 
test.c:9:7: warning: ‘p’ is used uninitialized in this function [-Wuninitialized] 
+0

我試過了重寫connect()調用,而不希望宏展開: 'INT連接的(INT FD,常量結構sockaddr *地址中,socklen_t LEN) {// 我的代碼在這裏 }' 而不是使用'__CONST_SOCKADDR_ARG'有趣的是,它工作,沒有編譯器警告,什麼都沒有。代碼無縫編譯。 –