Salve.. di nuovo :-p Devo cercare un nome di un utente in un file di testo, e in caso di successo ritornare 1, altrimenti -1. Il nome di ogni utente è salvato in una struct (oltre alla sua password e al suo permesso).
Allego il codice e l'errore che ho in output:
Aggiunta di un utente al file:
codice:
int registraUtente(Utente utente) {
//Cerco se utente è già presente, in tal caso ritorna -1
int esito = cercaNome(utente);
if(esito == 1) {
printf("\nNome utente già presente, sceglierne un'altro.\n");
return -1;
}
else {
int ds = open("login",O_WRONLY|O_APPEND);
if(ds == -1) {
return -1;
}
int w = write(ds,&utente,sizeof(utente));
if(w == -1) {
return -1;
}
close(ds);
return 1;
}
}
Ricerca del nome utente nel file:
codice:
int cercaNome(Utente utente) {
Utente temp;
memset(temp.nickname,0,sizeof(temp.nickname));
memset(temp.password,0,sizeof(temp.password));
int cont = 0;
//Apro il file login
FILE *f;
f = fopen("login","r");
if(f == NULL) {
printf("Errore apertura elenco utenti\n");
chiudiServer();
}
//Conteggio gli utenti presenti
else {
while(fscanf(f,"%s %s %d",temp.nickname,temp.password,&temp.permesso) == -1) {
if(errno != EINTR) {
printf("\nErrore fscanf\n");
chiudiServer();
}
}
while(!feof(f)) {
while(fscanf(f,"%s %s %d",temp.nickname,temp.password,&temp.permesso) == -1) {
if(errno != EINTR) {
printf("\nErrore fscanf\n");
chiudiServer();
}
}
++cont;
}
rewind(f); //Riposizionamento indice del file
//Ricerca dell'utente
int i;
for(i=0; i<cont; i++) {
while(fscanf(f,"%s %s %d",temp.nickname,temp.password,&temp.permesso) == -1) {
if(errno != EINTR) {
printf("\nErrore fscanf\n");
chiudiServer();
}
}
if(strcmp(utente.nickname,temp.nickname) == 0) { //Utente trovato
while(fclose(f) != 0) {
if(errno != EINTR) {
printf("\nErrore fclose\n");
chiudiServer();
}
}
return 1;
}
}
while(fclose(f) != 0){
if(errno != EINTR){
printf("\nErrore fclose\n");
chiudiServer();
}
}
return -1;
}
}
Errore che capita quando dal client ho inserito nickname e password e premo invio. L'errore avviene nel terminale che simula il server, quindi è sicuramente riferito a questo codice, di preciso alla seconda funzione qui riportata.
*** stack smashing detected ***: ./server terminated
======= Backtrace: =========
/lib/x86_64-linux-gnu/libc.so.6(__fortify_fail+0x37)[0x7f00f2465007]
/lib/x86_64-linux-gnu/libc.so.6(__fortify_fail+0x0)[0x7f00f2464fd0]
./server[0x4015ac]
======= Memory map: ========
00400000-00402000 r-xp 00000000 08:06 2622024 /home/loris/Scrivania/TesinaC/server
00602000-00603000 r--p 00002000 08:06 2622024 /home/loris/Scrivania/TesinaC/server
00603000-00604000 rw-p 00003000 08:06 2622024 /home/loris/Scrivania/TesinaC/server
01da7000-01dc8000 rw-p 00000000 00:00 0 [heap]
7f00f2146000-7f00f215b000 r-xp 00000000 08:06 3673778 /lib/x86_64-linux-gnu/libgcc_s.so.1
7f00f215b000-7f00f235a000 ---p 00015000 08:06 3673778 /lib/x86_64-linux-gnu/libgcc_s.so.1
7f00f235a000-7f00f235b000 r--p 00014000 08:06 3673778 /lib/x86_64-linux-gnu/libgcc_s.so.1
7f00f235b000-7f00f235c000 rw-p 00015000 08:06 3673778 /lib/x86_64-linux-gnu/libgcc_s.so.1
7f00f235c000-7f00f250f000 r-xp 00000000 08:06 3677066 /lib/x86_64-linux-gnu/libc-2.15.so
7f00f250f000-7f00f270e000 ---p 001b3000 08:06 3677066 /lib/x86_64-linux-gnu/libc-2.15.so
7f00f270e000-7f00f2712000 r--p 001b2000 08:06 3677066 /lib/x86_64-linux-gnu/libc-2.15.so
7f00f2712000-7f00f2714000 rw-p 001b6000 08:06 3677066 /lib/x86_64-linux-gnu/libc-2.15.so
7f00f2714000-7f00f2719000 rw-p 00000000 00:00 0
7f00f2719000-7f00f273b000 r-xp 00000000 08:06 3677068 /lib/x86_64-linux-gnu/ld-2.15.so
7f00f2921000-7f00f2924000 rw-p 00000000 00:00 0
7f00f2937000-7f00f293b000 rw-p 00000000 00:00 0
7f00f293b000-7f00f293c000 r--p 00022000 08:06 3677068 /lib/x86_64-linux-gnu/ld-2.15.so
7f00f293c000-7f00f293e000 rw-p 00023000 08:06 3677068 /lib/x86_64-linux-gnu/ld-2.15.so
7fff326c8000-7fff326e9000 rw-p 00000000 00:00 0 [stack]
7fff327ff000-7fff32800000 r-xp 00000000 00:00 0 [vdso]
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0 [vsyscall]
Annullato (core dump creato)
O.O Grazie per l'aiuto