This is a snippet of the LIST ftp's cmd:
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, "Error: transfer incomplete: %d di %d bytes inviati\n", rc_list, (int)fileStat.st_size); onexit(newsockd, sockd, fpl, 3); } printf("OK\n"); close(fpl); if(remove( "listfiles.txt" ) == -1 ){ perror("errore cancellazione file"); onexit(newsockd, sockd, 0, 2); } wher &files is declared as char **files and the function list_files is a function written by me that isn't relevant for my problem.
My problem: the first time LIST cmd it's called it works properly but if i call LIST another time it always give me "error, transfer incomplete" i don't understand why...
offset_listand how do you initialize it? Remember that ifsendfilecan't send everything then it will return a value less than the requested size, and you will have to adjust the size and try again.offset_t...so i have to do this?send: if((uint32_t)rc_list != fsize){ fprintf(stderr, "Error: transfer incomplete: %d di %d bytes inviati\n", rc_list, (int)fileStat.st_size); goto send; }