1 /* generic.h -- anything you don't #undef at the end remains in effect. 2 The ONLY things that go in here are generic indicator flags; it's up 3 to your programs to declare and call things based on those flags. 4 5 You should only need to make changes via a minimal system-specific section 6 at the end of this file. To build a new section, rip through this and 7 check everything it mentions on your platform, and #undef that which needs 8 it. If you generate a system-specific section you didn't find in here, 9 please mail me a copy so I can update the "master". 10 11 I realize I'm probably inventing another pseudo-standard here, but 12 goddamnit, everybody ELSE has already, and I can't include all of their 13 hairball schemes too. HAVE_xx conforms to the gnu/autoconf usage and 14 seems to be the most common format. In fact, I dug a lot of these out 15 of autoconf and tried to common them all together using "stupidh" to 16 collect data from platforms. 17 18 In disgust... _H* 940910, 941115, 950511. Pseudo-version: 1.3 19 20 Updated 951104 with many patches from netcat feedback, and properly 21 closed a lot of slop in open-ended comments: version 1.4 22 960217 + nextstep: version 1.5 23 */ 24 25 #ifndef GENERIC_H /* only run through this once */ 26 #define GENERIC_H 27 28 /* =============================== */ 29 /* System calls, lib routines, etc */ 30 /* =============================== */ 31 32 /* How does your system declare malloc, void or char? Usually void, but go 33 ask the SunOS people why they had to be different... */ 34 #define VOID_MALLOC 35 36 /* notably from fwtk/firewall.h: posix locking? */ 37 #define HAVE_FLOCK /* otherwise it's lockf() */ 38 39 /* if you don't have setsid(), you might have setpgrp(). */ 40 #define HAVE_SETSID 41 42 /* random() is generally considered better than rand() */ 43 #define HAVE_RANDOM 44 45 /* the srand48/lrand48/etc family is s'posedly even better */ 46 #define HAVE_RAND48 47 /* bmc@telebase and others have suggested these macros if a box *does* have 48 rand48. Will consider for later if we're doing something that really 49 requires stronger random numbers, but netcat and such certainly doesn't. 50 #define srandom(seed) srand48((long) seed) 51 #define random() lrand48() */ 52 53 /* if your machine doesn't have lstat(), it should have stat() [dos...] */ 54 #define HAVE_LSTAT 55 56 /* different kinds of term ioctls. How to recognize them, very roughly: 57 sysv/POSIX_ME_HARDER: termio[s].h, struct termio[s], tty.c_*[] 58 bsd/old stuff: sgtty.h, ioctl(TIOCSETP), sgttyb.sg_*, tchars.t_* */ 59 #define HAVE_TERMIOS 60 61 /* dbm vs ndbm */ 62 #define HAVE_NDBM 63 64 /* extended utmp/wtmp stuff. MOST machines still do NOT have this SV-ism */ 65 #define UTMPX 66 67 /* some systems have nice() which takes *relative* values... [resource.h] */ 68 #define HAVE_SETPRIORITY 69 70 /* a sysvism, I think, but ... */ 71 #define HAVE_SYSINFO 72 73 /* ============= */ 74 /* Include files */ 75 /* ============= */ 76 77 /* Presence of these can be determined via a script that sniffs them 78 out if you aren't sure. See "stupidh"... */ 79 80 /* stdlib comes with most modern compilers, but ya never know */ 81 #define HAVE_STDLIB_H 82 83 /* not on a DOS box! */ 84 #define HAVE_UNISTD_H 85 86 /* stdarg is a weird one */ 87 #define HAVE_STDARG_H 88 89 /* dir.h or maybe ndir.h otherwise. */ 90 #define HAVE_DIRENT_H 91 92 /* string or strings */ 93 #define HAVE_STRINGS_H 94 95 /* if you don't have lastlog.h, what you want might be in login.h */ 96 #define HAVE_LASTLOG_H 97 98 /* predefines for _PATH_various */ 99 #define HAVE_PATHS_H 100 101 /* some SV-flavors break select stuff out separately */ 102 #define HAVE_SELECT_H 103 104 /* assorted others */ 105 #define HAVE_PARAM_H /* in sys/ */ 106 #define HAVE_SYSMACROS_H /* in sys/ */ 107 #define HAVE_TTYENT_H /* securetty et al */ 108 109 /* ==================== */ 110 111 /* Still maybe have to do something about the following, if it's even 112 worth it. I just grepped a lot of these out of various code, without 113 looking them up yet: 114 115 #define HAVE_EINPROGRESS 116 #define HAVE_F_SETOWN 117 HAVE_FILIO_H ... fionbio, fiosetown, etc... will need for hairier 118 select loops. 119 #define HAVE_SETENV ... now *there's* a hairy one; **environ is portable 120 #define BIG_ENDIAN/little_endian ... *please* try to avoid this stupidity 121 and LSBFIRST/MSBFIRST 122 #define HAVE_GETUSERSHELL ... you could always pull it out of getpwent() 123 #define HAVE_SETE[UG]ID ... lib or syscall, it varies on diff platforms 124 #define HAVE_STRCHR ... should actually be handled by string/strings 125 #define HAVE_PSTAT 126 #define HAVE_ST_BLKSIZE ... a stat() thing? 127 #define HAVE_IP_TOS 128 #define HAVE_STRFTIME ... screw this, we'll just INCLUDE one for lame 129 old boxes that don't have it [sunos 3.x, early 4.x?] 130 #define HAVE_VFPRINTF 131 #define HAVE_SHADOW_PASSWD ... in its multitudinous schemes?? ... how 132 about sumpin' like #define SHADOW_PASSWD_TYPE ... could get grody. 133 ... looks like sysv /etc/shadow, getspent() family is common. 134 #define SIG* ... what a swamp, punt for now; should all be in signal.h 135 #define HAVE_STRCSPN ... see larry wall's comment in the fwtk regex code 136 #define ULTRIX_AUTH ... bwahaha. 137 #define HAVE_YP or NIS or whatever you wanna call it this week 138 randomness about VARARGS?? 139 --- later stuff to be considered --- 140 #define UINT4 ... u-int on alpha/osf, i.e. __alpha/__osf__, ulong elsewhere? 141 dont name it that, though, it'll conflict with extant .h files like md5 142 randomness about machine/endian.h, machine/inline.h -- bsdi, net/2 143 randomness about _PATH_WTMP vs WTMP_FILE and where they even live!! 144 #define HAVE_SYS_ERRLIST ... whether it's in stdio.h or not [bsd 4.4] 145 --- still more stuff 146 #define HAVE_SETENV 147 #define _PATH_UTMP vs UTMP_FILE, a la deslogind?! 148 #define HAVE_DAEMON 149 #define HAVE_INETADDR [vixie bind?] 150 lseek: SEEK_SET vs L_SET and associated lossage [epi-notes, old 386Mach] 151 bsdi: ioctl_compat.h ? 152 --- takin' some ifdefs from CNS krb: 153 F_GETOWN/F_SETOWN 154 CRAY: long = 8 bytes, etc [class with alpha?] 155 CGETENT 156 SIGINFO 157 SIGTSTP SIGTTOU SIGWINCH 158 SPX? 159 SYSV_TERMIO -- covered elsewhere, I hope 160 TIOCEXT TIOCFLUSH TIOC[GS]WINSIZ 161 NEWINIT: something about init cleaning up dead login processes [telnet?] 162 PARENT_DOES_UTMP, too [telnet] 163 VDISCARD 164 VEOL/VEOL2/VLNEXT VREPRINT -- termios stuff?, and related... 165 STREAMSPTY/STREAMSPTYEM 166 AF_INET/AF_UNSPEC, PF_* 167 ECHOCTL/ECHOKE 168 F_ULOCK [?!] 169 setpgrp/getpgrp() ONEARG business.. 170 HAVE_ALLOCA 171 HAVE_GETUTENT 172 HAVE_SYS_SELECT_H [irix!] 173 HAVE_DIRENT [old 386mach has *direct.h*!] 174 HAVE_SIGSET 175 HAVE_VFORK_H and HAVE_VFORK 176 HAVE_VHANGUP 177 HAVE_VSPRINTF 178 HAVE_IPTOS_* 179 HAVE_STRCASECMP, STRNCASECMP 180 HAVE_SYS_FCNTL_H 181 HAVE_SYS_TIME_H 182 HAVE_UTIMES 183 NOTTYENT [?] 184 HAVE_FCHMOD 185 HAVE_GETUSERSHELL 186 HAVE_SIGCONTEXT [stack hair, very machine-specific] 187 YYLINENO? 188 POSIX_SIGNALS 189 POSIX_TERMIOS 190 SETPROCTITLE -- breaks some places, like fbsd sendmail 191 SIG* -- actual signal names? some are missing 192 SIOCGIFCONF 193 SO_BROADCAST 194 SHMEM [krb tickets] 195 VARARGS, or HAVE_VARARGS 196 CBAUD 197 ... and B300, B9600, etc etc 198 HAVE_BZERO vs memset/memcpy 199 HAVE_SETVBUF 200 HAVE_STRDUP 201 HAVE_GETENV 202 HAVE_STRSAVE 203 HAVE_STBLKSIZE [stat?] 204 HAVE_STREAM_H -- in sys/, ref sendmail 8.7 for IP_SRCROUTE 205 FCHMOD 206 INITGROUPS -- most machines seem to *have* 207 SETREUID 208 SNPRINTF 209 SETPGRP semantics bsd vs. sys5 style 210 211 There's also the issue about WHERE various .h files live, sys/ or otherwise. 212 There's a BIG swamp lurking where network code of any sort lives. 213 */ 214 215 /* ======================== */ 216 /* System-specific sections */ 217 /* ======================== */ 218 219 /* By turning OFF various bits of the above, you can customize for 220 a given platform. Yes, we're ignoring the stock compiler predefines 221 and using our own plugged in via the Makefile. */ 222 223 /* DOS boxes, with MSC; you may need to adapt to a different compiler. */ 224 /* looks like later ones *do* have dirent.h, for example */ 225 #ifdef MSDOS 226 #undef HAVE_FLOCK 227 #undef HAVE_RANDOM 228 #undef HAVE_LSTAT 229 #undef HAVE_TERMIOS 230 #undef UTMPX 231 #undef HAVE_SYSINFO 232 #undef HAVE_UNISTD_H 233 #undef HAVE_DIRENT_H /* unless you have the k00l little wrapper from L5!! */ 234 #undef HAVE_STRINGS_H 235 #undef HAVE_LASTLOG_H 236 #undef HAVE_PATHS_H 237 #undef HAVE_PARAM_H 238 #undef HAVE_SYSMACROS_H 239 #undef HAVE_SELECT_H 240 #undef HAVE_TTYENT_H 241 #endif /* MSDOS */ 242 243 /* buglix 4.x; dunno about 3.x on down. should be bsd4.2 */ 244 #ifdef ULTRIX 245 #undef UTMPX 246 #undef HAVE_PATHS_H 247 #undef HAVE_SYSMACROS_H 248 #undef HAVE_SELECT_H 249 #endif /* buglix */ 250 251 /* some of this might still be broken on older sunoses */ 252 #ifdef SUNOS 253 #undef VOID_MALLOC 254 #undef UTMPX 255 #undef HAVE_PATHS_H 256 #undef HAVE_SELECT_H 257 #endif /* sunos */ 258 259 /* "contact your vendor for a fix" */ 260 #ifdef SOLARIS 261 /* has UTMPX */ 262 #undef HAVE_RANDOM 263 #undef HAVE_SETPRIORITY 264 #undef HAVE_STRINGS_H /* this is genuinely the case, go figure */ 265 #undef HAVE_PATHS_H 266 #undef HAVE_SELECT_H 267 #undef HAVE_TTYENT_H 268 #endif /* SOLARIS */ 269 270 /* whatever aix variant MIT had at the time; 3.2.x?? */ 271 #ifdef AIX 272 #undef UTMPX 273 #undef HAVE_LASTLOG_H 274 #define HAVE_LOGIN_H /* "special", in the educational sense */ 275 #endif /* aix */ 276 277 /* linux, which is trying as desperately as the gnu folks can to be 278 POSIXLY_CORRECT. I think I'm gonna hurl... */ 279 #ifdef LINUX 280 #undef UTMPX 281 #undef HAVE_SYSINFO 282 #undef HAVE_SELECT_H 283 #undef HAVE_TTYENT_H 284 #endif /* linux */ 285 286 /* irix 5.x; may not be correct for earlier ones */ 287 #ifdef IRIX 288 /* wow, does irix really have everything?! */ 289 #endif /* irix */ 290 291 /* osf on alphas */ 292 #ifdef OSF 293 #undef UTMPX 294 #undef HAVE_SELECT_H 295 #endif /* osf */ 296 297 /* they's some FUCKED UP paths in this one! */ 298 #ifdef FREEBSD 299 #undef UTMPX 300 #undef HAVE_SYSINFO 301 #undef HAVE_LASTLOG_H 302 #undef HAVE_SYSMACROS_H 303 #undef HAVE_SELECT_H /* actually a lie, but only for kernel */ 304 #endif /* freebsd */ 305 306 /* Originally from the sidewinder site, of all places, but subsequently 307 checked further under a more normal bsdi 2.0 */ 308 #ifdef BSDI 309 #undef UTMPX 310 #undef HAVE_LASTLOG_H 311 #undef HAVE_SYSMACROS_H 312 /* and their malloc.h was in sys/ ?! */ 313 #undef HAVE_SELECT_H 314 #endif /* bsdi */ 315 316 /* netbsd/44lite, jives with amiga-netbsd from cactus */ 317 #ifdef NETBSD 318 #undef UTMPX 319 #undef HAVE_SYSINFO 320 #undef HAVE_LASTLOG_H 321 #undef HAVE_SELECT_H 322 #endif /* netbsd */ 323 324 /* Hpux 9.0x, from BBN and various patches sent in */ 325 #ifdef HPUX 326 #undef HAVE_RANDOM /* but *does* have ?rand48 -- need to consider.. */ 327 #undef HAVE_UTMPX 328 #undef HAVE_LASTLOG_H /* has utmp/wtmp/btmp nonsense, and pututline() */ 329 #undef HAVE_PATHS_H 330 #undef HAVE_SELECT_H 331 #undef HAVE_TTYENT_H 332 #endif /* hockeypux */ 333 334 /* Unixware [a loose definition of "unix", to be sure], 1.1.2 [at least] 335 from Brian Clapper. He wasn't sure about 2.0... */ 336 #ifdef UNIXWARE 337 /* has UTMPX */ 338 #undef HAVE_SETPRIORITY 339 /* NOTE: UnixWare does provide the BSD stuff, in "/usr/ucbinclude" (headers) 340 and "/usr/ucblib" (libraries). However, I've run into problems linking 341 stuff out of that version of the C library, when objects are also coming 342 out of the "regular" C library. My advice: Avoid the BSD compatibility 343 stuff wherever possible. Brian Clapper <bmc@telebase.com> */ 344 #undef HAVE_STRINGS_H 345 #undef HAVE_PATHS_H 346 #undef HAVE_TTYENT_H 347 #endif /* UNIXWARE */ 348 349 /* A/UX 3.1.x from darieb@sandia.gov */ 350 #ifdef AUX 351 #undef HAVE_RANDOM 352 #undef HAVE_SELECT_H /* xxx: untested */ 353 #endif /* a/ux */ 354 355 /* NeXTSTEP 3.2 motorola mudge@l0pht.com xxx should also work with 356 white hardware and Sparc/HPPA. Should work with 3.3 too as it's 357 4.3 / 4.4 bsd wrapped around mach */ 358 #ifdef NEXT 359 #undef UTMPX 360 #undef HAVE_SELECT_X 361 #endif /* NeXTSTEP 3.2 motorola */ 362 363 /* Make some "generic" assumptions if all else fails */ 364 #ifdef GENERIC 365 #undef HAVE_FLOCK 366 #if defined(SYSV) && (SYSV < 4) /* TW leftover: old SV doesnt have symlinks */ 367 #undef HAVE_LSTAT 368 #endif /* old SYSV */ 369 #undef HAVE_TERMIOS 370 #undef UTMPX 371 #undef HAVE_PATHS_H 372 #undef HAVE_SELECT_H 373 #endif /* generic */ 374 375 /* ================ */ 376 #endif /* GENERIC_H */ 377 378