「C言語によるTCP/IPセキュリティプログラミング」という本を購入し、DNS自作プロキシを作成しているのですが、
下記画像の通り、unionにて2つのエラーが出てしまいました。
この本には、自作ライブラリを多く作成し使用しているので迷ってしまいました。
このエラーはどうしたら解決できるでしょうか?
C言語に詳しい方にご助言いただけたら幸いです。
#include "inc.h" #include "base.h" /* •ø•§•‡•¢•¶•»ª˛¥÷(…√) */ #define TIMEOUT_SEC (30) #define TIMEOUT_SEC_U (5) /* •—•È•·°º•ø•’•°•§•Î•—•π */ #define PARAM_PATH "/etc/dnsproxy.ini" /* DNS•µ°º•–•«°º•ø */ #define DNS_SERVER_HOST "192.168.0.10" char DnsServerHost[512]=DNS_SERVER_HOST; #define DNS_SERVER_PORT "20053" char DnsServerPort[512]=DNS_SERVER_PORT; #define BIG(a,b) ((a)>=(b)?(a):(b)) /* •◊•Ì•»•ø•§•◊ */ static int MsgLogTcpQuery(JOB_DATA *job_data,char *buf,int size); static int MsgLogTcpResponse(JOB_DATA *job_data,char *buf,int size); static int MsgLogUdpQuery(JOB_DATA *job_data,char *buf,int size); static int MsgLogUdpResponse(JOB_DATA *job_data,char *buf,int size); static void do_timeout(int sig); static int set_timeout(int sec); static int reset_timeout(); /* •—•È•·°º•ø∆…§flπ˛§fl */ int ReadParam() { GetPrivateProfileString("DnsProxy","DnsServerHost",DNS_SERVER_HOST,DnsServerHost,sizeof(DnsServerHost),PARAM_PATH); GetPrivateProfileString("DnsProxy","DnsServerPort",DNS_SERVER_PORT,DnsServerPort,sizeof(DnsServerPort),PARAM_PATH); lprintf("DnsServer=%s:%s\n",DnsServerHost,DnsServerPort); return(0); } /* •◊•Ì•≠•∑ΩËÕ˝º¬π‘ */ int DoProxy(JOB_DATA *job_data) { int ret; int count=0; int width; struct timeval timeout; fd_set readOK; int end=0; char buf[4097]; set_timeout(TIMEOUT_SEC); job_data->soc_server=-1; strcpy(job_data->host,""); strcpy(job_data->port,""); job_data->soc_server=ClientSocket(DnsServerHost,DnsServerPort,-1); if(job_data->soc_server==-1){ lprintf("%s:%s§À¿‹¬≥§«§≠§ §§\n",DnsServerHost,DnsServerPort); return(-1); } while(1){ count++; /* select()Õ—•fi•π•Ø∫Ó¿Æ */ FD_ZERO(&readOK); FD_SET(job_data->soc,&readOK); width=job_data->soc+1; FD_SET(job_data->soc_server,&readOK); width=BIG(job_data->soc_server+1,width); timeout.tv_sec=32767; timeout.tv_usec=0; switch(select(width,&readOK,NULL,NULL,&timeout)){ case -1: if(errno!=EINTR){ lperror("select"); /* ≥‰§Íπ˛§fl∞ ≥∞§Œ•®•È°º§ŒæÏπÁ§œΩ™Œª */ end=1; } break; case 0: end=1; break; default: if(FD_ISSET(job_data->soc,&readOK)){ /* •Ø•È•§•¢•Û•»•Ï•«•£ */ /* •Ø•È•§•¢•Û•»§´§ÈºıøÆ */ ret=recv(job_data->soc,buf,sizeof(buf)-1,0); if(ret>0){ MsgLogTcpQuery(job_data,buf,ret); /* •µ°º•–§À¡˜øÆ */ SendSize(job_data->soc_server,buf,ret); } if(ret<=0){ end=1; } } if(FD_ISSET(job_data->soc_server,&readOK)){ /* •µ°º•–•Ï•«•£ */ /* •µ°º•–§´§ÈºıøÆ */ ret=recv(job_data->soc_server,buf,sizeof(buf)-1,0); if(ret>0){ MsgLogTcpResponse(job_data,buf,ret); /* •Ø•È•§•¢•Û•»§À¡˜øÆ */ SendSize(job_data->soc,buf,ret); } if(ret<=0){ end=1; } } break; } if(end){ break; } } if(job_data->soc_server!=-1){ /* •Ω•±•√•»•Ø•Ì°º•∫ */ SocketClose(job_data->soc_server); } /* •ø•§•‡•¢•¶•»•Í•ª•√•» */ reset_timeout(); return(0); } /* •Ì•∞Ω–Œœ¥ÿœ¢ */ static int MsgLogTcpQuery(JOB_DATA *job_data,char *buf,int size) { char msg[512]; sprintf(msg,"TCP:Query(%s)[%d]<<<<<<<<<<\n",job_data->client_address,getpid()); log_out(msg,buf+2,size-2); return(0); } static int MsgLogTcpResponse(JOB_DATA *job_data,char *buf,int size) { char msg[512]; sprintf(msg,"TCP:Response(%s)[%d]>>>>>>>>>>\n",job_data->client_address,getpid()); log_out(msg,buf+2,size-2); return(0); } static int MsgLogUdpQuery(JOB_DATA *job_data,char *buf,int size) { char msg[512]; sprintf(msg,"UDP:Query(%s)[%d]<<<<<<<<<<\n",job_data->client_address,getpid()); log_out(msg,buf,size); return(0); } static int MsgLogUdpResponse(JOB_DATA *job_data,char *buf,int size) { char msg[512]; sprintf(msg,"UDP:Response(%s)[%d]>>>>>>>>>>\n",job_data->client_address,getpid()); log_out(msg,buf,size); return(0); } /* •◊•Ì•≠•∑ΩËÕ˝º¬π‘(UDP) */ int DoProxyU(JOB_DATA *job_data) { struct sockaddr_in from,to,server; struct in_addr addr; int fromlen,size,tolen,ret,size2; char adr[80]; union { HEADER hde; u_char buf[PACKETSZ]; }buf,buf2; set_timeout(TIMEOUT_SEC_U); /* •Ø•È•§•¢•Û•»§´§ÈºıøÆ */ fromlen=sizeof(from); size=recvfrom(job_data->soc,buf.buf,sizeof(buf),0,&from,&fromlen); if(size<=0||size>512){ return(-1); } strcpy(job_data->client_address,inet_ntoa(from.sin_addr)); MsgLogUdpQuery(job_data,buf.buf,size); if(buf.hde.qr==1){ /* ÷≈˙§ŒæÏπÁ:¡˜øƧŒ§fl */ job_data->soc_server=ClientSocketU(DnsServerHost,DnsServerPort,-1,&to,&tolen); if(job_data->soc_server==-1){ lprintf("%s:%s§À¿‹¬≥§«§≠§ §§\n",DnsServerHost,DnsServerPort); return(-1); } ret=sendto(job_data->soc_server,buf.buf,size,0,&to,tolen); strcpy(adr,inet_ntoa(from.sin_addr)); SocketClose(job_data->soc_server); return(1); } else{ /* ɧ§πÁ§Ô§ª§ŒæÏπÁ */ if(atoaddr(DnsServerHost,&addr)==0){ lprintf("atoaddr():error\n"); return(-1); } memset((char *)&server,0,sizeof(server)); server.sin_family=AF_INET; server.sin_port=atoport(DnsServerPort,"udp"); server.sin_addr=addr; _res.nscount=1; memcpy(&_res.nsaddr_list[0],&server,sizeof(struct sockaddr_in)); _res.options&=~RES_RECURSE; _res.retry=1; /* •µ°º•–§Àɧ§πÁ§Ô§ª¡˜øÆ°¶±˛≈˙ºıøÆ */ size2=res_send(buf.buf,size,buf2.buf,PACKETSZ); MsgLogUdpResponse(job_data,buf2.buf,size2); if(size2<=0){ return(-1); } if(buf.hde.id!=buf2.hde.id){ return(-1); } /* •Ø•È•§•¢•Û•»§À±˛≈˙ */ ret=sendto(job_data->soc,buf2.buf,size2,0,&from,fromlen); return(0); } } /* •ø•§•‡•¢•¶•»ΩËÕ˝¥ÿœ¢ */ static void do_timeout(int sig) { exit(0); } static int set_timeout(int sec) { signal(SIGALRM,do_timeout); alarm(sec); return(0); } static int reset_timeout() { alarm(0); return(0); }
コードを提示していただかないと何もわかりません。