#include #include #include #include #include #include #include #include #include #include #define MAXREQ 512 #define MAXREP 2048 char* type(char *path){ struct stat st; lstat(path,&st); if(S_ISLNK(st.st_mode)) return "lnk"; else if(S_ISDIR(st.st_mode)) return "dir"; else // regular file return "reg"; } int main (int argc, char* argv[]) { int sock,ssock; struct sockaddr_in saddr, caddr; int caddr_len=sizeof(struct sockaddr_in), lg; saddr.sin_port = htons(atoi(argv[1])); saddr.sin_family = AF_INET; saddr.sin_addr.s_addr = htonl(INADDR_ANY); if ((ssock = socket(AF_INET,SOCK_STREAM,0))<0) {printf("pb de creation\n"); exit(0);} if (bind(ssock,(struct sockaddr *)&saddr,sizeof(saddr))!=0) {printf("change de port\n"); exit(0);} if(listen(ssock,5)!=0) {printf("pb listen\n"); exit(0);} while(1) { sock = accept(ssock, (struct sockaddr *)&caddr, &caddr_len); if (fork() == 0) { while(1){ char cmd[7]; char args[MAXREQ]; lg = read(sock, cmd, 8); lg = read(sock, args, MAXREQ); args[lg]='\0'; if(lg<1) exit(0); char *path=(char*)malloc(sizeof(char)*lg); strncpy(path,args,lg); if(strcmp(cmd,"getattr")==0){ write(sock,type(path),3); }else{ //cmd=="readdir" DIR *rep; struct dirent *rep_entree; char* reponse=(char*)malloc(MAXREP); reponse[0]='\0'; if ((rep = opendir (path)) != NULL) { while ((rep_entree = readdir (rep)) != NULL) { strcat (reponse,rep_entree->d_name); char *filepath=(char*)malloc(1024); filepath[0]='\0'; strcat(filepath,path); strcat(filepath,rep_entree->d_name); if (strcmp(type(filepath),"dir")==0) strcat (reponse,"/"); strcat (reponse,"\n"); } write(sock,reponse,strlen(reponse)); } else perror("opendir"); } } } waitpid(-1,NULL,WNOHANG); } }