1
0
mirror of https://github.com/adtools/clib2.git synced 2025-12-08 14:59:05 +00:00

- The V37/V40 compatibility code is no longer built for the AmigaOS4

version of the library.

- Switched over the last use of DeviceProc() to GetDeviceProc(), etc.


git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@14798 87f5fb63-7c3d-0410-a384-fd976d0f7a62
This commit is contained in:
Olaf Barthel
2005-01-09 15:58:02 +00:00
parent 64c1175f7b
commit 5191ee5660
8 changed files with 241 additions and 154 deletions

View File

@ -31,6 +31,15 @@
- Made the <ctype.h> macros more robust.
- Removed the "NIL:" file handle tests preceding the Open("CONSOLE:",..)
calls. As of Kickstart 2.x and beyond these are no longer a source of
trouble.
- The V37/V40 compatibility code is no longer built for the AmigaOS4
version of the library.
- Switched over the last use of DeviceProc() to GetDeviceProc(), etc.
c.lib 1.185 (2.1.2005)

View File

@ -1,5 +1,5 @@
/*
* $Id: dirent_readdir.c,v 1.4 2005-01-02 09:07:07 obarthel Exp $
* $Id: dirent_readdir.c,v 1.5 2005-01-09 15:58:02 obarthel Exp $
*
* :ts=4
*
@ -89,7 +89,6 @@ readdir(DIR * directory_pointer)
D_S(struct FileInfoBlock,fib);
D_S(struct bcpl_name,bcpl_name);
UBYTE * name = bcpl_name->name;
struct MsgPort * port;
BPTR dir_lock;
assert( (((ULONG)name) & 3) == 0 );
@ -103,10 +102,12 @@ readdir(DIR * directory_pointer)
{
if(IsFileSystem(dh->dh_VolumeNode->ln_Name))
{
port = DeviceProc(dh->dh_VolumeNode->ln_Name);
if(port != NULL)
struct DevProc * dvp;
dvp = GetDeviceProc(dh->dh_VolumeNode->ln_Name,NULL);
if(dvp != NULL)
{
dir_lock = DoPkt(port,ACTION_LOCATE_OBJECT,ZERO,MKBADDR(name),SHARED_LOCK, 0,0);
dir_lock = DoPkt(dvp->dvp_Port,ACTION_LOCATE_OBJECT,ZERO,MKBADDR(name),SHARED_LOCK, 0,0);
if(dir_lock != ZERO)
{
if(Examine(dir_lock,fib))
@ -122,6 +123,8 @@ readdir(DIR * directory_pointer)
UnLock(dir_lock);
}
FreeDeviceProc(dvp);
}
}

View File

@ -1,5 +1,5 @@
/*
* $Id: fcntl_open.c,v 1.5 2005-01-09 09:54:33 obarthel Exp $
* $Id: fcntl_open.c,v 1.6 2005-01-09 15:58:02 obarthel Exp $
*
* :ts=4
*
@ -53,6 +53,69 @@
/****************************************************************************/
/* This is used in place of ExamineFH() in order to work around a bug in
dos.library V40 and below: a "NIL:" file handle will crash the
ExamineFH() function. */
static LONG
safe_examine_file_handle(BPTR file_handle,struct FileInfoBlock *fib)
{
LONG result = DOSFALSE;
assert( fib != NULL );
#ifndef __amigaos4__
{
struct FileHandle * fh = (struct FileHandle *)BADDR(file_handle);
if(fh == NULL || fh->fh_Type == NULL)
{
SetIoErr(ERROR_OBJECT_WRONG_TYPE);
goto out;
}
}
#endif /* __amigaos4__ */
PROFILE_OFF();
result = ExamineFH(file_handle,fib);
PROFILE_ON();
out:
return(result);
}
/* Same thing as above, but for ChangeMode(), which suffers from
the same problem. */
static LONG
safe_change_mode(LONG type,BPTR file_handle,LONG mode)
{
LONG result = DOSFALSE;
#ifndef __amigaos4__
{
struct FileHandle * fh = (struct FileHandle *)BADDR(file_handle);
assert( type == CHANGE_FH );
if(fh == NULL || fh->fh_Type == NULL)
{
SetIoErr(ERROR_OBJECT_WRONG_TYPE);
goto out;
}
}
#endif /* __amigaos4__ */
PROFILE_OFF();
result = ChangeMode(type,file_handle,mode);
PROFILE_ON();
out:
return(result);
}
/****************************************************************************/
int
open(const char *path_name, int open_flag, ... /* mode_t mode */ )
{
@ -64,7 +127,6 @@ open(const char *path_name, int open_flag, ... /* mode_t mode */ )
LONG is_file_system = FALSE;
LONG open_mode;
BPTR lock = ZERO;
struct FileHandle * file_handle;
BPTR handle = ZERO;
BOOL create_new_file = FALSE;
LONG is_interactive;
@ -294,47 +356,33 @@ open(const char *path_name, int open_flag, ... /* mode_t mode */ )
goto out;
}
file_handle = BADDR(handle);
/* NOTE: workaround for a bug in dos.library V40 and below which will
* crash the caller if the file handle refers to "NIL:".
*/
if(file_handle->fh_Type != NULL)
if(safe_examine_file_handle(handle,fib) != DOSFALSE)
{
LONG status;
BOOL operation_permitted = TRUE;
PROFILE_OFF();
status = ExamineFH(handle,fib);
PROFILE_ON();
if(status != DOSFALSE)
/* Check if the file is readable. */
if(FLAG_IS_SET(fib->fib_Protection,FIBF_READ))
{
BOOL operation_permitted = TRUE;
/* Check if the file is readable. */
if(FLAG_IS_SET(fib->fib_Protection,FIBF_READ))
if(access_mode == O_RDONLY ||
access_mode == O_RDWR)
{
if(access_mode == O_RDONLY ||
access_mode == O_RDWR)
{
operation_permitted = FALSE;
}
operation_permitted = FALSE;
}
}
/* Check if the file can be written to. */
if(FLAG_IS_SET(fib->fib_Protection,FIBF_WRITE))
{
if(access_mode == O_WRONLY)
operation_permitted = FALSE;
}
/* Check if the file can be written to. */
if(FLAG_IS_SET(fib->fib_Protection,FIBF_WRITE))
{
if(access_mode == O_WRONLY)
operation_permitted = FALSE;
}
if(NOT operation_permitted)
{
SHOWMSG("this object must not be opened");
if(NOT operation_permitted)
{
SHOWMSG("this object must not be opened");
errno = EACCES;
goto out;
}
errno = EACCES;
goto out;
}
}
@ -365,7 +413,7 @@ open(const char *path_name, int open_flag, ... /* mode_t mode */ )
len = 0;
for(i = 0 ; i < (int)strlen(path_name) ; i++)
for(i = 0 ; path_name[i] != '\0' ; i++)
{
if(path_name[i] == ':')
{
@ -400,21 +448,11 @@ open(const char *path_name, int open_flag, ... /* mode_t mode */ )
if(is_file_system)
{
/* NOTE: workaround for a bug in dos.library V40 and below which will
* crash the caller if the file handle refers to "NIL:".
*/
if(file_handle->fh_Type != NULL)
{
/* We opened the file in exclusive access mode. Switch it back
into shared access mode so that its contents can be read
while it's still open. */
if(open_mode == MODE_NEWFILE)
{
PROFILE_OFF();
ChangeMode(CHANGE_FH,handle,SHARED_LOCK);
PROFILE_ON();
}
}
/* We opened the file in exclusive access mode. Switch it back
into shared access mode so that its contents can be read
while it's still open. */
if(open_mode == MODE_NEWFILE)
safe_change_mode(CHANGE_FH,handle,SHARED_LOCK);
/* We should be able to seek in this file. */
SET_FLAG(fd->fd_Flags,FDF_CACHE_POSITION);

View File

@ -1,5 +1,5 @@
/*
* $Id: stdio_fdhookentry.c,v 1.5 2005-01-02 09:07:08 obarthel Exp $
* $Id: stdio_fdhookentry.c,v 1.6 2005-01-09 15:58:02 obarthel Exp $
*
* :ts=4
*
@ -59,16 +59,21 @@
static LONG
safe_examine_file_handle(BPTR file_handle,struct FileInfoBlock *fib)
{
struct FileHandle * fh = (struct FileHandle *)BADDR(file_handle);
LONG result = DOSFALSE;
assert( fib != NULL );
if(fh == NULL || fh->fh_Type == NULL)
#ifndef __amigaos4__
{
SetIoErr(ERROR_OBJECT_WRONG_TYPE);
goto out;
struct FileHandle * fh = (struct FileHandle *)BADDR(file_handle);
if(fh == NULL || fh->fh_Type == NULL)
{
SetIoErr(ERROR_OBJECT_WRONG_TYPE);
goto out;
}
}
#endif /* __amigaos4__ */
PROFILE_OFF();
result = ExamineFH(file_handle,fib);
@ -85,14 +90,19 @@ safe_examine_file_handle(BPTR file_handle,struct FileInfoBlock *fib)
static BPTR
safe_parent_of_file_handle(BPTR file_handle)
{
struct FileHandle * fh = (struct FileHandle *)BADDR(file_handle);
BPTR result = ZERO;
if(fh == NULL || fh->fh_Type == NULL)
#ifndef __amigaos4__
{
SetIoErr(ERROR_OBJECT_WRONG_TYPE);
goto out;
struct FileHandle * fh = (struct FileHandle *)BADDR(file_handle);
if(fh == NULL || fh->fh_Type == NULL)
{
SetIoErr(ERROR_OBJECT_WRONG_TYPE);
goto out;
}
}
#endif /* __amigaos4__ */
PROFILE_OFF();
result = ParentOfFH(file_handle);
@ -244,19 +254,27 @@ obtain_file_lock_semaphore(BOOL shared)
if(shared)
{
if(((struct Library *)SysBase)->lib_Version >= 39)
#if defined(__amigaos4__)
{
ObtainSemaphoreShared((struct SignalSemaphore *)FileLockSemaphore);
}
else
#else
{
/* Workaround for shared semaphore nesting problem. */
if(CANNOT AttemptSemaphoreShared((struct SignalSemaphore *)FileLockSemaphore))
if(((struct Library *)SysBase)->lib_Version >= 39)
{
if(CANNOT AttemptSemaphore((struct SignalSemaphore *)FileLockSemaphore))
ObtainSemaphoreShared((struct SignalSemaphore *)FileLockSemaphore);
ObtainSemaphoreShared((struct SignalSemaphore *)FileLockSemaphore);
}
else
{
/* Workaround for shared semaphore nesting problem. */
if(CANNOT AttemptSemaphoreShared((struct SignalSemaphore *)FileLockSemaphore))
{
if(CANNOT AttemptSemaphore((struct SignalSemaphore *)FileLockSemaphore))
ObtainSemaphoreShared((struct SignalSemaphore *)FileLockSemaphore);
}
}
}
#endif /* __amigaos4__ */
}
else
{
@ -1885,10 +1903,8 @@ __fd_hook_entry(
old_current_dir = CurrentDir(parent_dir);
if(((struct Library *)DOSBase)->lib_Version >= 39)
#if defined(__amigaos4__)
{
SHOWMSG("changing owner");
if(SetOwner(fib->fib_FileName,(LONG)((((ULONG)message->owner) << 16) | message->group)))
{
result = 0;
@ -1900,36 +1916,55 @@ __fd_hook_entry(
__translate_io_error_to_errno(IoErr(),&error);
}
}
else
#else
{
D_S(struct bcpl_name,new_name);
struct DevProc * dvp;
unsigned int len;
SHOWMSG("have to do this manually...");
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)
{
new_name->name[0] = len;
memmove(&new_name->name[1],fib->fib_FileName,len);
SHOWMSG("changing owner");
if(DoPkt(dvp->dvp_Port,ACTION_SET_OWNER,dvp->dvp_Lock,MKBADDR(new_name),(LONG)((((ULONG)message->owner) << 16) | message->group),0,0))
if(SetOwner(fib->fib_FileName,(LONG)((((ULONG)message->owner) << 16) | message->group)))
{
result = 0;
}
else
__translate_io_error_to_errno(IoErr(),&error);
{
SHOWMSG("that didn't work");
FreeDeviceProc(dvp);
__translate_io_error_to_errno(IoErr(),&error);
}
}
else
{
__translate_io_error_to_errno(IoErr(),&error);
D_S(struct bcpl_name,new_name);
struct DevProc * dvp;
unsigned int len;
SHOWMSG("have to do this manually...");
len = strlen(fib->fib_FileName);
assert( len < sizeof(new_name->name) );
dvp = GetDeviceProc(fib->fib_FileName,NULL);
if(dvp != NULL)
{
new_name->name[0] = len;
memmove(&new_name->name[1],fib->fib_FileName,len);
if(DoPkt(dvp->dvp_Port,ACTION_SET_OWNER,dvp->dvp_Lock,MKBADDR(new_name),(LONG)((((ULONG)message->owner) << 16) | message->group),0,0))
result = 0;
else
__translate_io_error_to_errno(IoErr(),&error);
FreeDeviceProc(dvp);
}
else
{
__translate_io_error_to_errno(IoErr(),&error);
}
}
}
#endif /* __amigaos4__ */
CurrentDir(old_current_dir);

View File

@ -1,5 +1,5 @@
/*
* $Id: stdio_init_exit.c,v 1.10 2005-01-09 10:43:40 obarthel Exp $
* $Id: stdio_init_exit.c,v 1.11 2005-01-09 15:58:02 obarthel Exp $
*
* :ts=4
*
@ -242,13 +242,9 @@ __stdio_init(void)
SET_FLAG(__fd[STDERR_FILENO]->fd_Flags,FDF_NO_CLOSE);
}
else if (__fd[STDOUT_FILENO]->fd_DefaultFile != ZERO)
else
{
struct FileHandle * fh = (struct FileHandle *)BADDR(__fd[STDOUT_FILENO]->fd_DefaultFile);
/* Careful, this could be "NIL:". */
if(fh->fh_Type != NULL)
__fd[STDERR_FILENO]->fd_DefaultFile = Open("CONSOLE:",MODE_NEWFILE);
__fd[STDERR_FILENO]->fd_DefaultFile = Open("CONSOLE:",MODE_NEWFILE);
}
}

View File

@ -1,5 +1,5 @@
/*
* $Id: stdlib_malloc.c,v 1.5 2005-01-02 09:07:18 obarthel Exp $
* $Id: stdlib_malloc.c,v 1.6 2005-01-09 15:58:02 obarthel Exp $
*
* :ts=4
*
@ -275,8 +275,16 @@ __memory_init(void)
NewList((struct List *)&__memory_list);
if(((struct Library *)SysBase)->lib_Version >= 39)
#if defined(__amigaos4__)
{
__memory_pool = CreatePool(MEMF_ANY,(ULONG)__default_pool_size,(ULONG)__default_puddle_size);
}
#else
{
if(((struct Library *)SysBase)->lib_Version >= 39)
__memory_pool = CreatePool(MEMF_ANY,(ULONG)__default_pool_size,(ULONG)__default_puddle_size);
}
#endif /* __amigaos4__ */
LEAVE();
}

View File

@ -1,5 +1,5 @@
/*
* $Id: stdlib_startup.c,v 1.5 2005-01-02 09:07:19 obarthel Exp $
* $Id: stdlib_startup.c,v 1.6 2005-01-09 15:58:02 obarthel Exp $
*
* :ts=4
*
@ -387,17 +387,13 @@ __startup_init(void)
{
struct FileHandle * fh = BADDR(input);
/* Careful: "NIL:" will have a NULL MsgPort in the file handle. */
if(fh->fh_Type != NULL)
{
old_console_task = SetConsoleTask(fh->fh_Type);
old_console_task = SetConsoleTask(fh->fh_Type);
output = Open("CONSOLE:",MODE_NEWFILE);
if(output != ZERO)
restore_console_task = TRUE;
else
SetConsoleTask((struct MsgPort *)old_console_task);
}
output = Open("CONSOLE:",MODE_NEWFILE);
if(output != ZERO)
restore_console_task = TRUE;
else
SetConsoleTask((struct MsgPort *)old_console_task);
}
if(output == ZERO)

View File

@ -1,5 +1,5 @@
/*
* $Id: unistd_chown.c,v 1.3 2005-01-02 09:07:19 obarthel Exp $
* $Id: unistd_chown.c,v 1.4 2005-01-09 15:58:02 obarthel Exp $
*
* :ts=4
*
@ -106,57 +106,59 @@ chown(const char * path_name, uid_t owner, gid_t group)
D(("changing owner of '%s'",path_name));
if(((struct Library *)DOSBase)->lib_Version >= 39)
#if defined(__amigaos4__)
{
PROFILE_OFF();
status = SetOwner((STRPTR)path_name,(LONG)((((ULONG)owner) << 16) | group));
PROFILE_ON();
if(status == DOSFALSE)
{
__translate_io_error_to_errno(IoErr(),&errno);
goto out;
}
result = 0;
}
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)
{
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
{
__translate_io_error_to_errno(IoErr(),&errno);
goto out;
D_S(struct bcpl_name,new_name);
size_t len;
len = strlen(path_name);
if(len >= sizeof(new_name->name))
{
errno = ENAMETOOLONG;
goto out;
}
PROFILE_OFF();
dvp = GetDeviceProc((STRPTR)path_name,NULL);
PROFILE_ON();
if(dvp == NULL)
{
__translate_io_error_to_errno(IoErr(),&errno);
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();
if(status == DOSFALSE)
{
__translate_io_error_to_errno(IoErr(),&errno);
goto out;
}
result = 0;
}
#endif /* __amigaos4__ */
if(status == DOSFALSE)
{
__translate_io_error_to_errno(IoErr(),&errno);
goto out;
}
result = 0;
out: