This is the part of the ftp cmd "LIST" :
this is the function file_list:Code:if(recv(newsockd, buffer, 5, 0) < 0){ perror("Errore nella ricezione comando LIST"); onexit(newsockd, sockd, 0, 2); } other = strtok(buffer, "\n"); if(strcmp(other, "LIST") == 0){ printf("Ricevuta richiesta LIST\n"); } else onexit(newsockd, sockd, 0, 2); count = file_list("./", &files); if((fp_list = fopen("listfiles.txt", "w")) == NULL){ perror("Impossibile aprire il file per la scrittura LIST"); onexit(newsockd, sockd, 0, 2); } for(i=0; i < count; i++){ if(strcmp(files[i], "DIR ..") == 0 || strcmp(files[i], "DIR .") == 0) continue; else{ fprintf(fp_list, "%s\n", files[i]); } } fclose(fp_list); if((fpl = open("listfiles.txt", O_RDONLY)) < 0){ perror("open file with open"); onexit(newsockd, sockd, 0, 2); exit(1); } if(fstat(fpl, &fileStat) < 0){ perror("Errore fstat"); onexit(newsockd, sockd, fpl, 3); } fsize = fileStat.st_size; if(send(newsockd, &fsize, sizeof(fsize), 0) < 0){ perror("Errore durante l'invio grande file list"); onexit(newsockd, sockd, fpl, 3); } rc_list = sendfile(newsockd, fpl, &offset_list, fileStat.st_size); if(rc_list == -1){ perror("Invio file list non riuscito"); onexit(newsockd, sockd, fpl, 3); } if((uint32_t)rc_list != fsize){ fprintf(stderr, "Trasferimento incompleto: %d di %d bytes inviati\n", rc_list, (int)fileStat.st_size); onexit(newsockd, sockd, fpl, 3); } close(fpl); if(remove( "listfiles.txt" ) == -1 ){ perror("errore cancellazione file"); onexit(newsockd, sockd, 0, 2); } memset(buffer, 0, sizeof(buffer));
What is the problem?Code:#include "prototypes.h" uint32_t file_list(char *path, char ***ls){ DIR *dp; struct stat fileStat; struct dirent *ep = NULL; uint32_t len, count = 0; int file = 0; *ls = NULL; dp = opendir (path); if(dp == NULL){ fprintf(stderr, "Non esiste la directory: %s\n", path); exit(1); } ep = readdir(dp); while(NULL != ep){ count++; ep = readdir(dp); } rewinddir(dp); *ls = calloc(count, sizeof(char *)); count = 0; ep = readdir(dp); while(ep != NULL){ if((file = open(ep->d_name, O_RDONLY)) < 0){ perror("apertura file"); exit(1); } if(fstat(file, &fileStat) != 0){ perror("filestat"); free(*ls); close(file); exit(EXIT_FAILURE); } close(file); if(S_ISDIR(fileStat.st_mode)){ len = strlen(ep->d_name); (*ls)[count] = malloc(len+5); /* lunghezza stringa + "DIR \n" */ strcpy((*ls)[count], "DIR "); /* copio DIR */ strcat((*ls)[count++], ep->d_name); /* concateno la stringa DIR con il nome della dir */ ep = readdir(dp); } else{ (*ls)[count++] = strdup(ep->d_name); ep = readdir(dp); } } (void)closedir(dp); return count; }
When i call the LIST cmd the 1st time it is all ok but when i call it the 2nd time the files is partially sent and i don't know why O.o



LinkBack URL
About LinkBacks




