#define SUID printf("uid==%d euid==%d\n",getuid(),geteuid()) #define error(MSG) _error(MSG,__LINE__,__FILE__) void _error(const char*msg,int line,const char* file){ printf("%s:%d %s\n",file,line,msg); exit(1); } int main(int argc,char *argv[],char* envp[]){ signed int feedoutfd=-1,feedinfd=-1; struct sockaddr_in adrs[2]; char arga[512],argb[512]; char*args[7]; int ret; args[0]="/usr/bin/valgrind"; args[1]="-v"; args[2]="./feedmain"; args[3]="-proper"; args[4]=arga; args[5]=argb; args[6]=0; printf("starting feed program\n"); SUID; feedoutfd=socket(PF_INET,SOCK_STREAM,0); feedinfd=socket(PF_INET,SOCK_STREAM,0); if ((feedoutfd <0) | (feedinfd <0)) { printf("error 1 %d %d\n",feedoutfd,feedinfd); return(1); } bzero((char *) &adrs[0],sizeof(adrs[0])); adrs[0].sin_family = AF_INET; adrs[1].sin_family = AF_INET; adrs[0].sin_port = htons(98); adrs[1].sin_port = htons(104); adrs[0].sin_addr.s_addr = INADDR_ANY; adrs[1].sin_addr.s_addr = INADDR_ANY; if (bind(feedoutfd, (struct sockaddr *) &adrs[0],sizeof(adrs[0])) < 0) error("ERROR on bindingA"); if (bind(feedinfd, (struct sockaddr *) &adrs[1],sizeof(adrs[1])) < 0) error("ERROR on bindingB"); snprintf(arga,500,"%d",feedoutfd); snprintf(argb,500,"%d",feedinfd); seteuid(getuid()); SUID; ret=execve("/usr/bin/valgrind",args,envp); if (ret){ printf("ERROR %d on execve\n",ret); return -1; } }