github.com/guyezi/gofrontend@v0.0.0-20200228202240-7a62a49e62c0/libgo/runtime/go-nosys.c (about) 1 /* go-nosys.c -- functions missing from system. 2 3 Copyright 2012 The Go Authors. All rights reserved. 4 Use of this source code is governed by a BSD-style 5 license that can be found in the LICENSE file. */ 6 7 /* This file exists to provide definitions for functions that are 8 missing from libc, according to the configure script. This permits 9 the Go syscall package to not worry about whether the functions 10 exist or not. */ 11 12 #include "config.h" 13 14 #include <errno.h> 15 #include <fcntl.h> 16 #include <math.h> 17 #include <pthread.h> 18 #include <stdint.h> 19 #include <stdlib.h> 20 #include <string.h> 21 #include <sys/types.h> 22 #include <sys/resource.h> 23 #include <sys/socket.h> 24 #include <sys/stat.h> 25 #include <sys/time.h> 26 #include <sys/wait.h> 27 #include <time.h> 28 #include <unistd.h> 29 30 #ifndef HAVE_OFF64_T 31 typedef signed int off64_t __attribute__ ((mode (DI))); 32 #endif 33 34 #ifndef HAVE_LOFF_T 35 typedef off64_t loff_t; 36 #endif 37 38 #ifndef HAVE_ACCEPT4 39 struct sockaddr; 40 int 41 accept4 (int sockfd __attribute__ ((unused)), 42 struct sockaddr *addr __attribute__ ((unused)), 43 socklen_t *addrlen __attribute__ ((unused)), 44 int flags __attribute__ ((unused))) 45 { 46 errno = ENOSYS; 47 return -1; 48 } 49 #endif 50 51 #ifndef HAVE_DUP3 52 int 53 dup3 (int oldfd __attribute__ ((unused)), 54 int newfd __attribute__ ((unused)), 55 int flags __attribute__ ((unused))) 56 { 57 errno = ENOSYS; 58 return -1; 59 } 60 #endif 61 62 #ifndef HAVE_EPOLL_CREATE1 63 int 64 epoll_create1 (int flags __attribute__ ((unused))) 65 { 66 errno = ENOSYS; 67 return -1; 68 } 69 #endif 70 71 #ifndef HAVE_FACCESSAT 72 int 73 faccessat (int fd __attribute__ ((unused)), 74 const char *pathname __attribute__ ((unused)), 75 int mode __attribute__ ((unused)), 76 int flags __attribute__ ((unused))) 77 { 78 errno = ENOSYS; 79 return -1; 80 } 81 #endif 82 83 #ifndef HAVE_FALLOCATE 84 int 85 fallocate (int fd __attribute__ ((unused)), 86 int mode __attribute__ ((unused)), 87 off_t offset __attribute__ ((unused)), 88 off_t len __attribute__ ((unused))) 89 { 90 errno = ENOSYS; 91 return -1; 92 } 93 #endif 94 95 #ifndef HAVE_FCHMODAT 96 int 97 fchmodat (int dirfd __attribute__ ((unused)), 98 const char *pathname __attribute__ ((unused)), 99 mode_t mode __attribute__ ((unused)), 100 int flags __attribute__ ((unused))) 101 { 102 errno = ENOSYS; 103 return -1; 104 } 105 #endif 106 107 #ifndef HAVE_FCHOWNAT 108 int 109 fchownat (int dirfd __attribute__ ((unused)), 110 const char *pathname __attribute__ ((unused)), 111 uid_t owner __attribute__ ((unused)), 112 gid_t group __attribute__ ((unused)), 113 int flags __attribute__ ((unused))) 114 { 115 errno = ENOSYS; 116 return -1; 117 } 118 #endif 119 120 #ifndef HAVE_FUTIMESAT 121 int 122 futimesat (int dirfd __attribute__ ((unused)), 123 const char *pathname __attribute__ ((unused)), 124 const struct timeval times[2] __attribute__ ((unused))) 125 { 126 errno = ENOSYS; 127 return -1; 128 } 129 #endif 130 131 #ifndef HAVE_GETXATTR 132 ssize_t 133 getxattr (const char *path __attribute__ ((unused)), 134 const char *name __attribute__ ((unused)), 135 void *value __attribute__ ((unused)), 136 size_t size __attribute__ ((unused))) 137 { 138 errno = ENOSYS; 139 return -1; 140 } 141 #endif 142 143 #ifndef HAVE_INOTIFY_ADD_WATCH 144 int 145 inotify_add_watch (int fd __attribute__ ((unused)), 146 const char* pathname __attribute__ ((unused)), 147 uint32_t mask __attribute__ ((unused))) 148 { 149 errno = ENOSYS; 150 return -1; 151 } 152 #endif 153 154 #ifndef HAVE_INOTIFY_INIT 155 int 156 inotify_init (void) 157 { 158 errno = ENOSYS; 159 return -1; 160 } 161 #endif 162 163 #ifndef HAVE_INOTIFY_INIT1 164 int 165 inotify_init1 (int flags __attribute__ ((unused))) 166 { 167 errno = ENOSYS; 168 return -1; 169 } 170 #endif 171 172 #ifndef HAVE_INOTIFY_RM_WATCH 173 int 174 inotify_rm_watch (int fd __attribute__ ((unused)), 175 uint32_t wd __attribute__ ((unused))) 176 { 177 errno = ENOSYS; 178 return -1; 179 } 180 #endif 181 182 #ifndef HAVE_LISTXATTR 183 ssize_t 184 listxattr (const char *path __attribute__ ((unused)), 185 char *list __attribute__ ((unused)), 186 size_t size __attribute__ ((unused))) 187 { 188 errno = ENOSYS; 189 return -1; 190 } 191 #endif 192 193 #ifndef HAVE_MKDIRAT 194 int 195 mkdirat (int dirfd __attribute__ ((unused)), 196 const char *pathname __attribute__ ((unused)), 197 mode_t mode __attribute__ ((unused))) 198 { 199 errno = ENOSYS; 200 return -1; 201 } 202 #endif 203 204 #ifndef HAVE_MKNODAT 205 int 206 mknodat (int dirfd __attribute__ ((unused)), 207 const char *pathname __attribute__ ((unused)), 208 mode_t mode __attribute__ ((unused)), 209 dev_t dev __attribute__ ((unused))) 210 { 211 errno = ENOSYS; 212 return -1; 213 } 214 #endif 215 216 #ifndef HAVE_OPENAT 217 int 218 openat (int dirfd __attribute__ ((unused)), 219 const char *pathname __attribute__ ((unused)), 220 int oflag __attribute__ ((unused)), 221 ...) 222 { 223 errno = ENOSYS; 224 return -1; 225 } 226 #endif 227 228 #ifndef HAVE_PIPE2 229 int 230 pipe2 (int pipefd[2] __attribute__ ((unused)), 231 int flags __attribute__ ((unused))) 232 { 233 errno = ENOSYS; 234 return -1; 235 } 236 #endif 237 238 #ifndef HAVE_REMOVEXATTR 239 int 240 removexattr (const char *path __attribute__ ((unused)), 241 const char *name __attribute__ ((unused))) 242 { 243 errno = ENOSYS; 244 return -1; 245 } 246 #endif 247 248 #ifndef HAVE_RENAMEAT 249 int 250 renameat (int olddirfd __attribute__ ((unused)), 251 const char *oldpath __attribute__ ((unused)), 252 int newdirfd __attribute__ ((unused)), 253 const char *newpath __attribute__ ((unused))) 254 { 255 errno = ENOSYS; 256 return -1; 257 } 258 #endif 259 260 #ifndef HAVE_SETXATTR 261 int 262 setxattr (const char *path __attribute__ ((unused)), 263 const char *name __attribute__ ((unused)), 264 const void *value __attribute__ ((unused)), 265 size_t size __attribute__ ((unused)), 266 int flags __attribute__ ((unused))) 267 { 268 errno = ENOSYS; 269 return -1; 270 } 271 #endif 272 273 #ifndef HAVE_SPLICE 274 int 275 splice (int fd __attribute__ ((unused)), 276 loff_t *off_in __attribute__ ((unused)), 277 int fd_out __attribute__ ((unused)), 278 loff_t *off_out __attribute__ ((unused)), 279 size_t len __attribute__ ((unused)), 280 unsigned int flags __attribute__ ((unused))) 281 { 282 errno = ENOSYS; 283 return -1; 284 } 285 #endif 286 287 #ifndef HAVE_SYNC_FILE_RANGE 288 int 289 sync_file_range (int fd __attribute__ ((unused)), 290 off64_t offset __attribute__ ((unused)), 291 off64_t nbytes __attribute__ ((unused)), 292 unsigned int flags __attribute__ ((unused))) 293 { 294 errno = ENOSYS; 295 return -1; 296 } 297 #endif 298 299 #ifndef HAVE_TEE 300 int 301 tee (int fd_in __attribute__ ((unused)), 302 int fd_out __attribute__ ((unused)), 303 size_t len __attribute__ ((unused)), 304 unsigned int flags __attribute__ ((unused))) 305 { 306 errno = ENOSYS; 307 return -1; 308 } 309 #endif 310 311 #ifndef HAVE_UNLINKAT 312 int 313 unlinkat (int dirfd __attribute__ ((unused)), 314 const char *pathname __attribute__ ((unused)), 315 int flags __attribute__ ((unused))) 316 { 317 errno = ENOSYS; 318 return -1; 319 } 320 #endif 321 322 #ifndef HAVE_UNSHARE 323 int 324 unshare (int flags __attribute__ ((unused))) 325 { 326 errno = ENOSYS; 327 return -1; 328 } 329 #endif 330 331 #ifndef HAVE_UTIMENSAT 332 struct timespec; 333 int 334 utimensat(int dirfd __attribute__ ((unused)), 335 const char *pathname __attribute__ ((unused)), 336 const struct timespec times[2] __attribute__ ((unused)), 337 int flags __attribute__ ((unused))) 338 { 339 errno = ENOSYS; 340 return -1; 341 } 342 #endif 343 344 345 #ifndef HAVE_MINCORE 346 int 347 mincore(void *addr __attribute__ ((unused)), 348 size_t length __attribute__ ((unused)), 349 unsigned char *vec __attribute__ ((unused))) 350 { 351 errno = ENOSYS; 352 return -1; 353 } 354 #endif 355 356 /* Long double math functions. These are needed on old i386 systems 357 that don't have them in libm. The compiler translates calls to 358 these functions on float64 to call an 80-bit floating point 359 function instead, because when optimizing that function can be 360 executed as an x87 instructure. However, when not optimizing, this 361 translates into a call to the math function. So on systems that 362 don't provide these functions, we provide a version that just calls 363 the float64 version. */ 364 365 #ifndef HAVE_COSL 366 long double 367 cosl (long double a) 368 { 369 return (long double) cos ((double) a); 370 } 371 #endif 372 373 #ifndef HAVE_EXPL 374 long double 375 expl (long double a) 376 { 377 return (long double) exp ((double) a); 378 } 379 #endif 380 381 #ifndef HAVE_LOGL 382 long double 383 logl (long double a) 384 { 385 return (long double) log ((double) a); 386 } 387 #endif 388 389 #ifndef HAVE_SINL 390 long double 391 sinl (long double a) 392 { 393 return (long double) sin ((double) a); 394 } 395 #endif 396 397 #ifndef HAVE_TANL 398 long double 399 tanl (long double a) 400 { 401 return (long double) tan ((double) a); 402 } 403 #endif 404 405 #ifndef HAVE_ACOSL 406 long double 407 acosl (long double a) 408 { 409 return (long double) acos ((double) a); 410 } 411 #endif 412 413 #ifndef HAVE_ASINL 414 long double 415 asinl (long double a) 416 { 417 return (long double) asin ((double) a); 418 } 419 #endif 420 421 #ifndef HAVE_ATANL 422 long double 423 atanl (long double a) 424 { 425 return (long double) atan ((double) a); 426 } 427 #endif 428 429 #ifndef HAVE_ATAN2L 430 long double 431 atan2l (long double a, long double b) 432 { 433 return (long double) atan2 ((double) a, (double) b); 434 } 435 #endif 436 437 #ifndef HAVE_EXPM1L 438 long double 439 expm1l (long double a) 440 { 441 return (long double) expm1 ((double) a); 442 } 443 #endif 444 445 #ifndef HAVE_LDEXPL 446 long double 447 ldexpl (long double a, int exp) 448 { 449 return (long double) ldexp ((double) a, exp); 450 } 451 #endif 452 453 #ifndef HAVE_LOG10L 454 long double 455 log10l (long double a) 456 { 457 return (long double) log10 ((double) a); 458 } 459 #endif 460 461 #ifndef HAVE_LOG1PL 462 long double 463 log1pl (long double a) 464 { 465 return (long double) log1p ((double) a); 466 } 467 #endif 468 469 #ifndef HAVE_STRERROR_R 470 471 /* Some old systems do not have strerror_r. This is a replacement. 472 It assumes that nothing else in the program calls strerror. */ 473 474 static pthread_mutex_t strerror_lock = PTHREAD_MUTEX_INITIALIZER; 475 476 int 477 strerror_r (int errnum, char *buf, size_t buflen) 478 { 479 int i; 480 char *errmsg; 481 size_t len; 482 int ret; 483 484 i = pthread_mutex_lock (&strerror_lock); 485 if (i != 0) 486 abort (); 487 488 errmsg = strerror (errnum); 489 len = strlen (errmsg); 490 if (len >= buflen) 491 ret = ERANGE; 492 else 493 { 494 memcpy (buf, errmsg, len + 1); 495 ret = 0; 496 } 497 498 i = pthread_mutex_unlock (&strerror_lock); 499 if (i != 0) 500 abort (); 501 502 return ret; 503 } 504 505 #endif /* ! HAVE_STRERROR_R */ 506 507 #ifndef HAVE_SYSCALL 508 int 509 syscall(int number __attribute__ ((unused)), ...) 510 { 511 errno = ENOSYS; 512 return -1; 513 } 514 #endif 515 516 #ifndef HAVE_WAIT4 517 518 /* Some old systems do not have wait4. This is a replacement that 519 uses waitpid. */ 520 521 pid_t 522 wait4 (pid_t pid, int *status, int options, struct rusage *rusage __attribute__ ((unused))) 523 { 524 return waitpid (pid, status, options); 525 } 526 527 #endif