lspawnfcgiunix.inc 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. uses
  2. Classes, BaseUnix;
  3. function SpawnFCGIProcess(App, Enviro: string; const aPort: Word): Integer;
  4. var
  5. TheSocket: TLSocket;
  6. i: Integer;
  7. SL: TStringList;
  8. aNil: Pointer = nil;
  9. Apps : AnsiString {$IF SIZEOF(CHAR)=1} absolute App{$endif};
  10. EnviroS : AnsiString {$IF SIZEOF(CHAR)=1} absolute Enviro{$endif};
  11. ppEnv, ppArgs: ppAnsiChar;
  12. Env : Array of AnsiString;
  13. Len : Integer;
  14. begin
  15. {$IF SIZEOF(CHAR)=2}
  16. Apps:=UTF8Encode(App);
  17. Enviros:=UTF8Encode(EnviroS);
  18. {$ENDIF}
  19. Result:=FpFork;
  20. if Result = 0 then begin
  21. ppArgs:=@aNil;
  22. for i:=3 to 10000 do
  23. CloseSocket(i);
  24. if CloseSocket(StdInputHandle) <> 0 then
  25. Exit(LSocketError);
  26. TheSocket:=TLSocket.Create;
  27. TheSocket.SetState(ssBlocking);
  28. if not TheSocket.Listen(aPort) then
  29. Exit(LSocketError);
  30. ppEnv:=@aNil;
  31. if Length(Enviro) > 0 then begin
  32. SL:=TStringList.Create;
  33. repeat
  34. i:=Pos(':', Enviro);
  35. if i > 0 then begin
  36. SL.Add(Copy(Enviro, 1, i - 1));
  37. Delete(Enviro, 1, i);
  38. end else
  39. SL.Add(Enviro);
  40. until i = 0;
  41. Len:=SL.Count;
  42. SetLength(Env,Len);
  43. For I:=0 to Len-1 do
  44. begin
  45. {$IF SIZEOF(CHAR)=2}
  46. Env[i]:=UTF8Encode(SL[I]);
  47. {$ELSE}
  48. Env[i]:=SL[i];
  49. {$ENDIF}
  50. end;
  51. GetMem(ppEnv, SizeOf(pChar) * (Len+1));
  52. for i:=0 to Len-1 do
  53. ppEnv[i]:=pAnsiChar(Env[i]);
  54. ppEnv[Len]:=nil;
  55. end;
  56. FpExecve(pAnsiChar(App), ppArgs, ppEnv);
  57. end else if Result > 0 then
  58. Result:=0; // it went ok
  59. end;