2014-06-19 55 views
2

我在庫中創建了一個與socklen_t衝突的typedef,並試圖從ndk-path/platforms/android-19/arch-arm/usr中創建一個包含的文件/include/sys/socket.h。在sys/socket.h中將socklen_t int更改爲uint32_t

該庫有typedef uint32_t socklen_t,但包含sys/socket.h類型將其定義爲int。我可以讓庫使用sys/socket.h版本(int)或者在socket.h頭文件中重新定義它(如下所示)。哪個更安全?我試圖聯繫圖書館的作者,但沒有迴應。是否正在改變socket.h中的定義安全?

#ifndef _SYS_SOCKET_H_ 
#define _SYS_SOCKET_H_ 

#include <sys/cdefs.h> 
#include <sys/types.h> 
#include <cstdint> 
#include <linux/socket.h> 

__BEGIN_DECLS 

#define SOCK_STREAM  1 
#define SOCK_DGRAM  2 
#define SOCK_RAW   3 
#define SOCK_RDM   4 
#define SOCK_SEQPACKET 5 
#define SOCK_PACKET  10 

#ifdef __i386__ 
# define __socketcall extern __attribute__((__cdecl__)) 
#else 
# define __socketcall extern 
#endif 

/* BIONIC: second argument to shutdown() */ 
enum { 
    SHUT_RD = 0,  /* no more receptions */ 
#define SHUT_RD   SHUT_RD 
    SHUT_WR,   /* no more transmissions */ 
#define SHUT_WR   SHUT_WR 
    SHUT_RDWR   /* no more receptions or transmissions */ 
#define SHUT_RDWR  SHUT_RDWR 
}; 


typedef uint32_t socklen_t; 

__socketcall int socket(int, int, int); 
__socketcall int bind(int, const struct sockaddr *, int); 
__socketcall int connect(int, const struct sockaddr *, socklen_t); 
__socketcall int listen(int, int); 
__socketcall int accept(int, struct sockaddr *, socklen_t *); 
__socketcall int getsockname(int, struct sockaddr *, socklen_t *); 
__socketcall int getpeername(int, struct sockaddr *, socklen_t *); 
__socketcall int socketpair(int, int, int, int *); 
__socketcall int shutdown(int, int); 
__socketcall int setsockopt(int, int, int, const void *, socklen_t); 
__socketcall int getsockopt(int, int, int, void *, socklen_t *); 
__socketcall int sendmsg(int, const struct msghdr *, unsigned int); 
__socketcall int recvmsg(int, struct msghdr *, unsigned int); 

extern ssize_t send(int, const void *, size_t, unsigned int); 
extern ssize_t recv(int, void *, size_t, unsigned int); 

__socketcall ssize_t sendto(int, const void *, size_t, int, const struct sockaddr *, socklen_t); 
__socketcall ssize_t recvfrom(int, void *, size_t, unsigned int, const struct sockaddr *, socklen_t *); 

#undef __socketcall 

__END_DECLS 

#endif /* _SYS_SOCKET_H */ 
+0

您需要匹配庫編譯時認爲'socklen_t'的任何內容,否則您將得到未解析的符號鏈接器錯誤。如果你確實改變了某些東西,它可能必須放在那個庫中,你需要重新編譯它。 –

+0

你確定你應該包含這個文件,而不僅僅是正常的「socket.h」嗎? – EJP

回答

2

更改系統包括是一個壞主意,因爲系統的其餘部分幾乎肯定依賴於什麼protoyped/typdefed /宣/ definded在那裏。

因此調整明顯不可移植的庫代碼。