@@ -208,6 +208,8 @@ struct spawn_info {
208
208
char * prog ;
209
209
char * * argv ;
210
210
int std_fds [3 ];
211
+ int set_pgid ;
212
+ pid_t pgid ;
211
213
};
212
214
213
215
static void subprocess (int failure_fd , struct spawn_info * info )
@@ -216,6 +218,13 @@ static void subprocess(int failure_fd, struct spawn_info *info)
216
218
struct sigaction sa ;
217
219
sigset_t sigset ;
218
220
221
+ if (info -> set_pgid ) {
222
+ if (setpgid (0 , info -> pgid ) == -1 ) {
223
+ subprocess_failure (failure_fd , "setpgid" , NOTHING );
224
+ return ;
225
+ }
226
+ }
227
+
219
228
/* Restore all signals to their default behavior before unblocking
220
229
them, to avoid invoking handlers from the parent */
221
230
sa .sa_handler = SIG_DFL ;
@@ -349,7 +358,8 @@ CAMLprim value spawn_unix(value v_env,
349
358
value v_stdin ,
350
359
value v_stdout ,
351
360
value v_stderr ,
352
- value v_use_vfork )
361
+ value v_use_vfork ,
362
+ value v_setpgid )
353
363
{
354
364
CAMLparam4 (v_env , v_cwd , v_prog , v_argv );
355
365
pid_t ret ;
@@ -394,6 +404,10 @@ CAMLprim value spawn_unix(value v_env,
394
404
info .env =
395
405
Is_block (v_env ) ?
396
406
alloc_string_vect (Field (v_env , 0 )) : copy_c_string_array (environ );
407
+ info .set_pgid = Is_block (v_setpgid );
408
+ info .pgid =
409
+ Is_block (v_setpgid ) ?
410
+ Long_val (Field (v_setpgid , 0 )) : 0 ;
397
411
398
412
caml_enter_blocking_section ();
399
413
enter_safe_pipe_section ();
@@ -508,7 +522,8 @@ CAMLprim value spawn_unix(value v_env,
508
522
value v_stdin ,
509
523
value v_stdout ,
510
524
value v_stderr ,
511
- value v_use_vfork )
525
+ value v_use_vfork ,
526
+ value v_setpgid )
512
527
{
513
528
(void )v_env ;
514
529
(void )v_cwd ;
@@ -518,6 +533,7 @@ CAMLprim value spawn_unix(value v_env,
518
533
(void )v_stdout ;
519
534
(void )v_stderr ;
520
535
(void )v_use_vfork ;
536
+ (void )v_setpgid ;
521
537
unix_error (ENOSYS , "spawn_unix" , Nothing );
522
538
}
523
539
@@ -598,7 +614,8 @@ CAMLprim value spawn_unix_byte(value * argv)
598
614
argv [4 ],
599
615
argv [5 ],
600
616
argv [6 ],
601
- argv [7 ]);
617
+ argv [7 ],
618
+ argv [8 ]);
602
619
}
603
620
604
621
CAMLprim value spawn_windows_byte (value * argv )
0 commit comments