int convert_msgmeta(char *line, DBT *out_key, DBT *out_data) {
char *token;
struct MetaData *m = malloc(sizeof(struct MetaData));
- token = strtok(line, "|");
- m->meta_msgnum = atol(strtok(NULL, "|"));
- m->meta_refcount = atoi(strtok(NULL, "|"));
- strncpy(m->meta_content_type, strtok(NULL, "|"), sizeof(m->meta_content_type));
- m->meta_rfc822_length = atol(strtok(NULL, "|"));
+
+ memset(m, 0, sizeof(struct MetaData));
+ char *p = line;
+
+ for (int i=0; (token = strsep(&p, "|")); ++i) {
+ switch(i) {
+ case 1:
+ m->meta_msgnum = atol(token);
+ break;
+ case 2:
+ m->meta_refcount = atoi(token);
+ break;
+ case 3:
+ strncpy(m->meta_content_type, token, sizeof(m->meta_content_type));
+ break;
+ case 4:
+ m->meta_rfc822_length = atol(token);
+ break;
+ }
+ }
// metadata records are stored in the CDB_MSGMAIN table,
// but with the index being the *negative* of the message number.