#include #include #include #include #include #include #include #include #include #include void pmenu() { printf("1 ... ping\n" "2 ... quit\n" "3 ... dir\n" "4 ... current dir\n" "5 ... set dir\n" "6 ... download file\n" "7 ... delete file\n" "8 ... upload file\n" "> "); fflush(stdout); } int main(int argc, char **argv) { int s,len,readb,f=0; struct sockaddr_in sa; struct hostent* host; static unsigned char buf [0x1001]; fd_set rfds; len=sizeof(struct sockaddr); if (argc>1) { printf("using %s\n",argv[1]); if ((host=gethostbyname(argv[1]))==0) { herror(argv[1]); exit(1); } } else { printf("usage: ratc \n"); exit(1); } if ((s=socket(AF_INET,SOCK_DGRAM,0))==1) { perror("socket"); exit(1); } memcpy((char*)&sa.sin_addr,host->h_addr,sizeof(sa.sin_addr)); sa.sin_family=AF_INET; sa.sin_port=htons(0x0BAD); pmenu(); while (1) { FD_ZERO(&rfds); FD_SET(0,&rfds); FD_SET(s,&rfds); select(s+1,&rfds,NULL,NULL,NULL); if (FD_ISSET(0,&rfds)) { fgets(buf,0x1000,stdin); switch (buf[0]) { case '1': puts("sending ping"); buf[0]=0; sendto(s,buf,1,0,(struct sockaddr*)&sa,len); pmenu(); break; case '2': puts("sending quit"); buf[0]=1; sendto(s,buf,1,0,(struct sockaddr*)&sa,len); pmenu(); break; case '3': buf[0]=2; strcpy(buf+1,"*.*"); sendto(s,buf,5,0,(struct sockaddr*)&sa,len); pmenu(); break; case '4': buf[0]=3; sendto(s,buf,1,0,(struct sockaddr*)&sa,len); break; case '5': buf[0]=4; printf("cd to: "); fflush(stdout); fgets((char*)&buf[1],0xFFF,stdin); buf[strlen(buf)-1]=0; sendto(s,buf,strlen(buf)+1,0,(struct sockaddr*)&sa,len); break; case '6': buf[0]=5; printf("download: "); fflush(stdout); fgets((char*)&buf[1],0xFFF,stdin); buf[strlen(buf)-1]=0; sendto(s,buf,strlen(buf)+1,0,(struct sockaddr*)&sa,len); pmenu(); break; case '7': buf[0]=6; printf("delete: "); fflush(stdout); fgets((char*)&buf[1],0xFFF,stdin); buf[strlen(buf)-1]=0; sendto(s,buf,strlen(buf)+1,0,(struct sockaddr*)&sa,len); pmenu(); break; case '8': printf("upload: "); fflush(stdout); fgets((char*)&buf[1],0xFFF,stdin); buf[strlen(buf)-1]=0; if ((f=open(buf+1,O_RDONLY))==-1) { printf("not found!\n"); } else { buf[0]=7; sendto(s,buf,strlen(buf)+1,0,(struct sockaddr*)&sa,len); pmenu(); } break; default: puts("invalid command"); } } if (FD_ISSET(s,&rfds)) { readb=read(s,buf,1000); switch (buf[0]) { case 0: puts("ping reply!");break; case 2: printf("current dir: %s\n",(char*)&buf[1]); pmenu(); break; case 3: puts("--- dir:\n"); break; case 4: if (buf[45]!=0) printf("%s\n",(char*)&buf[45]); break; case 5: puts("---"); pmenu(); break; case 6: printf("incoming file part %d\n",(buf[4]<<24)+(buf[3]<<16)+(buf[2]<<8)+buf[1]); break; case 7: printf("incoming file done (%d parts)\n",(buf[4]<<24)+(buf[3]<<16)+(buf[2]<<8)+buf[1]); pmenu(); break; case 8: // printf("ack %d\n",(buf[4]<<24)+(buf[3]<<16)+(buf[2]<<8)+buf[1]); if (f) { buf[0]=8; lseek(f,((buf[4]<<24)+(buf[3]<<16)+(buf[2]<<8)+buf[1])*0x100,SEEK_SET); readb=read(f,buf+5,0x100); if (readb==0x100) { sendto(s,buf,readb+5,0,(struct sockaddr*)&sa,len); } else { if (readb>0) { sendto(s,buf,readb+5,0,(struct sockaddr*)&sa,len); } puts("file uploaded"); buf[0]=9; sendto(s,buf,1,0,(struct sockaddr*)&sa,len); close(f); f=0; } } break; default: puts("unknown reply"); } } } close(s); return 0; }