99a7d67beb4db420331d7082c5c1a5d54bfbbcac
[mmh] / sbr / getthreadid.c
1 #include <h/mh.h>
2 #include <h/utils.h>
3 #include <h/addrsbr.h>
4
5 static char *threadid(char *, char *);
6
7 char *
8 getthreadid(const char *path)
9 {
10         char *msgid = NULL;
11         char *referens = NULL;
12         char *ret;
13         struct field f = {{0}};
14         enum state state = FLD2;
15         FILE *file = fopen(path, "r");
16
17         while (state == FLD2 && !msgid && !referens) {
18                 switch (state = m_getfld2(state, &f, file)) {
19                 case FLD2:
20                         if (strncasecmp("message-id", f.name, f.namelen)==0) {
21                                 msgid = f.value;
22                                 f.value = NULL;
23                         } else if (strncasecmp("references", f.name, f.namelen)==0) {
24                                 referens = f.value;
25                                 f.value = NULL;
26                         }
27                         break;
28                 default:
29                         fclose(file);
30                         break;
31                 }
32         }
33
34         ret = threadid(msgid, referens);
35
36         mh_free0(&msgid);
37         mh_free0(&referens);
38
39         return ret;
40 }
41
42 static char *
43 threadid(char *msgid, char *referens)
44 {
45         char *threadfrom;
46         char *start, *end;
47         char *cp;
48
49         threadfrom = referens ? referens : msgid;
50
51         start = strchr(threadfrom, '<');
52         end = strchr(start, '>');
53         if (!(*start) || !(*end)) {
54                 return NULL;
55         }
56         *end = '\0';
57         cp = mh_xstrdup(start + 1);
58         *end = '>';
59
60         return cp;
61 }