/[mailutils]/mailutils/mail/shell.c
ViewVC logotype

Diff of /mailutils/mail/shell.c

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

revision 1.13 by polak, Sun Feb 9 12:33:01 2003 UTC revision 1.14 by gray, Tue Aug 12 11:33:26 2003 UTC
# Line 17  Line 17 
17    
18  #include "mail.h"  #include "mail.h"
19    
20    int
21    mail_execute (int shell, int argc, char **argv)
22    {
23      pid_t pid = fork ();
24    
25      if (pid == 0)
26        {
27          if (shell)
28            {
29              if (argc == 0)
30                {
31                  argv = xmalloc (sizeof (argv[0]) * 2);
32                  argv[0] = getenv ("SHELL");
33                  argv[1] = NULL;
34                  argc = 1;
35                }
36              else
37                {
38                  char *buf = NULL;
39    
40                  while (isspace (**argv))
41                    (*argv)++;
42                  argcv_string (argc, &argv[0], &buf);
43    
44                  /* 1(shell) + 1 (-c) + 1(arg) + 1 (null) = 4  */
45                  argv = xmalloc (4 * (sizeof (argv[0])));
46              
47                  argv[0] = getenv ("SHELL");
48                  argv[1] = "-c";
49                  argv[2] = buf;
50                  argv[3] = NULL;
51    
52                  argc = 3;
53                }
54            }
55          
56          execvp (argv[0], argv);
57          exit (1);
58        }
59      else if (pid > 0)
60        {
61          while (waitpid (pid, NULL, 0) == -1)
62            /* do nothing */;
63          return 0;
64        }
65      else if (pid < 0)
66        {
67          mu_error ("fork failed: %s", mu_strerror (errno));
68          return 1;
69        }
70    }
71    
72  /*  /*
73   * sh[ell] [command] -- GNU extension   * sh[ell] [command] -- GNU extension
74   * ![command] -- GNU extension   * ![command] -- GNU extension
# Line 27  mail_shell (int argc, char **argv) Line 79  mail_shell (int argc, char **argv)
79  {  {
80    if (argv[0][0] == '!' && strlen (argv[0]) > 1)    if (argv[0][0] == '!' && strlen (argv[0]) > 1)
81      {      {
       char *buf = NULL;  
82        argv[0][0] = ' ';        argv[0][0] = ' ';
83        argcv_string (argc, argv, &buf);        return mail_execute (1, argc, argv);
       if (buf)  
         {  
           int ret = util_do_command ("shell %s", &buf[1]);  
           free (buf);  
           return ret;  
         }  
       else  
         return util_do_command ("shell");  
84      }      }
85    else if (argc > 1)    else if (argc > 1)
86      {      {
87        int pid = fork ();        return mail_execute (0, argc-1, argv+1);
       if (pid == 0)  
         {  
           char **argvec;  
           char *buf = NULL;  
   
           /* 1(shell) + 1 (-c) + 1(arg) + 1 (null) = 4  */  
           argvec = xmalloc (4 * (sizeof (char *)));  
   
           argcv_string (argc-1, &argv[1], &buf);  
   
           argvec[0] = getenv ("SHELL");  
           argvec[1] = "-c";  
           argvec[2] = buf;  
           argvec[3] = NULL;  
   
           execvp (argvec[0], argvec);  
           free (buf); /* Being cute, nuke it when finish testing.  */  
           free (argvec);  
           return 1;  
         }  
         if (pid > 0)  
         {  
           while (waitpid(pid, NULL, 0) == -1)  
             /* do nothing */;  
           return 0;  
         }  
       return 1;  
88      }      }
89    else    else
90      {      {
91        return util_do_command ("shell %s", getenv("SHELL"));        return mail_execute (1, 0, NULL);
92      }      }
93    return 1;    return 1;
94  }  }

Legend:
Removed from v.1.13  
changed lines
  Added in v.1.14

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