]>
Commit | Line | Data |
---|---|---|
b585a9fa EZ |
1 | /* Copyright (c) 1993-2002 |
2 | * Juergen Weigert ([email protected]) | |
3 | * Michael Schroeder ([email protected]) | |
4 | * Copyright (c) 1987 Oliver Laumann | |
5 | * | |
6 | * This program is free software; you can redistribute it and/or modify | |
7 | * it under the terms of the GNU General Public License as published by | |
8 | * the Free Software Foundation; either version 2, or (at your option) | |
9 | * any later version. | |
10 | * | |
11 | * This program is distributed in the hope that it will be useful, | |
12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
14 | * GNU General Public License for more details. | |
15 | * | |
16 | * You should have received a copy of the GNU General Public License | |
17 | * along with this program (see the file COPYING); if not, write to the | |
18 | * Free Software Foundation, Inc., | |
19 | * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA | |
20 | * | |
21 | **************************************************************** | |
775e241e | 22 | * $Id: os.h,v 1.10 1994/05/31 12:32:22 mlschroe Exp $ FAU |
b585a9fa EZ |
23 | */ |
24 | ||
25 | #include <stdio.h> | |
26 | #include <errno.h> | |
27 | ||
28 | #include <sys/param.h> | |
29 | ||
30 | /* In strict ANSI mode, HP-UX machines define __hpux but not hpux */ | |
31 | #if defined(__hpux) && !defined(hpux) | |
32 | # define hpux | |
33 | #endif | |
34 | ||
35 | #if defined(__bsdi__) || defined(__386BSD__) || defined(_CX_UX) || defined(hpux) || defined(_IBMR2) || defined(linux) | |
36 | # include <signal.h> | |
37 | #endif /* __bsdi__ || __386BSD__ || _CX_UX || hpux || _IBMR2 || linux */ | |
38 | ||
39 | #ifdef ISC | |
40 | # ifdef ENAMETOOLONG | |
41 | # undef ENAMETOOLONG | |
42 | # endif | |
43 | # ifdef ENOTEMPTY | |
44 | # undef ENOTEMPTY | |
45 | # endif | |
46 | # include <sys/bsdtypes.h> | |
47 | # include <net/errno.h> | |
48 | #endif | |
49 | ||
50 | #ifdef sun | |
51 | # define getpgrp __getpgrp | |
52 | # define exit __exit | |
53 | #endif | |
54 | #ifdef POSIX | |
55 | # include <unistd.h> | |
56 | # if defined(__STDC__) | |
57 | # include <stdlib.h> | |
58 | # endif /* __STDC__ */ | |
59 | #endif /* POSIX */ | |
60 | #ifdef sun | |
61 | # undef getpgrp | |
62 | # undef exit | |
63 | #endif /* sun */ | |
64 | ||
65 | #ifndef linux /* all done in <errno.h> */ | |
66 | extern int errno; | |
67 | #endif /* linux */ | |
68 | #ifndef HAVE_STRERROR | |
69 | /* No macros, please */ | |
70 | #undef strerror | |
71 | #endif | |
72 | ||
73 | #if !defined(SYSV) && !defined(linux) | |
74 | # ifdef NEWSOS | |
75 | # define strlen ___strlen___ | |
76 | # include <strings.h> | |
77 | # undef strlen | |
78 | # else /* NEWSOS */ | |
79 | # include <strings.h> | |
80 | # endif /* NEWSOS */ | |
81 | #else /* SYSV */ | |
82 | # if defined(SVR4) || defined(NEWSOS) | |
83 | # define strlen ___strlen___ | |
84 | # include <string.h> | |
85 | # undef strlen | |
86 | # if !defined(NEWSOS) && !defined(__hpux) | |
87 | extern size_t strlen(const char *); | |
88 | # endif | |
89 | # else /* SVR4 */ | |
90 | # include <string.h> | |
91 | # endif /* SVR4 */ | |
92 | #endif /* SYSV */ | |
93 | ||
94 | #ifdef USEVARARGS | |
95 | # if defined(__STDC__) | |
96 | # include <stdarg.h> | |
97 | # define VA_LIST(var) va_list var; | |
98 | # define VA_DOTS ... | |
99 | # define VA_DECL | |
100 | # define VA_START(ap, fmt) va_start(ap, fmt) | |
101 | # define VA_ARGS(ap) ap | |
102 | # define VA_END(ap) va_end(ap) | |
103 | # else | |
104 | # include <varargs.h> | |
105 | # define VA_LIST(var) va_list var; | |
106 | # define VA_DOTS va_alist | |
107 | # define VA_DECL va_dcl | |
108 | # define VA_START(ap, fmt) va_start(ap) | |
109 | # define VA_ARGS(ap) ap | |
110 | # define VA_END(ap) va_end(ap) | |
111 | # endif | |
112 | #else | |
113 | # define VA_LIST(var) | |
114 | # define VA_DOTS p1, p2, p3, p4, p5, p6 | |
115 | # define VA_DECL unsigned long VA_DOTS; | |
116 | # define VA_START(ap, fmt) | |
117 | # define VA_ARGS(ap) VA_DOTS | |
118 | # define VA_END(ap) | |
119 | # undef vsnprintf | |
120 | # define vsnprintf xsnprintf | |
121 | #endif | |
122 | ||
123 | #if !defined(sun) && !defined(B43) && !defined(ISC) && !defined(pyr) && !defined(_CX_UX) | |
124 | # include <time.h> | |
125 | #endif | |
126 | #include <sys/time.h> | |
127 | ||
128 | #ifdef M_UNIX /* SCO */ | |
129 | # include <sys/stream.h> | |
130 | # include <sys/ptem.h> | |
131 | # define ftruncate(fd, s) chsize(fd, s) | |
132 | #endif | |
133 | ||
134 | #ifdef SYSV | |
135 | # define index strchr | |
136 | # define rindex strrchr | |
137 | # define bzero(poi,len) memset(poi,0,len) | |
138 | # define bcmp memcmp | |
139 | # define killpg(pgrp,sig) kill( -(pgrp), sig) | |
140 | #endif | |
141 | ||
142 | #ifndef HAVE_GETCWD | |
143 | # define getcwd(b,l) getwd(b) | |
144 | #endif | |
145 | ||
146 | #ifndef USEBCOPY | |
147 | # ifdef USEMEMMOVE | |
148 | # define bcopy(s,d,len) memmove(d,s,len) | |
149 | # else | |
150 | # ifdef USEMEMCPY | |
151 | # define bcopy(s,d,len) memcpy(d,s,len) | |
152 | # else | |
153 | # define NEED_OWN_BCOPY | |
154 | # define bcopy xbcopy | |
155 | # endif | |
156 | # endif | |
157 | #endif | |
158 | ||
159 | #ifdef hpux | |
160 | # define setreuid(ruid, euid) setresuid(ruid, euid, -1) | |
161 | # define setregid(rgid, egid) setresgid(rgid, egid, -1) | |
162 | #endif | |
163 | ||
164 | #if defined(HAVE_SETEUID) || defined(HAVE_SETREUID) | |
165 | # define USE_SETEUID | |
166 | #endif | |
167 | ||
168 | #if !defined(HAVE__EXIT) && !defined(_exit) | |
169 | #define _exit(x) exit(x) | |
170 | #endif | |
171 | ||
172 | #ifndef HAVE_UTIMES | |
173 | # define utimes utime | |
174 | #endif | |
175 | ||
176 | #ifdef BUILTIN_TELNET | |
177 | # include <netinet/in.h> | |
178 | # include <arpa/inet.h> | |
179 | #endif | |
180 | ||
181 | #if defined(USE_LOCALE) && (!defined(HAVE_SETLOCALE) || !defined(HAVE_STRFTIME)) | |
182 | # undef USE_LOCALE | |
183 | #endif | |
184 | ||
185 | /***************************************************************** | |
186 | * terminal handling | |
187 | */ | |
188 | ||
cc88a640 | 189 | #if defined (POSIX) || defined (__FreeBSD__) |
b585a9fa EZ |
190 | # include <termios.h> |
191 | # ifdef hpux | |
192 | # include <bsdtty.h> | |
193 | # endif /* hpux */ | |
194 | # ifdef NCCS | |
195 | # define MAXCC NCCS | |
196 | # else | |
197 | # define MAXCC 256 | |
198 | # endif | |
199 | #else /* POSIX */ | |
200 | # ifdef TERMIO | |
201 | # include <termio.h> | |
202 | # ifdef NCC | |
203 | # define MAXCC NCC | |
204 | # else | |
205 | # define MAXCC 256 | |
206 | # endif | |
207 | # ifdef CYTERMIO | |
208 | # include <cytermio.h> | |
209 | # endif | |
210 | # else /* TERMIO */ | |
775e241e TT |
211 | # if defined (HAVE_SGTTY_H) |
212 | # include <sgtty.h> | |
213 | # endif | |
b585a9fa EZ |
214 | # endif /* TERMIO */ |
215 | #endif /* POSIX */ | |
216 | ||
217 | #ifndef VDISABLE | |
218 | # ifdef _POSIX_VDISABLE | |
219 | # define VDISABLE _POSIX_VDISABLE | |
220 | # else | |
221 | # define VDISABLE 0377 | |
222 | # endif /* _POSIX_VDISABLE */ | |
223 | #endif /* !VDISABLE */ | |
224 | ||
225 | ||
226 | /* on sgi, regardless of the stream head's read mode (RNORM/RMSGN/RMSGD) | |
227 | * TIOCPKT mode causes data loss if our buffer is too small (IOSIZE) | |
228 | * to hold the whole packet at first read(). | |
229 | * (Marc Boucher) | |
230 | * | |
231 | * matthew green: | |
232 | * TIOCPKT is broken on dgux 5.4.1 generic AViiON mc88100 | |
233 | * | |
234 | * Joe Traister: On AIX4, programs like irc won't work if screen | |
235 | * uses TIOCPKT (select fails to return on pty read). | |
236 | */ | |
237 | #if defined(sgi) || defined(DGUX) || defined(_IBMR2) | |
238 | # undef TIOCPKT | |
239 | #endif | |
240 | ||
241 | /* linux ncurses is broken, we have to use our own tputs */ | |
242 | #if defined(linux) && defined(TERMINFO) | |
243 | # define tputs xtputs | |
244 | #endif | |
245 | ||
246 | /* Alexandre Oliva: SVR4 style ptys don't work with osf */ | |
247 | #ifdef __osf__ | |
248 | # undef HAVE_SVR4_PTYS | |
249 | #endif | |
250 | ||
251 | /***************************************************************** | |
252 | * utmp handling | |
253 | */ | |
254 | ||
255 | #ifdef GETUTENT | |
256 | typedef char *slot_t; | |
257 | #else | |
258 | typedef int slot_t; | |
259 | #endif | |
260 | ||
261 | #if defined(UTMPOK) || defined(BUGGYGETLOGIN) | |
262 | # if defined(SVR4) && !defined(DGUX) && !defined(__hpux) && !defined(linux) | |
263 | # include <utmpx.h> | |
264 | # define UTMPFILE UTMPX_FILE | |
265 | # define utmp utmpx | |
266 | # define getutent getutxent | |
267 | # define getutid getutxid | |
268 | # define getutline getutxline | |
269 | # define pututline pututxline | |
270 | # define setutent setutxent | |
271 | # define endutent endutxent | |
272 | # define ut_time ut_xtime | |
273 | # else /* SVR4 */ | |
274 | # include <utmp.h> | |
275 | # endif /* SVR4 */ | |
276 | # ifdef apollo | |
277 | /* | |
278 | * We don't have GETUTENT, so we dig into utmp ourselves. | |
279 | * But we save the permanent filedescriptor and | |
280 | * open utmp just when we need to. | |
281 | * This code supports an unsorted utmp. jw. | |
282 | */ | |
283 | # define UTNOKEEP | |
284 | # endif /* apollo */ | |
285 | ||
286 | # ifndef UTMPFILE | |
287 | # ifdef UTMP_FILE | |
288 | # define UTMPFILE UTMP_FILE | |
289 | # else | |
290 | # ifdef _PATH_UTMP | |
291 | # define UTMPFILE _PATH_UTMP | |
292 | # else | |
293 | # define UTMPFILE "/etc/utmp" | |
294 | # endif /* _PATH_UTMP */ | |
295 | # endif | |
296 | # endif | |
297 | ||
298 | #endif /* UTMPOK || BUGGYGETLOGIN */ | |
299 | ||
300 | #if !defined(UTMPOK) && defined(USRLIMIT) | |
301 | # undef USRLIMIT | |
302 | #endif | |
303 | ||
304 | #ifdef LOGOUTOK | |
305 | # ifndef LOGINDEFAULT | |
306 | # define LOGINDEFAULT 0 | |
307 | # endif | |
308 | #else | |
309 | # ifdef LOGINDEFAULT | |
310 | # undef LOGINDEFAULT | |
311 | # endif | |
312 | # define LOGINDEFAULT 1 | |
313 | #endif | |
314 | ||
315 | ||
316 | /***************************************************************** | |
317 | * file stuff | |
318 | */ | |
319 | ||
320 | #ifndef F_OK | |
321 | #define F_OK 0 | |
322 | #endif | |
323 | #ifndef X_OK | |
324 | #define X_OK 1 | |
325 | #endif | |
326 | #ifndef W_OK | |
327 | #define W_OK 2 | |
328 | #endif | |
329 | #ifndef R_OK | |
330 | #define R_OK 4 | |
331 | #endif | |
332 | ||
333 | #ifndef S_IFIFO | |
334 | #define S_IFIFO 0010000 | |
335 | #endif | |
336 | #ifndef S_IREAD | |
337 | #define S_IREAD 0000400 | |
338 | #endif | |
339 | #ifndef S_IWRITE | |
340 | #define S_IWRITE 0000200 | |
341 | #endif | |
342 | #ifndef S_IEXEC | |
343 | #define S_IEXEC 0000100 | |
344 | #endif | |
345 | ||
346 | #if defined(S_IFIFO) && defined(S_IFMT) && !defined(S_ISFIFO) | |
347 | #define S_ISFIFO(mode) (((mode) & S_IFMT) == S_IFIFO) | |
348 | #endif | |
349 | #if defined(S_IFSOCK) && defined(S_IFMT) && !defined(S_ISSOCK) | |
350 | #define S_ISSOCK(mode) (((mode) & S_IFMT) == S_IFSOCK) | |
351 | #endif | |
352 | #if defined(S_IFCHR) && defined(S_IFMT) && !defined(S_ISCHR) | |
353 | #define S_ISCHR(mode) (((mode) & S_IFMT) == S_IFCHR) | |
354 | #endif | |
355 | #if defined(S_IFDIR) && defined(S_IFMT) && !defined(S_ISDIR) | |
356 | #define S_ISDIR(mode) (((mode) & S_IFMT) == S_IFDIR) | |
357 | #endif | |
358 | #if defined(S_IFLNK) && defined(S_IFMT) && !defined(S_ISLNK) | |
359 | #define S_ISLNK(mode) (((mode) & S_IFMT) == S_IFLNK) | |
360 | #endif | |
361 | ||
362 | /* | |
363 | * SunOS 4.1.3: `man 2V open' has only one line that mentions O_NOBLOCK: | |
364 | * | |
365 | * O_NONBLOCK Same as O_NDELAY above. | |
366 | * | |
367 | * on the very same SunOS 4.1.3, I traced the open system call and found | |
368 | * that an open("/dev/ttyy08", O_RDWR|O_NONBLOCK|O_NOCTTY) was blocked, | |
369 | * whereas open("/dev/ttyy08", O_RDWR|O_NDELAY |O_NOCTTY) went through. | |
370 | * | |
371 | * For this simple reason I now favour O_NDELAY. jw. 4.5.95 | |
372 | */ | |
373 | #if defined(sun) && !defined(SVR4) | |
374 | # undef O_NONBLOCK | |
375 | #endif | |
376 | ||
377 | #if !defined(O_NONBLOCK) && defined(O_NDELAY) | |
378 | # define O_NONBLOCK O_NDELAY | |
379 | #endif | |
380 | ||
381 | #if !defined(FNBLOCK) && defined(FNONBLOCK) | |
382 | # define FNBLOCK FNONBLOCK | |
383 | #endif | |
384 | #if !defined(FNBLOCK) && defined(FNDELAY) | |
385 | # define FNBLOCK FNDELAY | |
386 | #endif | |
387 | #if !defined(FNBLOCK) && defined(O_NONBLOCK) | |
388 | # define FNBLOCK O_NONBLOCK | |
389 | #endif | |
390 | ||
391 | #ifndef POSIX | |
392 | #undef mkfifo | |
393 | #define mkfifo(n,m) mknod(n,S_IFIFO|(m),0) | |
394 | #endif | |
395 | ||
396 | #if !defined(HAVE_LSTAT) && !defined(lstat) | |
397 | # define lstat stat | |
398 | #endif | |
399 | ||
400 | /***************************************************************** | |
401 | * signal handling | |
402 | */ | |
403 | ||
404 | #ifdef SIGVOID | |
405 | # define SIGRETURN | |
406 | # define sigret_t void | |
407 | #else | |
408 | # define SIGRETURN return 0; | |
409 | # define sigret_t int | |
410 | #endif | |
411 | ||
412 | /* Geeeee, reverse it? */ | |
413 | #if defined(SVR4) || (defined(SYSV) && defined(ISC)) || defined(_AIX) || defined(linux) || defined(ultrix) || defined(__386BSD__) || defined(__bsdi__) || defined(POSIX) || defined(NeXT) | |
414 | # define SIGHASARG | |
415 | #endif | |
416 | ||
417 | #ifdef SIGHASARG | |
418 | # define SIGPROTOARG (int) | |
419 | # define SIGDEFARG (sigsig) int sigsig; | |
420 | # define SIGARG 0 | |
421 | #else | |
422 | # define SIGPROTOARG (void) | |
423 | # define SIGDEFARG () | |
424 | # define SIGARG | |
425 | #endif | |
426 | ||
427 | #ifndef SIGCHLD | |
428 | #define SIGCHLD SIGCLD | |
429 | #endif | |
430 | ||
431 | #if defined(POSIX) || defined(hpux) | |
432 | # define signal xsignal | |
433 | #else | |
434 | # ifdef USESIGSET | |
435 | # define signal sigset | |
436 | # endif /* USESIGSET */ | |
437 | #endif | |
438 | ||
439 | /* used in screen.c and attacher.c */ | |
440 | #ifndef NSIG /* kbeal needs these w/o SYSV */ | |
441 | # define NSIG 32 | |
442 | #endif /* !NSIG */ | |
443 | ||
444 | ||
445 | /***************************************************************** | |
446 | * Wait stuff | |
447 | */ | |
448 | ||
449 | #if (!defined(sysV68) && !defined(M_XENIX)) || defined(NeXT) || defined(M_UNIX) | |
450 | # include <sys/wait.h> | |
451 | #endif | |
452 | ||
453 | #ifndef WTERMSIG | |
454 | # ifndef BSDWAIT /* if wait is NOT a union: */ | |
455 | # define WTERMSIG(status) (status & 0177) | |
456 | # else | |
457 | # define WTERMSIG(status) status.w_T.w_Termsig | |
458 | # endif | |
459 | #endif | |
460 | ||
461 | #ifndef WSTOPSIG | |
462 | # ifndef BSDWAIT /* if wait is NOT a union: */ | |
463 | # define WSTOPSIG(status) ((status >> 8) & 0377) | |
464 | # else | |
465 | # define WSTOPSIG(status) status.w_S.w_Stopsig | |
466 | # endif | |
467 | #endif | |
468 | ||
469 | /* NET-2 uses WCOREDUMP */ | |
470 | #if defined(WCOREDUMP) && !defined(WIFCORESIG) | |
471 | # define WIFCORESIG(status) WCOREDUMP(status) | |
472 | #endif | |
473 | ||
474 | #ifndef WIFCORESIG | |
475 | # ifndef BSDWAIT /* if wait is NOT a union: */ | |
476 | # define WIFCORESIG(status) (status & 0200) | |
477 | # else | |
478 | # define WIFCORESIG(status) status.w_T.w_Coredump | |
479 | # endif | |
480 | #endif | |
481 | ||
482 | #ifndef WEXITSTATUS | |
483 | # ifndef BSDWAIT /* if wait is NOT a union: */ | |
484 | # define WEXITSTATUS(status) ((status >> 8) & 0377) | |
485 | # else | |
486 | # define WEXITSTATUS(status) status.w_T.w_Retcode | |
487 | # endif | |
488 | #endif | |
489 | ||
490 | ||
491 | /***************************************************************** | |
492 | * select stuff | |
493 | */ | |
494 | ||
775e241e | 495 | #if defined(M_XENIX) || defined(M_UNIX) || defined(_SEQUENT_) || defined (__INTERIX) |
b585a9fa EZ |
496 | #include <sys/select.h> /* for timeval + FD... */ |
497 | #endif | |
498 | ||
499 | /* | |
500 | * SunOS 3.5 - Tom Schmidt - Micron Semiconductor, Inc - 27-Jul-93 | |
501 | * [email protected] | |
502 | */ | |
503 | #ifndef FD_SET | |
504 | # ifndef SUNOS3 | |
505 | typedef struct fd_set { int fds_bits[1]; } fd_set; | |
506 | # endif | |
507 | # define FD_ZERO(fd) ((fd)->fds_bits[0] = 0) | |
508 | # define FD_SET(b, fd) ((fd)->fds_bits[0] |= 1 << (b)) | |
509 | # define FD_ISSET(b, fd) ((fd)->fds_bits[0] & 1 << (b)) | |
510 | # define FD_SETSIZE 32 | |
511 | #endif | |
512 | ||
513 | ||
514 | /***************************************************************** | |
515 | * user defineable stuff | |
516 | */ | |
517 | ||
518 | #ifndef TERMCAP_BUFSIZE | |
519 | # define TERMCAP_BUFSIZE 2048 | |
520 | #endif | |
521 | ||
522 | #ifndef MAXPATHLEN | |
523 | # define MAXPATHLEN 1024 | |
524 | #endif | |
525 | ||
526 | /* | |
527 | * you may try to vary this value. Use low values if your (VMS) system | |
528 | * tends to choke when pasting. Use high values if you want to test | |
529 | * how many characters your pty's can buffer. | |
530 | */ | |
531 | #define IOSIZE 4096 |