DragonFlyBSD Kernel Audit
DF-0779 / diag.c
← back to finding ↓ download raw
#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;
}