Hi,
I have ftp client doen by using C program, when I complie its comin with a
warning: data definition has no type or storage class
& when i run it it comes as
Segmentation fault
Pls find below the coding
/**
* client.c
* @compile gcc client.c -o client
*/
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<stdio.h>
#include<netdb.h>
#include <sys/stat.h>
#include <sys/errno.h>
#include <fcntl.h>
#include <string.h>
#define MAXBUFF 1024
str_echo(char * buff);
int iscdcmd(char * buff);//cd\u547d\u4ee4
int isgetcmd(char * k); //get\u547d\u4ee4
char * getPath(char *buff);//\u5f97\u5230\u8def\u5f84
char* getFile(char* cmd);//\u5f97\u5230\u4e0a\u4f20\u6587\u4ef6\u7684\u540d\u 79f0
int checkcmd(char* cmd);//\u76d1\u6d4b\u662f\u5426\u662f\u5408\u6cd5\u547d\u 4ee4
str_echo(char * buff)
{
char * s=buff;
if((strcmp(buff,"ls\n")==0)||(strcmp(buff,"pwd\n") ==0))
{
FILE * res=popen(buff,"r");
while(fgets(buff,MAXBUFF-1,res)!=NULL)
{
printf("%s",buff);
}
pclose(res);
}
else
printf("An invalid FTP command\n");
}
int iscdcmd(char * k)
{
char * s=k;
while(*s==' ')
{
s=s+1;
}
if(*s!='c')return 0;
s=s+1;
if(*s!='d')return 0;
s=s+1;
if(*s!=' ')return 0;
else return 1;
}
int isgetcmd(char * k)
{
char * s=k;
while(*s==' ')
{
s=s+1;
}
if(*s!='g')return 0;
s=s+1;
if(*s!='e')return 0;
s=s+1;
if(*s!='t')return 0;
s=s+1;
if(*s!=' ')return 0;
else return 1;
}
/**int isputcmd(char * k)
{
char * s=k;
while(*s==' ')
{
s=s+1;
}
if(*s!='p')return 0;
s=s+1;
if(*s!='u')return 0;
s=s+1;
if(*s!='t')return 0;
s=s+1;
if(*s!=' ')return 0;
else return 1;
} */
int checkcmd(char* cmd)
{
if(*cmd=='c'&&*(cmd+1)=='d')return 1;
else
if(*cmd=='l'&&*(cmd+1)=='s')return 1;
else
if(*cmd=='p'&&*(cmd+1)=='w'&&*(cmd+2)=='d')return 1;
else
if(*cmd=='g'&&*(cmd+1)=='e'&&*(cmd+2)=='t')return 1;
/** else
if(*cmd=='p'&&*(cmd+1)=='u'&&*(cmd+2)=='t')return 1;
*/
else
if(*cmd=='q'&&*(cmd+1)=='u'&&*(cmd+2)=='i'&&*(cmd+ 3)=='t')return 1;
else
return 0;
}
char* getPath(char* cmd)
{
char* Path;
while(*cmd==' ')
{
cmd=cmd+1;
}
if(*cmd=='c'&&*(cmd+1)=='d')
{
cmd=cmd+2;
while(*cmd==' ')
{
cmd=cmd+1;
}
Path=cmd;
while(*cmd!='\n')
{
cmd=cmd+1;
}
*cmd='\0';
}
return Path;
}
char* getFile(char* cmd)
{
char* Path;
while(*cmd==' ')
{
cmd=cmd+1;
}
cmd=cmd+3;
while(*cmd==' ')
{
cmd=cmd+1;
}
Path=cmd;
while(*cmd!='\n')
{
cmd=cmd+1;
}
*cmd='\0';
return Path;
}
main(argc,argv)
int argc;
char* argv[];
{
char buff[MAXBUFF];
char buff1[MAXBUFF];
char num[MAXBUFF];
char file[30];
struct sockaddr_in remote;
int sk,result,n,source,target,k;
struct hostent *hp, *gethostbyname();
sk=socket(AF_INET,SOCK_STREAM,0);
remote.sin_family=AF_INET;
hp=(struct hostent *)gethostbyname(argv[1]);
bcopy(hp->h_addr,(char*)&remote.sin_addr,hp->h_length);
remote.sin_port=atoi(argv[2]);
connect(sk,(struct sockaddr*)&remote,sizeof(remote));
if(read(sk,buff,MAXBUFF)>0)
{
printf("You are Client %s!\n",buff);
strcpy(num,buff);
printf("The server host name:%s\n",inet_ntoa(remote.sin_addr));
}
while(1)
{
printf("ftp>:");
fgets(buff,MAXBUFF,stdin);
if(*buff=='!')
{
char *k=buff;
k++;
if(iscdcmd(k))
{
result=chdir((char*)getPath(k));
if(result==0)
{
FILE* fp=popen("pwd","r");
if((fgets(buff,MAXBUFF,fp))!=NULL)
{
printf("The client directory is : %s\n",buff);
}
pclose(fp);
}
else
{
strcpy(buff,(char *)strerror(errno));
printf(buff);
printf("\n");
}
}
else
{
str_echo(k);
}
}
else
{
if(checkcmd(buff))
{
if(write(sk,buff,MAXBUFF)<0)
{
printf("Clent: Fail to pass the command !\n");
}
/**
if(isputcmd(buff)) //\u4e0a\u4f20\u6587\u4ef6
{
strcpy(file,getFile(buff));
if((source=open(file,O_RDONLY))<0)
{
printf("filename: no such file.\n");
write(sk,"error\n",MAXBUFF);
}
else
{
write(sk,"ok\n",MAXBUFF);
printf("uploading..\n");
lseek(source,0,SEEK_SET);
memset(buff, 0x0 ,MAXBUFF);
while((k=read(source,buff,MAXBUFF))>0)
{
write(sk,buff,k);
}
printf("finished\n");
}
close(source);
}
else */
if(isgetcmd(buff)) //\u4e0b\u8f7d\u6587\u4ef6
{
read(sk,buff1,MAXBUFF);
if(strcmp(buff1,"error\n")!=0)
{
printf("downloading..\n");
strcpy(file,getFile(buff));
printf(file);
if((target=open(file,O_WRONLY|O_CREAT|O_TRUNC,0644 ))<0)
{
printf("error\n");
}
while(1)
{
if((k=read(sk,buff,MAXBUFF))>0)
{
write(target,buff,k);
if(k!=MAXBUFF)break;
}
}
close(target);
printf("finished\n");
}
else printf("filename: no such file.\n");
}
else
{
if(strcmp(buff,"quit\n")==0)//\u9000\u51fa
{
break;
}
else
while(1) //\u8bfb\u53d6\u670d\u52a1\u5668\u7684\u8fd4\u56de\u 5b57\u7b26
{
if((n=read(sk,buff,MAXBUFF))>0)
{
if(strcmp(buff,"end")==0)break;
printf("%s",buff);
}
}
}
}
else
printf("An invalid FTP command\n");
}
}
close(sk);
}
Pls advice me.
Thanks
mili