/*
-** For the states FLD2, BODY2 and FMTERR2 memory is allocated for f->value.
-** For the states LENERR2, IOERR2 and FILEEOF2 no memory is allocated.
+** FLD2: We read a (complete) header field
+** BODY2: We read a body line
+** LENERR2: Line is too long (>998, as defined by RFC 822)
+** FMTERR2: Header field invalid
+** IOERR2: Failure to read
+** FILEEOF2: We're at the end of the file
+**
+** f->name is only filled in FLD2.
+**
+** In FLD2, f->value contains the field's (complete) value only;
+** in BODY2, LENERR2 and FMTERR2 f->value contains the whole line;
+** in IOERR2 and FILEEOF2 f->value is not set.
*/
enum state
m_getfld2(enum state s, struct field *f, FILE *msg)
}
}
+ *f->name = '\0';
+ f->namelen = 0;
+
if (nchars >= NAMESZ) {
- free(tmpline);
+ if (f->value) {
+ free(f->value);
+ }
+ f->value = tmpline;
+ f->valuelen = nchars;
return LENERR2;
}
- *f->name = '\0';
- f->namelen = 0;
-
switch (s) {
case FLD2:
if (*(tmpline + nchars - 1) != '\n') {
}
if (nchars >= NAMESZ) {
- free(tmpline);
+ if (f->value) {
+ free(f->value);
+ }
+ f->value = tmpline;
+ f->valuelen = nchars;
return LENERR2;
}