xref: /freebsd/contrib/tcsh/tc.os.h (revision ce6a89e27cd190313be39bb479880aeda4778436)
1 /*
2  * tc.os.h: Shell os dependent defines
3  */
4 /*-
5  * Copyright (c) 1980, 1991 The Regents of the University of California.
6  * All rights reserved.
7  *
8  * Redistribution and use in source and binary forms, with or without
9  * modification, are permitted provided that the following conditions
10  * are met:
11  * 1. Redistributions of source code must retain the above copyright
12  *    notice, this list of conditions and the following disclaimer.
13  * 2. Redistributions in binary form must reproduce the above copyright
14  *    notice, this list of conditions and the following disclaimer in the
15  *    documentation and/or other materials provided with the distribution.
16  * 3. Neither the name of the University nor the names of its contributors
17  *    may be used to endorse or promote products derived from this software
18  *    without specific prior written permission.
19  *
20  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
21  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
24  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
25  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
26  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
27  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
28  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
29  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
30  * SUCH DAMAGE.
31  */
32 #ifndef _h_tc_os
33 #define _h_tc_os
34 
35 #ifdef notdef
36 /*
37  * for SVR4 and linux we used to fork pipelines backwards.
38  * This should not be needed any more.
39  * more info in sh.sem.c
40  */
41 # define BACKPIPE
42 #endif /* notdef */
43 
44 #ifdef __CYGWIN__
45 #  undef NOFILE
46 #  define NOFILE sysconf(_SC_OPEN_MAX)
47 #endif
48 
49 #ifdef   _VMS_POSIX
50 # ifndef  NOFILE
51 #  define  NOFILE 64
52 # endif /* NOFILE */
53 # define  nice(a)       setprio((getpid()),a)
54 # include <sys/time.h>    /* for time stuff in tc.prompt.c */
55 # include <limits.h>
56 #endif /* atp vmsposix */
57 
58 #if defined(DECOSF1) || defined(HPUXVERSION)
59 # include <sys/signal.h>
60 #endif /* DECOSF1 || HPUXVERSION */
61 
62 #ifdef DECOSF1
63 # include <sys/ioctl.h>
64 #endif /* DECOSF1 */
65 
66 #if defined(OPEN_MAX) && !defined(NOFILE)
67 # define NOFILE OPEN_MAX
68 #endif /* OPEN_MAX && !NOFILE */
69 
70 #if defined(USR_NFDS) && !defined(NOFILE)
71 # define NOFILE USR_NFDS
72 #endif /* USR_NFDS && !NOFILE */
73 
74 #ifndef NOFILE
75 # define NOFILE 256
76 #endif /* NOFILE */
77 
78 #ifdef OREO
79 # include <sys/time.h>
80 # ifdef notdef
81   /* Don't include it, because it defines things we don't really have */
82 #  include <sys/resource.h>
83 # endif /* notdef */
84 # ifdef POSIX
85 #  include <sys/tty.h>
86 #  include <termios.h>
87 # endif /* POSIX */
88 #endif /* OREO */
89 
90 #ifdef __QNXNTO__
91 #include <sys/resource.h>
92 #include <fcntl.h>
93 #undef O_TEXT
94 #undef O_BINARY
95 #endif
96 
97 #ifdef convex
98 # include <sys/dmon.h>
99 #endif /* convex */
100 
101 #ifdef titan
102 extern int end;
103 #endif /* titan */
104 
105 #ifdef hpux
106 # ifdef lint
107 /*
108  * Hpux defines struct ucred, in <sys/user.h>, but if I include that
109  * then I need to include the *world*
110  * [all this to pass lint cleanly!!!]
111  * so I define struct ucred here...
112  */
113 struct ucred {
114     int     foo;
115 };
116 # endif /* lint */
117 
118 /*
119  * hpux 7.0 does not define it
120  */
121 # ifndef CSUSP
122 #  define CSUSP 032
123 # endif	/* CSUSP */
124 
125 # include <signal.h>
126 # if !defined(hp9000s500) && !(defined(SIGRTMAX) || defined(SIGRTMIN))
127 /*
128  * hpux < 7
129  */
130 #  include <sys/bsdtty.h>
131 # endif /* !hp9000s500 && !(SIGRTMAX || SIGRTMIN) */
132 
133 # ifndef TIOCSTI
134 #  include <sys/strtio.h>
135 # endif
136 #endif /* hpux */
137 
138 /*
139  * ISC does not define CSUSP
140  */
141 #ifdef ISC
142 # ifndef CSUSP
143 #  define CSUSP 032
144 # endif	/* CSUSP */
145 # if defined(POSIX) && !defined(TIOCGWINSZ)
146 /*
147  * ISC defines this only in termio.h. If we are using POSIX and include
148  * termios.h, then we define it ourselves so that window resizing works.
149  */
150 #  define TIOCGWINSZ      (('T'<<8)|104)
151 # endif /* POSIX && !TIOCGWINSZ */
152 #endif /* ISC */
153 
154 #ifdef ISC202
155 # undef TIOCGWINSZ
156 #endif /* ISC202 */
157 
158 /*
159  * XXX: This will be changed soon to
160  * #if (SYSVREL > 0) && defined(TIOCGWINSZ)
161  * If that breaks on your machine, let me know.
162  *
163  * It would break on glibc, where all this is
164  * defined in <termios.h>. Wrapper added.
165  */
166 #if !defined(__linux__) && !defined(__GNU__) && !defined(__GLIBC__) && !defined(_VMS_POSIX)
167 # if defined(INTEL) || defined(u3b2) || defined (u3b5) || defined(ub15) || defined(u3b20d) || defined(ISC) || defined(SCO) || defined(tower32)
168 #  ifdef TIOCGWINSZ
169 /*
170  * for struct winsiz
171  */
172 #   include <sys/stream.h>
173 #   include <sys/ptem.h>
174 #  endif /* TIOCGWINSZ */
175 # endif /* INTEL || u3b2 || u3b5 || ub15 || u3b20d || ISC || SCO || tower32 */
176 #endif /* !glibc && !_VMS_POSIX */
177 
178 #ifdef IRIS4D
179 # include <sys/time.h>
180 # include <sys/resource.h>
181 #endif /* IRIS4D */
182 
183 /*
184  * For some versions of system V software, specially ones that use the
185  * Wollongong Software TCP/IP, the FIOCLEX, FIONCLEX, FIONBIO calls
186  * might not work correctly for file descriptors [they work only for
187  * sockets]. So we try to use first the fcntl() and we only use the
188  * ioctl() form, only if we don't have the fcntl() one.
189  *
190  * From: scott@craycos.com (Scott Bolte)
191  */
192 #ifndef WINNT_NATIVE
193 # ifdef F_SETFD
194 #  ifndef FD_CLOEXEC
195 #   define FD_CLOEXEC 1
196 #  endif
197 #  define close_on_exec(fd, v) fcntl((fd), F_SETFD, ((v) ? FD_CLOEXEC : 0))
198 # else /* !F_SETFD */
199 #  ifdef FIOCLEX
200 #   define close_on_exec(fd, v) ioctl((fd), ((v) ? FIOCLEX : FIONCLEX), NULL)
201 #  else /* !FIOCLEX */
202 #   define close_on_exec(fd, v)	/* Nothing */
203 #  endif /* FIOCLEX */
204 # endif /* F_SETFD */
205 #else /* WINNT_NATIVE */
206 # define close_on_exec(fd, v) nt_close_on_exec((fd),(v))
207 #endif /* !WINNT_NATIVE */
208 
209 /*
210  * Stat
211  */
212 #ifdef ISC
213 /* these are not defined for _POSIX_SOURCE under ISC 2.2 */
214 # ifndef S_IFMT
215 #  define S_IFMT	0170000		/* type of file */
216 #  define S_IFDIR	0040000		/* directory */
217 #  define S_IFCHR	0020000		/* character special */
218 #  define S_IFBLK	0060000		/* block special */
219 #  define S_IFREG	0100000		/* regular */
220 #  define S_IFIFO	0010000		/* fifo */
221 #  define S_IFNAM	0050000		/* special named file */
222 #  ifndef ISC202
223 #   define S_IFLNK	0120000		/* symbolic link */
224 #  endif /* ISC202 */
225 # endif /* S_IFMT */
226 #endif /* ISC */
227 
228 #ifdef STAT_MACROS_BROKEN
229 # undef S_ISDIR
230 # undef S_ISCHR
231 # undef S_ISBLK
232 # undef S_ISREG
233 # undef S_ISFIFO
234 # undef S_ISNAM
235 # undef S_ISLNK
236 # undef S_ISSOCK
237 #endif /* STAT_MACROS_BROKEN */
238 
239 #ifdef S_IFMT
240 # if !defined(S_ISDIR) && defined(S_IFDIR)
241 #  define S_ISDIR(a)	(((a) & S_IFMT) == S_IFDIR)
242 # endif	/* ! S_ISDIR && S_IFDIR */
243 # if !defined(S_ISCHR) && defined(S_IFCHR)
244 #  define S_ISCHR(a)	(((a) & S_IFMT) == S_IFCHR)
245 # endif /* ! S_ISCHR && S_IFCHR */
246 # if !defined(S_ISBLK) && defined(S_IFBLK)
247 #  define S_ISBLK(a)	(((a) & S_IFMT) == S_IFBLK)
248 # endif	/* ! S_ISBLK && S_IFBLK */
249 # if !defined(S_ISREG) && defined(S_IFREG)
250 #  define S_ISREG(a)	(((a) & S_IFMT) == S_IFREG)
251 # endif	/* ! S_ISREG && S_IFREG */
252 # if !defined(S_ISFIFO) && defined(S_IFIFO)
253 #  define S_ISFIFO(a)	(((a) & S_IFMT) == S_IFIFO)
254 # endif	/* ! S_ISFIFO && S_IFIFO */
255 # if !defined(S_ISNAM) && defined(S_IFNAM)
256 #  define S_ISNAM(a)	(((a) & S_IFMT) == S_IFNAM)
257 # endif	/* ! S_ISNAM && S_IFNAM */
258 # if !defined(S_ISLNK) && defined(S_IFLNK)
259 #  define S_ISLNK(a)	(((a) & S_IFMT) == S_IFLNK)
260 # endif	/* ! S_ISLNK && S_IFLNK */
261 # if !defined(S_ISSOCK) && defined(S_IFSOCK)
262 #  define S_ISSOCK(a)	(((a) & S_IFMT) == S_IFSOCK)
263 # endif	/* ! S_ISSOCK && S_IFSOCK */
264 #endif /* S_IFMT */
265 
266 #ifdef tower32
267 /* The header files lie; we really don't have symlinks */
268 # undef S_ISLNK
269 # undef S_IFLNK
270 #endif /* tower32 */
271 
272 #ifndef S_IREAD
273 # define S_IREAD 0000400
274 #endif /* S_IREAD */
275 #ifndef S_IROTH
276 # define S_IROTH (S_IREAD >> 6)
277 #endif /* S_IROTH */
278 #ifndef S_IRGRP
279 # define S_IRGRP (S_IREAD >> 3)
280 #endif /* S_IRGRP */
281 #ifndef S_IRUSR
282 # define S_IRUSR S_IREAD
283 #endif /* S_IRUSR */
284 
285 #ifndef S_IWRITE
286 # define S_IWRITE 0000200
287 #endif /* S_IWRITE */
288 #ifndef S_IWOTH
289 # define S_IWOTH (S_IWRITE >> 6)
290 #endif /* S_IWOTH */
291 #ifndef S_IWGRP
292 # define S_IWGRP (S_IWRITE >> 3)
293 #endif /* S_IWGRP */
294 #ifndef S_IWUSR
295 # define S_IWUSR S_IWRITE
296 #endif /* S_IWUSR */
297 
298 #ifndef S_IEXEC
299 # define S_IEXEC 0000100
300 #endif /* S_IEXEC */
301 #ifndef S_IXOTH
302 # define S_IXOTH (S_IEXEC >> 6)
303 #endif /* S_IXOTH */
304 #ifndef S_IXGRP
305 # define S_IXGRP (S_IEXEC >> 3)
306 #endif /* S_IXGRP */
307 #ifndef S_IXUSR
308 # define S_IXUSR S_IEXEC
309 #endif /* S_IXUSR */
310 
311 #ifndef S_ISUID
312 # define S_ISUID 0004000 	/* setuid */
313 #endif /* S_ISUID */
314 #ifndef S_ISGID
315 # define S_ISGID 0002000	/* setgid */
316 #endif /* S_ISGID */
317 #ifndef S_ISVTX
318 # define S_ISVTX 0001000	/* sticky */
319 #endif /* S_ISVTX */
320 #ifndef S_ENFMT
321 # define S_ENFMT S_ISGID	/* record locking enforcement flag */
322 #endif /* S_ENFMT */
323 
324 /* the following macros are for POSIX conformance */
325 #ifndef S_IRWXU
326 # define S_IRWXU (S_IRUSR | S_IWUSR | S_IXUSR)
327 #endif /* S_IRWXU */
328 #ifndef S_IRWXG
329 # define S_IRWXG (S_IRGRP | S_IWGRP | S_IXGRP)
330 #endif /* S_IRWXG */
331 #ifndef S_IRWXO
332 # define S_IRWXO (S_IROTH | S_IWOTH | S_IXOTH)
333 #endif /* S_IRWXO */
334 
335 /*
336  * Access()
337  */
338 #ifndef F_OK
339 # define F_OK 0
340 #endif /* F_OK */
341 #ifndef X_OK
342 # define X_OK 1
343 #endif /* X_OK */
344 #ifndef W_OK
345 # define W_OK 2
346 #endif /* W_OK */
347 #ifndef R_OK
348 # define R_OK 4
349 #endif /* R_OK */
350 
351 /*
352  * Open()
353  */
354 #ifndef O_RDONLY
355 # define O_RDONLY	0
356 #endif /* O_RDONLY */
357 #ifndef O_WRONLY
358 # define O_WRONLY	1
359 #endif /* O_WRONLY */
360 #ifndef O_RDWR
361 # define O_RDWR		2
362 #endif /* O_RDWR */
363 #ifndef O_TEMPORARY
364 # define O_TEMPORARY	0
365 #endif /* O_TEMPORARY */
366 #ifndef O_EXCL
367 # define O_EXCL		0
368 #endif /* O_EXCL */
369 #ifndef O_LARGEFILE
370 # define O_LARGEFILE	0
371 #endif /* O_LARGEFILE */
372 #ifndef O_CREAT
373 # define O_CREAT	0
374 #endif /* O_CREAT */
375 
376 /*
377  * Lseek()
378  */
379 #ifndef L_SET
380 # ifdef SEEK_SET
381 #  define L_SET		SEEK_SET
382 # else /* !SEEK_SET */
383 #  define L_SET		0
384 # endif	/* SEEK_SET */
385 #endif /* L_SET */
386 #ifndef L_INCR
387 # ifdef SEEK_CUR
388 #  define L_INCR	SEEK_CUR
389 # else /* !SEEK_CUR */
390 #  define L_INCR	1
391 # endif	/* SEEK_CUR */
392 #endif /* L_INCR */
393 #ifndef L_XTND
394 # ifdef SEEK_END
395 #  define L_XTND	SEEK_END
396 # else /* !SEEK_END */
397 #  define L_XTND	2
398 # endif /* SEEK_END */
399 #endif /* L_XTND */
400 
401 #if !defined (HAVE_SETPGID) && !defined (SETPGRP_VOID)
402 # define setpgid(pid, pgrp)	setpgrp(pid, pgrp)
403 #endif
404 
405 #if defined(BSDJOBS) && !(defined(POSIX) && defined(POSIXJOBS))
406 # define NEEDtcgetpgrp
407 #endif /* BSDJOBS && !(POSIX && POSIXJOBS) */
408 
409 #ifdef RENO
410 /*
411  * RENO has this broken. It is fixed on 4.4BSD
412  */
413 # define NEEDtcgetpgrp
414 #endif /* RENO */
415 
416 #ifdef SXA
417 # ifndef _BSDX_
418 /*
419  * Only needed in the system V environment.
420  */
421 #  define setrlimit 	bsd_setrlimit
422 #  define getrlimit	bsd_getrlimit
423 # endif	/* _BSDX_ */
424 #endif /* SXA */
425 
426 #if defined(_MINIX) || defined(__EMX__)
427 # define HAVENOLIMIT
428 /*
429  * Minix does not have these, so...
430  */
431 # define getpgrp		getpid
432 #endif /* _MINIX || __EMX__ */
433 
434 #ifdef __EMX__
435 /* XXX: How can we get the tty name in emx? */
436 # define ttyname(fd) (isatty(fd) ? "/dev/tty" : NULL)
437 #endif /* __EMX__ */
438 
439 #ifndef S_IFLNK
440 # define lstat stat
441 #endif /* S_IFLNK */
442 
443 
444 #if defined(BSDTIMES) && !defined(_SEQUENT_)
445 typedef struct timeval timeval_t;
446 #endif /* BSDTIMES && ! _SEQUENT_ */
447 
448 #ifdef NeXT
449 /*
450  * From Tony_Mason@transarc.com, override NeXT's malloc stuff.
451  */
452 # define malloc tcsh_malloc
453 # define calloc tcsh_calloc
454 # define realloc tcsh_realloc
455 # define free tcsh_free
456 #endif /* NeXT */
457 
458 #if defined(HAVE_GETHOSTNAME) && !HAVE_DECL_GETHOSTNAME
459 extern int gethostname (char *, int);
460 #endif
461 
462 #ifndef GETPGRP_VOID
463 # define mygetpgrp()    getpgrp(0)
464 #else
465 # define mygetpgrp()    getpgrp()
466 #endif
467 
468 #if !defined(POSIX) || defined(SUNOS4) || defined(UTekV) || defined(sysV88)
469 extern time_t time();
470 extern char *getenv();
471 extern int atoi();
472 # ifndef __EMX__
473 extern char *ttyname();
474 # endif /* __EMX__ */
475 
476 
477 # if defined(SUNOS4)
478 #  ifndef toupper
479 extern int toupper (int);
480 #  endif /* toupper */
481 #  ifndef tolower
482 extern int tolower (int);
483 #  endif /* tolower */
484 extern caddr_t sbrk (int);
485 # else /* !SUNOS4 */
486 #  ifndef WINNT_NATIVE
487 #   ifdef hpux
488 extern void abort();
489 extern void qsort();
490 #   endif /* hpux */
491 #  endif /* !WINNT_NATIVE */
492 # endif	/* SUNOS4 */
493 #ifndef _CX_UX
494 extern void perror();
495 #endif
496 
497 # ifdef BSD
498 extern uid_t getuid(), geteuid();
499 extern gid_t getgid(), getegid();
500 # endif /* BSD */
501 
502 # ifdef SYSMALLOC
503 extern memalign_t malloc();
504 extern memalign_t realloc();
505 extern memalign_t calloc();
506 extern void free();
507 # endif	/* SYSMALLOC */
508 
509 # ifdef BSDJOBS
510 #  ifdef BSDTIMES
511 #   ifdef __MACHTEN__
512 extern pid_t wait3();
513 #   endif /* __MACHTEN__ */
514 #  endif /* BSDTIMES */
515 # endif	/* BSDJOBS */
516 
517 # if (!defined(fps500) && !defined(apollo) && !defined(__lucid) && !defined(HPBSD) && !defined(DECOSF1))
518 extern void setpwent();
519 extern void endpwent();
520 # endif /* !fps500 && !apollo && !__lucid && !HPBSD && !DECOSF1 */
521 
522 # ifndef __STDC__
523 extern struct passwd *getpwuid(), *getpwnam(), *getpwent();
524 #  ifdef HAVE_SHADOW_H
525 extern struct spwd *getspnam(), *getspent();
526 #  endif /* HAVE_SHADOW_H */
527 #  if defined(HAVE_AUTH_H) && defined(HAVE_GETAUTHUID)
528 extern struct authorization *getauthuid();
529 #  endif /* HAVE_AUTH_H && HAVE_GETAUTHUID */
530 # endif /* __STDC__ */
531 
532 # ifndef getcwd
533 extern char *getcwd();
534 # endif	/* getcwd */
535 
536 #else /* POSIX || !SUNOS4 || !UTekV || !sysV88 */
537 
538 # if (defined(SUNOS4) && !defined(__GNUC__)) || defined(_IBMR2) || defined(_IBMESA)
539 extern char *getvwd();
540 # endif	/* (SUNOS4 && ! __GNUC__) || _IBMR2 || _IBMESA */
541 
542 # ifdef SCO
543 extern char *ttyname();
544 # endif /* SCO */
545 
546 # ifdef __clipper__
547 extern char *ttyname();
548 # endif /* __clipper__ */
549 
550 #endif /* !POSIX || SUNOS4 || UTekV || sysV88 */
551 
552 #if defined(SUNOS4) && __GNUC__ == 2
553 /*
554  * Somehow these are missing
555  */
556 extern int ioctl (int, int, ...);
557 extern int readlink (const char *, char *, size_t);
558 extern void setgrent (void);
559 extern void endgrent (void);
560 # ifdef REMOTEHOST
561 #  ifndef _SOCKLEN_T	/* Avoid Solaris 2.7 bogosity. */
562 struct sockaddr;
563 extern int getpeername (int, struct sockaddr *, int *);
564 #  endif /* _SOCKLEN_T */
565 # endif /* REMOTEHOST */
566 #endif /* SUNOS4 && __GNUC__ == 2 */
567 
568 #if (defined(BSD) && !defined(BSD4_4)) || defined(SUNOS4)
569 # if defined(__alpha) && defined(__osf__) && DECOSF1 < 200
570 extern void bcopy	(const void *, void *, size_t);
571 #  define memmove(a, b, c) (bcopy((char *) (b), (char *) (a), (int) (c)), a)
572 # endif /* __alpha && __osf__ && DECOSF1 < 200 */
573 #endif /* (BSD && !BSD4_4) || SUNOS4 */
574 
575 #ifdef SUNOS4
576 # include <memory.h>	/* memset should be declared in <string.h> but isn't */
577 #endif /* SUNOS4 */
578 
579 #if SYSVREL == 4
580 # ifdef REMOTEHOST
581 /* Irix6 defines getpeername(int, void *, int *) which conflicts with
582    the definition below. */
583 #  if !defined(__sgi) && !defined(_OSD_POSIX) && !defined(__MVS__)
584 #   ifndef _SOCKLEN_T	/* Avoid Solaris 2.7 bogosity. */
585 struct sockaddr;
586 extern int getpeername (int, struct sockaddr *, int *);
587 #   endif /* _SOCKLEN_T */
588 #  endif /* !__sgi && !_OSD_POSIX && !__MVS__ */
589 # endif /* REMOTEHOST */
590 # ifndef BSDTIMES
591 extern int getrlimit (int, struct rlimit *);
592 extern int setrlimit (int, const struct rlimit *);
593 # endif /* !BSDTIMES */
594 # if defined(SOLARIS2)
595 extern char *strerror (int);
596 # endif /* SOLARIS2 */
597 #endif /* SYSVREL == 4 */
598 
599 #if defined(__alpha) && defined(__osf__) && DECOSF1 < 200
600 /* These are ok for 1.3, but conflict with the header files for 2.0 */
601 extern char *sbrk (ssize_t);
602 extern int ioctl (int, unsigned long, char *);
603 extern pid_t vfork (void);
604 extern int killpg (pid_t, int);
605 #endif /* __osf__ && __alpha && DECOSF1 < 200 */
606 
607 #ifndef va_copy
608 # ifdef __va_copy
609 #  define va_copy(DEST, SRC) __va_copy(DEST, SRC)
610 # else
611 #  define va_copy(DEST, SRC) memcpy(&(DEST), &(SRC), sizeof(va_list))
612 # endif
613 #endif
614 
615 #if defined(__CYGWIN__) && !defined(NO_CRYPT)
616 extern char *cygwin_xcrypt(struct passwd *, const char *, const char *);
617 #endif /* __CYGWIN__ && !NO_CRYPT */
618 
619 #endif /* _h_tc_os */
620