tclUnixPort.h

Go to the documentation of this file.
00001 /*
00002  * tclUnixPort.h --
00003  *
00004  *      This header file handles porting issues that occur because
00005  *      of differences between systems.  It reads in UNIX-related
00006  *      header files and sets up UNIX-related macros for Tcl's UNIX
00007  *      core.  It should be the only file that contains #ifdefs to
00008  *      handle different flavors of UNIX.  This file sets up the
00009  *      union of all UNIX-related things needed by any of the Tcl
00010  *      core files.  This file depends on configuration #defines such
00011  *      as NO_DIRENT_H that are set up by the "configure" script.
00012  *
00013  *      Much of the material in this file was originally contributed
00014  *      by Karl Lehenbauer, Mark Diekhans and Peter da Silva.
00015  *
00016  * Copyright (c) 1991-1994 The Regents of the University of California.
00017  * Copyright (c) 1994-1997 Sun Microsystems, Inc.
00018  *
00019  * See the file "license.terms" for information on usage and redistribution
00020  * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
00021  *
00022  * RCS: @(#) $Id: tclUnixPort.h,v 1.61 2007/12/13 15:28:42 dgp Exp $
00023  */
00024 
00025 #ifndef _TCLUNIXPORT
00026 #define _TCLUNIXPORT
00027 
00028 /*
00029  *---------------------------------------------------------------------------
00030  * The following sets of #includes and #ifdefs are required to get Tcl to
00031  * compile under the various flavors of unix.
00032  *---------------------------------------------------------------------------
00033  */
00034 
00035 #include <errno.h>
00036 #include <fcntl.h>
00037 #ifdef HAVE_NET_ERRNO_H
00038 #   include <net/errno.h>
00039 #endif
00040 #include <pwd.h>
00041 #include <signal.h>
00042 #ifdef HAVE_SYS_PARAM_H
00043 #   include <sys/param.h>
00044 #endif
00045 #include <sys/types.h>
00046 #ifdef USE_DIRENT2_H
00047 #   include "../compat/dirent2.h"
00048 #else
00049 #ifdef NO_DIRENT_H
00050 #   include "../compat/dirent.h"
00051 #else
00052 #   include <dirent.h>
00053 #endif
00054 #endif
00055 
00056 #ifdef HAVE_STRUCT_DIRENT64
00057 typedef struct dirent64 Tcl_DirEntry;
00058 #   define TclOSreaddir         readdir64
00059 #else
00060 typedef struct dirent   Tcl_DirEntry;
00061 #   define TclOSreaddir         readdir
00062 #endif
00063 
00064 #ifdef HAVE_TYPE_OFF64_T
00065 typedef off64_t         Tcl_SeekOffset;
00066 #   define TclOSseek            lseek64
00067 #   define TclOSopen            open64
00068 #else
00069 typedef off_t           Tcl_SeekOffset;
00070 #   define TclOSseek            lseek
00071 #   define TclOSopen            open
00072 #endif
00073 
00074 #ifdef HAVE_STRUCT_STAT64
00075 #   define TclOSstat            stat64
00076 #   define TclOSlstat           lstat64
00077 #else
00078 #   define TclOSstat            stat
00079 #   define TclOSlstat           lstat
00080 #endif
00081 
00082 #include <sys/file.h>
00083 #ifdef HAVE_SYS_SELECT_H
00084 #   include <sys/select.h>
00085 #endif
00086 #include <sys/stat.h>
00087 #if TIME_WITH_SYS_TIME
00088 #   include <sys/time.h>
00089 #   include <time.h>
00090 #else
00091 #if HAVE_SYS_TIME_H
00092 #   include <sys/time.h>
00093 #else
00094 #   include <time.h>
00095 #endif
00096 #endif
00097 #ifndef NO_SYS_WAIT_H
00098 #   include <sys/wait.h>
00099 #endif
00100 #if HAVE_INTTYPES_H
00101 #   include <inttypes.h>
00102 #endif
00103 #if HAVE_STDINT_H
00104 #   include <stdint.h>
00105 #endif
00106 #ifdef HAVE_UNISTD_H
00107 #   include <unistd.h>
00108 #else
00109 #   include "../compat/unistd.h"
00110 #endif
00111 #ifdef  USE_FIONBIO
00112     /*
00113      * Not using the Posix fcntl(...,O_NONBLOCK,...) interface, instead
00114      * we are using ioctl(..,FIONBIO,..).
00115      */
00116 
00117 #   ifdef HAVE_SYS_FILIO_H
00118 #       include <sys/filio.h>   /* For FIONBIO. */
00119 #   endif
00120 
00121 #   ifdef HAVE_SYS_IOCTL_H
00122 #       include <sys/ioctl.h>   /* For FIONBIO. */
00123 #   endif
00124 #endif  /* USE_FIONBIO */
00125 #include <utime.h>
00126 
00127 /*
00128  * Socket support stuff: This likely needs more work to parameterize for
00129  * each system.
00130  */
00131 #include <sys/socket.h>         /* struct sockaddr, SOCK_STREAM, ... */
00132 #ifndef NO_UNAME
00133 #   include <sys/utsname.h>     /* uname system call. */
00134 #endif
00135 #include <netinet/in.h>         /* struct in_addr, struct sockaddr_in */
00136 #include <arpa/inet.h>          /* inet_ntoa() */
00137 #include <netdb.h>              /* gethostbyname() */
00138 
00139 /*
00140  * Some platforms (e.g. SunOS) don't define FLT_MAX and FLT_MIN, so we
00141  * look for an alternative definition.  If no other alternative is available
00142  * we use a reasonable guess.
00143  */
00144 
00145 #ifndef NO_FLOAT_H
00146 #   include <float.h>
00147 #else
00148 #ifndef NO_VALUES_H
00149 #   include <values.h>
00150 #endif
00151 #endif
00152 
00153 #ifndef FLT_MAX
00154 #   ifdef MAXFLOAT
00155 #       define FLT_MAX MAXFLOAT
00156 #   else
00157 #       define FLT_MAX 3.402823466E+38F
00158 #   endif
00159 #endif
00160 #ifndef FLT_MIN
00161 #   ifdef MINFLOAT
00162 #       define FLT_MIN MINFLOAT
00163 #   else
00164 #       define FLT_MIN 1.175494351E-38F
00165 #   endif
00166 #endif
00167 
00168 /*
00169  * NeXT doesn't define O_NONBLOCK, so #define it here if necessary.
00170  */
00171 
00172 #ifndef O_NONBLOCK
00173 #   define O_NONBLOCK 0x80
00174 #endif
00175 
00176 /*
00177  * HPUX needs the flag O_NONBLOCK to get the right non-blocking I/O
00178  * semantics, while most other systems need O_NDELAY.  Define the
00179  * constant NBIO_FLAG to be one of these
00180  */
00181 
00182 #ifdef HPUX
00183 #  define NBIO_FLAG O_NONBLOCK
00184 #else
00185 #  define NBIO_FLAG O_NDELAY
00186 #endif
00187 
00188 /*
00189  * The type of the status returned by wait varies from UNIX system
00190  * to UNIX system.  The macro below defines it:
00191  */
00192 
00193 #ifdef _AIX
00194 #   define WAIT_STATUS_TYPE pid_t
00195 #else
00196 #ifndef NO_UNION_WAIT
00197 #   define WAIT_STATUS_TYPE union wait
00198 #else
00199 #   define WAIT_STATUS_TYPE int
00200 #endif
00201 #endif
00202 
00203 /*
00204  * Supply definitions for macros to query wait status, if not already
00205  * defined in header files above.
00206  */
00207 
00208 #ifndef WIFEXITED
00209 #   define WIFEXITED(stat)  (((*((int *) &(stat))) & 0xff) == 0)
00210 #endif
00211 
00212 #ifndef WEXITSTATUS
00213 #   define WEXITSTATUS(stat) (((*((int *) &(stat))) >> 8) & 0xff)
00214 #endif
00215 
00216 #ifndef WIFSIGNALED
00217 #   define WIFSIGNALED(stat) (((*((int *) &(stat)))) && ((*((int *) &(stat))) == ((*((int *) &(stat))) & 0x00ff)))
00218 #endif
00219 
00220 #ifndef WTERMSIG
00221 #   define WTERMSIG(stat)    ((*((int *) &(stat))) & 0x7f)
00222 #endif
00223 
00224 #ifndef WIFSTOPPED
00225 #   define WIFSTOPPED(stat)  (((*((int *) &(stat))) & 0xff) == 0177)
00226 #endif
00227 
00228 #ifndef WSTOPSIG
00229 #   define WSTOPSIG(stat)    (((*((int *) &(stat))) >> 8) & 0xff)
00230 #endif
00231 
00232 /*
00233  * Define constants for waitpid() system call if they aren't defined
00234  * by a system header file.
00235  */
00236 
00237 #ifndef WNOHANG
00238 #   define WNOHANG 1
00239 #endif
00240 #ifndef WUNTRACED
00241 #   define WUNTRACED 2
00242 #endif
00243 
00244 /*
00245  * Supply macros for seek offsets, if they're not already provided by
00246  * an include file.
00247  */
00248 
00249 #ifndef SEEK_SET
00250 #   define SEEK_SET 0
00251 #endif
00252 #ifndef SEEK_CUR
00253 #   define SEEK_CUR 1
00254 #endif
00255 #ifndef SEEK_END
00256 #   define SEEK_END 2
00257 #endif
00258 
00259 /*
00260  * The stuff below is needed by the "time" command.  If this system has no
00261  * gettimeofday call, then must use times and the CLK_TCK #define (from
00262  * sys/param.h) to compute elapsed time.  Unfortunately, some systems only
00263  * have HZ and no CLK_TCK, and some might not even have HZ.
00264  */
00265 
00266 #ifdef NO_GETTOD
00267 #   include <sys/times.h>
00268 #   include <sys/param.h>
00269 #   ifndef CLK_TCK
00270 #       ifdef HZ
00271 #           define CLK_TCK HZ
00272 #       else
00273 #           define CLK_TCK 60
00274 #       endif
00275 #   endif
00276 #else
00277 #   ifdef HAVE_BSDGETTIMEOFDAY
00278 #       define gettimeofday BSDgettimeofday
00279 #   endif
00280 #endif
00281 
00282 #ifdef GETTOD_NOT_DECLARED
00283 EXTERN int              gettimeofday _ANSI_ARGS_((struct timeval *tp,
00284                             struct timezone *tzp));
00285 #endif
00286 
00287 /*
00288  * Define access mode constants if they aren't already defined.
00289  */
00290 
00291 #ifndef F_OK
00292 #    define F_OK 00
00293 #endif
00294 #ifndef X_OK
00295 #    define X_OK 01
00296 #endif
00297 #ifndef W_OK
00298 #    define W_OK 02
00299 #endif
00300 #ifndef R_OK
00301 #    define R_OK 04
00302 #endif
00303 
00304 /*
00305  * Define FD_CLOEEXEC (the close-on-exec flag bit) if it isn't
00306  * already defined.
00307  */
00308 
00309 #ifndef FD_CLOEXEC
00310 #   define FD_CLOEXEC 1
00311 #endif
00312 
00313 /*
00314  * On systems without symbolic links (i.e. S_IFLNK isn't defined)
00315  * define "lstat" to use "stat" instead.
00316  */
00317 
00318 #ifndef S_IFLNK
00319 #   undef TclOSlstat
00320 #   define lstat        stat
00321 #   define lstat64      stat64
00322 #   define TclOSlstat   TclOSstat
00323 #endif
00324 
00325 /*
00326  * Define macros to query file type bits, if they're not already
00327  * defined.
00328  */
00329 
00330 #ifndef S_ISREG
00331 #   ifdef S_IFREG
00332 #       define S_ISREG(m) (((m) & S_IFMT) == S_IFREG)
00333 #   else
00334 #       define S_ISREG(m) 0
00335 #   endif
00336 #endif /* !S_ISREG */
00337 #ifndef S_ISDIR
00338 #   ifdef S_IFDIR
00339 #       define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR)
00340 #   else
00341 #       define S_ISDIR(m) 0
00342 #   endif
00343 #endif /* !S_ISDIR */
00344 #ifndef S_ISCHR
00345 #   ifdef S_IFCHR
00346 #       define S_ISCHR(m) (((m) & S_IFMT) == S_IFCHR)
00347 #   else
00348 #       define S_ISCHR(m) 0
00349 #   endif
00350 #endif /* !S_ISCHR */
00351 #ifndef S_ISBLK
00352 #   ifdef S_IFBLK
00353 #       define S_ISBLK(m) (((m) & S_IFMT) == S_IFBLK)
00354 #   else
00355 #       define S_ISBLK(m) 0
00356 #   endif
00357 #endif /* !S_ISBLK */
00358 #ifndef S_ISFIFO
00359 #   ifdef S_IFIFO
00360 #       define S_ISFIFO(m) (((m) & S_IFMT) == S_IFIFO)
00361 #   else
00362 #       define S_ISFIFO(m) 0
00363 #   endif
00364 #endif /* !S_ISFIFO */
00365 #ifndef S_ISLNK
00366 #   ifdef S_IFLNK
00367 #       define S_ISLNK(m) (((m) & S_IFMT) == S_IFLNK)
00368 #   else
00369 #       define S_ISLNK(m) 0
00370 #   endif
00371 #endif /* !S_ISLNK */
00372 #ifndef S_ISSOCK
00373 #   ifdef S_IFSOCK
00374 #       define S_ISSOCK(m) (((m) & S_IFMT) == S_IFSOCK)
00375 #   else
00376 #       define S_ISSOCK(m) 0
00377 #   endif
00378 #endif /* !S_ISSOCK */
00379 
00380 /*
00381  * Make sure that MAXPATHLEN and MAXNAMLEN are defined.
00382  */
00383 
00384 #ifndef MAXPATHLEN
00385 #   ifdef PATH_MAX
00386 #       define MAXPATHLEN PATH_MAX
00387 #   else
00388 #       define MAXPATHLEN 2048
00389 #   endif
00390 #endif
00391 
00392 #ifndef MAXNAMLEN
00393 #   ifdef NAME_MAX
00394 #       define MAXNAMLEN NAME_MAX
00395 #   else
00396 #       define MAXNAMLEN 255
00397 #   endif
00398 #endif
00399 
00400 /*
00401  * Make sure that L_tmpnam is defined.
00402  */
00403 
00404 #ifndef L_tmpnam
00405 #   define L_tmpnam 100
00406 #endif
00407 
00408 /*
00409  * The following macro defines the type of the mask arguments to
00410  * select:
00411  */
00412 
00413 #ifndef NO_FD_SET
00414 #   define SELECT_MASK fd_set
00415 #else /* NO_FD_SET */
00416 #   ifndef _AIX
00417         typedef long fd_mask;
00418 #   endif /* !AIX */
00419 #   if defined(_IBMR2)
00420 #       define SELECT_MASK void
00421 #   else /* !defined(_IBMR2) */
00422 #       define SELECT_MASK int
00423 #   endif /* defined(_IBMR2) */
00424 #endif /* !NO_FD_SET */
00425 
00426 /*
00427  * Define "NBBY" (number of bits per byte) if it's not already defined.
00428  */
00429 
00430 #ifndef NBBY
00431 #   define NBBY 8
00432 #endif
00433 
00434 /*
00435  * The following macro defines the number of fd_masks in an fd_set:
00436  */
00437 
00438 #ifndef FD_SETSIZE
00439 #   ifdef OPEN_MAX
00440 #       define FD_SETSIZE OPEN_MAX
00441 #   else
00442 #       define FD_SETSIZE 256
00443 #   endif
00444 #endif /* FD_SETSIZE */
00445 #if !defined(howmany)
00446 #   define howmany(x, y) (((x)+((y)-1))/(y))
00447 #endif /* !defined(howmany) */
00448 #ifndef NFDBITS
00449 #   define NFDBITS NBBY*sizeof(fd_mask)
00450 #endif /* NFDBITS */
00451 #define MASK_SIZE howmany(FD_SETSIZE, NFDBITS)
00452 
00453 /*
00454  * Not all systems declare the errno variable in errno.h. so this
00455  * file does it explicitly.  The list of system error messages also
00456  * isn't generally declared in a header file anywhere.
00457  */
00458 
00459 #ifdef NO_ERRNO
00460 extern int errno;
00461 #endif /* NO_ERRNO */
00462 
00463 /*
00464  * Not all systems declare all the errors that Tcl uses!  Provide some
00465  * work-arounds...
00466  */
00467 
00468 #ifndef EOVERFLOW
00469 #   ifdef EFBIG
00470 #       define EOVERFLOW EFBIG
00471 #   else /* !EFBIG */
00472 #       define EOVERFLOW EINVAL
00473 #   endif /* EFBIG */
00474 #endif /* EOVERFLOW */
00475 
00476 /*
00477  * Variables provided by the C library:
00478  */
00479 
00480 #if defined(__APPLE__) && defined(__DYNAMIC__)
00481 #   include <crt_externs.h>
00482 #   define environ (*_NSGetEnviron())
00483 #   define USE_PUTENV 1
00484 #else
00485 #   if defined(_sgi) || defined(__sgi)
00486 #       define environ _environ
00487 #   endif
00488 extern char **environ;
00489 #endif
00490 
00491 /*
00492  * At present (12/91) not all stdlib.h implementations declare strtod.
00493  * The declaration below is here to ensure that it's declared, so that
00494  * the compiler won't take the default approach of assuming it returns
00495  * an int.  There's no ANSI prototype for it because there would end
00496  * up being too many conflicts with slightly-different prototypes.
00497  */
00498 
00499 #ifdef NO_STDLIB_H
00500 extern double strtod();
00501 #endif
00502 
00503 /*
00504  * There is no platform-specific panic routine for Unix in the Tcl internals.
00505  */
00506 
00507 #define TclpPanic ((Tcl_PanicProc *) NULL)
00508 
00509 /*
00510  * Darwin specifc configure overrides.
00511  */
00512 
00513 #ifdef __APPLE__
00514 /*
00515  * Support for fat compiles: configure runs only once for multiple architectures
00516  */
00517 #   if defined(__LP64__) && defined (NO_COREFOUNDATION_64)
00518 #       undef HAVE_COREFOUNDATION
00519 #    endif /* __LP64__ && NO_COREFOUNDATION_64 */
00520 #   include <sys/cdefs.h>
00521 #   ifdef __DARWIN_UNIX03
00522 #       if __DARWIN_UNIX03
00523 #           undef HAVE_PUTENV_THAT_COPIES
00524 #       else
00525 #           define HAVE_PUTENV_THAT_COPIES 1
00526 #       endif
00527 #   endif /* __DARWIN_UNIX03 */
00528 /*
00529  * The termios configure test program relies on the configure script being run
00530  * from a terminal, which is not the case e.g. when configuring from Xcode.
00531  * Since termios is known to be present on all Mac OS X releases since 10.0,
00532  * override the configure defines for serial API here. [Bug 497147]
00533  */
00534 #   define USE_TERMIOS 1
00535 #   undef  USE_TERMIO
00536 #   undef  USE_SGTTY
00537 /*
00538  * Include AvailabilityMacros.h here (when available) to ensure any symbolic
00539  * MAC_OS_X_VERSION_* constants passed on the command line are translated.
00540  */
00541 #   ifdef HAVE_AVAILABILITYMACROS_H
00542 #       include <AvailabilityMacros.h>
00543 #   endif
00544 /*
00545  * Support for weak import.
00546  */
00547 #   ifdef HAVE_WEAK_IMPORT
00548 #       if !defined(HAVE_AVAILABILITYMACROS_H) || !defined(MAC_OS_X_VERSION_MIN_REQUIRED)
00549 #           undef HAVE_WEAK_IMPORT
00550 #       else
00551 #           ifndef WEAK_IMPORT_ATTRIBUTE
00552 #               define WEAK_IMPORT_ATTRIBUTE __attribute__((weak_import))
00553 #           endif
00554 #       endif
00555 #   endif /* HAVE_WEAK_IMPORT */
00556 /*
00557  * Support for MAC_OS_X_VERSION_MAX_ALLOWED define from AvailabilityMacros.h:
00558  * only use API available in the indicated OS version or earlier.
00559  */
00560 #   ifdef MAC_OS_X_VERSION_MAX_ALLOWED
00561 #       if MAC_OS_X_VERSION_MAX_ALLOWED < 1050 && defined(__LP64__)
00562 #           undef HAVE_COREFOUNDATION
00563 #       endif
00564 #       if MAC_OS_X_VERSION_MAX_ALLOWED < 1040
00565 #           undef HAVE_OSSPINLOCKLOCK
00566 #           undef HAVE_PTHREAD_ATFORK
00567 #           undef HAVE_COPYFILE
00568 #       endif
00569 #       if MAC_OS_X_VERSION_MAX_ALLOWED < 1030
00570 #           ifdef TCL_THREADS
00571                 /* prior to 10.3, realpath is not threadsafe, c.f. bug 711232 */
00572 #               define NO_REALPATH 1
00573 #           endif
00574 #           undef HAVE_LANGINFO
00575 #       endif
00576 #   endif /* MAC_OS_X_VERSION_MAX_ALLOWED */
00577 #   if defined(HAVE_COREFOUNDATION) && defined(__LP64__) && \
00578             defined(HAVE_WEAK_IMPORT) && MAC_OS_X_VERSION_MIN_REQUIRED < 1050
00579 #       warning "Weak import of 64-bit CoreFoundation is not supported, will not run on Mac OS X < 10.5."
00580 #   endif
00581 /*
00582  * At present, using vfork() instead of fork() causes execve() to fail
00583  * intermittently on Darwin x86_64. rdar://4685553
00584  */
00585 #   if defined(__x86_64__) && !defined(FIXED_RDAR_4685553)
00586 #       undef USE_VFORK
00587 #   endif /* __x86_64__ */
00588 #endif /* __APPLE__ */
00589 
00590 /*
00591  *---------------------------------------------------------------------------
00592  * The following macros and declarations represent the interface between 
00593  * generic and unix-specific parts of Tcl.  Some of the macros may override 
00594  * functions declared in tclInt.h.
00595  *---------------------------------------------------------------------------
00596  */
00597 
00598 /*
00599  * The default platform eol translation on Unix is TCL_TRANSLATE_LF.
00600  */
00601 
00602 #ifdef DJGPP
00603 #define TCL_PLATFORM_TRANSLATION        TCL_TRANSLATE_CRLF
00604 typedef int socklen_t;
00605 #else
00606 #define TCL_PLATFORM_TRANSLATION        TCL_TRANSLATE_LF
00607 #endif
00608 
00609 /*
00610  * The following macros have trivial definitions, allowing generic code to 
00611  * address platform-specific issues.
00612  */
00613 
00614 #define TclpGetPid(pid)         ((unsigned long) (pid))
00615 #define TclpReleaseFile(file)   /* Nothing. */
00616 
00617 /*
00618  * The following defines wrap the system memory allocation routines.
00619  */
00620 
00621 #define TclpSysAlloc(size, isBin)       malloc((size_t)size)
00622 #define TclpSysFree(ptr)                free((char*)ptr)
00623 #define TclpSysRealloc(ptr, size)       realloc((char*)ptr, (size_t)size)
00624 
00625 /*
00626  * The following macros and declaration wrap the C runtime library
00627  * functions.
00628  */
00629 
00630 #define TclpExit                exit
00631 
00632 #ifdef TCL_THREADS
00633 EXTERN struct tm *      TclpLocaltime(CONST time_t *);
00634 EXTERN struct tm *      TclpGmtime(CONST time_t *);
00635 EXTERN char *           TclpInetNtoa(struct in_addr);
00636 /* #define localtime(x) TclpLocaltime(x)
00637  * #define gmtime(x)    TclpGmtime(x)    */
00638 #   undef inet_ntoa
00639 #   define inet_ntoa(x) TclpInetNtoa(x)
00640 #   ifdef HAVE_PTHREAD_ATTR_GET_NP
00641 #       define TclpPthreadGetAttrs      pthread_attr_get_np
00642 #       ifdef ATTRGETNP_NOT_DECLARED
00643 /*
00644  * Assume it is in pthread_np.h if it isn't in pthread.h. [Bug 1064882]
00645  * We might need to revisit this in the future. :^(
00646  */
00647 #           include <pthread.h>
00648 #           include <pthread_np.h>
00649 #       endif
00650 #   else
00651 #       ifdef HAVE_PTHREAD_GETATTR_NP
00652 #           define TclpPthreadGetAttrs  pthread_getattr_np
00653 #           ifdef GETATTRNP_NOT_DECLARED
00654 EXTERN int pthread_getattr_np _ANSI_ARGS_((pthread_t, pthread_attr_t *));
00655 #           endif
00656 #       endif /* HAVE_PTHREAD_GETATTR_NP */
00657 #   endif /* HAVE_PTHREAD_ATTR_GET_NP */
00658 #endif /* TCL_THREADS */
00659 
00660 /*
00661  * Set of MT-safe implementations of some
00662  * known-to-be-MT-unsafe library calls.
00663  * Instead of returning pointers to the
00664  * static storage, those return pointers
00665  * to the TSD data. 
00666  */
00667 
00668 #include <pwd.h>
00669 #include <grp.h>
00670 
00671 #ifndef MODULE_SCOPE
00672 #define MODULE_SCOPE extern
00673 #endif
00674 
00675 MODULE_SCOPE struct passwd*  TclpGetPwNam(const char *name);
00676 MODULE_SCOPE struct group*   TclpGetGrNam(const char *name);
00677 MODULE_SCOPE struct passwd*  TclpGetPwUid(uid_t uid);
00678 MODULE_SCOPE struct group*   TclpGetGrGid(gid_t gid);
00679 MODULE_SCOPE struct hostent* TclpGetHostByName(const char *name);
00680 MODULE_SCOPE struct hostent* TclpGetHostByAddr(const char *addr, int length, int type);
00681 
00682 #endif /* _TCLUNIXPORT */



Generated on Wed Mar 12 12:18:26 2008 by  doxygen 1.5.1