summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ChangeLog12
-rw-r--r--generic/tclInt.decls20
-rw-r--r--generic/tclIntPlatDecls.h30
-rw-r--r--generic/tclStubInit.c6
-rw-r--r--unix/tclUnixThrd.c32
5 files changed, 92 insertions, 8 deletions
diff --git a/ChangeLog b/ChangeLog
index 6fa764e..ae8228e 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,15 @@
+2002-08-06 Daniel Steffen <das@users.sourceforge.net>
+
+ * generic/tclInt.decls:
+ * unix/tclUnixThrd.c: Added stubs and implementations for
+ non-threaded build for the tclUnixThrd.c procs TclpReaddir,
+ TclpLocaltime, TclpGmtime and TclpInetNtoa.
+ Fixes link errors in stubbed & threaded extensions that include
+ tclUnixPort.h and use any of the procs readdir, localtime,
+ gmtime or inet_ntoa (e.g. TclX 8.4) [Bug 589526]
+ * generic/tclIntPlatDecls.h:
+ * generic/tclStubInit.c: Regen.
+
2002-08-05 Don Porter <dgp@users.sourceforge.net>
* library/tcltest/tcltest.tcl: The setup and cleanup scripts are now
diff --git a/generic/tclInt.decls b/generic/tclInt.decls
index 5a91a50..8c1e733 100644
--- a/generic/tclInt.decls
+++ b/generic/tclInt.decls
@@ -12,7 +12,7 @@
# See the file "license.terms" for information on usage and redistribution
# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
#
-# RCS: @(#) $Id: tclInt.decls,v 1.54 2002/08/05 03:24:40 dgp Exp $
+# RCS: @(#) $Id: tclInt.decls,v 1.55 2002/08/06 01:49:27 das Exp $
library tcl
@@ -954,3 +954,21 @@ declare 9 unix {
TclFile TclpCreateTempFile(CONST char *contents)
}
+# Added in 8.4:
+
+declare 10 unix {
+ Tcl_DirEntry * TclpReaddir(DIR * dir)
+}
+
+declare 11 unix {
+ struct tm * TclpLocaltime(time_t * clock)
+}
+
+declare 12 unix {
+ struct tm * TclpGmtime(time_t * clock)
+}
+
+declare 13 unix {
+ char * TclpInetNtoa(struct in_addr addr)
+}
+
diff --git a/generic/tclIntPlatDecls.h b/generic/tclIntPlatDecls.h
index 090d3d1..b430443 100644
--- a/generic/tclIntPlatDecls.h
+++ b/generic/tclIntPlatDecls.h
@@ -9,7 +9,7 @@
* Copyright (c) 1998-1999 by Scriptics Corporation.
* All rights reserved.
*
- * RCS: @(#) $Id: tclIntPlatDecls.h,v 1.17 2002/04/19 14:18:38 das Exp $
+ * RCS: @(#) $Id: tclIntPlatDecls.h,v 1.18 2002/08/06 01:49:27 das Exp $
*/
#ifndef _TCLINTPLATDECLS
@@ -59,6 +59,14 @@ EXTERN int TclUnixWaitForFile _ANSI_ARGS_((int fd, int mask,
/* 9 */
EXTERN TclFile TclpCreateTempFile _ANSI_ARGS_((
CONST char * contents));
+/* 10 */
+EXTERN Tcl_DirEntry * TclpReaddir _ANSI_ARGS_((DIR * dir));
+/* 11 */
+EXTERN struct tm * TclpLocaltime _ANSI_ARGS_((time_t * clock));
+/* 12 */
+EXTERN struct tm * TclpGmtime _ANSI_ARGS_((time_t * clock));
+/* 13 */
+EXTERN char * TclpInetNtoa _ANSI_ARGS_((struct in_addr addr));
#endif /* UNIX */
#ifdef __WIN32__
/* 0 */
@@ -218,6 +226,10 @@ typedef struct TclIntPlatStubs {
TclFile (*tclpOpenFile) _ANSI_ARGS_((CONST char * fname, int mode)); /* 7 */
int (*tclUnixWaitForFile) _ANSI_ARGS_((int fd, int mask, int timeout)); /* 8 */
TclFile (*tclpCreateTempFile) _ANSI_ARGS_((CONST char * contents)); /* 9 */
+ Tcl_DirEntry * (*tclpReaddir) _ANSI_ARGS_((DIR * dir)); /* 10 */
+ struct tm * (*tclpLocaltime) _ANSI_ARGS_((time_t * clock)); /* 11 */
+ struct tm * (*tclpGmtime) _ANSI_ARGS_((time_t * clock)); /* 12 */
+ char * (*tclpInetNtoa) _ANSI_ARGS_((struct in_addr addr)); /* 13 */
#endif /* UNIX */
#ifdef __WIN32__
void (*tclWinConvertError) _ANSI_ARGS_((DWORD errCode)); /* 0 */
@@ -332,6 +344,22 @@ extern TclIntPlatStubs *tclIntPlatStubsPtr;
#define TclpCreateTempFile \
(tclIntPlatStubsPtr->tclpCreateTempFile) /* 9 */
#endif
+#ifndef TclpReaddir
+#define TclpReaddir \
+ (tclIntPlatStubsPtr->tclpReaddir) /* 10 */
+#endif
+#ifndef TclpLocaltime
+#define TclpLocaltime \
+ (tclIntPlatStubsPtr->tclpLocaltime) /* 11 */
+#endif
+#ifndef TclpGmtime
+#define TclpGmtime \
+ (tclIntPlatStubsPtr->tclpGmtime) /* 12 */
+#endif
+#ifndef TclpInetNtoa
+#define TclpInetNtoa \
+ (tclIntPlatStubsPtr->tclpInetNtoa) /* 13 */
+#endif
#endif /* UNIX */
#ifdef __WIN32__
#ifndef TclWinConvertError
diff --git a/generic/tclStubInit.c b/generic/tclStubInit.c
index eb9480b..a9f5ab4 100644
--- a/generic/tclStubInit.c
+++ b/generic/tclStubInit.c
@@ -8,7 +8,7 @@
* See the file "license.terms" for information on usage and redistribution
* of this file, and for a DISCLAIMER OF ALL WARRANTIES.
*
- * RCS: @(#) $Id: tclStubInit.c,v 1.73 2002/07/17 18:21:55 msofer Exp $
+ * RCS: @(#) $Id: tclStubInit.c,v 1.74 2002/08/06 01:49:27 das Exp $
*/
#include "tclInt.h"
@@ -267,6 +267,10 @@ TclIntPlatStubs tclIntPlatStubs = {
TclpOpenFile, /* 7 */
TclUnixWaitForFile, /* 8 */
TclpCreateTempFile, /* 9 */
+ TclpReaddir, /* 10 */
+ TclpLocaltime, /* 11 */
+ TclpGmtime, /* 12 */
+ TclpInetNtoa, /* 13 */
#endif /* UNIX */
#ifdef __WIN32__
TclWinConvertError, /* 0 */
diff --git a/unix/tclUnixThrd.c b/unix/tclUnixThrd.c
index c0640cd..1dd2d99 100644
--- a/unix/tclUnixThrd.c
+++ b/unix/tclUnixThrd.c
@@ -13,10 +13,10 @@
*/
#include "tclInt.h"
+#include "tclPort.h"
#ifdef TCL_THREADS
-#include "tclPort.h"
#include "pthread.h"
typedef struct ThreadSpecificData {
@@ -772,6 +772,7 @@ TclpFinalizeCondition(condPtr)
*condPtr = NULL;
}
}
+#endif /* TCL_THREADS */
/*
*----------------------------------------------------------------------
@@ -790,7 +791,7 @@ TclpFinalizeCondition(condPtr)
*----------------------------------------------------------------------
*/
-#ifndef HAVE_READDIR_R
+#if defined(TCL_THREADS) && !defined(HAVE_READDIR_R)
TCL_DECLARE_MUTEX( rdMutex )
#undef readdir
#endif
@@ -798,8 +799,9 @@ TCL_DECLARE_MUTEX( rdMutex )
Tcl_DirEntry *
TclpReaddir(DIR * dir)
{
- ThreadSpecificData *tsdPtr = TCL_TSD_INIT(&dataKey);
Tcl_DirEntry *ent;
+#ifdef TCL_THREADS
+ ThreadSpecificData *tsdPtr = TCL_TSD_INIT(&dataKey);
#ifdef HAVE_READDIR_R
ent = &tsdPtr->rdbuf.ent;
@@ -823,10 +825,17 @@ TclpReaddir(DIR * dir)
Tcl_MutexUnlock(&rdMutex);
#endif /* HAVE_READDIR_R */
+#else
+# ifdef HAVE_STRUCT_DIRENT64
+ ent = readdir64(dir);
+# else /* !HAVE_STRUCT_DIRENT64 */
+ ent = readdir(dir);
+# endif /* HAVE_STRUCT_DIRENT64 */
+#endif
return ent;
}
-#if !defined(HAVE_GMTIME_R) || !defined(HAVE_LOCALTIME_R)
+#if defined(TCL_THREADS) && (!defined(HAVE_GMTIME_R) || !defined(HAVE_LOCALTIME_R))
TCL_DECLARE_MUTEX( tmMutex )
#undef localtime
#undef gmtime
@@ -835,6 +844,7 @@ TCL_DECLARE_MUTEX( tmMutex )
struct tm *
TclpLocaltime(time_t * clock)
{
+#ifdef TCL_THREADS
ThreadSpecificData *tsdPtr = TCL_TSD_INIT(&dataKey);
#ifdef HAVE_LOCALTIME_R
@@ -843,13 +853,17 @@ TclpLocaltime(time_t * clock)
Tcl_MutexLock( &tmMutex );
memcpy( (VOID *) &tsdPtr->ltbuf, (VOID *) localtime( clock ), sizeof (struct tm) );
Tcl_MutexUnlock( &tmMutex );
- return &tsdPtr->ltbuf;
+ return &tsdPtr->ltbuf;
#endif
+#else
+ return localtime(clock);
+#endif
}
struct tm *
TclpGmtime(time_t * clock)
{
+#ifdef TCL_THREADS
ThreadSpecificData *tsdPtr = TCL_TSD_INIT(&dataKey);
#ifdef HAVE_GMTIME_R
@@ -860,11 +874,15 @@ TclpGmtime(time_t * clock)
Tcl_MutexUnlock( &tmMutex );
return &tsdPtr->gtbuf;
#endif
+#else
+ return gmtime(clock);
+#endif
}
char *
TclpInetNtoa(struct in_addr addr)
{
+#ifdef TCL_THREADS
ThreadSpecificData *tsdPtr = TCL_TSD_INIT(&dataKey);
union {
unsigned long l;
@@ -874,8 +892,12 @@ TclpInetNtoa(struct in_addr addr)
u.l = (unsigned long) addr.s_addr;
sprintf(tsdPtr->nabuf, "%u.%u.%u.%u", u.b[0], u.b[1], u.b[2], u.b[3]);
return tsdPtr->nabuf;
+#else
+ return inet_ntoa(addr);
+#endif
}
+#ifdef TCL_THREADS
/*
* Additions by AOL for specialized thread memory allocator.
*/