DF-0779 / diag2.c
#include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <stdio.h> #include <string.h> #include <unistd.h> #include <stdint.h> static void put32(uint8_t**p,uint32_t v){v=htonl(v);memcpy(*p,&v,4);*p+=4;} static void putn(uint8_t**p,const void*src,size_t n){memcpy(*p,src,n);*p+=n;} static size_t make_auth_unix(uint8_t*body){ uint8_t*b=body; put32(&b,0x12345678); const char*mach="dfbsd"; size_t mlen=strlen(mach),pad=(mlen+3)&~3u; put32(&b,(uint32_t)mlen); putn(&b,mach,mlen); b+=mlen; if(pad>mlen){memset(b,0,pad-mlen);b+=pad-mlen;} put32(&b,0); put32(&b,0); put32(&b,0); return b-body; } int main(int argc,char**argv){ uint16_t port=argc>1?atoi(argv[1]):792; uint32_t prog=argc>2?atoi(argv[2]):100005; uint32_t vers=argc>3?atoi(argv[3]):3; uint32_t proc=argc>4?atoi(argv[4]):1; struct sockaddr_in sin; memset(&sin,0,sizeof sin); sin.sin_family=AF_INET; sin.sin_port=htons(port); sin.sin_addr.s_addr=inet_addr("127.0.0.1"); const char* path="/tmp/df0779_export"; size_t plen=strlen(path),padd=(plen+3)&~3u; uint8_t args[256],*a=args; put32(&a,(uint32_t)plen); putn(&a,path,plen); a+=plen; if(padd>plen){memset(a,0,padd-plen);a+=padd-plen;} int alen=a-args; uint8_t req[256],*q=req; put32(&q,0x1234); put32(&q,0); put32(&q,2); put32(&q,prog); put32(&q,vers); put32(&q,proc); uint8_t authbuf[256]; size_t authlen=make_auth_unix(authbuf); put32(&q,1); put32(&q,(uint32_t)authlen); putn(&q,authbuf,authlen); put32(&q,0); put32(&q,0); putn(&q,args,alen); int rl=q-req; int s=socket(AF_INET,SOCK_DGRAM,0); struct timeval tv={.tv_sec=5}; setsockopt(s,SOL_SOCKET,SO_RCVTIMEO,&tv,sizeof tv); connect(s,(struct sockaddr*)&sin,sizeof sin); send(s,req,rl,0); uint8_t rep[4096]; int n=recv(s,rep,sizeof rep,0); printf("prog=%u vers=%u proc=%u port=%u reply n=%d\n",prog,vers,proc,port,n); if(n>0){for(int i=0;i<n;i++){printf("%02x ",rep[i]); if((i&15)==15)printf("\n");}printf("\n"); /* parse */ uint8_t*p=rep; uint32_t xid,mt,rs; memcpy(&xid,p,4);p+=4; memcpy(&mt,p,4);p+=4;mt=ntohl(mt); memcpy(&rs,p,4);p+=4;rs=ntohl(rs); printf("mtype=%u reply_stat=%u ",mt,rs); if(rs==0){uint32_t vf,vl,ast;memcpy(&vf,p,4);p+=4;vf=ntohl(vf);memcpy(&vl,p,4);p+=4;vl=ntohl(vl);p+=vl;memcpy(&ast,p,4);p+=4;ast=ntohl(ast);printf("verf_flavor=%u verf_len=%u accept_stat=%u\n",vf,vl,ast);} else {uint32_t rej,as; memcpy(&rej,p,4);p+=4;rej=ntohl(rej); memcpy(&as,p,4);as=ntohl(as);printf("reject_stat=%u auth_stat=%u\n",rej,as);} } close(s);return 0; } |