--- a
+++ b/src/utils/idfile.cpp
@@ -0,0 +1,127 @@
+#ifndef lint
+static char rcsid[] = "@(#$Id: idfile.cpp,v 1.1 2005-04-07 09:05:39 dockes Exp $ (C) 2005 J.F.Dockes";
+#endif
+#ifndef TEST_IDFILE
+#include <unistd.h> // for access(2)
+#include <ctype.h>
+
+#include <fstream>
+#include <sstream>
+
+#include "debuglog.h"
+
+using namespace std;
+
+
+// Mail headers we compare to:
+static const char *mailhs[] = {"From: ", "Received: ", "Message-Id: ", "To: ",
+ "Date: ", "Subject: ", "Status: "};
+static const int mailhsl[] = {6, 10, 12, 4, 6, 9, 8};
+static const int nmh = sizeof(mailhs) / sizeof(char *);
+
+const int wantnhead = 3;
+
+string idFile(const char *fn)
+{
+ ifstream input;
+ input.open(fn, ios::in);
+ if (!input.is_open()) {
+ LOGERR(("idFile: could not open [%s]\n", fn));
+ return string("");
+ }
+
+ bool line1HasFrom = false;
+ int lookslikemail = 0;
+
+ // emacs VM sometimes inserts very long lines with continuations or
+ // not (for folder information). This forces us to look at many
+ // lines and long ones
+ for (int lnum = 1; lnum < 200; lnum++) {
+
+#define LL 1024
+ char cline[LL+1];
+ cline[LL] = 0;
+ input.getline(cline, LL-1);
+ if (input.fail()) {
+ if (input.bad()) {
+ LOGERR(("idfile: error while reading [%s]\n", fn));
+ return string("");
+ }
+ // Must be eof ?
+ break;
+ }
+
+ LOGDEB2(("idfile: lnum %d : [%s]\n", lnum, cline));
+ // Check for a few things that can't be found in a mail file,
+ // (optimization to get a quick negative
+
+ // Lines must begin with whitespace or have a colon in the
+ // first 50 chars (hope no one comes up with a longer header
+ // name !
+ if (!isspace(cline[0])) {
+ char *cp = strchr(cline, ':');
+ if (cp == 0 || (cp - cline) > 70) {
+ LOGDEB2(("idfile: can't be mail header line: [%s]\n", cline));
+ break;
+ }
+ }
+
+ int ll = strlen(cline);
+ if (ll > 1000) {
+ LOGDEB2(("idFile: Line too long\n"));
+ return string("");
+ }
+ if (lnum == 1) {
+ if (!strncmp("From ", cline, 5)) {
+ line1HasFrom = true;
+ continue;
+ }
+ }
+
+ for (int i = 0; i < nmh; i++) {
+ if (!strncasecmp(mailhs[i], cline, mailhsl[i])) {
+ //fprintf(stderr, "Got [%s]\n", mailhs[i]);
+ lookslikemail++;
+ break;
+ }
+ }
+ if (lookslikemail >= wantnhead)
+ break;
+ }
+ if (line1HasFrom)
+ lookslikemail++;
+
+ if (lookslikemail >= wantnhead)
+ return line1HasFrom ? string("text/x-mail") : string("message/rfc822");
+
+ return string("");
+}
+
+
+#else
+
+#include <string>
+#include <iostream>
+
+#include <unistd.h>
+#include <fcntl.h>
+
+using namespace std;
+
+#include "debuglog.h"
+#include "idfile.h"
+
+int main(int argc, char **argv)
+{
+ if (argc != 2) {
+ cerr << "Usage: idfile filename" << endl;
+ exit(1);
+ }
+ DebugLog::getdbl()->setloglevel(DEBDEB1);
+ DebugLog::setfilename("stderr");
+ string mime = idFile(argv[1]);
+ cout << argv[1] << " : " << mime << endl;
+ exit(0);
+}
+
+#endif