@@ -16,7 +16,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
16
16
*/
17
17
18
18
19
- #define VERSION "1.2.2 "
19
+ #define VERSION "1.2.3 "
20
20
21
21
22
22
#undef _POSIX_C_SOURCE
@@ -86,6 +86,7 @@ typedef struct {
86
86
unsigned numthreads ;
87
87
unsigned threads_running ;
88
88
char * statefile ;
89
+ char * eof_marker ;
89
90
unsigned long long skip ;
90
91
sblist * job_infos ;
91
92
sblist * subst_entries ;
@@ -319,6 +320,7 @@ static int syntax(void) {
319
320
"available options:\n\n"
320
321
"-skip=XXX -threads=XXX -resume -statefile=/tmp/state -delayedflush\n"
321
322
"-delayedspinup=XXX -buffered -joinoutput -limits=mem=16M,cpu=10\n"
323
+ "-eof=XXX\n"
322
324
"-exec ./mycommand {}\n"
323
325
"\n"
324
326
"-skip=XXX\n"
@@ -327,6 +329,10 @@ static int syntax(void) {
327
329
" XXX=number of parallel processes to spawn\n"
328
330
"-resume\n"
329
331
" resume from last jobnumber stored in statefile\n"
332
+ "-eof=XXX\n"
333
+ " use XXX as the EOF marker on stdin\n"
334
+ " if the marker is encountered, behave as if stdin was closed\n"
335
+ " not compatible with pipe/bulk mode\n"
330
336
"-statefile=XXX\n"
331
337
" XXX=filename\n"
332
338
" saves last launched jobnumber into a file\n"
@@ -393,6 +399,9 @@ static int parse_args(int argc, char** argv) {
393
399
op_temp = op_get (op , SPL ("statefile" ));
394
400
prog_state .statefile = op_temp ;
395
401
402
+ op_temp = op_get (op , SPL ("eof" ));
403
+ prog_state .eof_marker = op_temp ;
404
+
396
405
op_temp = op_get (op , SPL ("skip" ));
397
406
prog_state .skip = op_temp ? strtoll (op_temp ,0 ,10 ) : 0 ;
398
407
if (op_hasflag (op , SPL ("resume" ))) {
@@ -585,6 +594,13 @@ static size_t count_linefeeds(const char *buf, size_t len) {
585
594
}
586
595
return cnt ;
587
596
}
597
+
598
+ static int match_eof (char * inbuf , size_t len ) {
599
+ if (!prog_state .eof_marker ) return 0 ;
600
+ size_t l = strlen (prog_state .eof_marker );
601
+ return l == len - 1 && !memcmp (prog_state .eof_marker , inbuf , l );
602
+ }
603
+
588
604
#define MAX_SUBSTS 16
589
605
static int dispatch_line (char * inbuf , size_t len , char * * argv ) {
590
606
char subst_buf [MAX_SUBSTS ][4096 ];
@@ -751,13 +767,17 @@ int main(int argc, char** argv) {
751
767
752
768
if (!p ) break ;
753
769
ptrdiff_t diff = (p - in ) + 1 ;
770
+ if (match_eof (in , diff )) {
771
+ exitcode = 0 ;
772
+ goto out ;
773
+ }
754
774
if (!dispatch_line (in , diff , argv ))
755
775
goto out ;
756
776
left -= diff ;
757
777
in += diff ;
758
778
}
759
779
if (!n ) {
760
- if (left ) dispatch_line (in , left , argv );
780
+ if (left && ! match_eof ( in , left ) ) dispatch_line (in , left , argv );
761
781
break ;
762
782
}
763
783
if (left > chunksize ) {
0 commit comments