2012-02-26 18 views
1

open-mesh.orgからandroid-ndkでbatctl-2012.0.0をコンパイルしようとしていますが、進行中のtcpdump.cで無効なアプリケーション'sizeof'を 'struct ether_arp'型に変換します。どこで解決するか教えてください。ターミナル'struct ether_arp'型の不完全な 'sizeof'の無効なアプリケーション

/home/renanto/workspace/androidbatctl/jni/tcpdump.c: In function 'dump_arp': 
/home/renanto/workspace/androidbatctl/jni/tcpdump.c:96: error: invalid application of 'sizeof' to incomplete type 'struct ether_arp' 
/home/renanto/workspace/androidbatctl/jni/tcpdump.c:96: error: invalid application of 'sizeof' to incomplete type 'struct ether_arp' 

答えて

1

で非常に多くの

static void dump_arp(unsigned char *packet_buff, ssize_t buff_len, int time_printed) 
{ 
struct ether_arp *arphdr; 

LEN_CHECK((size_t)buff_len, (long)sizeof(struct ether_arp), "ARP"); 

if (!time_printed) 
    print_time(); 

arphdr = (struct ether_arp *)packet_buff; 

switch (ntohs(arphdr->arp_op)) { 
case ARPOP_REQUEST: 
    printf("ARP, Request who-has %s", inet_ntoa(*(struct in_addr *)&arphdr->arp_tpa)); 
    printf(" tell %s (%s), length %zd\n", inet_ntoa(*(struct in_addr *)&arphdr->arp_spa), 
     ether_ntoa_long((struct ether_addr *)&arphdr->arp_sha), buff_len); 
    break; 
case ARPOP_REPLY: 
    printf("ARP, Reply %s is-at %s, length %zd\n", inet_ntoa(*(struct in_addr *)&arphdr->arp_spa), 
     ether_ntoa_long((struct ether_addr *)&arphdr->arp_sha), buff_len); 
    break; 
default: 
    printf("ARP, unknown op code: %i\n", ntohs(arphdr->arp_op)); 
    break; 
} 
} 

このありがとう「不完全なタイプは、」コンパイラは構造体の定義を見ることができないことを意味します。 sizeofを使用したり、不完全な型のフィールドにアクセスすることはできません。

この機能を動作させるには、struct ether_arpの定義を持つヘッダーファイル#includeが必要です。 Android固有のものではなく、Linuxの構造体なので、NDK内のインクルードパスで見つける必要があります。

+0

私は同じ問題を抱えていますが、今ではどちらかがAndroidヘッダーのどこにあるのかを見ています。 http://osxr.org/android/ident?_i=ether_arpはそのような目的のための良いツールと思われます – Mixaz

+0

私の検索によると、struct ether_arpはAndroidソースコードには全く定義されていません... – Mixaz

+0

@MixazそれはAndroid構造体ではなく、Linux構造体(POSIXのもの、正確には)です。私はより多くの情報で私の答えを更新しました。 –

関連する問題