1 /* $NetBSD: compat_defs.h,v 1.23 2002/11/29 13:00:22 lukem Exp $ */ 2 3 #ifndef __NETBSD_COMPAT_DEFS_H__ 4 #define __NETBSD_COMPAT_DEFS_H__ 5 6 /* Work around some complete brain damage. */ 7 8 /* 9 * Linux: <features.h> turns on _POSIX_SOURCE by default, even though the 10 * program (not the OS) should do that. Preload <features.h> to keep any 11 * of this crap from being pulled in, and undefine _POSIX_SOURCE. 12 */ 13 14 #if defined(__linux__) && HAVE_FEATURES_H 15 #include <features.h> 16 #endif 17 18 #undef _POSIX_SOURCE 19 #undef _POSIX_C_SOURCE 20 21 /* System headers needed for (re)definitions below. */ 22 23 #include <sys/types.h> 24 #include <sys/mman.h> 25 #include <sys/param.h> 26 #include <sys/stat.h> 27 #include <sys/time.h> 28 #include <errno.h> 29 #include <fcntl.h> 30 #include <grp.h> 31 #include <limits.h> 32 #include <paths.h> 33 #include <stdarg.h> 34 #include <stdio.h> 35 #include <stdlib.h> 36 #include <string.h> 37 38 #if HAVE_SYS_CDEFS_H 39 #include <sys/cdefs.h> 40 #endif 41 #if HAVE_SYS_SYSLIMITS_H 42 #include <sys/syslimits.h> 43 #endif 44 #if HAVE_SYS_SYSMACROS_H 45 /* major(), minor() on SVR4 */ 46 #include <sys/sysmacros.h> 47 #endif 48 #if HAVE_INTTYPES_H 49 #include <inttypes.h> 50 #endif 51 #if HAVE_STDDEF_H 52 #include <stddef.h> 53 #endif 54 55 /* We don't include <pwd.h> here, so that "compat_pwd.h" works. */ 56 struct passwd; 57 58 /* Assume an ANSI compiler for the host. */ 59 60 #undef __P 61 #define __P(x) x 62 63 #ifndef __BEGIN_DECLS 64 #define __BEGIN_DECLS 65 #endif 66 #ifndef __END_DECLS 67 #define __END_DECLS 68 #endif 69 70 /* Some things usually in BSD <sys/cdefs.h>. */ 71 72 #ifndef __CONCAT 73 #define __CONCAT(x,y) x ## y 74 #endif 75 #if !defined(__attribute__) && !defined(__GNUC__) 76 #define __attribute__(x) 77 #endif 78 #ifndef __RENAME 79 #define __RENAME(x) 80 #endif 81 #undef __aconst 82 #define __aconst 83 #undef __dead 84 #define __dead 85 #undef __restrict 86 #define __restrict 87 88 /* Dirent support. */ 89 90 #if HAVE_DIRENT_H 91 # include <dirent.h> 92 # define NAMLEN(dirent) (strlen((dirent)->d_name)) 93 #else 94 # define dirent direct 95 # define NAMLEN(dirent) ((dirent)->d_namlen) 96 # if HAVE_SYS_NDIR_H 97 # include <sys/ndir.h> 98 # endif 99 # if HAVE_SYS_DIR_H 100 # include <sys/dir.h> 101 # endif 102 # if HAVE_NDIR_H 103 # include <ndir.h> 104 # endif 105 #endif 106 107 /* Type substitutes. */ 108 109 #if !HAVE_ID_T 110 typedef unsigned long id_t; 111 #endif 112 113 /* Prototypes for replacement functions. */ 114 115 #if !HAVE_ASPRINTF 116 int asprintf(char **, const char *, ...); 117 #endif 118 119 #if !HAVE_ASNPRINTF 120 int asnprintf(char **, size_t, const char *, ...); 121 #endif 122 123 #if !HAVE_BASENAME 124 char *basename(char *); 125 #endif 126 127 #if !HAVE_DECL_OPTIND 128 int getopt(int, char *const *, const char *); 129 extern char *optarg; 130 extern int optind, opterr, optopt; 131 #endif 132 133 #if !HAVE_DIRNAME 134 char *dirname(char *); 135 #endif 136 137 #if !HAVE_DIRFD 138 #if HAVE_DIR_DD_FD 139 #define dirfd(dirp) ((dirp)->dd_fd) 140 #else 141 #error cannot figure out how to turn a DIR * into a fd 142 #endif 143 #endif 144 145 #if !HAVE_ERR_H 146 void err(int, const char *, ...); 147 void errx(int, const char *, ...); 148 void warn(const char *, ...); 149 void warnx(const char *, ...); 150 #endif 151 152 #if !HAVE_FGETLN 153 char *fgetln(FILE *, size_t *); 154 #endif 155 156 #if !HAVE_FLOCK 157 # define LOCK_SH 0x01 158 # define LOCK_EX 0x02 159 # define LOCK_NB 0x04 160 # define LOCK_UN 0x08 161 int flock(int, int); 162 #endif 163 164 #if !HAVE_FPARSELN 165 # define FPARSELN_UNESCESC 0x01 166 # define FPARSELN_UNESCCONT 0x02 167 # define FPARSELN_UNESCCOMM 0x04 168 # define FPARSELN_UNESCREST 0x08 169 # define FPARSELN_UNESCALL 0x0f 170 char *fparseln(FILE *, size_t *, size_t *, const char [3], int); 171 #endif 172 173 #if !HAVE_ISSETUGID 174 int issetugid(void); 175 #endif 176 177 #if !HAVE_ISBLANK && !defined(isblank) 178 #define isblank(x) ((x) == ' ' || (x) == '\t') 179 #endif 180 181 #if !HAVE_LCHFLAGS 182 int lchflags(const char *, u_long); 183 #endif 184 185 #if !HAVE_LCHMOD 186 int lchmod(const char *, mode_t); 187 #endif 188 189 #if !HAVE_LCHOWN 190 int lchown(const char *, uid_t, gid_t); 191 #endif 192 193 #if !HAVE_MACHINE_BSWAP_H 194 #define bswap16(x) ((((x) << 8) & 0xff00) | (((x) >> 8) & 0x00ff)) 195 196 #define bswap32(x) ((((x) << 24) & 0xff000000) | \ 197 (((x) << 8) & 0x00ff0000) | \ 198 (((x) >> 8) & 0x0000ff00) | \ 199 (((x) >> 24) & 0x000000ff)) 200 201 #define bswap64(x) (((u_int64_t)bswap32((x)) << 32) | \ 202 ((u_int64_t)bswap32((x) >> 32))) 203 #endif 204 205 #if !HAVE_MKSTEMP 206 int mkstemp(char *); 207 #endif 208 209 #if !HAVE_MKDTEMP 210 char *mkdtemp(char *); 211 #endif 212 213 #if !HAVE_MKSTEMP || !HAVE_MKDTEMP 214 /* This is a prototype for the internal function. */ 215 int gettemp(char *, int *, int); 216 #endif 217 218 #if !HAVE_PREAD 219 ssize_t pread(int, void *, size_t, off_t); 220 #endif 221 222 #if !HAVE_PWCACHE_USERDB 223 int uid_from_user(const char *, uid_t *); 224 int pwcache_userdb(int (*)(int), void (*)(void), 225 struct passwd * (*)(const char *), struct passwd * (*)(uid_t)); 226 int gid_from_group(const char *, gid_t *); 227 int pwcache_groupdb(int (*)(int), void (*)(void), 228 struct group * (*)(const char *), struct group * (*)(gid_t)); 229 #endif 230 231 #if !HAVE_PWRITE 232 ssize_t pwrite(int, const void *, size_t, off_t); 233 #endif 234 235 #if !HAVE_SETENV 236 int setenv(const char *, const char *, int); 237 #endif 238 239 #if !HAVE_DECL_SETGROUPENT 240 int setgroupent(int); 241 #endif 242 243 #if !HAVE_DECL_SETPASSENT 244 int setpassent(int); 245 #endif 246 247 #if !HAVE_SETPROGNAME 248 const char *getprogname(void); 249 void setprogname(const char *); 250 #endif 251 252 #if !HAVE_SNPRINTF 253 int snprintf(char *, size_t, const char *, ...); 254 #endif 255 256 #if !HAVE_STRLCAT 257 size_t strlcat(char *, const char *, size_t); 258 #endif 259 260 #if !HAVE_STRLCPY 261 size_t strlcpy(char *, const char *, size_t); 262 #endif 263 264 #if !HAVE_STRSEP 265 char *strsep(char **, const char *); 266 #endif 267 268 #if !HAVE_STRSUFTOLL 269 long long strsuftoll(const char *, const char *, long long, long long); 270 long long strsuftollx(const char *, const char *, 271 long long, long long, char *, size_t); 272 #endif 273 274 #if !HAVE_STRTOLL 275 long long strtoll(const char *, char **, int); 276 #endif 277 278 #if !HAVE_USER_FROM_UID 279 const char *user_from_uid(uid_t, int); 280 const char *group_from_gid(gid_t, int); 281 #endif 282 283 #if !HAVE_VASPRINTF 284 int vasprintf(char **, const char *, va_list); 285 #endif 286 287 #if !HAVE_VASNPRINTF 288 int vasnprintf(char **, size_t, const char *, va_list); 289 #endif 290 291 #if !HAVE_VSNPRINTF 292 int vsnprintf(char *, size_t, const char *, va_list); 293 #endif 294 295 /* 296 * getmode() and setmode() are always defined, as these function names 297 * exist but with very different meanings on other OS's. The compat 298 * versions here simply accept an octal mode number; the "u+x,g-w" type 299 * of syntax is not accepted. 300 */ 301 302 #define getmode __nbcompat_getmode 303 #define setmode __nbcompat_setmode 304 305 mode_t getmode(const void *, mode_t); 306 void *setmode(const char *); 307 308 /* Eliminate assertions embedded in binaries. */ 309 310 #undef _DIAGASSERT 311 #define _DIAGASSERT(x) 312 313 /* Heimdal expects this one. */ 314 315 #undef RCSID 316 #define RCSID(x) 317 318 /* Some definitions not available on all systems. */ 319 320 /* <errno.h> */ 321 322 #ifndef EFTYPE 323 #define EFTYPE EIO 324 #endif 325 326 /* <fcntl.h> */ 327 328 #ifndef O_EXLOCK 329 #define O_EXLOCK 0 330 #endif 331 #ifndef O_SHLOCK 332 #define O_SHLOCK 0 333 #endif 334 335 /* <limits.h> */ 336 337 #ifndef UID_MAX 338 #define UID_MAX 32767 339 #endif 340 #ifndef GID_MAX 341 #define GID_MAX UID_MAX 342 #endif 343 344 #ifndef UQUAD_MAX 345 #define UQUAD_MAX ((u_quad_t)-1) 346 #endif 347 #ifndef QUAD_MAX 348 #define QUAD_MAX ((quad_t)(UQUAD_MAX >> 1)) 349 #endif 350 #ifndef QUAD_MIN 351 #define QUAD_MIN ((quad_t)(~QUAD_MAX)) 352 #endif 353 #ifndef ULLONG_MAX 354 #define ULLONG_MAX ((unsigned long long)-1) 355 #endif 356 #ifndef LLONG_MAX 357 #define LLONG_MAX ((long long)(ULLONG_MAX >> 1)) 358 #endif 359 #ifndef LLONG_MIN 360 #define LLONG_MIN ((long long)(~LLONG_MAX)) 361 #endif 362 363 /* <paths.h> */ 364 365 #ifndef _PATH_BSHELL 366 #define _PATH_BSHELL PATH_BSHELL 367 #endif 368 #ifndef _PATH_DEFPATH 369 #define _PATH_DEFPATH "/usr/bin:/bin:/usr/local/bin" 370 #endif 371 #ifndef _PATH_DEV 372 #define _PATH_DEV "/dev/" 373 #endif 374 #ifndef _PATH_DEVNULL 375 #define _PATH_DEVNULL _PATH_DEV "null" 376 #endif 377 #ifndef _PATH_TMP 378 #define _PATH_TMP "/tmp/" 379 #endif 380 #ifndef _PATH_DEFTAPE 381 #define _PATH_DEFTAPE "/dev/nrst0" 382 #endif 383 384 /* <stdarg.h> */ 385 386 #ifndef _BSD_VA_LIST_ 387 #define _BSD_VA_LIST_ va_list 388 #endif 389 390 /* <stdint.h> */ 391 392 #ifndef UINT32_MAX 393 #define UINT32_MAX 0xffffffffU 394 #endif 395 396 /* <stdlib.h> */ 397 398 #ifndef __GNUC__ 399 # if HAVE_ALLOCA_H 400 # include <alloca.h> 401 # else 402 # ifndef alloca /* predefined by HP cc +Olibcalls */ 403 char *alloca (); 404 # endif 405 # endif 406 #endif 407 408 /* <sys/endian.h> */ 409 410 #ifndef HAVE_SYS_ENDIAN_H 411 #if WORDS_BIGENDIAN 412 #define htobe16(x) (x) 413 #define htobe32(x) (x) 414 #define htobe64(x) (x) 415 #define htole16(x) bswap16((u_int16_t)(x)) 416 #define htole32(x) bswap32((u_int32_t)(x)) 417 #define htole64(x) bswap64((u_int64_t)(x)) 418 #else 419 #define htobe16(x) bswap16((u_int16_t)(x)) 420 #define htobe32(x) bswap32((u_int32_t)(x)) 421 #define htobe64(x) bswap64((u_int64_t)(x)) 422 #define htole16(x) (x) 423 #define htole32(x) (x) 424 #define htole64(x) (x) 425 #endif 426 #define be16toh(x) htobe16(x) 427 #define be32toh(x) htobe32(x) 428 #define be64toh(x) htobe64(x) 429 #define le16toh(x) htole16(x) 430 #define le32toh(x) htole32(x) 431 #define le64toh(x) htole64(x) 432 #endif 433 434 /* <sys/mman.h> */ 435 436 #ifndef MAP_FILE 437 #define MAP_FILE 0 438 #endif 439 440 /* HP-UX has MAP_ANONYMOUS but not MAP_ANON */ 441 #ifndef MAP_ANON 442 #ifdef MAP_ANONYMOUS 443 #define MAP_ANON MAP_ANONYMOUS 444 #endif 445 #endif 446 447 /* <sys/param.h> */ 448 449 #undef BIG_ENDIAN 450 #undef LITTLE_ENDIAN 451 #define BIG_ENDIAN 4321 452 #define LITTLE_ENDIAN 1234 453 454 #undef BYTE_ORDER 455 #if WORDS_BIGENDIAN 456 #define BYTE_ORDER BIG_ENDIAN 457 #else 458 #define BYTE_ORDER LITTLE_ENDIAN 459 #endif 460 461 #ifndef DEV_BSIZE 462 #define DEV_BSIZE (1 << 9) 463 #endif 464 465 #undef MIN 466 #undef MAX 467 #define MIN(a,b) ((a) < (b) ? (a) : (b)) 468 #define MAX(a,b) ((a) > (b) ? (a) : (b)) 469 470 #ifndef MAXBSIZE 471 #define MAXBSIZE (64 * 1024) 472 #endif 473 #ifndef MAXFRAG 474 #define MAXFRAG 8 475 #endif 476 #ifndef MAXPHYS 477 #define MAXPHYS (64 * 1024) 478 #endif 479 480 /* XXX needed by makefs; this should be done in a better way */ 481 #undef btodb 482 #define btodb(x) ((x) << 9) 483 484 #undef setbit 485 #undef clrbit 486 #undef isset 487 #undef isclr 488 #define setbit(a,i) ((a)[(i)/NBBY] |= 1<<((i)%NBBY)) 489 #define clrbit(a,i) ((a)[(i)/NBBY] &= ~(1<<((i)%NBBY))) 490 #define isset(a,i) ((a)[(i)/NBBY] & (1<<((i)%NBBY))) 491 #define isclr(a,i) (((a)[(i)/NBBY] & (1<<((i)%NBBY))) == 0) 492 493 #ifndef powerof2 494 #define powerof2(x) ((((x)-1)&(x))==0) 495 #endif 496 497 #undef roundup 498 #define roundup(x, y) ((((x)+((y)-1))/(y))*(y)) 499 500 /* <sys/stat.h> */ 501 502 #ifndef ALLPERMS 503 #define ALLPERMS (S_ISUID|S_ISGID|S_ISTXT|S_IRWXU|S_IRWXG|S_IRWXO) 504 #endif 505 #ifndef DEFFILEMODE 506 #define DEFFILEMODE (S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH) 507 #endif 508 #ifndef S_ISTXT 509 #ifdef S_ISVTX 510 #define S_ISTXT S_ISVTX 511 #else 512 #define S_ISTXT 0 513 #endif 514 #endif 515 516 /* <sys/syslimits.h> */ 517 518 #ifndef LINE_MAX 519 #define LINE_MAX 2048 520 #endif 521 522 /* <sys/time.h> */ 523 524 #ifndef timercmp 525 #define timercmp(tvp, uvp, cmp) \ 526 (((tvp)->tv_sec == (uvp)->tv_sec) ? \ 527 ((tvp)->tv_usec cmp (uvp)->tv_usec) : \ 528 ((tvp)->tv_sec cmp (uvp)->tv_sec)) 529 #endif 530 #ifndef timeradd 531 #define timeradd(tvp, uvp, vvp) \ 532 do { \ 533 (vvp)->tv_sec = (tvp)->tv_sec + (uvp)->tv_sec; \ 534 (vvp)->tv_usec = (tvp)->tv_usec + (uvp)->tv_usec; \ 535 if ((vvp)->tv_usec >= 1000000) { \ 536 (vvp)->tv_sec++; \ 537 (vvp)->tv_usec -= 1000000; \ 538 } \ 539 } while (/* CONSTCOND */ 0) 540 #endif 541 #ifndef timersub 542 #define timersub(tvp, uvp, vvp) \ 543 do { \ 544 (vvp)->tv_sec = (tvp)->tv_sec - (uvp)->tv_sec; \ 545 (vvp)->tv_usec = (tvp)->tv_usec - (uvp)->tv_usec; \ 546 if ((vvp)->tv_usec < 0) { \ 547 (vvp)->tv_sec--; \ 548 (vvp)->tv_usec += 1000000; \ 549 } \ 550 } while (/* CONSTCOND */ 0) 551 #endif 552 553 /* <sys/types.h> */ 554 555 #if !HAVE_U_QUAD_T 556 /* #define, not typedef, as quad_t exists as a struct on some systems */ 557 #define quad_t long long 558 #define u_quad_t unsigned long long 559 #define strtoq strtoll 560 #define strtouq strtoull 561 #endif 562 563 #endif /* !__NETBSD_COMPAT_DEFS_H__ */ 564