--  waitdemo2.adb
--    Shows how a parent process gets the child process exit status.

with
  Ada.Command_Line,
  Ada.Text_IO,
  Interfaces.C;

with Fork, Get_Process_ID, Wait;
with Process_Termination;

procedure Wait_Demo_2 is
   package Duration_Text_IO is new Ada.Text_IO.Fixed_IO (Duration);
   package int_Text_IO is new Ada.Text_IO.Integer_IO (Interfaces.C.int);

   procedure Child (Wait : in     Duration) is
      use Ada.Command_Line, Ada.Text_IO, Duration_Text_IO, int_Text_IO;
   begin
      Put ("Child ");
      Put (Get_Process_ID, Width => 0);
      Put (" here.  Will sleep for ");
      Put (Wait, Fore => 1, Aft => 3);
      Put_Line (" seconds.");
      delay Wait;
      Put_Line ("Child done.  About to exit.");
      Set_Exit_Status (42);
   end Child;

   procedure Parent (With_Child : in     Interfaces.C.int) is
      use Ada.Text_IO, int_Text_IO, Process_Termination;

      Child        : Interfaces.C.int;
      Child_Status : aliased Interfaces.C.int;
   begin
      Put_Line ("Waiting ...");
      Child := Wait (Child_Status'Access);
      Put ("Done waiting for ");
      Put (With_Child, Width => 0);
      Put (".  Wait returned: ");
      Put (Child, Width => 0);
      New_Line;

      Put ("Status: exit =");
      Put (Exit_Status'Image (Exit_Code (Child_Status)));
      Put (" signal =");
      Put (POSIX_Signal'Image (Signal (Child_Status)));
      Put (" core = ");
      Put (Boolean'Image (Core_Dumped (Child_Status)));
      New_Line;
   end Parent;

   use Ada.Text_IO, Interfaces.C, int_Text_IO;

   New_Process_ID : int;
begin
   Put ("Before: My process ID is ");
   Put (Get_Process_ID, Width => 0);
   New_Line;

   New_Process_ID := Fork;

   if New_Process_ID < 0 then
      Put_Line (Standard_Error, "fork() failed");
   elsif New_Process_ID = 0 then
      Child (Wait => 5.0);
   else
      Parent (With_Child => New_Process_ID);
   end if;
end Wait_Demo_2;

