setsysnr.inc 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. {$ifdef FPC_COMPILING_SYSCALL_UNIT}
  2. { these variables are used inside osysc.inc file
  3. but needed here also if compiling syscall unit. }
  4. {$i errno.inc}
  5. {$i ptypes.inc}
  6. {$endif FPC_COMPILING_SYSCALL_UNIT}
  7. {$ifndef FPC_IS_SYSTEM}
  8. function geterrno:longint; external name 'FPC_SYS_GETERRNO';
  9. procedure seterrno(err:longint); external name 'FPC_SYS_SETERRNO';
  10. {$endif FPC_IS_SYSTEM}
  11. procedure SetSyscallNumbers;
  12. Var
  13. mib : array[0..1] of cint;
  14. release : shortstring;
  15. len : size_t;
  16. oerrno : cint;
  17. err : word;
  18. point, c : char;
  19. i, version_major, version_minor, version : cint;
  20. Begin
  21. mib[0] := 1{ CTL_KERN};
  22. mib[1] := 2{KERN_OSRELEASE};
  23. len := sizeof (release) - 1;
  24. oerrno := geterrno;
  25. if (do_syscall(syscall_nr_sysctl,TSysParam(@mib), 2, TSysParam(@release[1]),
  26. TSysParam(@len), TSysParam(NIL), 0) = -1) Then
  27. Begin
  28. if (geterrno = ESysENOMEM) Then
  29. seterrno(oerrno);
  30. version_major:=3;
  31. version_minor:=9;
  32. End
  33. else
  34. begin
  35. setlength(release,len);
  36. i:=0;
  37. while (i < len) do
  38. begin
  39. if (release[i]='.') then
  40. break;
  41. inc (i);
  42. end;
  43. setlength(release,i-1);
  44. val (release, version_major, err);
  45. if err<> 0 then
  46. version_major:=3;
  47. setlength(release,len);
  48. release:=copy(release,i+1,len);
  49. val (release, version_minor, err);
  50. if err<> 0 then
  51. version_minor:=9;
  52. end;
  53. version:=version_major * 1000 + version_minor;
  54. { version-specific checks and setting of compatibility flags can be inserted here }
  55. end;