/[mailutils]/mailutils/mh/mh_init.c
ViewVC logotype

Diff of /mailutils/mh/mh_init.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1.33 by gray, Fri Feb 21 13:01:55 2003 UTC revision 1.34 by gray, Sat Feb 22 22:35:25 2003 UTC
# Line 544  mh_file_copy (const char *from, const ch Line 544  mh_file_copy (const char *from, const ch
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  {  {

Legend:
Removed from v.1.33  
changed lines
  Added in v.1.34

savannah-hackers-public@gnu.org
ViewVC Help
Powered by ViewVC 1.1.26