@@ -93,6 +93,7 @@ enum opt {
9393 OPT_HELP = 'h' ,
9494 OPT_VERBOSE = 'v' ,
9595 OPT_QUIET = 'q' ,
96+ OPT_PARALLEL = 'p' ,
9697 OPT_USE_BEARSSL = 0x100 ,
9798 OPT_USE_OPENSSL ,
9899};
@@ -101,6 +102,7 @@ static struct option options[] = {
101102 { "help" , no_argument , NULL , OPT_HELP },
102103 { "verbose" , no_argument , NULL , OPT_VERBOSE },
103104 { "quiet" , no_argument , NULL , OPT_QUIET },
105+ { "parallel" , required_argument , NULL , OPT_PARALLEL },
104106 { "use-bearssl" , no_argument , NULL , OPT_USE_BEARSSL },
105107 { "use-openssl" , no_argument , NULL , OPT_USE_OPENSSL },
106108 { 0 , 0 , 0 , 0 },
@@ -121,9 +123,9 @@ static int usage(const char *name)
121123
122124int main (int argc , char * argv [])
123125{
124- const char * url ;
125126 int opt ;
126127 int index ;
128+ int parallel = 1 ;
127129#ifdef UPIPE_HAVE_BEARSSL_H
128130 bool use_bearssl = true;
129131#endif
@@ -134,7 +136,7 @@ int main(int argc, char *argv[])
134136 /*
135137 * parse options
136138 */
137- while ((opt = getopt_long (argc , argv , "hvq " , options , & index )) != -1 ) {
139+ while ((opt = getopt_long (argc , argv , "hvqp: " , options , & index )) != -1 ) {
138140 switch (opt ) {
139141 case OPT_HELP :
140142 usage (argv [0 ]);
@@ -151,6 +153,10 @@ int main(int argc, char *argv[])
151153 log_level ++ ;
152154 break ;
153155
156+ case OPT_PARALLEL :
157+ parallel = atoi (optarg );
158+ break ;
159+
154160#ifdef UPIPE_HAVE_BEARSSL_H
155161 case OPT_USE_BEARSSL :
156162 use_bearssl = true;
@@ -185,7 +191,6 @@ int main(int argc, char *argv[])
185191 exit (EXIT_FAILURE );
186192 return -1 ;
187193 }
188- url = argv [optind ];
189194
190195 struct umem_mgr * umem_mgr = umem_alloc_mgr_alloc ();
191196 assert (umem_mgr != NULL );
@@ -208,6 +213,9 @@ int main(int argc, char *argv[])
208213 assert (logger != NULL );
209214 logger = uprobe_upump_mgr_alloc (logger , upump_mgr );
210215 assert (logger != NULL );
216+ logger = uprobe_ubuf_mem_alloc (logger , umem_mgr , UBUF_POOL_DEPTH ,
217+ UBUF_POOL_DEPTH );
218+ assert (logger != NULL );
211219 logger = uprobe_http_redir_alloc (logger );
212220 assert (logger );
213221#ifdef UPIPE_HAVE_BEARSSL_H
@@ -224,31 +232,34 @@ int main(int argc, char *argv[])
224232 }
225233#endif
226234
227- logger = uprobe_ubuf_mem_alloc (logger , umem_mgr , UBUF_POOL_DEPTH ,
228- UBUF_POOL_DEPTH );
229- assert (logger != NULL );
230-
231- struct upipe_mgr * upipe_fsink_mgr = upipe_fsink_mgr_alloc ();
232- struct upipe * upipe_fsink = upipe_void_alloc (
233- upipe_fsink_mgr ,
234- uprobe_pfx_alloc (uprobe_use (logger ), log_level , "fsink" ));
235- upipe_mgr_release (upipe_fsink_mgr );
236- ubase_assert (upipe_fsink_set_path (
237- upipe_fsink , "/dev/stdout" , UPIPE_FSINK_OVERWRITE ));
235+ struct upipe * sources [parallel ];
236+ for (int i = 0 ; i < parallel ; i ++ ) {
237+ for (int j = optind ; j < argc ; j ++ ) {
238+ struct upipe_mgr * upipe_fsink_mgr = upipe_fsink_mgr_alloc ();
239+ struct upipe * upipe_fsink = upipe_void_alloc (
240+ upipe_fsink_mgr ,
241+ uprobe_pfx_alloc (uprobe_use (logger ), log_level , "fsink" ));
242+ upipe_mgr_release (upipe_fsink_mgr );
243+ ubase_assert (upipe_fsink_set_path (
244+ upipe_fsink , "/dev/stdout" , UPIPE_FSINK_OVERWRITE ));
238245
239- struct upipe_mgr * upipe_http_src_mgr = upipe_http_src_mgr_alloc ();
240- struct upipe * upipe_http_src = upipe_void_alloc (upipe_http_src_mgr ,
241- uprobe_pfx_alloc (uprobe_use (logger ), log_level , "http" ));
242- upipe_mgr_release (upipe_http_src_mgr ); // nop
243- assert (upipe_http_src != NULL );
244- ubase_assert (upipe_set_output_size (upipe_http_src , READ_SIZE ));
245- ubase_assert (upipe_set_uri (upipe_http_src , url ));
246- ubase_assert (upipe_set_output (upipe_http_src , upipe_fsink ));
247- upipe_release (upipe_fsink );
246+ struct upipe_mgr * upipe_http_src_mgr = upipe_http_src_mgr_alloc ();
247+ sources [i ] = upipe_void_alloc (
248+ upipe_http_src_mgr ,
249+ uprobe_pfx_alloc (uprobe_use (logger ), log_level , "http" ));
250+ upipe_mgr_release (upipe_http_src_mgr ); // nop
251+ assert (sources [i ] != NULL );
252+ ubase_assert (upipe_set_output_size (sources [i ], READ_SIZE ));
253+ ubase_assert (upipe_set_uri (sources [i ], argv [j ]));
254+ ubase_assert (upipe_set_output (sources [i ], upipe_fsink ));
255+ upipe_release (upipe_fsink );
256+ }
257+ }
248258
249259 upump_mgr_run (upump_mgr , NULL );
250260
251- upipe_release (upipe_http_src );
261+ for (int i = 0 ; i < parallel ; i ++ )
262+ upipe_release (sources [i ]);
252263
253264 upump_mgr_release (upump_mgr );
254265 uref_mgr_release (uref_mgr );
0 commit comments