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

Diff of /mailutils/mh/mhn.c

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

revision 1.6 by gray, Wed Mar 19 22:27:02 2003 UTC revision 1.7 by gray, Thu Mar 20 15:04:11 2003 UTC
# Line 595  _mhn_profile_get (char *prefix, char *ty Line 595  _mhn_profile_get (char *prefix, char *ty
595  }  }
596    
597  char *  char *
598    mhn_compose_command (char *typestr, int *flags, char *file)
599    {
600      char *p, *str;
601      char *type, *subtype, *typeargs;
602      struct obstack stk;
603    
604      split_content (typestr, &type, &subtype);
605      str = _mhn_profile_get ("compose", type, subtype, NULL);
606      if (!str)
607        return NULL;
608      
609      /* Expand macro-notations:
610        %a  additional arguments
611        %f  filename containing content
612        %F  %f, and stdout is not redirected
613        %s  subtype */
614    
615      obstack_init (&stk);
616      for (p = str; *p && isspace (*p); p++)
617        ;
618      
619      if (*p == '|')
620        p++;
621    
622      for ( ; *p; p++)
623        {
624          if (*p == '%')
625            {
626              switch (*++p)
627                {
628                case 'a':
629                  /* additional arguments */
630                  obstack_grow (&stk, typeargs, strlen (typeargs));
631                  break;
632                  
633                case 'F':
634                  /* %f, and stdout is not redirected */
635                  *flags |= MHN_STDIN;
636                  /*FALLTHRU*/
637                case 'f':
638                  obstack_grow (&stk, file, strlen (file));
639                  break;
640                  
641                case 's':
642                  /* subtype */
643                  obstack_grow (&stk, subtype, strlen (subtype));
644                  break;
645                  
646                default:
647                  obstack_1grow (&stk, *p);
648                  p++;
649                }
650            }
651          else
652            obstack_1grow (&stk, *p);
653        }
654      obstack_1grow (&stk, 0);
655    
656      free (type);
657      free (subtype);
658    
659      str = obstack_finish (&stk);
660      for (p = str; *p && isspace (*p); p++)
661        ;
662      if (!*p)
663        str = NULL;
664      else
665        str = strdup (str);
666    
667      obstack_free (&stk, NULL);
668      return str;
669    }
670    
671    char *
672  mhn_show_command (message_t msg, msg_part_t part, int *flags, char **tempfile)  mhn_show_command (message_t msg, msg_part_t part, int *flags, char **tempfile)
673  {  {
674    char *p, *str, *tmp;    char *p, *str, *tmp;
# Line 720  mhn_store_command (message_t msg, msg_pa Line 794  mhn_store_command (message_t msg, msg_pa
794    message_get_header (msg, &hdr);    message_get_header (msg, &hdr);
795    _get_content_type (hdr, &typestr, &typeargs);    _get_content_type (hdr, &typestr, &typeargs);
796    split_content (typestr, &type, &subtype);    split_content (typestr, &type, &subtype);
797    str = _mhn_profile_get ("show", type, subtype, "%m%P.%s");    str = _mhn_profile_get ("store", type, subtype, "%m%P.%s");
798        
799    /* Expand macro-notations:    /* Expand macro-notations:
800       %m  message number       %m  message number
# Line 1056  show_internal (message_t msg, msg_part_t Line 1130  show_internal (message_t msg, msg_part_t
1130  }  }
1131    
1132  int  int
1133  exec_internal (message_t msg, msg_part_t part, char *encoding, char *cmd)  mhn_exec (stream_t *str, char *cmd, int flags)
1134  {  {
1135    int rc;    int rc = prog_stream_create (str, cmd, MU_STREAM_WRITE);
   stream_t tmp;  
   
   rc = prog_stream_create (&tmp, cmd, MU_STREAM_WRITE);  
1136    if (rc)    if (rc)
1137      {      {
1138        mh_error (_("can't create proc stream (command %s): %s"),        mh_error (_("can't create proc stream (command %s): %s"),
1139                  cmd, mu_strerror (rc));                  cmd, mu_strerror (rc));
       return rc;  
1140      }      }
1141    rc = stream_open (tmp);    else
   if (rc)  
1142      {      {
1143        mh_error (_("can't open proc stream (command %s): %s"),        rc = stream_open (*str);
1144                  cmd, mu_strerror (rc));        if (rc)
1145        return rc;          mh_error (_("can't open proc stream (command %s): %s"),
1146                      cmd, mu_strerror (rc));
1147      }      }
1148      return rc;
1149    }
1150    
1151    int
1152    exec_internal (message_t msg, msg_part_t part, char *encoding, char *cmd,
1153                   int flags)
1154    {
1155      int rc;
1156      stream_t tmp;
1157    
1158      if ((rc = mhn_exec (&tmp, cmd, flags)))
1159        return rc;
1160    show_internal (msg, part, encoding, tmp);          show_internal (msg, part, encoding, tmp);      
1161    stream_destroy (&tmp, stream_get_owner (tmp));    stream_destroy (&tmp, stream_get_owner (tmp));
1162    return rc;    return rc;
# Line 1130  mhn_run_command (message_t msg, msg_part Line 1212  mhn_run_command (message_t msg, msg_part
1212        argcv_free (argc, argv);        argcv_free (argc, argv);
1213      }      }
1214    else    else
1215      rc = exec_internal (msg, part, encoding, cmd);      rc = exec_internal (msg, part, encoding, cmd, flags);
1216    
1217    return rc;    return rc;
1218  }  }
# Line 1190  show_handler (message_t msg, msg_part_t Line 1272  show_handler (message_t msg, msg_part_t
1272      {      {
1273        char *pager = mh_global_profile_get ("moreproc", getenv ("PAGER"));        char *pager = mh_global_profile_get ("moreproc", getenv ("PAGER"));
1274        if (pager)        if (pager)
1275          exec_internal (msg, part, encoding, pager);          exec_internal (msg, part, encoding, pager, 0);
1276        else        else
1277          show_internal (msg, part, encoding, out);          show_internal (msg, part, encoding, out);
1278      }      }
# Line 1870  edit_mime (char *cmd, struct compose_env Line 1952  edit_mime (char *cmd, struct compose_env
1952    body_t body;    body_t body;
1953    stream_t in, out = NULL, fstr;    stream_t in, out = NULL, fstr;
1954    char *encoding;    char *encoding;
1955    char *p;    char *p, *typestr;
1956      char *shell_cmd;
1957      int flags;
1958        
1959    if (!*msg)    if (!*msg)
1960      message_create (msg, NULL);      message_create (msg, NULL);
1961    message_get_header (*msg, &hdr);    message_get_header (*msg, &hdr);
1962    rc = parse_type_command (&cmd, env, hdr);    rc = parse_type_command (&cmd, env, hdr);
1963      if (rc)
1964        return 1;
1965      
1966    for (p = cmd + strlen (cmd) - 1; p > cmd && isspace (*p); p--)    for (p = cmd + strlen (cmd) - 1; p > cmd && isspace (*p); p--)
1967      ;      ;
1968    if (p == cmd)    p[1] = 0;
1969    
1970      _get_content_type (hdr, &typestr, NULL);
1971      shell_cmd = mhn_compose_command (typestr, &flags, cmd);
1972      free (typestr);
1973    
1974      /* Open the input stream, whatever it is */
1975      if (shell_cmd)
1976        {
1977          if (mhn_exec (&in, cmd, flags))
1978            return 1;
1979        }
1980      else if (p == cmd)
1981      {      {
1982        mh_error (_("%s:%lu: missing filename"),        mh_error (_("%s:%lu: missing filename"),
1983                  input_file,                  input_file,
# Line 1886  edit_mime (char *cmd, struct compose_env Line 1985  edit_mime (char *cmd, struct compose_env
1985        finish_msg (env, msg);        finish_msg (env, msg);
1986        return 1;        return 1;
1987      }      }
1988    p[1] = 0;    else
   
   /* Open input stream */  
   rc = file_stream_create (&in, cmd, MU_STREAM_READ);  
   if (rc)  
     {  
       mh_error (_("can't create input stream (file %s): %s"),  
                 cmd, mu_strerror (rc));  
       return rc;  
     }  
   rc = stream_open (in);  
   if (rc)  
1989      {      {
1990        mh_error (_("can't open input stream (file %s): %s"),        rc = file_stream_create (&in, cmd, MU_STREAM_READ);
1991                  cmd, mu_strerror (rc));        if (rc)
1992        stream_destroy (&in, stream_get_owner (in));          {
1993        return rc;            mh_error (_("can't create input stream (file %s): %s"),
1994                        cmd, mu_strerror (rc));
1995              return rc;
1996            }
1997          rc = stream_open (in);
1998          if (rc)
1999            {
2000              mh_error (_("can't open input stream (file %s): %s"),
2001                        cmd, mu_strerror (rc));
2002              stream_destroy (&in, stream_get_owner (in));
2003              return rc;
2004            }
2005      }      }
2006      
2007    /* Create filter */    /* Create filter */
2008    
2009    if (_get_hdr_value (hdr, MU_HEADER_CONTENT_TRANSFER_ENCODING, &encoding))    if (_get_hdr_value (hdr, MU_HEADER_CONTENT_TRANSFER_ENCODING, &encoding))
# Line 2183  mhn_compose () Line 2282  mhn_compose ()
2282    rename (name, input_file);    rename (name, input_file);
2283    
2284    free (name);    free (name);
   free (input_file);  
2285        
2286    return 0;    return 0;
2287  }  }

Legend:
Removed from v.1.6  
changed lines
  Added in v.1.7

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