#include <sys/stat.h>
#include <stdlib.h>
#include <util.h>
#include <unistd.h>
#include "smtpd.h"
#include "log.h"
#define MAX_FORWARD_SIZE (4 * 1024)
#define MAX_EXPAND_NODES (100)
int
forwards_get(int fd, struct expand *expand)
{
FILE *fp = NULL;
char *line = NULL;
size_t len;
size_t lineno;
size_t save;
int ret;
struct stat sb;
ret = -1;
if (fstat(fd, &sb) == -1)
goto end;
if (sb.st_size == 0) {
log_info("info: forward file is empty");
ret = 0;
goto end;
}
if (sb.st_size >= MAX_FORWARD_SIZE) {
log_info("info: forward file exceeds max size");
goto end;
}
if ((fp = fdopen(fd, "r")) == NULL) {
log_warn("warn: fdopen failure in forwards_get()");
goto end;
}
lineno = 0;
save = expand->nb_nodes;
while ((line = fparseln(fp, &len, &lineno, NULL, 0)) != NULL) {
if (!expand_line(expand, line, 0)) {
log_info("info: parse error in forward file");
goto end;
}
if (expand->nb_nodes > MAX_EXPAND_NODES) {
log_info("info: forward file expanded too many nodes");
goto end;
}
free(line);
}
ret = expand->nb_nodes > save ? 1 : 0;
end:
free(line);
if (fp)
fclose(fp);
else
close(fd);
return ret;
}