Changeset 97cdbaf5
- Timestamp:
- Mar 11, 2012, 10:57:35 PM (13 years ago)
- Branches:
- master, release-1.10, release-1.9
- Children:
- a03a409
- Parents:
- 1f39ded
- git-author:
- David Benjamin <davidben@mit.edu> (01/23/12 00:38:29)
- git-committer:
- David Benjamin <davidben@mit.edu> (03/11/12 22:57:35)
- Files:
-
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
filterproc.c
r1f39ded r97cdbaf5 3 3 #include <poll.h> 4 4 5 int send_receive(int rfd, int wfd, const char *out, char **in) 5 /* Even in case of error, send_receive is responsible for closing wfd 6 * (to EOF the child) and rfd (for consistency). */ 7 static int send_receive(int rfd, int wfd, const char *out, char **in) 6 8 { 7 9 GString *str = g_string_new(""); … … 21 23 if(!out || !*out) { 22 24 /* Nothing to write. Close our end so the child doesn't hang waiting. */ 23 close(wfd); 25 close(wfd); wfd = -1; 24 26 out = NULL; 25 27 } … … 46 48 } 47 49 if(!out || !*out || fds[1].revents & (POLLERR | POLLHUP)) { 48 close(wfd); 50 close(wfd); wfd = -1; 49 51 out = NULL; 50 52 } … … 62 64 } 63 65 66 if (wfd >= 0) close(wfd); 67 close(rfd); 64 68 *in = g_string_free(str, err < 0); 65 69 return err; 66 70 } 67 71 68 int call_filter(const char * prog, const char *const *argv, const char *in, char **out, int *status)72 int call_filter(const char *const *argv, const char *in, char **out, int *status) 69 73 { 70 int err = 0; 71 pid_t pid; 72 int rfd[2]; 73 int wfd[2]; 74 int err; 75 GPid child_pid; 76 int child_stdin, child_stdout; 74 77 75 if((err = pipe(rfd))) goto out; 76 if((err = pipe(wfd))) goto out_close_rfd; 77 78 pid = fork(); 79 if(pid < 0) { 80 err = pid; 81 goto out_close_all; 82 } 83 if(pid) { 84 /* parent */ 85 close(rfd[1]); 86 close(wfd[0]); 87 err = send_receive(rfd[0], wfd[1], in, out); 88 if(err == 0) { 89 waitpid(pid, status, 0); 90 } 91 } else { 92 /* child */ 93 close(rfd[0]); 94 close(wfd[1]); 95 dup2(rfd[1], 1); 96 dup2(wfd[0], 0); 97 close(rfd[1]); 98 close(wfd[0]); 99 100 if(execvp(prog, (char *const *)argv)) { 101 _exit(-1); 102 } 78 if (!g_spawn_async_with_pipes(NULL, (char**)argv, NULL, 79 G_SPAWN_SEARCH_PATH | G_SPAWN_DO_NOT_REAP_CHILD, 80 NULL, NULL, 81 &child_pid, &child_stdin, &child_stdout, NULL, 82 NULL)) { 83 return 1; 103 84 } 104 85 105 out_close_all: 106 close(wfd[0]); 107 close(wfd[1]); 108 out_close_rfd: 109 close(rfd[0]); 110 close(rfd[1]); 111 out: 86 err = send_receive(child_stdout, child_stdin, in, out); 87 if (err == 0) { 88 waitpid(child_pid, status, 0); 89 } 112 90 return err; 113 91 } -
filterproc.h
r06adc25 r97cdbaf5 2 2 #define INC_BARNOWL_FILTER_PROC_H 3 3 4 int call_filter(const char *prog, 5 const char *const *argv, 4 int call_filter(const char *const *argv, 6 5 const char *in, 7 6 char **out, int *status); -
functions.c
rbd482c3 r97cdbaf5 405 405 406 406 zcrypt = g_build_filename(owl_get_bindir(), "zcrypt", NULL); 407 argv[0] = "zcrypt";407 argv[0] = zcrypt; 408 408 argv[1] = "-E"; 409 409 argv[2] = "-c"; argv[3] = owl_zwrite_get_class(z); … … 411 411 argv[6] = NULL; 412 412 413 rv = call_filter( zcrypt,argv, owl_zwrite_get_message(z), &cryptmsg, &status);413 rv = call_filter(argv, owl_zwrite_get_message(z), &cryptmsg, &status); 414 414 415 415 g_free(zcrypt); -
message.c
rbff1f22 r97cdbaf5 875 875 if (owl_global_is_zcrypt(&g) && !strcasecmp(n->z_opcode, "crypt")) { 876 876 const char *argv[] = { 877 "zcrypt",877 NULL, 878 878 "-D", 879 879 "-c", owl_message_get_class(m), … … 887 887 888 888 zcrypt = g_build_filename(owl_get_bindir(), "zcrypt", NULL); 889 890 rv = call_filter(zcrypt, argv, owl_message_get_body(m), &out, &status); 889 argv[0] = zcrypt; 890 891 rv = call_filter(argv, owl_message_get_body(m), &out, &status); 891 892 g_free(zcrypt); 892 893 -
tester.c
ra74a044 r97cdbaf5 3 3 #include "owl.h" 4 4 #undef WINDOW 5 #include "filterproc.h" 5 6 6 7 #include <stdio.h> … … 23 24 int owl_smartfilter_regtest(void); 24 25 int owl_history_regtest(void); 26 int call_filter_regtest(void); 25 27 26 28 extern void owl_perl_xs_init(pTHX); … … 113 115 numfailures += owl_smartfilter_regtest(); 114 116 numfailures += owl_history_regtest(); 117 numfailures += call_filter_regtest(); 115 118 if (numfailures) { 116 119 fprintf(stderr, "# *** WARNING: %d failures total\n", numfailures); … … 981 984 return numfailed; 982 985 } 986 987 int call_filter_regtest(void) 988 { 989 int numfailed = 0; 990 int ret; 991 char *out = NULL; 992 int status; 993 994 printf("# BEGIN testing call_filter\n"); 995 996 const char *cat_argv[] = { "cat", NULL }; 997 ret = call_filter(cat_argv, "Mangos!", &out, &status); 998 FAIL_UNLESS("call_filter cat", (ret == 0 && 999 status == 0 && 1000 strcmp(out, "Mangos!") == 0)); 1001 g_free(out); out = NULL; 1002 1003 ret = call_filter(cat_argv, "", &out, &status); 1004 FAIL_UNLESS("call_filter cat", (ret == 0 && 1005 status == 0 && 1006 strcmp(out, "") == 0)); 1007 g_free(out); out = NULL; 1008 1009 ret = call_filter(cat_argv, NULL, &out, &status); 1010 FAIL_UNLESS("call_filter cat", (ret == 0 && 1011 status == 0 && 1012 strcmp(out, "") == 0)); 1013 g_free(out); out = NULL; 1014 1015 printf("# END testing call_filter (%d failures)\n", numfailed); 1016 return numfailed; 1017 } -
zcrypt.c
rc6332f5 r97cdbaf5 774 774 NULL 775 775 }; 776 err = call_filter( "gpg",argv, in, &out, &status);776 err = call_filter(argv, in, &out, &status); 777 777 if(err || status) { 778 778 g_free(out); … … 857 857 if(!in) return FALSE; 858 858 859 err = call_filter( "gpg",argv, in, &out, &status);859 err = call_filter(argv, in, &out, &status); 860 860 if(err || status) { 861 861 g_free(out);
Note: See TracChangeset
for help on using the changeset viewer.