From 2e4de301cce9df4563b6d9fb60839641bf6cf2e1 Mon Sep 17 00:00:00 2001 From: Olaf Barthel Date: Wed, 5 Apr 2006 06:43:56 +0000 Subject: [PATCH] - Added include to due to latest "TimeVal" change in the OS4 SDK. Otherwise "struct timeval" will not be defined at the time the of the netincludes will be included by . - The strftime() hook function had the locale and character parameters switched, which made 'setlocale(LC_ALL,""); strftime(..);' unusable. Fixed. - fchown() and chown() now accept owner and group ID values of -1, which indicate that the respective information should not be changed. - The OS4 library build now includes the crtbegin.o and crtend.o object files in the libc.a library, which solves a problem with the thread-safe shared library support code. git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@15090 87f5fb63-7c3d-0410-a384-fd976d0f7a62 --- library/GNUmakefile.os4 | 10 ++- library/amiga_dotimer.c | 25 +++++- library/amiga_timedelay.c | 15 +++- library/changes | 15 +++- library/sas_profile.c | 15 +++- library/skeleton_library/lib_user.c | 16 ++-- library/time_strftime.c | 8 +- library/unistd_chown.c | 134 +++++++++++++++++++--------- library/unistd_fchown.c | 112 +++++++++++++---------- library/unistd_headers.h | 22 ++++- library/unistd_time_delay.c | 19 +++- library/unistd_timer.c | 14 ++- 12 files changed, 282 insertions(+), 123 deletions(-) diff --git a/library/GNUmakefile.os4 b/library/GNUmakefile.os4 index 3bc350e..0f1ac99 100644 --- a/library/GNUmakefile.os4 +++ b/library/GNUmakefile.os4 @@ -1,5 +1,5 @@ # -# $Id: GNUmakefile.os4,v 1.93 2006-02-27 11:18:51 obarthel Exp $ +# $Id: GNUmakefile.os4,v 1.94 2006-04-05 06:43:56 obarthel Exp $ # # :ts=8 # @@ -147,10 +147,10 @@ WARNINGS = \ # -Wconversion -Wshadow INCLUDES = -Iinclude -I. -I$(SDK_INCLUDE) -#OPTIONS = -D__THREAD_SAFE -DNDEBUG -DUSE_64_BIT_INTS -D__USE_INLINE__ -Wa,-mregnames -fno-common -std=gnu99 - OPTIONS = -DNDEBUG -DUSE_64_BIT_INTS -D__USE_INLINE__ -Wa,-mregnames -fno-common -std=gnu99 + OPTIONS = -D__THREAD_SAFE -DNDEBUG -DUSE_64_BIT_INTS -D__USE_INLINE__ -Wa,-mregnames -fno-common -std=gnu99 +#OPTIONS = -DNDEBUG -DUSE_64_BIT_INTS -D__USE_INLINE__ -Wa,-mregnames -fno-common -std=gnu99 OPTIMIZE = -O3 - DEBUG = -ggdb +#DEBUG = -ggdb CFLAGS = $(WARNINGS) $(OPTIMIZE) $(DEBUG) $(OPTIONS) $(CODE_TYPE) $(INCLUDES) @@ -159,6 +159,8 @@ CFLAGS = $(WARNINGS) $(OPTIMIZE) $(DEBUG) $(OPTIONS) $(CODE_TYPE) $(INCLUDES) # All objects files which make up libc.a C_LIB = \ c.lib_rev.o \ + crtbegin.o \ + crtend.o \ ctype_isalnum.o \ ctype_isalpha.o \ ctype_isascii.o \ diff --git a/library/amiga_dotimer.c b/library/amiga_dotimer.c index ae4556d..7f3bf3f 100644 --- a/library/amiga_dotimer.c +++ b/library/amiga_dotimer.c @@ -1,5 +1,5 @@ /* - * $Id: amiga_dotimer.c,v 1.7 2006-01-08 12:04:22 obarthel Exp $ + * $Id: amiga_dotimer.c,v 1.8 2006-04-05 06:43:56 obarthel Exp $ * * :ts=4 * @@ -55,6 +55,23 @@ /****************************************************************************/ +/* A quick workaround for the timeval/timerequest->TimeVal/TimeRequest + change in the recent OS4 header files. */ + +#if defined(__NEW_TIMEVAL_DEFINITION_USED__) + +#define timeval TimeVal +#define tv_secs Seconds +#define tv_micro Microseconds + +#define timerequest TimeRequest +#define tr_node Request +#define tr_time Time + +#endif /* __NEW_TIMEVAL_DEFINITION_USED__ */ + +/****************************************************************************/ + LONG DoTimer(struct timeval *tv,LONG unit,LONG command) { @@ -67,10 +84,10 @@ DoTimer(struct timeval *tv,LONG unit,LONG command) #if defined(__amigaos4__) { mp = AllocSysObjectTags(ASOT_PORT, - ASOPORT_Action, PA_SIGNAL, + ASOPORT_Action, PA_SIGNAL, ASOPORT_AllocSig, FALSE, - ASOPORT_Signal, SIGB_SINGLE, - ASOPORT_Target, FindTask(NULL), + ASOPORT_Signal, SIGB_SINGLE, + ASOPORT_Target, FindTask(NULL), TAG_DONE); if(mp == NULL) diff --git a/library/amiga_timedelay.c b/library/amiga_timedelay.c index 4fa2c5d..54029cf 100644 --- a/library/amiga_timedelay.c +++ b/library/amiga_timedelay.c @@ -1,5 +1,5 @@ /* - * $Id: amiga_timedelay.c,v 1.3 2006-01-08 12:04:22 obarthel Exp $ + * $Id: amiga_timedelay.c,v 1.4 2006-04-05 06:43:56 obarthel Exp $ * * :ts=4 * @@ -39,6 +39,19 @@ /****************************************************************************/ +/* A quick workaround for the timeval/timerequest->TimeVal/TimeRequest + change in the recent OS4 header files. */ + +#if defined(__NEW_TIMEVAL_DEFINITION_USED__) + +#define timeval TimeVal +#define tv_secs Seconds +#define tv_micro Microseconds + +#endif /* __NEW_TIMEVAL_DEFINITION_USED__ */ + +/****************************************************************************/ + LONG TimeDelay(LONG unit,ULONG seconds,ULONG micros) { diff --git a/library/changes b/library/changes index 0e3bceb..a1c2775 100644 --- a/library/changes +++ b/library/changes @@ -1,9 +1,18 @@ -c.lib 1.200 - -- added include to sys/socket.h due to latest "TimeVal" change +- Added include to due to latest "TimeVal" change in the OS4 SDK. Otherwise "struct timeval" will not be defined at the time the of the netincludes will be included by . +- The strftime() hook function had the locale and character parameters + switched, which made 'setlocale(LC_ALL,""); strftime(..);' unusable. + Fixed. + +- fchown() and chown() now accept owner and group ID values of -1, which + indicate that the respective information should not be changed. + +- The OS4 library build now includes the crtbegin.o and crtend.o object + files in the libc.a library, which solves a problem with the thread-safe + shared library support code. + c.lib 1.199 (6.3.2006) diff --git a/library/sas_profile.c b/library/sas_profile.c index 0a944b7..a71e14a 100644 --- a/library/sas_profile.c +++ b/library/sas_profile.c @@ -1,5 +1,5 @@ /* - * $Id: sas_profile.c,v 1.6 2005-04-24 08:46:37 obarthel Exp $ + * $Id: sas_profile.c,v 1.7 2006-04-05 06:43:56 obarthel Exp $ * * :ts=4 * @@ -52,6 +52,19 @@ extern struct Library * SysBase; /****************************************************************************/ +/* A quick workaround for the timeval/timerequest->TimeVal/TimeRequest + change in the recent OS4 header files. */ + +#if defined(__NEW_TIMEVAL_DEFINITION_USED__) + +#define timerequest TimeRequest +#define tr_node Request +#define tr_time Time + +#endif /* __NEW_TIMEVAL_DEFINITION_USED__ */ + +/****************************************************************************/ + struct SPROFMSG { struct Message message; diff --git a/library/skeleton_library/lib_user.c b/library/skeleton_library/lib_user.c index 585059b..e65e1cf 100755 --- a/library/skeleton_library/lib_user.c +++ b/library/skeleton_library/lib_user.c @@ -1,5 +1,5 @@ /* - * $Id: lib_user.c,v 1.6 2006-01-08 12:06:14 obarthel Exp $ + * $Id: lib_user.c,v 1.7 2006-04-05 06:43:56 obarthel Exp $ * * :ts=4 * @@ -100,7 +100,7 @@ UserLibOpen(struct UserData * ud) { BOOL result = FALSE; - /* For the AmigaOS4 build, invoke the clib2 shared library + /* For the thread safe build, invoke the clib2 shared library initialization code. Note that this is not strictly necessary. In fact, you should not need this functionality if you stick to use Amiga operating system routines only @@ -109,15 +109,15 @@ UserLibOpen(struct UserData * ud) Use this feature only if you are porting code to the Amiga which cannot be easily converted to follow the AmigaOS API definitions only. */ - #if defined(__amigaos4__) && defined(__THREAD_SAFE) + #if defined(__THREAD_SAFE) { /* Note that the clib2 library initialization is called exactly once, when the first client opens this library. */ - if(ud->ud_UseCount == 0 && !__lib_init(SysBase)) + if(ud->ud_UseCount == 0 && !__lib_init(ud->ud_SysBase)) goto out; } - #endif /* __amigaos4__ && __THREAD_SAFE */ + #endif /* __THREAD_SAFE */ /* Remember that one more customer is using this data structure. */ ud->ud_UseCount++; @@ -140,7 +140,7 @@ UserLibClose(struct UserData * ud) /* Remember that one less customer is using this data structure. */ ud->ud_UseCount--; - /* For the AmigaOS4 build, invoke the clib2 shared library + /* For the thread safe build, invoke the clib2 shared library cleanup code. Note that this is not strictly necessary. In fact, you should not need this functionality if you stick to use Amiga operating system routines only @@ -149,7 +149,7 @@ UserLibClose(struct UserData * ud) Use this feature only if you are porting code to the Amiga which cannot be easily converted to follow the AmigaOS API definitions only. */ - #if defined(__amigaos4__) && defined(__THREAD_SAFE) + #if defined(__THREAD_SAFE) { /* Note that the clib2 library cleanup code is called exactly once, when the last client @@ -157,7 +157,7 @@ UserLibClose(struct UserData * ud) if(ud->ud_UseCount == 0) __lib_exit(); } - #endif /* __amigaos4__ && __THREAD_SAFE */ + #endif /* __THREAD_SAFE */ } /****************************************************************************/ diff --git a/library/time_strftime.c b/library/time_strftime.c index 40d8c8c..f40c7e5 100644 --- a/library/time_strftime.c +++ b/library/time_strftime.c @@ -1,5 +1,5 @@ /* - * $Id: time_strftime.c,v 1.18 2006-01-08 12:04:27 obarthel Exp $ + * $Id: time_strftime.c,v 1.19 2006-04-05 06:43:56 obarthel Exp $ * * :ts=4 * @@ -59,8 +59,8 @@ struct format_hook_data STATIC VOID format_hook_function( struct Hook * hook, - long c, - struct Locale * UNUSED unused_locale) + struct Locale * UNUSED unused_locale, + ULONG c) { struct format_hook_data * data = hook->h_Data; @@ -97,7 +97,7 @@ store_string_via_hook(const char * string,int len,struct Hook * hook) len = strlen(string); while(len-- > 0) - CallHookPkt(hook,(APTR)((ULONG)(*string++)),NULL); + CallHookPkt(hook,NULL,(APTR)((ULONG)(*string++))); } /****************************************************************************/ diff --git a/library/unistd_chown.c b/library/unistd_chown.c index 2922360..2d07dab 100644 --- a/library/unistd_chown.c +++ b/library/unistd_chown.c @@ -1,5 +1,5 @@ /* - * $Id: unistd_chown.c,v 1.9 2006-01-08 12:04:27 obarthel Exp $ + * $Id: unistd_chown.c,v 1.10 2006-04-05 06:43:56 obarthel Exp $ * * :ts=4 * @@ -54,6 +54,8 @@ chown(const char * path_name, uid_t owner, gid_t group) struct name_translation_info path_name_nti; #endif /* UNIX_PATH_SEMANTICS */ struct DevProc * dvp = NULL; + BPTR file_lock = ZERO; + BOOL owner_changed = TRUE; LONG status; int result = ERROR; @@ -80,14 +82,6 @@ chown(const char * path_name, uid_t owner, gid_t group) } #endif /* CHECK_FOR_NULL_POINTERS */ - if(owner > 65535 || group > 65535) - { - SHOWMSG("invalid owner or group"); - - __set_errno(EINVAL); - goto out; - } - #if defined(UNIX_PATH_SEMANTICS) { if(__unix_path_semantics) @@ -112,58 +106,105 @@ chown(const char * path_name, uid_t owner, gid_t group) } #endif /* UNIX_PATH_SEMANTICS */ - D(("changing owner of '%s'",path_name)); + /* A value of -1 for either the owner or the group ID means + that what's currently being used should not be changed. */ + if(owner == (uid_t)-1 || group == (gid_t)-1) + { + D_S(struct FileInfoBlock,fib); - #if defined(__amigaos4__) - { PROFILE_OFF(); - status = SetOwner((STRPTR)path_name,(LONG)((((ULONG)owner) << 16) | group)); + + /* Try to find out which owner/group information + is currently in use. */ + lock = Lock(path_name,SHARED_LOCK); + if(lock == ZERO || CANNOT Examine(file_lock,fib)) + { + PROFILE_ON(); + + __set_errno(__translate_access_io_error_to_errno(IoErr())); + goto out; + } + + UnLock(lock); + lock = ZERO; + PROFILE_ON(); + + /* Replace the information that should not be changed. */ + if(owner == (uid_t)-1) + owner = fib->fib_OwnerUID; + + if(group == (gid_t)-1) + group = fib->fib_OwnerGID; + + /* Is anything different at all? */ + if(owner == fib->fib_OwnerUID && group == fib->fib_OwnerGID) + owner_changed = FALSE; } - #else + + if(owner > 65535 || group > 65535) { - if(((struct Library *)DOSBase)->lib_Version >= 39) + SHOWMSG("invalid owner or group"); + + __set_errno(EINVAL); + goto out; + } + + if(owner_changed) + { + D(("changing owner of '%s'",path_name)); + + #if defined(__amigaos4__) { PROFILE_OFF(); status = SetOwner((STRPTR)path_name,(LONG)((((ULONG)owner) << 16) | group)); PROFILE_ON(); } - else + #else { - D_S(struct bcpl_name,new_name); - size_t len; - - len = strlen(path_name); - if(len >= sizeof(new_name->name)) + if(((struct Library *)DOSBase)->lib_Version >= 39) { - __set_errno(ENAMETOOLONG); - goto out; + PROFILE_OFF(); + status = SetOwner((STRPTR)path_name,(LONG)((((ULONG)owner) << 16) | group)); + PROFILE_ON(); } - - PROFILE_OFF(); - dvp = GetDeviceProc((STRPTR)path_name,NULL); - PROFILE_ON(); - - if(dvp == NULL) + else { - __set_errno(__translate_io_error_to_errno(IoErr())); - goto out; + D_S(struct bcpl_name,new_name); + size_t len; + + len = strlen(path_name); + if(len >= sizeof(new_name->name)) + { + __set_errno(ENAMETOOLONG); + goto out; + } + + PROFILE_OFF(); + dvp = GetDeviceProc((STRPTR)path_name,NULL); + PROFILE_ON(); + + if(dvp == NULL) + { + __set_errno(__translate_io_error_to_errno(IoErr())); + goto out; + } + + new_name->name[0] = len; + memmove(&new_name->name[1],path_name,len); + + PROFILE_OFF(); + status = DoPkt(dvp->dvp_Port,ACTION_SET_OWNER,dvp->dvp_Lock,MKBADDR(new_name),(LONG)((((ULONG)owner) << 16) | group),0,0); + PROFILE_ON(); } - - new_name->name[0] = len; - memmove(&new_name->name[1],path_name,len); - - PROFILE_OFF(); - status = DoPkt(dvp->dvp_Port,ACTION_SET_OWNER,dvp->dvp_Lock,MKBADDR(new_name),(LONG)((((ULONG)owner) << 16) | group),0,0); - PROFILE_ON(); } - } - #endif /* __amigaos4__ */ + #endif /* __amigaos4__ */ - if(status == DOSFALSE) - { - __set_errno(__translate_io_error_to_errno(IoErr())); - goto out; + if(status == DOSFALSE) + { + __set_errno(__translate_io_error_to_errno(IoErr())); + goto out; + } } result = OK; @@ -171,7 +212,12 @@ chown(const char * path_name, uid_t owner, gid_t group) out: PROFILE_OFF(); + FreeDeviceProc(dvp); + + if(file_lock != ZERO) + UnLock(file_lock); + PROFILE_ON(); RETURN(result); diff --git a/library/unistd_fchown.c b/library/unistd_fchown.c index 569810c..57ead8a 100644 --- a/library/unistd_fchown.c +++ b/library/unistd_fchown.c @@ -1,5 +1,5 @@ /* - * $Id: unistd_fchown.c,v 1.12 2006-01-08 12:04:27 obarthel Exp $ + * $Id: unistd_fchown.c,v 1.13 2006-04-05 06:43:56 obarthel Exp $ * * :ts=4 * @@ -88,17 +88,6 @@ fchown(int file_descriptor, uid_t owner, gid_t group) goto out; } - if(owner > 65535 || group > 65535) - { - SHOWMSG("owner or group not OK"); - - SHOWVALUE(owner); - SHOWVALUE(group); - - __set_errno(EINVAL); - goto out; - } - PROFILE_OFF(); success = (__safe_examine_file_handle(fd->fd_DefaultFile,fib) && (parent_dir = __safe_parent_of_file_handle(fd->fd_DefaultFile)) != ZERO); PROFILE_ON(); @@ -114,59 +103,86 @@ fchown(int file_descriptor, uid_t owner, gid_t group) old_current_dir = CurrentDir(parent_dir); current_dir_changed = TRUE; - PROFILE_OFF(); + /* A value of -1 for either the owner or the group ID means + that what's currently being used should not be changed. */ + if(owner == (uid_t)-1) + owner = fib->fib_OwnerUID; - #if defined(__amigaos4__) + if(group == (gid_t)-1) + group = fib->fib_OwnerGID; + + /* Check if the owner and group IDs are usable. This test + follows the comparison against -1 above just so that we + can be sure that we are not mistaking a -1 for a + large unsigned number. */ + if(owner > 65535 || group > 65535) { - success = SetOwner(fib->fib_FileName,(LONG)((((ULONG)owner) << 16) | group)); + SHOWMSG("owner or group not OK"); + + SHOWVALUE(owner); + SHOWVALUE(group); + + __set_errno(EINVAL); + goto out; } - #else + + /* Did anything change at all? */ + if(group != fib->fib_OwnerUID || owner != fib->fib_OwnerUID) { - if(((struct Library *)DOSBase)->lib_Version >= 39) + PROFILE_OFF(); + + #if defined(__amigaos4__) { - success = SetOwner(fib->fib_FileName,(LONG)((((ULONG)owner) << 16) | group)); + success = SetOwner(fib->fib_FileName,(LONG)((((ULONG)owner) << 16) | (ULONG)group)); } - else + #else { - D_S(struct bcpl_name,new_name); - struct DevProc * dvp; - unsigned int len; - - SHOWMSG("have to do this manually..."); - - success = DOSFALSE; - - len = strlen(fib->fib_FileName); - - assert( len < sizeof(new_name->name) ); - - dvp = GetDeviceProc(fib->fib_FileName,NULL); - if(dvp != NULL) + if(((struct Library *)DOSBase)->lib_Version >= 39) { - LONG error; + success = SetOwner(fib->fib_FileName,(LONG)((((ULONG)owner) << 16) | (ULONG)group)); + } + else + { + D_S(struct bcpl_name,new_name); + struct DevProc * dvp; + unsigned int len; - new_name->name[0] = len; - memmove(&new_name->name[1],fib->fib_FileName,len); + SHOWMSG("have to do this manually..."); - success = DoPkt(dvp->dvp_Port,ACTION_SET_OWNER,dvp->dvp_Lock,MKBADDR(new_name),(LONG)((((ULONG)owner) << 16) | group),0,0); - error = IoErr(); + success = DOSFALSE; - FreeDeviceProc(dvp); + len = strlen(fib->fib_FileName); - SetIoErr(error); + assert( len < sizeof(new_name->name) ); + + dvp = GetDeviceProc(fib->fib_FileName,NULL); + if(dvp != NULL) + { + LONG error; + + new_name->name[0] = len; + memmove(&new_name->name[1],fib->fib_FileName,len); + + success = DoPkt(dvp->dvp_Port,ACTION_SET_OWNER,dvp->dvp_Lock,MKBADDR(new_name),(LONG)((((ULONG)owner) << 16) | (ULONG)group),0,0); + error = IoErr(); + + FreeDeviceProc(dvp); + + SetIoErr(error); + } } } - } - #endif /* __amigaos4__ */ + #endif /* __amigaos4__ */ - PROFILE_ON(); + PROFILE_ON(); - if(NO success) - { - SHOWMSG("couldn't change owner/group"); + if(NO success) + { + SHOWMSG("couldn't change owner/group"); - __set_errno(__translate_io_error_to_errno(IoErr())); - goto out; + __set_errno(__translate_io_error_to_errno(IoErr())); + goto out; + } } result = OK; diff --git a/library/unistd_headers.h b/library/unistd_headers.h index 7cd9903..26c6bfe 100644 --- a/library/unistd_headers.h +++ b/library/unistd_headers.h @@ -1,5 +1,5 @@ /* - * $Id: unistd_headers.h,v 1.9 2006-01-08 12:04:27 obarthel Exp $ + * $Id: unistd_headers.h,v 1.10 2006-04-05 06:43:56 obarthel Exp $ * * :ts=4 * @@ -64,10 +64,24 @@ extern struct MinList NOCOMMON __unlink_list; /****************************************************************************/ /* Local timer I/O. */ -extern struct MsgPort * NOCOMMON __timer_port; +extern struct MsgPort * NOCOMMON __timer_port; +extern BOOL NOCOMMON __timer_busy; +extern struct Library * NOCOMMON __TimerBase; + +/****************************************************************************/ + +/* A quick workaround for the timeval/timerequest->TimeVal/TimeRequest + change in the recent OS4 header files. */ + +#if defined(__NEW_TIMEVAL_DEFINITION_USED__) + +extern struct TimeRequest * NOCOMMON __timer_request; + +#else + extern struct timerequest * NOCOMMON __timer_request; -extern BOOL NOCOMMON __timer_busy; -extern struct Library * NOCOMMON __TimerBase; + +#endif /* __NEW_TIMEVAL_DEFINITION_USED__ */ /****************************************************************************/ diff --git a/library/unistd_time_delay.c b/library/unistd_time_delay.c index f5cf908..d09a372 100644 --- a/library/unistd_time_delay.c +++ b/library/unistd_time_delay.c @@ -1,5 +1,5 @@ /* - * $Id: unistd_time_delay.c,v 1.7 2006-01-08 12:04:27 obarthel Exp $ + * $Id: unistd_time_delay.c,v 1.8 2006-04-05 06:43:56 obarthel Exp $ * * :ts=4 * @@ -47,6 +47,23 @@ /****************************************************************************/ +/* A quick workaround for the timeval/timerequest->TimeVal/TimeRequest + change in the recent OS4 header files. */ + +#if defined(__NEW_TIMEVAL_DEFINITION_USED__) + +#define timeval TimeVal +#define tv_secs Seconds +#define tv_micro Microseconds + +#define timerequest TimeRequest +#define tr_node Request +#define tr_time Time + +#endif /* __NEW_TIMEVAL_DEFINITION_USED__ */ + +/****************************************************************************/ + unsigned int __time_delay(unsigned long seconds,unsigned long microseconds) { diff --git a/library/unistd_timer.c b/library/unistd_timer.c index d4343fd..7a716b4 100644 --- a/library/unistd_timer.c +++ b/library/unistd_timer.c @@ -1,5 +1,5 @@ /* - * $Id: unistd_timer.c,v 1.9 2006-01-08 12:04:27 obarthel Exp $ + * $Id: unistd_timer.c,v 1.10 2006-04-05 06:43:56 obarthel Exp $ * * :ts=4 * @@ -51,6 +51,18 @@ /****************************************************************************/ +/* A quick workaround for the timeval/timerequest->TimeVal/TimeRequest + change in the recent OS4 header files. */ + +#if defined(__NEW_TIMEVAL_DEFINITION_USED__) + +#define timerequest TimeRequest +#define tr_node Request + +#endif /* __NEW_TIMEVAL_DEFINITION_USED__ */ + +/****************************************************************************/ + /* Local timer I/O. */ struct MsgPort * NOCOMMON __timer_port; struct timerequest * NOCOMMON __timer_request;