544 |
return rc; |
return rc; |
545 |
} |
} |
546 |
|
|
|
int |
|
|
_mh_delim (char *str) |
|
|
{ |
|
|
if (str[0] == '-') |
|
|
{ |
|
|
for (; *str == '-'; str++) |
|
|
; |
|
|
for (; *str == ' ' || *str == '\t'; str++) |
|
|
; |
|
|
} |
|
|
return str[0] == '\n'; |
|
|
} |
|
|
|
|
|
char * |
|
|
skipws (char *p, size_t off) |
|
|
{ |
|
|
int len; |
|
|
for (p += off; *p && isspace (*p); p++) |
|
|
; |
|
|
len = strlen (p); |
|
|
if (len > 0 && p[len-1] == '\n') |
|
|
p[len-1] = 0; |
|
|
return p; |
|
|
} |
|
|
|
|
|
struct msg_envelope { |
|
|
char *from; |
|
|
char *date; |
|
|
}; |
|
|
|
|
|
static int |
|
|
restore_envelope (stream_t str, struct msg_envelope **pmenv) |
|
|
{ |
|
|
size_t offset = 0; |
|
|
char *from = NULL; |
|
|
char *env_from = NULL; |
|
|
char *env_date = NULL; |
|
|
int rc; |
|
|
char buffer[80]; |
|
|
size_t len; |
|
|
|
|
|
while ((rc = stream_readline (str, buffer, sizeof buffer, offset, &len)) == 0 |
|
|
&& len > 0) |
|
|
{ |
|
|
if (_mh_delim (buffer)) |
|
|
break; |
|
|
buffer[len] = 0; |
|
|
offset += len; |
|
|
if (strncasecmp (buffer, MU_HEADER_FROM, |
|
|
sizeof (MU_HEADER_FROM) - 1) == 0) |
|
|
from = strdup (skipws (buffer, sizeof (MU_HEADER_FROM))); |
|
|
else if (strncasecmp (buffer, MU_HEADER_ENV_SENDER, |
|
|
sizeof (MU_HEADER_ENV_SENDER) - 1) == 0) |
|
|
env_from = strdup (skipws (buffer, sizeof (MU_HEADER_ENV_SENDER))); |
|
|
else if (strncasecmp (buffer, MU_HEADER_ENV_DATE, |
|
|
sizeof (MU_HEADER_ENV_DATE) - 1) == 0) |
|
|
env_date = strdup (skipws (buffer, sizeof (MU_HEADER_ENV_DATE))); |
|
|
} |
|
|
|
|
|
if (!env_from) |
|
|
{ |
|
|
if (from) |
|
|
{ |
|
|
address_t addr; |
|
|
|
|
|
address_create (&addr, from); |
|
|
if (!addr |
|
|
|| address_aget_email (addr, 1, &env_from)) |
|
|
env_from = strdup ("GNU-MH"); |
|
|
address_destroy (&addr); |
|
|
} |
|
|
else |
|
|
env_from = strdup ("GNU-MH"); |
|
|
} |
|
|
|
|
|
if (!env_date) |
|
|
{ |
|
|
struct tm *tm; |
|
|
time_t t; |
|
|
char date[80]; |
|
|
|
|
|
time(&t); |
|
|
tm = gmtime(&t); |
|
|
strftime (date, sizeof (date), "%a %b %e %H:%M:%S %Y", tm); |
|
|
env_date = strdup (date); |
|
|
} |
|
|
|
|
|
*pmenv = xmalloc (sizeof (**pmenv) |
|
|
+ strlen (env_from) |
|
|
+ strlen (env_date) |
|
|
+ 2); |
|
|
(*pmenv)->from = (char*) (*pmenv + 1); |
|
|
(*pmenv)->date = (char*) ((*pmenv)->from + strlen (env_from) + 1); |
|
|
|
|
|
strcpy ((*pmenv)->from, env_from); |
|
|
strcpy ((*pmenv)->date, env_date); |
|
|
|
|
|
free (env_from); |
|
|
free (env_date); |
|
|
free (from); |
|
|
return 0; |
|
|
} |
|
|
|
|
|
static int |
|
|
_env_msg_date (envelope_t envelope, char *buf, size_t len, size_t *pnwrite) |
|
|
{ |
|
|
message_t msg = envelope_get_owner (envelope); |
|
|
struct msg_envelope *env = message_get_owner (msg); |
|
|
|
|
|
if (!env || !env->date) |
|
|
return EINVAL; |
|
|
strncpy (buf, env->date, len); |
|
|
buf[len-1] = 0; |
|
|
return 0; |
|
|
} |
|
|
|
|
|
static int |
|
|
_env_msg_sender (envelope_t envelope, char *buf, size_t len, size_t *pnwrite) |
|
|
{ |
|
|
message_t msg = envelope_get_owner (envelope); |
|
|
struct msg_envelope *env = message_get_owner (msg); |
|
|
|
|
|
if (!env || !env->from) |
|
|
return EINVAL; |
|
|
strncpy (buf, env->from, len); |
|
|
buf[len-1] = 0; |
|
|
return 0; |
|
|
} |
|
|
|
|
|
message_t |
|
|
mh_stream_to_message (stream_t instream) |
|
|
{ |
|
|
struct msg_envelope *mp; |
|
|
envelope_t env; |
|
|
message_t msg; |
|
|
stream_t draftstream; |
|
|
int rc; |
|
|
|
|
|
if ((rc = mhdraft_stream_create (&draftstream, instream, 0))) |
|
|
{ |
|
|
mh_error(_("cannot create draft message stream: %s"), |
|
|
mu_strerror (rc)); |
|
|
return NULL; |
|
|
} |
|
|
|
|
|
if ((rc = stream_open (draftstream))) |
|
|
{ |
|
|
mh_error(_("cannot open draft message stream: %s"), |
|
|
mu_strerror (rc)); |
|
|
stream_destroy (&draftstream, stream_get_owner (draftstream)); |
|
|
return NULL; |
|
|
} |
|
|
|
|
|
restore_envelope (instream, &mp); |
|
|
|
|
|
if (message_create (&msg, mp)) |
|
|
return NULL; |
|
|
|
|
|
message_set_stream (msg, draftstream, mp); |
|
|
|
|
|
if (envelope_create (&env, msg)) |
|
|
return NULL; |
|
|
|
|
|
envelope_set_date (env, _env_msg_date, msg); |
|
|
envelope_set_sender (env, _env_msg_sender, msg); |
|
|
message_set_envelope (msg, env, mp); |
|
|
|
|
|
return msg; |
|
|
} |
|
|
|
|
547 |
message_t |
message_t |
548 |
mh_file_to_message (char *folder, char *file_name) |
mh_file_to_message (char *folder, char *file_name) |
549 |
{ |
{ |