Ik probeer mails uit het mailbestand te halen en deze vervolgens in structs te zetten en wegschrijven in een tijdelijk bestand om er later andere bewerkingen mee te doen. Maar ik krijg weer de welbekende segmentation faults. Dit is mijn code:
Dat regexx gedoe dat gebruik ik om regexpressies uit te voeren, dat klopt wel en hoeft niet verandert te worden. Hoe ik dat realloc ook aanroep, ik krijg altijd een segmentation fault.
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
| #include <stdio.h>
#include <ctype.h>
#include <string.h>
#include <iostream>
#include <sys/types.h>
#include <stdlib.h>
//#include <regexx.hh>
//using namespace regexx;
struct Messages
{
int flag;
char *mail;
};
FILE *tmpf;
void getmaildrop (char *user)
{
char loc [32];
//Regexx rxx;
FILE *mailfile;
sprintf (loc, "/var/spool/mail/%s", user); // Locatie bepalen
if ((mailfile = fopen (loc, "r")) == NULL) // Openen
{
printf ("ERROR OPENING MAILFILE\n");
}
else
{
struct Messages *entry;
char buf [1024];
char *mail;
tmpf = tmpfile (); // Temporary file aanmaken
entry = (struct Messages *D malloc (sizeof (int) + 1024 * sizeof (char));
mail = (char *D malloc (1024 * sizeof (char)); // Geheugen alloceren
entry->mail = (char *D malloc (1); // Geheugen alloceren
entry->mail = "\0"; // En vullen
printf ("Init gedaan...\n");
while (!feof (mailfile)) // Doorgaan tot End Of File (EOF)
{
fgets (buf, 1024, mailfile); // 1024 bytes inlezen
if (/*rxx.exec (str, "From .+@.+")*/strstr (buf, "From ")) // Checken op nieuwe mails en EOF
{
int newmail = 0;
sprintf (mail, "%s", buf); // Regel toevoegen
printf ("Nieuwe mail...\n");
while (!feof (mailfile) || newmail == 1)
{
fgets (buf, 1024, mailfile);
if (/*!rxx.exec (str, "From .+@.+")*/!strstr (buf, "From "))
{
printf ("Data wegschrijven in var...\n");
mail = (char *D realloc (mail, strlen (mail) + (1024 * sizeof (char))); // Geheugen vergroten met 1024 bytes
sprintf (mail, "%s%s", mail, buf);
}
else
{
long int fp;
newmail = 1;
printf ("Nieuwe mail wegschrijven naar temp...\n");
// Rekening houden met file pointer, terug plaatsen naar de juiste positie om data loss tegen te gaan
fp = ftell (mailfile);
fp = fp - strlen (buf);
fseek (mailfile, fp, SEEK_CUR);
printf ("File pointer goed gezet...\n");
// Nieuwe mail opgehaald, klaar voor wegschrijven
entry = (struct Messages *D realloc (entry, sizeof (struct Messages));
printf ("Opnieuw gealloceerd...\n");
printf ("Mail = %d\n", strlen (mail));
printf ("entry.mail = %d\n", strlen (entry->mail));
/***********************/
/* HIER GAAT HET FOUT */
/***********************/
entry->mail = (char *D realloc (&entry->mail, strlen (mail)); // Geheugen aanpassen aan grootte mail
printf ("Opnieuw gealloceerd...\n");
entry->mail = strdup (mail); // Struct vullen
entry->flag = 0; // Vlag op 0 zetten
printf ("Struct gevuld...\n");
printf ("Klaar om weggeschreven te worden...\n");
fwrite (&entry, sizeof (entry), 1, tmpf); // Wegschrijven naar bestand
printf ("Mail weggeschreven naar temp...\n");
}
}
}
}
free (mail); // Geheugen vrijgeven tegen memory leaks
free (entry->mail);
free (entry);
fclose (mailfile); // Bestand sluiten
}
}
main()
{
getmaildrop ("root"); // Ff om te testen
return 0;
} |
Dat regexx gedoe dat gebruik ik om regexpressies uit te voeren, dat klopt wel en hoeft niet verandert te worden. Hoe ik dat realloc ook aanroep, ik krijg altijd een segmentation fault.