setsysnr.inc 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  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. var
  9. use_openbsd_getdirentries_49 : boolean = false;
  10. use_getdirentries_syscall : boolean = true;
  11. function geterrno:longint; external name 'FPC_SYS_GETERRNO';
  12. procedure seterrno(err:longint); external name 'FPC_SYS_SETERRNO';
  13. {$endif FPC_IS_SYSTEM}
  14. procedure SetSyscallNumbers;
  15. Var
  16. mib : array[0..1] of cint;
  17. release : shortstring;
  18. len : size_t;
  19. oerrno : cint;
  20. err : word;
  21. point, c : char;
  22. i, version_major, version_minor, version : cint;
  23. Begin
  24. mib[0] := 1{ CTL_KERN};
  25. mib[1] := 2{KERN_OSRELEASE};
  26. len := sizeof (release) - 1;
  27. oerrno := geterrno;
  28. if (do_syscall(syscall_nr___sysctl,TSysParam(@mib), 2, TSysParam(@release[1]),
  29. TSysParam(@len), TSysParam(NIL), 0) = -1) Then
  30. Begin
  31. if (geterrno = ESysENOMEM) Then
  32. seterrno(oerrno);
  33. version_major:=3;
  34. version_minor:=9;
  35. End
  36. else
  37. begin
  38. setlength(release,len);
  39. i:=0;
  40. while (i < len) do
  41. begin
  42. if (release[i]='.') then
  43. break;
  44. inc (i);
  45. end;
  46. setlength(release,i-1);
  47. val (release, version_major, err);
  48. if err<> 0 then
  49. version_major:=3;
  50. setlength(release,len);
  51. release:=copy(release,i+1,len);
  52. val (release, version_minor, err);
  53. if err<> 0 then
  54. version_minor:=9;
  55. end;
  56. version:=version_major * 1000 + version_minor;
  57. if version >= 5005 then
  58. begin
  59. syscall_nr_waitpid := syscall_nr_wait4_55;
  60. syscall_nr_setitimer := syscall_nr_setitimer_55;
  61. syscall_nr_getitimer := syscall_nr_getitimer_55;
  62. syscall_nr_gettimeofday := syscall_nr_gettimeofday_55;
  63. syscall_nr_settimeofday := syscall_nr_settimeofday_55;
  64. syscall_nr_clock_gettime := syscall_nr_clock_gettime_55;
  65. syscall_nr_clock_settime := syscall_nr_clock_settime_55;
  66. syscall_nr_clock_getres := syscall_nr_clock_getres_55;
  67. syscall_nr_select := syscall_nr_select_55;
  68. syscall_nr_getrusage := syscall_nr_getrusage_55;
  69. syscall_nr_utimes := syscall_nr_utimes_55;
  70. syscall_nr_futimes := syscall_nr_futimes_55;
  71. syscall_nr_nanosleep := syscall_nr_nanosleep_55;
  72. syscall_nr_kevent := syscall_nr_kevent_55;
  73. end;
  74. if version>= 5004 then
  75. begin
  76. syscall_nr_statfs := syscall_nr_statfs_54;
  77. syscall_nr_fstatfs := syscall_nr_fstatfs_54;
  78. syscall_nr_fhstatfs := syscall_nr_fhstatfs_54;
  79. end
  80. else if version >= 4004 then
  81. begin
  82. syscall_nr_statfs := syscall_nr_statfs_44;
  83. syscall_nr_fstatfs := syscall_nr_fstatfs_44;
  84. syscall_nr_fhstatfs := syscall_nr_fhstatfs_44;
  85. end
  86. else if version < 2006 then
  87. begin
  88. syscall_nr_statfs := syscall_nr_statfs_20;
  89. syscall_nr_fstatfs := syscall_nr_fstatfs_20;
  90. syscall_nr_pipe := syscall_nr_pipe_20;
  91. end;
  92. if version>= 5005 then
  93. begin
  94. syscall_nr_stat := syscall_nr_stat_55;
  95. syscall_nr_fstat := syscall_nr_fstat_55;
  96. syscall_nr_lstat := syscall_nr_lstat_55;
  97. syscall_nr_fstatat := syscall_nr_fstatat_55;
  98. end
  99. else if version < 3006 then
  100. begin
  101. syscall_nr_stat := syscall_nr_stat_20;
  102. syscall_nr_fstat := syscall_nr_fstat_20;
  103. syscall_nr_lstat := syscall_nr_lstat_20;
  104. syscall_nr_fhstat := syscall_nr_fhstat_20;
  105. end;
  106. if version < 3005 then
  107. syscall_nr_sigaltstack := syscall_nr_sigaltstack_20;
  108. if version = 5001 then
  109. syscall_nr___tfork := syscall_nr___tfork_51
  110. else if version > 5001 then
  111. syscall_nr___tfork := syscall_nr___tfork_52;
  112. if version >= 5005 then
  113. begin
  114. { FIXME: what should we do here? }
  115. syscall_nr_getdirentries := -1;
  116. use_getdirentries_syscall:=false;
  117. end
  118. else if version >= 4009 then
  119. begin
  120. syscall_nr_getdirentries := syscall_nr_getdirentries_49;
  121. use_openbsd_getdirentries_49:=true;
  122. end;
  123. end;