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 |
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 |
} |
} |