既存の大規模なソフトウェアツールに機能を追加する作業を行っています(このツールは、DNSパケットのキャプチャや解析などに使用されます)。元のコードに何か奇妙なことに気づき、説明が何であるか理解できません。このコードには、次のようにIPアドレス(IPv6およびIPv4)を格納するための構造体があります。
typedef struct {
int af;
union {
struct in_addr a4;
struct in6_addr a6;
} u;
} iaddr;
さらに、このように格納されたアドレスを文字列に変換する機能があります。
static const char * ia_str(iaddr ia) {
static char ret[sizeof "ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff"];
(void) inet_ntop(ia.af, &ia.u, ret, sizeof ret);
return (ret);
}
これで、パケットを印刷するときに、コードは次のように送信元と宛先のアドレスとポートを印刷します。
void output(const char *descr, iaddr from, iaddr to, ...
...
fprintf(stderr, "%s:%u ", ia_str(from), sport);
fprintf(stderr, "-> %s:%u", ia_str(to), dport);
これまでのところ、とても良いです(私は思います)。これは公開されたコードであり、正常に機能しているようです。さて、この小さな小さな変更を行うと、上記の2つのfprintf行を1つに単純に結合します(これは、fprintfの代わりにsprintfを試した場合にも発生します)。
fprintf(stderr, "%s:%u -> %s:%u", ia_str(from), sport, ia_str(to), dport);
プログラムは、両方の位置に同じアドレス(つまり、ia_str(from)アドレス)を出力します。
私は困惑しています。助けてください。前もって感謝します!