DF-0779 / diag.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;} int main(int argc,char**argv){ struct sockaddr_in sin; memset(&sin,0,sizeof sin); sin.sin_family=AF_INET; sin.sin_port=htons(792); sin.sin_addr.s_addr=inet_addr("127.0.0.1"); const char* path=argc>1?argv[1]:"/tmp/df0779_export"; size_t plen=strlen(path),pad=(plen+3)&~3u; uint8_t args[256],*a=args; put32(&a,(uint32_t)plen); putn(&a,path,plen); a+=plen; if(pad>plen){memset(a,0,pad-plen);a+=pad-plen;} int alen=a-args; uint8_t req[256],*q=req; put32(&q,0x1234); put32(&q,0); put32(&q,2); put32(&q,100005); put32(&q,3); put32(&q,1); put32(&q,0); put32(&q,0); 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("MOUNT reply n=%d\n",n); if(n>0) for(int i=0;i<n;i++){printf("%02x ",rep[i]); if((i&15)==15)printf("\n");} printf("\n"); close(s);return 0; } |