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