ecco la funzione in oggetto:
codice:
int list(struct mail **l, int *num_msg) {
int n_msg;
read(f_from, &n_msg, sizeof(int));
*num_msg = n_msg;
if (n_msg <= 0) {
return 0;
}
struct mail vettore[n_msg];
int i;
for (i=0; i<n_msg; i++) {
vettore[i].sender = malloc(sizeof(char)*LENGTH);
vettore[i].recipient = malloc(sizeof(char)*LENGTH);
vettore[i].obj = malloc(sizeof(char)*LENGTH);
vettore[i].date = malloc(sizeof(char)*LENGTH);
read(f_from, vettore[i].sender, sizeof(char)*LENGTH);
read(f_from, vettore[i].recipient, sizeof(char)*LENGTH);
read(f_from, vettore[i].obj, sizeof(char)*LENGTH);
read(f_from, vettore[i].date, sizeof(char)*LENGTH);
read(f_from, &vettore[i].flags, sizeof(char));
read(f_from, &vettore[i].size, sizeof(int));
/* se stampo qui i campi di vettore[i] è perfetto */
l = malloc(sizeof(vettore));
memcpy(l, vettore, sizeof(vettore));
fifo_unlock();
return 0;
}
funzione chiamante:
codice:
struct mmbox_mail **l;
int num_msg;
list(l, &num_msg);
if (num_msg == 0) {
printf("nessuna mail\n");
}
else {
int i = 0;
for (i=0; i<num_msg; i++) {
printf("Mail %d di %d:\n", i+1, num_msg);
printf("Mittente : %s\n", l[i]->sender);
printf("Destinatario: %s\n", l[i]->recipient);
printf("Oggetto : %s\n", l[i]->obj);
printf("Ora : %s\n\n", l[i]->date);
printf("Size : %d\n", l[i]->size);
printf("Flags : %c\n\n", l[i]->flags);
}
}
ed ecco la struct
codice:
struct mail {
char *sender, *recipient;
char *obj, *date;
char flags;
size_t size;
};
ps. "f_from" usato nelle read è un filedescriptor aperto in un altra funzione, nessun problema nell'uso delle read..
il segfault lo ottengo nella funzione chiamante, appena tento di stampare qualcosa.
se stampo dentro la funzione invece, stampando i membri di "vettore" (dichiarato staticamente) invece di "l", tutto ok.