mirror of
https://github.com/adtools/clib2.git
synced 2025-12-08 14:59:05 +00:00
Compare commits
30 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
d27cfef46b | ||
|
|
0f3791a9a4 | ||
|
|
e5a2a2b451 | ||
|
|
ca1fc13792 | ||
|
|
3a0324e4ff | ||
|
|
77279e3224 | ||
|
|
75b0a762ef | ||
|
|
c635fb3ffe | ||
|
|
70d1e4b7a3 | ||
|
|
e9659f46d6 | ||
|
|
acc795df55 | ||
|
|
66303e9ba2 | ||
|
|
7e1d5d6f6a | ||
|
|
e789564429 | ||
|
|
350ffdb790 | ||
|
|
6809a5dd5b | ||
|
|
591ee2250e | ||
|
|
2b9d624d1d | ||
|
|
bf4d3b763c | ||
|
|
9984a37cb4 | ||
|
|
0b833b8680 | ||
|
|
b8ba11b158 | ||
|
|
872b2b335b | ||
|
|
b1f56b1bbe | ||
|
|
9ce2ba234f | ||
|
|
d5bfee3917 | ||
|
|
9f37f76b01 | ||
|
|
2f3de1dcd6 | ||
|
|
74b2838663 | ||
|
|
2c450a1e48 |
@@ -1,5 +1,5 @@
|
|||||||
#
|
#
|
||||||
# $Id: GNUmakefile.68k,v 1.96 2006-09-17 17:36:42 obarthel Exp $
|
# $Id: GNUmakefile.68k,v 1.101 2007-01-06 10:09:48 obarthel Exp $
|
||||||
#
|
#
|
||||||
# :ts=8
|
# :ts=8
|
||||||
#
|
#
|
||||||
@@ -183,11 +183,14 @@ C_LIB = \
|
|||||||
stat_fchmod.o \
|
stat_fchmod.o \
|
||||||
stat_fstat.o \
|
stat_fstat.o \
|
||||||
stat_lstat.o \
|
stat_lstat.o \
|
||||||
|
stat_lock.o \
|
||||||
stat_mkdir.o \
|
stat_mkdir.o \
|
||||||
stat_rmdir.o \
|
stat_rmdir.o \
|
||||||
stat_stat.o \
|
stat_stat.o \
|
||||||
stat_umask.o \
|
stat_umask.o \
|
||||||
stdio_asprintf.o \
|
stdio_asprintf.o \
|
||||||
|
stdio_change_fd_action.o \
|
||||||
|
stdio_change_fd_user_data.o \
|
||||||
stdio_clearerr.o \
|
stdio_clearerr.o \
|
||||||
stdio_dropiobreadbuffer.o \
|
stdio_dropiobreadbuffer.o \
|
||||||
stdio_duplicate_fd.o \
|
stdio_duplicate_fd.o \
|
||||||
@@ -227,6 +230,7 @@ C_LIB = \
|
|||||||
stdio_getchar.o \
|
stdio_getchar.o \
|
||||||
stdio_getchar_unlocked.o \
|
stdio_getchar_unlocked.o \
|
||||||
stdio_gets.o \
|
stdio_gets.o \
|
||||||
|
stdio_get_fd.o \
|
||||||
stdio_get_file_descriptor.o \
|
stdio_get_file_descriptor.o \
|
||||||
stdio_growfdtable.o \
|
stdio_growfdtable.o \
|
||||||
stdio_growiobtable.o \
|
stdio_growiobtable.o \
|
||||||
@@ -252,6 +256,7 @@ C_LIB = \
|
|||||||
stdio_remove.o \
|
stdio_remove.o \
|
||||||
stdio_remove_fd_alias.o \
|
stdio_remove_fd_alias.o \
|
||||||
stdio_rename.o \
|
stdio_rename.o \
|
||||||
|
stdio_resolve_fd_file.o \
|
||||||
stdio_rewind.o \
|
stdio_rewind.o \
|
||||||
stdio_scanf.o \
|
stdio_scanf.o \
|
||||||
stdio_setbuf.o \
|
stdio_setbuf.o \
|
||||||
@@ -455,6 +460,7 @@ C_LIB = \
|
|||||||
unistd_time_delay.o \
|
unistd_time_delay.o \
|
||||||
unistd_truncate.o \
|
unistd_truncate.o \
|
||||||
unistd_unlink.o \
|
unistd_unlink.o \
|
||||||
|
unistd_unlink_retries.o \
|
||||||
unistd_usleep.o \
|
unistd_usleep.o \
|
||||||
utime_utime.o \
|
utime_utime.o \
|
||||||
utsname_uname.o
|
utsname_uname.o
|
||||||
@@ -477,6 +483,7 @@ UNIX_LIB = \
|
|||||||
stat_chmod.o \
|
stat_chmod.o \
|
||||||
stat_fstat.o \
|
stat_fstat.o \
|
||||||
stat_lstat.o \
|
stat_lstat.o \
|
||||||
|
stat_lock.o \
|
||||||
stat_mkdir.o \
|
stat_mkdir.o \
|
||||||
stat_rmdir.o \
|
stat_rmdir.o \
|
||||||
stat_stat.o \
|
stat_stat.o \
|
||||||
@@ -657,6 +664,7 @@ MATH_LIB = \
|
|||||||
math_ldexpf.o \
|
math_ldexpf.o \
|
||||||
math_lgamma.o \
|
math_lgamma.o \
|
||||||
math_lgammaf.o \
|
math_lgammaf.o \
|
||||||
|
math_llrint.o \
|
||||||
math_log.o \
|
math_log.o \
|
||||||
math_log10.o \
|
math_log10.o \
|
||||||
math_log10f.o \
|
math_log10f.o \
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
#
|
#
|
||||||
# $Id: GNUmakefile.os4,v 1.109 2006-09-17 17:37:27 obarthel Exp $
|
# $Id: GNUmakefile.os4,v 1.111 2007-01-06 10:09:48 obarthel Exp $
|
||||||
#
|
#
|
||||||
# :ts=8
|
# :ts=8
|
||||||
#
|
#
|
||||||
@@ -91,7 +91,28 @@ include libprofile.gmk
|
|||||||
all-targets: \
|
all-targets: \
|
||||||
lib/crt0.o \
|
lib/crt0.o \
|
||||||
lib/small-data/crt0.o \
|
lib/small-data/crt0.o \
|
||||||
|
lib/soft-float/crt0.o \
|
||||||
lib/baserel/crt0.o \
|
lib/baserel/crt0.o \
|
||||||
|
lib/crtbegin.o \
|
||||||
|
lib/soft-float/crtbegin.o \
|
||||||
|
lib/small-data/crtbegin.o \
|
||||||
|
lib/baserel/crtbegin.o \
|
||||||
|
lib/crtend.o \
|
||||||
|
lib/soft-float/crtend.o \
|
||||||
|
lib/small-data/crtend.o \
|
||||||
|
lib/baserel/crtend.o \
|
||||||
|
lib.threadsafe/crt0.o \
|
||||||
|
lib.threadsafe/small-data/crt0.o \
|
||||||
|
lib.threadsafe/soft-float/crt0.o \
|
||||||
|
lib.threadsafe/baserel/crt0.o \
|
||||||
|
lib.threadsafe/crtbegin.o \
|
||||||
|
lib.threadsafe/soft-float/crtbegin.o \
|
||||||
|
lib.threadsafe/small-data/crtbegin.o \
|
||||||
|
lib.threadsafe/baserel/crtbegin.o \
|
||||||
|
lib.threadsafe/crtend.o \
|
||||||
|
lib.threadsafe/soft-float/crtend.o \
|
||||||
|
lib.threadsafe/small-data/crtend.o \
|
||||||
|
lib.threadsafe/baserel/crtend.o \
|
||||||
$(LIBS)
|
$(LIBS)
|
||||||
|
|
||||||
##############################################################################
|
##############################################################################
|
||||||
@@ -136,14 +157,58 @@ lib/%.o : AFLAGS += $(LARGEDATA)
|
|||||||
lib/%.o : %.S
|
lib/%.o : %.S
|
||||||
@$(ASSEMBLE)
|
@$(ASSEMBLE)
|
||||||
|
|
||||||
|
lib/%.o : %.c
|
||||||
|
@$(COMPILE)
|
||||||
|
|
||||||
lib/small-data/%.o : AFLAGS += $(SMALLDATA)
|
lib/small-data/%.o : AFLAGS += $(SMALLDATA)
|
||||||
lib/small-data/%.o : %.S
|
lib/small-data/%.o : %.S
|
||||||
@$(ASSEMBLE)
|
@$(ASSEMBLE)
|
||||||
|
|
||||||
|
lib/small-data/%.o : %.c
|
||||||
|
@$(COMPILE)
|
||||||
|
|
||||||
|
lib/soft-float/%.o : AFLAGS += $(SOFTFLOAT)
|
||||||
|
lib/soft-float/%.o : %.S
|
||||||
|
@$(ASSEMBLE)
|
||||||
|
|
||||||
|
lib/soft-float/%.o : %.c
|
||||||
|
@$(COMPILE)
|
||||||
|
|
||||||
lib/baserel/%.o : AFLAGS += $(BASEREL)
|
lib/baserel/%.o : AFLAGS += $(BASEREL)
|
||||||
lib/baserel/%.o : %.S
|
lib/baserel/%.o : %.S
|
||||||
@$(ASSEMBLE)
|
@$(ASSEMBLE)
|
||||||
|
|
||||||
|
lib/baserel/%.o : %.c
|
||||||
|
@$(COMPILE)
|
||||||
|
|
||||||
|
lib.threadsafe/%.o : AFLAGS += $(LARGEDATA) $(THREADSAFE)
|
||||||
|
lib.threadsafe/%.o : %.S
|
||||||
|
@$(ASSEMBLE)
|
||||||
|
|
||||||
|
lib.threadsafe/%.o : %.c
|
||||||
|
@$(COMPILE)
|
||||||
|
|
||||||
|
lib.threadsafe/small-data/%.o : AFLAGS += $(SMALLDATA) $(THREADSAFE)
|
||||||
|
lib.threadsafe/small-data/%.o : %.S
|
||||||
|
@$(ASSEMBLE)
|
||||||
|
|
||||||
|
lib.threadsafe/small-data/%.o : %.c
|
||||||
|
@$(COMPILE)
|
||||||
|
|
||||||
|
lib.threadsafe/soft-float/%.o : AFLAGS += $(SOFTFLOAT) $(THREADSAFE)
|
||||||
|
lib.threadsafe/soft-float/%.o : %.S
|
||||||
|
@$(ASSEMBLE)
|
||||||
|
|
||||||
|
lib.threadsafe/soft-float/%.o : %.c
|
||||||
|
@$(COMPILE)
|
||||||
|
|
||||||
|
lib.threadsafe/baserel/%.o : AFLAGS += $(BASEREL) $(THREADSAFE)
|
||||||
|
lib.threadsafe/baserel/%.o : %.S
|
||||||
|
@$(ASSEMBLE)
|
||||||
|
|
||||||
|
lib.threadsafe/baserel/%.o : %.c
|
||||||
|
@$(COMPILE)
|
||||||
|
|
||||||
##############################################################################
|
##############################################################################
|
||||||
|
|
||||||
define COMPILE
|
define COMPILE
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
#define VERSION 1
|
#define VERSION 1
|
||||||
#define REVISION 201
|
#define REVISION 202
|
||||||
#define DATE "21.9.2006"
|
#define DATE "16.1.2007"
|
||||||
#define VERS "amiga.lib 1.201"
|
#define VERS "amiga.lib 1.202"
|
||||||
#define VSTRING "amiga.lib 1.201 (21.9.2006)\r\n"
|
#define VSTRING "amiga.lib 1.202 (16.1.2007)\r\n"
|
||||||
#define VERSTAG "\0$VER: amiga.lib 1.201 (21.9.2006)"
|
#define VERSTAG "\0$VER: amiga.lib 1.202 (16.1.2007)"
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
201
|
202
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: amiga_acrypt.c,v 1.4 2006-01-08 12:04:22 obarthel Exp $
|
* $Id: amiga_acrypt.c,v 1.5 2006-09-25 15:12:47 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -49,6 +49,10 @@
|
|||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
|
UBYTE * ACrypt(UBYTE * buffer, const UBYTE * password, const UBYTE * user);
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
UBYTE *
|
UBYTE *
|
||||||
ACrypt(UBYTE * buffer, const UBYTE * password, const UBYTE * user)
|
ACrypt(UBYTE * buffer, const UBYTE * password, const UBYTE * user)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: amiga_argarraydone.c,v 1.3 2006-01-08 12:04:22 obarthel Exp $
|
* $Id: amiga_argarraydone.c,v 1.4 2006-09-25 14:05:31 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -48,7 +48,7 @@
|
|||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
extern char **CXLIB_argarray;
|
extern const unsigned char **CXLIB_argarray;
|
||||||
|
|
||||||
extern struct DiskObject * CXLIB_disko;
|
extern struct DiskObject * CXLIB_disko;
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: amiga_beginio.c,v 1.4 2006-01-08 12:04:22 obarthel Exp $
|
* $Id: amiga_beginio.c,v 1.5 2006-09-25 15:12:47 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -103,6 +103,10 @@ BeginIO(struct IORequest *ior)
|
|||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
|
VOID BeginIO(struct IORequest *ior);
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
VOID
|
VOID
|
||||||
BeginIO(struct IORequest *ior)
|
BeginIO(struct IORequest *ior)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: amiga_createextio.c,v 1.4 2006-01-08 12:04:22 obarthel Exp $
|
* $Id: amiga_createextio.c,v 1.5 2006-09-25 15:12:47 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -50,6 +50,10 @@
|
|||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
|
struct IORequest * CreateExtIO(CONST struct MsgPort * port, LONG io_size);
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
struct IORequest *
|
struct IORequest *
|
||||||
CreateExtIO(CONST struct MsgPort * port, LONG io_size)
|
CreateExtIO(CONST struct MsgPort * port, LONG io_size)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: amiga_createport.c,v 1.4 2006-01-08 12:04:22 obarthel Exp $
|
* $Id: amiga_createport.c,v 1.5 2006-09-25 15:12:47 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -50,6 +50,10 @@
|
|||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
|
struct MsgPort * CreatePort(CONST_STRPTR name, LONG pri);
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
struct MsgPort *
|
struct MsgPort *
|
||||||
CreatePort(CONST_STRPTR name, LONG pri)
|
CreatePort(CONST_STRPTR name, LONG pri)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: amiga_createstdio.c,v 1.4 2006-01-08 12:04:22 obarthel Exp $
|
* $Id: amiga_createstdio.c,v 1.5 2006-09-25 15:12:47 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -50,6 +50,10 @@
|
|||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
|
struct IOStdReq * CreateStdIO(CONST struct MsgPort * port);
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
struct IOStdReq *
|
struct IOStdReq *
|
||||||
CreateStdIO(CONST struct MsgPort * port)
|
CreateStdIO(CONST struct MsgPort * port)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: amiga_createtask.c,v 1.5 2006-01-08 12:04:22 obarthel Exp $
|
* $Id: amiga_createtask.c,v 1.6 2006-09-25 15:12:47 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -209,6 +209,10 @@ CreateTask(CONST_STRPTR name,LONG pri,CONST APTR init_pc,ULONG stack_size)
|
|||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
|
struct Task * CreateTask(CONST_STRPTR name,LONG pri,CONST APTR init_pc,ULONG stack_size);
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
struct Task *
|
struct Task *
|
||||||
CreateTask(CONST_STRPTR name,LONG pri,CONST APTR init_pc,ULONG stack_size)
|
CreateTask(CONST_STRPTR name,LONG pri,CONST APTR init_pc,ULONG stack_size)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: amiga_deleteextio.c,v 1.4 2006-01-08 12:04:22 obarthel Exp $
|
* $Id: amiga_deleteextio.c,v 1.5 2006-09-25 15:12:47 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -50,6 +50,10 @@
|
|||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
|
VOID DeleteExtIO(struct IORequest * io);
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
VOID
|
VOID
|
||||||
DeleteExtIO(struct IORequest * io)
|
DeleteExtIO(struct IORequest * io)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: amiga_deleteport.c,v 1.4 2006-01-08 12:04:22 obarthel Exp $
|
* $Id: amiga_deleteport.c,v 1.5 2006-09-25 15:12:47 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -50,6 +50,10 @@
|
|||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
|
VOID DeletePort(struct MsgPort * port);
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
VOID
|
VOID
|
||||||
DeletePort(struct MsgPort * port)
|
DeletePort(struct MsgPort * port)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: amiga_deletestdio.c,v 1.4 2006-01-08 12:04:22 obarthel Exp $
|
* $Id: amiga_deletestdio.c,v 1.5 2006-09-25 15:12:47 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -50,6 +50,10 @@
|
|||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
|
VOID DeleteStdIO(struct IOStdReq * io);
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
VOID
|
VOID
|
||||||
DeleteStdIO(struct IOStdReq * io)
|
DeleteStdIO(struct IOStdReq * io)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: amiga_deletetask.c,v 1.4 2006-01-08 12:04:22 obarthel Exp $
|
* $Id: amiga_deletetask.c,v 1.5 2006-09-25 15:12:47 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -63,6 +63,10 @@ DeleteTask(struct Task *tc)
|
|||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
|
VOID DeleteTask(struct Task *tc);
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
VOID
|
VOID
|
||||||
DeleteTask(struct Task *tc)
|
DeleteTask(struct Task *tc)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: amiga_newlist.c,v 1.3 2006-01-08 12:04:22 obarthel Exp $
|
* $Id: amiga_newlist.c,v 1.4 2006-09-25 15:12:47 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -43,6 +43,10 @@
|
|||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
|
VOID NewList(struct List *lh);
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
VOID
|
VOID
|
||||||
NewList(struct List *lh)
|
NewList(struct List *lh)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: amiga_rexxvars.c,v 1.8 2006-09-22 09:02:51 obarthel Exp $
|
* $Id: amiga_rexxvars.c,v 1.10 2006-09-25 18:19:44 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -68,6 +68,12 @@ static struct RexxSysIFace * IRexxSys;
|
|||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
|
BOOL CheckRexxMsg(struct RexxMsg *message);
|
||||||
|
LONG GetRexxVar(struct RexxMsg *message,STRPTR variable_name,STRPTR *buffer_pointer);
|
||||||
|
LONG SetRexxVar(struct RexxMsg *message,STRPTR variable_name,STRPTR value,ULONG length);
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
CLIB_CONSTRUCTOR(rexxvars_init)
|
CLIB_CONSTRUCTOR(rexxvars_init)
|
||||||
{
|
{
|
||||||
ENTER();
|
ENTER();
|
||||||
@@ -136,7 +142,7 @@ CheckRexxMsg(struct RexxMsg *message)
|
|||||||
if(message->rm_TaskBlock == NULL)
|
if(message->rm_TaskBlock == NULL)
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
if(NOT IsRexxMsg(message))
|
if(NOT IsRexxMsg((struct Message *)message))
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
result = TRUE;
|
result = TRUE;
|
||||||
@@ -159,7 +165,7 @@ GetRexxVar(struct RexxMsg *message,STRPTR variable_name,STRPTR *buffer_pointer)
|
|||||||
|
|
||||||
/* The following uses a function which was added to rexxsyslib.library V45.
|
/* The following uses a function which was added to rexxsyslib.library V45.
|
||||||
We therefore have a minimum library version requirement. */
|
We therefore have a minimum library version requirement. */
|
||||||
if(RexxSysBase == NULL || RexxSysBase->lib_Version < 45 || NOT IsRexxMsg(message))
|
if(RexxSysBase == NULL || RexxSysBase->lib_Version < 45 || NOT IsRexxMsg((struct Message *)message))
|
||||||
{
|
{
|
||||||
result = ERR10_010; /* invalid message packet */
|
result = ERR10_010; /* invalid message packet */
|
||||||
goto out;
|
goto out;
|
||||||
@@ -189,7 +195,7 @@ SetRexxVar(struct RexxMsg *message,STRPTR variable_name,STRPTR value,ULONG lengt
|
|||||||
|
|
||||||
/* The following uses a function which was added to rexxsyslib.library V45.
|
/* The following uses a function which was added to rexxsyslib.library V45.
|
||||||
We therefore have a minimum library version requirement. */
|
We therefore have a minimum library version requirement. */
|
||||||
if(RexxSysBase == NULL || RexxSysBase->lib_Version < 45 || NOT IsRexxMsg(message))
|
if(RexxSysBase == NULL || RexxSysBase->lib_Version < 45 || NOT IsRexxMsg((struct Message *)message))
|
||||||
{
|
{
|
||||||
result = ERR10_010; /* invalid message packet */
|
result = ERR10_010; /* invalid message packet */
|
||||||
goto out;
|
goto out;
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
#define VERSION 1
|
#define VERSION 1
|
||||||
#define REVISION 201
|
#define REVISION 202
|
||||||
#define DATE "21.9.2006"
|
#define DATE "16.1.2007"
|
||||||
#define VERS "c.lib 1.201"
|
#define VERS "c.lib 1.202"
|
||||||
#define VSTRING "c.lib 1.201 (21.9.2006)\r\n"
|
#define VSTRING "c.lib 1.202 (16.1.2007)\r\n"
|
||||||
#define VERSTAG "\0$VER: c.lib 1.201 (21.9.2006)"
|
#define VERSTAG "\0$VER: c.lib 1.202 (16.1.2007)"
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
201
|
202
|
||||||
|
|||||||
106
library/changes
106
library/changes
@@ -1,3 +1,109 @@
|
|||||||
|
c.lib 1.202 (16.1.2007)
|
||||||
|
|
||||||
|
- Added llrint() function contributed by Henning Nielsen Lund. Thank you
|
||||||
|
very much!
|
||||||
|
|
||||||
|
- <unistd.h> now also include <stdio.h>, so that the SEEK_SET, etc. macros
|
||||||
|
are defined for lseek() to use.
|
||||||
|
|
||||||
|
- Added a wrapper function which handles the thread-safe stdio stream
|
||||||
|
resolution.
|
||||||
|
|
||||||
|
- In tcflush() a break signal can no longer cause the read flush loop
|
||||||
|
to be quit with two semaphores still locked.
|
||||||
|
|
||||||
|
- In __obtain_daemon_message() the test to verify if the bsdsocket.library API
|
||||||
|
would support the server API functionality checked the wrong feature. Fixed.
|
||||||
|
|
||||||
|
- Switched over the fd->fd_DefaultFile references to fd->fd_Socket where
|
||||||
|
sockets are used rather than file handles.
|
||||||
|
|
||||||
|
- Added functions which modify the callback function and the userdata pointer
|
||||||
|
stored in a low level unbuffered file/socket data structure. These function
|
||||||
|
perform the proper locking and are thus safe to use in a thread-safe environment.
|
||||||
|
|
||||||
|
- The low level unbuffered file/socket now has a public equivalent, which
|
||||||
|
is defined (along with the typedefs and flags) in <sys/clib2_io.h>. Functions
|
||||||
|
for tinkering with it are still to come.
|
||||||
|
|
||||||
|
- The math kernel code no longer uses its own private scalbn() function.
|
||||||
|
|
||||||
|
- Added a function prototype for the _exit() function. Note that _exit() is
|
||||||
|
not an ISO 'C' function.
|
||||||
|
|
||||||
|
- Corrected the getopt() function prototype, as prompted by Henning Nielsen Lund.
|
||||||
|
|
||||||
|
- The printf() family no longer adds a 0 or 0x prefix if the alternate
|
||||||
|
conversion modifier is present for the %o and %x conversions and the
|
||||||
|
value to be converted is 0 already. Put another way, printf("%#x %#o",0,0);
|
||||||
|
now prints "0 0". This required another change so that %p always includes
|
||||||
|
the 0x prefix even if the pointer involved is a NULL pointer.
|
||||||
|
|
||||||
|
- readlink() no longer sort-of-works for files and directories. It now only
|
||||||
|
works for soft linked objects and returns an error for everything else.
|
||||||
|
This is based upon a fix by Peter Bengtsson. Thank you very much!
|
||||||
|
|
||||||
|
- Moved the lstat() local Lock() function into its own separate file.
|
||||||
|
|
||||||
|
- uname() now returns correct and robust information for OS version
|
||||||
|
numbers > 36. This integrates a fix by Peter Bengtsson. Thank you
|
||||||
|
very much!
|
||||||
|
|
||||||
|
- Moved the crtbegin.o/crtend.o files out of the link libraries. Moving
|
||||||
|
them in was intended to work as a fix for the shared library build, but
|
||||||
|
now it seems that this has to be done at the link stage through the
|
||||||
|
GCC specs file...
|
||||||
|
|
||||||
|
- Integrated a fix for __rem_pio2() which affects sin(), tan() and cos(),
|
||||||
|
contributed by Steven Solie. Thank you very much!
|
||||||
|
|
||||||
|
- The internal 'struct fd' file descriptor table entry data structure
|
||||||
|
now has a user data field entry.
|
||||||
|
|
||||||
|
- Rearranged the contents of the 'struct fd' file descriptor table entry
|
||||||
|
data structure in preparation for making it public. Also added a version
|
||||||
|
field so that user code can handle changes to it gracefully. The default
|
||||||
|
file is no longer a BCPL pointer to a file handle by default, but
|
||||||
|
both a BPTR and a socket identifier, wrapped into a union.
|
||||||
|
|
||||||
|
- Added experimental tilde expansion in Unix path names. This still needs
|
||||||
|
some more work.
|
||||||
|
|
||||||
|
- __get_default_file() called __fd_unlock() without having called
|
||||||
|
__fd_lock() first. Ouch.
|
||||||
|
|
||||||
|
- Removed an unnecessary pair of __fd_lock()..__fd_unlock() calls from
|
||||||
|
ttyname_r().
|
||||||
|
|
||||||
|
- The libunix.a unlink() function is now reentrant, or at least thread-safe.
|
||||||
|
|
||||||
|
- You can now make unlink() stop after a failed deletion attempt which
|
||||||
|
failed because the object to be deleted was reported as being "in use".
|
||||||
|
The libunix.a variant defaults to report the deletion to have succeeded
|
||||||
|
under these circumstances and later tries to delete the files marked
|
||||||
|
for deletion. See <dos.h> for a brief documentation of how to change
|
||||||
|
the behaviour.
|
||||||
|
|
||||||
|
- basename() and dirname() can no longer return NULL. They truncate the
|
||||||
|
resulting path name instead. This is done so because some code that
|
||||||
|
calls basename() or dirname() does not check if the function's return
|
||||||
|
value is NULL.
|
||||||
|
|
||||||
|
- The SetOwner() fall-back code for Kickstart 2.04 was passing the wrong
|
||||||
|
parameters to the file system. The first (dp_Arg1) should have been
|
||||||
|
zero. Ouch.
|
||||||
|
|
||||||
|
- basename() is not supposed to modify the string it is passed and should
|
||||||
|
return a pointer to a string which can be modified. Now it does. Same
|
||||||
|
thing for dirname().
|
||||||
|
|
||||||
|
- asctime_r() now returns NULL if the buffer is too short to hold even a single
|
||||||
|
byte of data.
|
||||||
|
|
||||||
|
- ttyname() now calls ttyname_r(). Also, the libunix.a version of ttyname_r()
|
||||||
|
will produce "/CONSOLE" rather than "CONSOLE:".
|
||||||
|
|
||||||
|
|
||||||
c.lib 1.201 (21.9.2006)
|
c.lib 1.201 (21.9.2006)
|
||||||
|
|
||||||
- If defined, the local environment variable "DISABLE_COMMANDLINE_WILDCARD_EXPANSION"
|
- If defined, the local environment variable "DISABLE_COMMANDLINE_WILDCARD_EXPANSION"
|
||||||
|
|||||||
3
library/contrib/README
Normal file
3
library/contrib/README
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
This directory contains contributions which have not yet been integrated
|
||||||
|
with the clib2 library build but which should be in the CVS repository
|
||||||
|
both for safekeeping and for you to look at and adapt.
|
||||||
183
library/contrib/byteswap/byteswap.h
Normal file
183
library/contrib/byteswap/byteswap.h
Normal file
@@ -0,0 +1,183 @@
|
|||||||
|
|
||||||
|
#ifndef __BYTESWAP_H
|
||||||
|
#define __BYTESWAP_H
|
||||||
|
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
#if defined(__GNUC__)
|
||||||
|
#define __CONST_FUNC __attribute__((const))
|
||||||
|
#else
|
||||||
|
#define __CONST_FUNC /* Nothing */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Single value byteswap functions. */
|
||||||
|
|
||||||
|
extern __CONST_FUNC uint16_t bswap16(uint16_t);
|
||||||
|
extern __CONST_FUNC uint32_t bswap24(uint32_t);
|
||||||
|
extern __CONST_FUNC uint32_t bswap32(uint32_t);
|
||||||
|
|
||||||
|
#ifdef INT64_MIN
|
||||||
|
extern __CONST_FUNC uint64_t bswap64(uint64_t);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Block byteswap functions. The swab() function usually resides in unistd.h, so perhaps it should be moved there? */
|
||||||
|
/* NOTE: Contrary to the standard swab(), this version returns the "to" pointer and the pointers are not restrict
|
||||||
|
* qualified - so swapping buffer-contents in-place is supported.
|
||||||
|
* Also, swab24(), swab32() and swab64() are non-standard functions.
|
||||||
|
*/
|
||||||
|
|
||||||
|
extern void *swab(void *from,void *to,ssize_t nbytes);
|
||||||
|
extern void *swab24(void *from,void *to,ssize_t nbytes); /* Same as swab(), but operates on 24-bit words instead. */
|
||||||
|
extern void *swab32(void *from,void *to,ssize_t nbytes); /* Same as swab(), but operates on 32-bit words instead. */
|
||||||
|
extern void *swab64(void *from,void *to,ssize_t nbytes); /* Same as swab(), but operates on 64-bit words instead. */
|
||||||
|
|
||||||
|
#define swab16(x) swab(x)
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Optimized inline-versions for the single-value functions follow.
|
||||||
|
* Only GCC+PPC and GCC+m68k support for now.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#if defined(__GNUC__)
|
||||||
|
|
||||||
|
/* Select implementation. */
|
||||||
|
|
||||||
|
#define bswap16(x) (__builtin_constant_p(x))?__const_swap16(x):__swap16(x)
|
||||||
|
#define bswap24(x) (__builtin_constant_p(x))?__const_swap24(x):__swap24(x)
|
||||||
|
#define bswap32(x) (__builtin_constant_p(x))?__const_swap32(x):__swap32(x)
|
||||||
|
#define bswap64(x) (__builtin_constant_p(x))?__const_swap64(x):__swap64(x)
|
||||||
|
|
||||||
|
/* Assembler implementations */
|
||||||
|
|
||||||
|
#if defined(__PPC__)
|
||||||
|
|
||||||
|
static __inline__ __CONST_FUNC uint16_t __swap16(uint16_t u16) {
|
||||||
|
uint_fast16_t result;
|
||||||
|
__asm__("\
|
||||||
|
rlwinm %[result],%[u16],8,16,24\n\
|
||||||
|
rlwimi %[result],%[u16],24,24,31\n\
|
||||||
|
":[result]"=&r"(result):[u16]"r"(u16));
|
||||||
|
return(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
static __inline__ __CONST_FUNC uint32_t __swap24(uint32_t u32) {
|
||||||
|
uint_fast32_t result;
|
||||||
|
__asm__("\
|
||||||
|
rlwinm %[result],%[u32],16,8,31\n\
|
||||||
|
rlwimi %[result],%[u32],0,16,24\n\
|
||||||
|
":[result]"=&r"(result):[u32]"r"(u32));
|
||||||
|
return(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
static __inline__ __CONST_FUNC uint32_t __swap32(uint32_t u32) {
|
||||||
|
uint_fast32_t result;
|
||||||
|
__asm__("\
|
||||||
|
rlwinm %[result],%[u32],8,8,31\n\
|
||||||
|
rlwimi %[result],%[u32],24,0,7\n\
|
||||||
|
rlwimi %[result],%[u32],24,16,23\n\
|
||||||
|
":[result]"=&r"(result):[u32]"r"(u32));
|
||||||
|
return(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Note: __swap64() might perhaps be optimized a bit more by scheduling the
|
||||||
|
* instructions to alternate register-use, but this instead means there
|
||||||
|
* are two less registers free since "u64" and "result" may no longer overlap.
|
||||||
|
* Decisions, decisions....
|
||||||
|
*/
|
||||||
|
|
||||||
|
static __inline__ __CONST_FUNC uint64_t __swap64(uint64_t u64) {
|
||||||
|
uint_fast64_t result;
|
||||||
|
uint_fast32_t tmp;
|
||||||
|
__asm__("\
|
||||||
|
rlwinm %[tmp],%[u64],8,8,31\n\
|
||||||
|
rlwimi %[tmp],%[u64],24,0,7\n\
|
||||||
|
rlwimi %[tmp],%[u64],24,16,23\n\
|
||||||
|
rlwinm %[result],%L[u64],8,8,31\n\
|
||||||
|
rlwimi %[result],%L[u64],24,0,7\n\
|
||||||
|
rlwimi %[result],%L[u64],24,16,23\n\
|
||||||
|
or %L[result],%[tmp],%[tmp]\n\
|
||||||
|
":[result]"=r"(result),[tmp]"=&r"(tmp):[u64]"r"(u64));
|
||||||
|
return(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
#elif defined(__mc68020__)
|
||||||
|
|
||||||
|
static __inline__ __CONST_FUNC uint16_t __swap16(uint16_t u16) {
|
||||||
|
__asm__("\
|
||||||
|
rol.w #8,%[u16]\n\
|
||||||
|
":[u16]"+d"(u16)::"cc");
|
||||||
|
return(u16);
|
||||||
|
}
|
||||||
|
|
||||||
|
static __inline__ __CONST_FUNC uint32_t __swap24(uint32_t u32) {
|
||||||
|
__asm__("\
|
||||||
|
rol.w #8,%[u32]\n\
|
||||||
|
swap %[u32]\n\
|
||||||
|
rol.w #8,%[u32]\n\
|
||||||
|
ror.l #8,%[u32]\n\
|
||||||
|
":[u32]"+d"(u32)::"cc");
|
||||||
|
return(u32);
|
||||||
|
}
|
||||||
|
|
||||||
|
static __inline__ __CONST_FUNC uint32_t __swap32(uint32_t u32) {
|
||||||
|
__asm__("\
|
||||||
|
rol.w #8,%[u32]\n\
|
||||||
|
swap %[u32]\n\
|
||||||
|
rol.w #8,%[u32]\n\
|
||||||
|
":[u32]"+d"(u32)::"cc");
|
||||||
|
return(u32);
|
||||||
|
}
|
||||||
|
|
||||||
|
static __inline__ __CONST_FUNC uint64_t __swap64(uint64_t u64) {
|
||||||
|
__asm__("\
|
||||||
|
rol.w #8,%[u64]\n\
|
||||||
|
rol.w #8,%L[u64]\n\
|
||||||
|
swap %[u64]\n\
|
||||||
|
swap %L[u64]\n\
|
||||||
|
rol.w #8,%[u64]\n\
|
||||||
|
rol.w #8,%L[u64]\n\
|
||||||
|
exg %[u64],L%[u64]\n\
|
||||||
|
":[u64]"+d"(u64)::"cc");
|
||||||
|
return(u64);
|
||||||
|
}
|
||||||
|
|
||||||
|
#else
|
||||||
|
/* Unknown or undefined architecture. Perhaps compiling with "-strict -ansi", but should not use this header then anyway. */
|
||||||
|
#undef bswap16
|
||||||
|
#undef bswap24
|
||||||
|
#undef bswap32
|
||||||
|
#undef bswap64
|
||||||
|
#define bswap16(x) (__builtin_constant_p(x))?__const_swap16(x):bswap16(x)
|
||||||
|
#define bswap24(x) (__builtin_constant_p(x))?__const_swap24(x):bswap24(x)
|
||||||
|
#define bswap32(x) (__builtin_constant_p(x))?__const_swap32(x):bswap32(x)
|
||||||
|
#define bswap64(x) (__builtin_constant_p(x))?__const_swap64(x):bswap64(x)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* C implementations for constant values */
|
||||||
|
|
||||||
|
static __inline__ uint16_t __const_swap16(uint16_t u16) {
|
||||||
|
return(u16>>8|u16<<8);
|
||||||
|
}
|
||||||
|
|
||||||
|
static __inline__ uint32_t __const_swap24(uint32_t u32) {
|
||||||
|
return(((u32&0xff)<<16)|((u32&0xff00))|((u32&0xff0000)>>16));
|
||||||
|
}
|
||||||
|
|
||||||
|
static __inline__ uint32_t __const_swap32(uint32_t u32) {
|
||||||
|
return(((u32&0xff)<<24)|((u32&0xff00)<<8)|((u32&0xff0000)>>8)|((u32&0xff000000)>>24));
|
||||||
|
}
|
||||||
|
|
||||||
|
static __inline__ uint64_t __const_swap64(uint64_t u64) {
|
||||||
|
return(((u64&0xffLL)<<56)|((u64&0xff00LL)<<40)|((u64&0xff0000LL)<<24)|((u64&0xff000000LL)<<8)|
|
||||||
|
((u64&0xff00000000LL)>>8)|((u64&0xff0000000000LL)>>24)|((u64&0xff000000000000LL)>>40)|((u64&0xff00000000000000LL)>>56));
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* __GNUC__ */
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* __BYTESWAP_H */
|
||||||
|
|
||||||
|
/* vi:set ts=3: */
|
||||||
|
|
||||||
28
library/contrib/byteswap/byteswap_bswap16.c
Normal file
28
library/contrib/byteswap/byteswap_bswap16.c
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
|
||||||
|
#if defined(__PPC__) && defined(__GNUC__)
|
||||||
|
|
||||||
|
asm("\
|
||||||
|
.text\n\
|
||||||
|
.align 2\n\
|
||||||
|
.globl bswap16\n\
|
||||||
|
.type bswap16, @function\n\
|
||||||
|
bswap16:\n\
|
||||||
|
# rlwinm %r4,%r3,8,16,24\n\
|
||||||
|
# rlwimi %r4,%r3,24,24,31\n\
|
||||||
|
# or %r3,%r4,%r4\n\
|
||||||
|
rlwimi %r3,%r3,16,8,15\n\
|
||||||
|
srwi %r3,%r3,8\n\
|
||||||
|
blr\n\
|
||||||
|
");
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
uint16_t bswap16(uint16_t u16)
|
||||||
|
{
|
||||||
|
return(u16>>8|u16<<8);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
29
library/contrib/byteswap/byteswap_bswap24.c
Normal file
29
library/contrib/byteswap/byteswap_bswap24.c
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
|
||||||
|
#if defined(__PPC__) && defined(__GNUC__)
|
||||||
|
|
||||||
|
asm(" .text\n\
|
||||||
|
.align 2\n\
|
||||||
|
.globl bswap24\n\
|
||||||
|
.type bswap24, @function\n\
|
||||||
|
bswap32:\n\
|
||||||
|
rlwinm %r4,%r3,16,8,31\n\
|
||||||
|
rlwimi %r4,%r3,0,16,24\n\
|
||||||
|
or %r3,%r4,%r4\n\
|
||||||
|
blr\n\
|
||||||
|
");
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
uint32_t bswap24(uint32_t u32)
|
||||||
|
{
|
||||||
|
return(
|
||||||
|
((u32&0xff)<<16)|
|
||||||
|
((u32&0xff00))|
|
||||||
|
((u32&0xff0000)>>16)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
31
library/contrib/byteswap/byteswap_bswap32.c
Normal file
31
library/contrib/byteswap/byteswap_bswap32.c
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
|
||||||
|
#if defined(__PPC__) && defined(__GNUC__)
|
||||||
|
|
||||||
|
asm(" .text\n\
|
||||||
|
.align 2\n\
|
||||||
|
.globl bswap32\n\
|
||||||
|
.type bswap32, @function\n\
|
||||||
|
bswap32:\n\
|
||||||
|
rlwinm %r4,%r3,8,8,31\n\
|
||||||
|
rlwimi %r4,%r3,24,0,7\n\
|
||||||
|
rlwimi %r4,%r3,24,16,23\n\
|
||||||
|
or %r3,%r4,%r4\n\
|
||||||
|
blr\n\
|
||||||
|
");
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
uint32_t bswap32(uint32_t u32)
|
||||||
|
{
|
||||||
|
return(
|
||||||
|
((u32&0xff)<<24)|
|
||||||
|
((u32&0xff00)<<8)|
|
||||||
|
((u32&0xff0000)>>8)|
|
||||||
|
((u32&0xff000000)>>24)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
48
library/contrib/byteswap/byteswap_bswap64.c
Normal file
48
library/contrib/byteswap/byteswap_bswap64.c
Normal file
@@ -0,0 +1,48 @@
|
|||||||
|
|
||||||
|
#if defined(USE_64_BIT_INTS)
|
||||||
|
|
||||||
|
#if defined(__PPC__) && defined(__GNUC__)
|
||||||
|
|
||||||
|
asm(" .text\n\
|
||||||
|
.align 2\n\
|
||||||
|
.globl bswap64\n\
|
||||||
|
.type bswap64, @function\n\
|
||||||
|
bswap64:\n\
|
||||||
|
rlwinm %r5,%r3,8,8,31\n\
|
||||||
|
rlwimi %r5,%r3,24,0,7\n\
|
||||||
|
rlwimi %r5,%r3,24,16,23\n\
|
||||||
|
rlwinm %r3,%r4,8,8,31\n\
|
||||||
|
rlwimi %r3,%r4,24,0,7\n\
|
||||||
|
rlwimi %r3,%r4,24,16,23\n\
|
||||||
|
or %r4,%r5,%r5\n\
|
||||||
|
blr\n\
|
||||||
|
");
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
uint64_t bswap64(uint64_t u64)
|
||||||
|
{
|
||||||
|
union {
|
||||||
|
uint64_t ll;
|
||||||
|
uint32_t l[2];
|
||||||
|
} v={.ll=u64};
|
||||||
|
uint32_t tmp;
|
||||||
|
tmp=v.l[0];
|
||||||
|
v.l[0]=((v.l[1]&0xff)<<24)|
|
||||||
|
((v.l[1]&0xff00)<<8)|
|
||||||
|
((v.l[1]&0xff0000)>>8)|
|
||||||
|
((v.l[1]&0xff000000)>>24);
|
||||||
|
v.l[1]=((tmp&0xff)<<24)|
|
||||||
|
((tmp&0xff00)<<8)|
|
||||||
|
((tmp&0xff0000)>>8)|
|
||||||
|
((tmp&0xff000000)>>24);
|
||||||
|
return(v.ll);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
70
library/contrib/byteswap/byteswap_swab.c
Normal file
70
library/contrib/byteswap/byteswap_swab.c
Normal file
@@ -0,0 +1,70 @@
|
|||||||
|
|
||||||
|
#if defined(__GNUC__) && defined(__PPC__)
|
||||||
|
|
||||||
|
/* r3=from, r4=to, r5=len/count, r6=index, r7=load/store/temp */
|
||||||
|
|
||||||
|
asm("\
|
||||||
|
.text\n\
|
||||||
|
.align 2\n\
|
||||||
|
.globl swab\n\
|
||||||
|
.type swab,@function\n\
|
||||||
|
swab:\n\
|
||||||
|
dcbt 0,%r3\n\
|
||||||
|
srawi. %r5,%r5,1\n\
|
||||||
|
bc 4,gt,.exit\n\
|
||||||
|
andi. %r7,%r3,3 # Check if we start on an address evenly divisible by 4.\n\
|
||||||
|
li %r6,0\n\
|
||||||
|
bc 4,gt,.preploop\n\
|
||||||
|
lhbrx %r7,%r6,%r3 # Fix alignment if needed.\n\
|
||||||
|
sthx %r7,%r6,%r4\n\
|
||||||
|
addi %r6,%r6,2\n\
|
||||||
|
subi %r5,%r5,1\n\
|
||||||
|
.preploop:\n\
|
||||||
|
andi. %r7,%r5,1 # Check if even or odd number of 16-bit words.\n\
|
||||||
|
srawi %r5,%r5,1 # Number of 32-bit words to half-swap.\n\
|
||||||
|
mtctr %r5\n\
|
||||||
|
bc 12,gt,.oddloop # Jump to loop for odd number of 16-bit words.\n\
|
||||||
|
.loop: # Loop is 'unrolled' by reading/writing 32-bit words.\n\
|
||||||
|
lwbrx %r7,%r6,%r3\n\
|
||||||
|
rotlwi %r7,%r7,16\n\
|
||||||
|
stwx %r7,%r6,%r4\n\
|
||||||
|
addi %r6,%r6,4\n\
|
||||||
|
bc 0,lt,.loop\n\
|
||||||
|
.exit:\n\
|
||||||
|
or %r3,%r4,%r4\n\
|
||||||
|
blr\n\
|
||||||
|
.oddloop:\n\
|
||||||
|
lwbrx %r7,%r6,%r3\n\
|
||||||
|
rotlwi %r7,%r7,16\n\
|
||||||
|
stwx %r7,%r6,%r4\n\
|
||||||
|
addi %r6,%r6,4\n\
|
||||||
|
bc 0,lt,.oddloop\n\
|
||||||
|
sub %r6,%r6,2\n\
|
||||||
|
lhbrx %r7,%r6,%r3 # Fix last 16-bit word.\n\
|
||||||
|
sthx %r7,%r6,%r4\n\
|
||||||
|
or %r3,%r4,%r4\n\
|
||||||
|
blr\n\
|
||||||
|
");
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
void *swab(void *from,void *to,ssize_t len)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
uint16_t u16,*u16in=from,*u16out=to;
|
||||||
|
|
||||||
|
for(i=0;i<(len>>1);i++) {
|
||||||
|
u16=u16in[i];
|
||||||
|
u16out[i]=u16>>8|u16<<8;
|
||||||
|
}
|
||||||
|
|
||||||
|
return(u16out);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
91
library/contrib/byteswap/byteswap_swab24.c
Normal file
91
library/contrib/byteswap/byteswap_swab24.c
Normal file
@@ -0,0 +1,91 @@
|
|||||||
|
|
||||||
|
#if defined(__GNUC__) && defined(__PPC__)
|
||||||
|
|
||||||
|
/* r3=from, r4=to, r5=len/remaining, r6/r7=index & r7=temp, r8/r9/r10=read/write temp */
|
||||||
|
|
||||||
|
asm("\
|
||||||
|
.text\n\
|
||||||
|
.align 2\n\
|
||||||
|
.globl swab24\n\
|
||||||
|
.type swab24,@function\n\
|
||||||
|
swab24:\n\
|
||||||
|
dcbt 0,%r3\n\
|
||||||
|
li %r7,3\n\
|
||||||
|
divwu %r5,%r5,%r7\n\
|
||||||
|
andi. %r7,%r5,3\n\
|
||||||
|
srawi. %r5,%r5,2\n\
|
||||||
|
mtctr %r5\n\
|
||||||
|
or %r5,%r7,%r7\n\
|
||||||
|
li %r6,0\n\
|
||||||
|
bc 4,gt,.postfix\n\
|
||||||
|
.loop:\n\
|
||||||
|
lwbrx %r8,%r6,%r3\n\
|
||||||
|
addi %r7,%r6,4\n\
|
||||||
|
lwzx %r9,%r7,%r3\n\
|
||||||
|
addi %r7,%r6,8\n\
|
||||||
|
lwbrx %r10,%r7,%r3\n\
|
||||||
|
rotlwi %r8,%r8,8\n\
|
||||||
|
or %r7,%r9,%r9\n\
|
||||||
|
rlwimi %r9,%r8,16,8,15\n\
|
||||||
|
rlwimi %r9,%r10,8,16,23\n\
|
||||||
|
rlwimi %r8,%r7,16,24,31\n\
|
||||||
|
rotrwi %r10,%r10,8\n\
|
||||||
|
rlwimi %r10,%r7,16,0,7\n\
|
||||||
|
stwx %r8,%r6,%r4\n\
|
||||||
|
addi %r6,%r6,4\n\
|
||||||
|
stwx %r9,%r6,%r4\n\
|
||||||
|
addi %r6,%r6,4\n\
|
||||||
|
stwx %r10,%r6,%r4\n\
|
||||||
|
addi %r6,%r6,4\n\
|
||||||
|
bc 0,lt,.loop\n\
|
||||||
|
.postfix: # Fix any remaining 24-bit words (number of remaining words in r5).\n\
|
||||||
|
or. %r5,%r5,%r5\n\
|
||||||
|
bc 4,gt,.exit\n\
|
||||||
|
mtctr %r5\n\
|
||||||
|
add %r3,%r3,%r6\n\
|
||||||
|
add %r6,%r4,%r6\n\
|
||||||
|
subi %r3,%r3,1\n\
|
||||||
|
.fixloop:\n\
|
||||||
|
lbzu %r7,1(%r3)\n\
|
||||||
|
lbzu %r8,1(%r3)\n\
|
||||||
|
lbzu %r9,1(%r3)\n\
|
||||||
|
stb %r7,2(%r6)\n\
|
||||||
|
stb %r8,1(%r6)\n\
|
||||||
|
stb %r9,0(%r6)\n\
|
||||||
|
addi %r6,%r6,3\n\
|
||||||
|
bc 0,lt,.fixloop\n\
|
||||||
|
.exit:\n\
|
||||||
|
or %r3,%r4,%r4\n\
|
||||||
|
blr\n\
|
||||||
|
");
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Ugh, this is really very, very ineffiecient.
|
||||||
|
* (But simple, understandable and safe)
|
||||||
|
*/
|
||||||
|
|
||||||
|
void *swab24(void *from,void *to,ssize_t len)
|
||||||
|
{
|
||||||
|
uint8_t *src=from,B0,B1,B2,*dst=to;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for(i=0;i<len;i+=3) {
|
||||||
|
B0=src[i];
|
||||||
|
B1=src[i+1];
|
||||||
|
B2=src[i+2];
|
||||||
|
dst[i]=B2;
|
||||||
|
dst[i+1]=B1;
|
||||||
|
dst[i+2]=B0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return(to);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
112
library/contrib/byteswap/byteswap_swab32.c
Normal file
112
library/contrib/byteswap/byteswap_swab32.c
Normal file
@@ -0,0 +1,112 @@
|
|||||||
|
|
||||||
|
#if defined(__GNUC__) && defined(__PPC__)
|
||||||
|
|
||||||
|
/* r3=from, r4=to, r5=len, r6=index, r7=load/store temp */
|
||||||
|
|
||||||
|
asm("\
|
||||||
|
.text\n\
|
||||||
|
.align 2\n\
|
||||||
|
.globl swab32\n\
|
||||||
|
.type swab32,@function\n\
|
||||||
|
swab32:\n\
|
||||||
|
srawi. %r5,%r5,2\n\
|
||||||
|
li %r6,0\n\
|
||||||
|
bc 4,gt,.exit\n\
|
||||||
|
mtctr %r5\n\
|
||||||
|
.loop:\n\
|
||||||
|
lwbrx %r7,%r6,%r3\n\
|
||||||
|
stwx %r7,%r6,%r4\n\
|
||||||
|
addi %r6,%r6,4\n\
|
||||||
|
bc 0,lt,.loop\n\
|
||||||
|
.exit:\n\
|
||||||
|
or %r3,%r4,%r4\n\
|
||||||
|
blr\n\
|
||||||
|
");
|
||||||
|
|
||||||
|
/* r3=from, r4=to, r5=len/temp, r6=index, r7=load/store temp, r8=cache hint
|
||||||
|
*
|
||||||
|
* The unrolled, cache-hinting version appears to be about 4.5% faster, but
|
||||||
|
* in this case I opted for the smaller implementation. swab64() appears to
|
||||||
|
* gain more from cache-hinting - probably because of it using more registers
|
||||||
|
* for intermediate storage.
|
||||||
|
asm("\
|
||||||
|
.text\n\
|
||||||
|
.align 2\n\
|
||||||
|
.globl swab32\n\
|
||||||
|
.type swab32,@function\n\
|
||||||
|
swab32:\n\
|
||||||
|
dcbt 0,%r3\n\
|
||||||
|
andi. %r8,%r5,31 # The number of bytes handled in '.pre'. Used for prefetch hint.\n\
|
||||||
|
srawi %r5,%r5,2 # Convert bytes-># of 32-bit words\n\
|
||||||
|
andi. %r7,%r5,7\n\
|
||||||
|
li %r6,0\n\
|
||||||
|
bc 4,gt,.preploop\n\
|
||||||
|
mtctr %r7\n\
|
||||||
|
.pre: # One 32-bit word at a time until we have (nLeft%8)==0 \n\
|
||||||
|
lwbrx %r7,%r6,%r3\n\
|
||||||
|
stwx %r7,%r6,%r4\n\
|
||||||
|
addi %r6,%r6,4\n\
|
||||||
|
bc 0,lt,.pre\n\
|
||||||
|
.preploop:\n\
|
||||||
|
srawi. %r5,%r5,3 # Divide by 8 again to get number of loops.\n\
|
||||||
|
addi %r8,%r8,32 # Start address for next loop (from r3).\n\
|
||||||
|
bc 4,gt,.exit\n\
|
||||||
|
mtctr %r5\n\
|
||||||
|
.loop: # Loop unrolled 8 times = 32 bytes = 1 cache-line (except on the 970).\n\
|
||||||
|
dcbt %r8,%r3 # Cache hint (prefetch) for the next loop\n\
|
||||||
|
lwbrx %r7,%r6,%r3\n\
|
||||||
|
stwx %r7,%r6,%r4\n\
|
||||||
|
addi %r6,%r6,4\n\
|
||||||
|
lwbrx %r7,%r6,%r3\n\
|
||||||
|
stwx %r7,%r6,%r4\n\
|
||||||
|
addi %r6,%r6,4\n\
|
||||||
|
lwbrx %r7,%r6,%r3\n\
|
||||||
|
stwx %r7,%r6,%r4\n\
|
||||||
|
addi %r6,%r6,4\n\
|
||||||
|
lwbrx %r7,%r6,%r3\n\
|
||||||
|
stwx %r7,%r6,%r4\n\
|
||||||
|
addi %r6,%r6,4\n\
|
||||||
|
lwbrx %r7,%r6,%r3\n\
|
||||||
|
stwx %r7,%r6,%r4\n\
|
||||||
|
addi %r6,%r6,4\n\
|
||||||
|
lwbrx %r7,%r6,%r3\n\
|
||||||
|
stwx %r7,%r6,%r4\n\
|
||||||
|
addi %r6,%r6,4\n\
|
||||||
|
lwbrx %r7,%r6,%r3\n\
|
||||||
|
stwx %r7,%r6,%r4\n\
|
||||||
|
addi %r6,%r6,4\n\
|
||||||
|
lwbrx %r7,%r6,%r3\n\
|
||||||
|
stwx %r7,%r6,%r4\n\
|
||||||
|
addi %r6,%r6,4\n\
|
||||||
|
addi %r8,%r8,32 # Update cache-hint offset\n\
|
||||||
|
bc 0,lt,.loop\n\
|
||||||
|
.exit:\n\
|
||||||
|
or %r3,%r4,%r4\n\
|
||||||
|
blr\n\
|
||||||
|
");
|
||||||
|
*/
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
void *swab32(void *from,void *to,ssize_t len)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
uint32_t *u32in=from,*u32out=to,tmp;
|
||||||
|
|
||||||
|
for(i=0;i<(len>>2);i++) {
|
||||||
|
tmp=u32in[i];
|
||||||
|
u32out[i]=((tmp&0xff)<<24)|
|
||||||
|
((tmp&0xff00)<<8)|
|
||||||
|
((tmp&0xff0000)>>8)|
|
||||||
|
((tmp&0xff000000)>>24);
|
||||||
|
}
|
||||||
|
|
||||||
|
return(to);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
101
library/contrib/byteswap/byteswap_swab64.c
Normal file
101
library/contrib/byteswap/byteswap_swab64.c
Normal file
@@ -0,0 +1,101 @@
|
|||||||
|
|
||||||
|
#if defined(__GNUC__) && defined(__PPC__)
|
||||||
|
|
||||||
|
/* r3=from, r4=to, r5=len/temp, r6/r7=index, r8/r9=load/store temp, r10=cache hint */
|
||||||
|
|
||||||
|
/* This version is unrolled and uses cache-hinting. It appears to gain about 10%
|
||||||
|
* over a non-unrolled, non-hinting version.
|
||||||
|
*/
|
||||||
|
|
||||||
|
asm("\
|
||||||
|
.text\n\
|
||||||
|
.align 2\n\
|
||||||
|
.globl swab64\n\
|
||||||
|
.type swab64,@function\n\
|
||||||
|
swab64:\n\
|
||||||
|
dcbt 0,%r3\n\
|
||||||
|
andi. %r10,%r5,31 # The number of bytes handled in '.pre'. Used for prefetch hint.\n\
|
||||||
|
srawi %r5,%r5,3 # Convert bytes-># of 64-bit words\n\
|
||||||
|
andi. %r7,%r5,3\n\
|
||||||
|
li %r6,0\n\
|
||||||
|
bc 4,gt,.preploop\n\
|
||||||
|
mtctr %r7\n\
|
||||||
|
.pre: # One 64-bit word at a time until we have (nLeft%4)==0 \n\
|
||||||
|
lwbrx %r8,%r6,%r3\n\
|
||||||
|
addi %r7,%r6,4\n\
|
||||||
|
lwbrx %r9,%r7,%r3\n\
|
||||||
|
stwx %r8,%r7,%r4\n\
|
||||||
|
stwx %r9,%r6,%r4\n\
|
||||||
|
addi %r6,%r6,8\n\
|
||||||
|
bc 0,lt,.pre\n\
|
||||||
|
.preploop:\n\
|
||||||
|
srawi. %r5,%r5,2 # Divide by 4 again to get number of loops.\n\
|
||||||
|
addi %r10,%r10,32 # Start address for next loop.\n\
|
||||||
|
bc 4,gt,.exit\n\
|
||||||
|
mtctr %r5\n\
|
||||||
|
.loop: # Loop unrolled 4 times = 32 bytes = 1 cache-line (except on the 970).\n\
|
||||||
|
dcbt %r10,%r3 # Cache hint (prefetch) for the next iteration\n\
|
||||||
|
lwbrx %r8,%r6,%r3\n\
|
||||||
|
addi %r7,%r6,4\n\
|
||||||
|
lwbrx %r9,%r7,%r3\n\
|
||||||
|
stwx %r8,%r7,%r4\n\
|
||||||
|
stwx %r9,%r6,%r4\n\
|
||||||
|
addi %r6,%r6,8\n\
|
||||||
|
lwbrx %r8,%r6,%r3\n\
|
||||||
|
addi %r7,%r6,4\n\
|
||||||
|
lwbrx %r9,%r7,%r3\n\
|
||||||
|
stwx %r8,%r7,%r4\n\
|
||||||
|
stwx %r9,%r6,%r4\n\
|
||||||
|
addi %r6,%r6,8\n\
|
||||||
|
lwbrx %r8,%r6,%r3\n\
|
||||||
|
addi %r7,%r6,4\n\
|
||||||
|
lwbrx %r9,%r7,%r3\n\
|
||||||
|
stwx %r8,%r7,%r4\n\
|
||||||
|
stwx %r9,%r6,%r4\n\
|
||||||
|
addi %r6,%r6,8\n\
|
||||||
|
lwbrx %r8,%r6,%r3\n\
|
||||||
|
addi %r7,%r6,4\n\
|
||||||
|
lwbrx %r9,%r7,%r3\n\
|
||||||
|
stwx %r8,%r7,%r4\n\
|
||||||
|
stwx %r9,%r6,%r4\n\
|
||||||
|
addi %r6,%r6,8\n\
|
||||||
|
addi %r10,%r10,32 # Update cache-hint offset\n\
|
||||||
|
bc 0,lt,.loop\n\
|
||||||
|
.exit:\n\
|
||||||
|
or %r3,%r4,%r4\n\
|
||||||
|
blr\n\
|
||||||
|
");
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
void *swab64(void *from,void *to,ssize_t len)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
struct {
|
||||||
|
uint32_t u32[2];
|
||||||
|
} *u64in=from,*u64out=to;
|
||||||
|
uint32_t tmp1,tmp2;
|
||||||
|
|
||||||
|
for(i=0;i<(len>>3);i++) {
|
||||||
|
tmp1=u64in[i].u32[0];
|
||||||
|
tmp2=u64in[i].u32[1];
|
||||||
|
u64out[i].u32[0]=((tmp2&0xff)<<24)|
|
||||||
|
((tmp2&0xff00)<<8)|
|
||||||
|
((tmp2&0xff0000)>>8)|
|
||||||
|
((tmp2&0xff000000)>>24);
|
||||||
|
u64out[i].u32[1]=((tmp1&0xff)<<24)|
|
||||||
|
((tmp1&0xff00)<<8)|
|
||||||
|
((tmp1&0xff0000)>>8)|
|
||||||
|
((tmp1&0xff000000)>>24);
|
||||||
|
}
|
||||||
|
|
||||||
|
return(to);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* vi:set ts=3: */
|
||||||
|
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: debug.c,v 1.5 2006-09-22 09:02:51 obarthel Exp $
|
* $Id: debug.c,v 1.6 2006-09-25 14:51:15 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=8
|
* :ts=8
|
||||||
*
|
*
|
||||||
@@ -273,7 +273,7 @@ _DPRINTF(const char *fmt,...)
|
|||||||
va_list args;
|
va_list args;
|
||||||
|
|
||||||
va_start(args,fmt);
|
va_start(args,fmt);
|
||||||
KPutFmt((char *)fmt,args);
|
KPutFmt(fmt,args);
|
||||||
va_end(args);
|
va_end(args);
|
||||||
|
|
||||||
KPrintF("\n");
|
KPrintF("\n");
|
||||||
@@ -288,7 +288,7 @@ _DLOG(const char *fmt,...)
|
|||||||
va_list args;
|
va_list args;
|
||||||
|
|
||||||
va_start(args,fmt);
|
va_start(args,fmt);
|
||||||
KPutFmt((char *)fmt,args);
|
KPutFmt(fmt,args);
|
||||||
va_end(args);
|
va_end(args);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
#define VERSION 1
|
#define VERSION 1
|
||||||
#define REVISION 201
|
#define REVISION 202
|
||||||
#define DATE "21.9.2006"
|
#define DATE "16.1.2007"
|
||||||
#define VERS "debug.lib 1.201"
|
#define VERS "debug.lib 1.202"
|
||||||
#define VSTRING "debug.lib 1.201 (21.9.2006)\r\n"
|
#define VSTRING "debug.lib 1.202 (16.1.2007)\r\n"
|
||||||
#define VERSTAG "\0$VER: debug.lib 1.201 (21.9.2006)"
|
#define VERSTAG "\0$VER: debug.lib 1.202 (16.1.2007)"
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
201
|
202
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: dirent_readdir.c,v 1.9 2006-01-08 12:04:22 obarthel Exp $
|
* $Id: dirent_readdir.c,v 1.10 2006-09-25 14:51:15 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -88,7 +88,7 @@ readdir(DIR * directory_pointer)
|
|||||||
{
|
{
|
||||||
D_S(struct FileInfoBlock,fib);
|
D_S(struct FileInfoBlock,fib);
|
||||||
D_S(struct bcpl_name,bcpl_name);
|
D_S(struct bcpl_name,bcpl_name);
|
||||||
UBYTE * name = bcpl_name->name;
|
char * name = (char *)bcpl_name->name;
|
||||||
BPTR dir_lock;
|
BPTR dir_lock;
|
||||||
|
|
||||||
assert( (((ULONG)name) & 3) == 0 );
|
assert( (((ULONG)name) & 3) == 0 );
|
||||||
@@ -96,7 +96,7 @@ readdir(DIR * directory_pointer)
|
|||||||
if(dh->dh_VolumeNode == NULL && NOT IsListEmpty((struct List *)&dh->dh_VolumeList))
|
if(dh->dh_VolumeNode == NULL && NOT IsListEmpty((struct List *)&dh->dh_VolumeList))
|
||||||
dh->dh_VolumeNode = (struct Node *)dh->dh_VolumeList.mlh_Head;
|
dh->dh_VolumeNode = (struct Node *)dh->dh_VolumeList.mlh_Head;
|
||||||
|
|
||||||
strcpy((char *)name,"\1:"); /* BSTR for ":" */
|
strcpy(name,"\1:"); /* BSTR for ":" */
|
||||||
|
|
||||||
while(result == NULL && dh->dh_VolumeNode != NULL && dh->dh_VolumeNode->ln_Succ != NULL)
|
while(result == NULL && dh->dh_VolumeNode != NULL && dh->dh_VolumeNode->ln_Succ != NULL)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: fcntl_fcntl.c,v 1.19 2006-01-08 12:04:22 obarthel Exp $
|
* $Id: fcntl_fcntl.c,v 1.20 2006-11-16 14:39:23 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -97,7 +97,7 @@ fcntl(int file_descriptor, int cmd, ... /* int arg */ )
|
|||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(fd->fd_DefaultFile == ZERO)
|
if(fd->fd_File == ZERO)
|
||||||
{
|
{
|
||||||
__set_errno(EBADF);
|
__set_errno(EBADF);
|
||||||
goto out;
|
goto out;
|
||||||
@@ -155,7 +155,7 @@ fcntl(int file_descriptor, int cmd, ... /* int arg */ )
|
|||||||
SHOWMSG("cmd=F_SETFL");
|
SHOWMSG("cmd=F_SETFL");
|
||||||
|
|
||||||
/* If this is a file, make sure that we don't hit a zero file handle. */
|
/* If this is a file, make sure that we don't hit a zero file handle. */
|
||||||
if(FLAG_IS_CLEAR(fd->fd_Flags,FDF_IS_SOCKET) && fd->fd_DefaultFile == ZERO)
|
if(FLAG_IS_CLEAR(fd->fd_Flags,FDF_IS_SOCKET) && fd->fd_File == ZERO)
|
||||||
{
|
{
|
||||||
__set_errno(EBADF);
|
__set_errno(EBADF);
|
||||||
goto out;
|
goto out;
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: fcntl_get_default_file.c,v 1.6 2006-09-12 14:16:44 obarthel Exp $
|
* $Id: fcntl_get_default_file.c,v 1.8 2006-11-16 14:39:23 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -46,7 +46,6 @@ __get_default_file(int file_descriptor,long * file_ptr)
|
|||||||
{
|
{
|
||||||
int result = ERROR;
|
int result = ERROR;
|
||||||
struct fd * fd;
|
struct fd * fd;
|
||||||
BPTR file;
|
|
||||||
|
|
||||||
assert( file_descriptor >= 0 && file_descriptor < __num_fd );
|
assert( file_descriptor >= 0 && file_descriptor < __num_fd );
|
||||||
assert( __fd[file_descriptor] != NULL );
|
assert( __fd[file_descriptor] != NULL );
|
||||||
@@ -60,67 +59,9 @@ __get_default_file(int file_descriptor,long * file_ptr)
|
|||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
__fd_unlock(fd);
|
__fd_lock(fd);
|
||||||
|
|
||||||
#if defined(__THREAD_SAFE)
|
(*file_ptr) = (long)__resolve_fd_file(fd);
|
||||||
{
|
|
||||||
/* Check if this file should be dynamically bound to one of the
|
|
||||||
three standard I/O streams. */
|
|
||||||
if(FLAG_IS_SET(fd->fd_Flags,FDF_STDIO))
|
|
||||||
{
|
|
||||||
switch(fd->fd_DefaultFile)
|
|
||||||
{
|
|
||||||
case STDIN_FILENO:
|
|
||||||
|
|
||||||
file = Input();
|
|
||||||
break;
|
|
||||||
|
|
||||||
case STDOUT_FILENO:
|
|
||||||
|
|
||||||
file = Output();
|
|
||||||
break;
|
|
||||||
|
|
||||||
case STDERR_FILENO:
|
|
||||||
|
|
||||||
#if defined(__amigaos4__)
|
|
||||||
{
|
|
||||||
file = ErrorOutput();
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
{
|
|
||||||
struct Process * this_process = (struct Process *)FindTask(NULL);
|
|
||||||
|
|
||||||
file = this_process->pr_CES;
|
|
||||||
}
|
|
||||||
#endif /* __amigaos4__ */
|
|
||||||
|
|
||||||
/* The following is rather controversial; if the standard error stream
|
|
||||||
is unavailable, we default to reuse the standard output stream. This
|
|
||||||
is problematic if the standard output stream was redirected and should
|
|
||||||
not be the same as the standard error output stream. */
|
|
||||||
if(file == ZERO)
|
|
||||||
file = Output();
|
|
||||||
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
|
|
||||||
file = ZERO;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
file = fd->fd_DefaultFile;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
{
|
|
||||||
file = fd->fd_DefaultFile;
|
|
||||||
}
|
|
||||||
#endif /* __THREAD_SAFE */
|
|
||||||
|
|
||||||
(*file_ptr) = (long)file;
|
|
||||||
|
|
||||||
result = 0;
|
result = 0;
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: dos.h,v 1.26 2006-09-22 07:54:25 obarthel Exp $
|
* $Id: dos.h,v 1.28 2006-09-27 09:40:06 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -509,8 +509,8 @@ extern BOOL (*__expand_wildcard_args_check)(void);
|
|||||||
* ("/gcc/bin:/SDK/C:/SDK/Local/C:/C:.") as used by the execvp()
|
* ("/gcc/bin:/SDK/C:/SDK/Local/C:/C:.") as used by the execvp()
|
||||||
* function.
|
* function.
|
||||||
*/
|
*/
|
||||||
extern char * __default_path_delimiter;
|
extern const char * __default_path_delimiter;
|
||||||
extern char * __default_path;
|
extern const char * __default_path;
|
||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
@@ -555,6 +555,16 @@ extern void __execve_exit(int return_code);
|
|||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The unlink() and remove() functions in libunix.a may return success even
|
||||||
|
* though deletion failed because the file/directory/link in question is still
|
||||||
|
* reported as being "in use". This is the default behaviour. If you want the
|
||||||
|
* deletion to fail instead, set '__unlink_retries' to FALSE.
|
||||||
|
*/
|
||||||
|
extern BOOL __unlink_retries;
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif /* __cplusplus */
|
#endif /* __cplusplus */
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: libgen.h,v 1.6 2006-01-08 12:06:14 obarthel Exp $
|
* $Id: libgen.h,v 1.7 2006-09-25 13:29:47 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -53,8 +53,8 @@ extern "C" {
|
|||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
char * basename(char *path);
|
char * basename(const char *path);
|
||||||
char * dirname(char *path);
|
char * dirname(const char *path);
|
||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: math.h,v 1.21 2006-01-08 12:06:14 obarthel Exp $
|
* $Id: math.h,v 1.22 2007-01-06 10:09:49 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -297,6 +297,7 @@ extern double hypot(double x,double y);
|
|||||||
extern double lgamma(double x);
|
extern double lgamma(double x);
|
||||||
extern double log1p(double x);
|
extern double log1p(double x);
|
||||||
extern double logb(double x);
|
extern double logb(double x);
|
||||||
|
extern long long int llrint(double x);
|
||||||
extern long int lrint(double x);
|
extern long int lrint(double x);
|
||||||
extern long int lround(double x);
|
extern long int lround(double x);
|
||||||
extern double nan(const char *tagp);
|
extern double nan(const char *tagp);
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: stdlib.h,v 1.17 2006-01-08 12:06:14 obarthel Exp $
|
* $Id: stdlib.h,v 1.18 2006-11-13 09:51:53 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -156,6 +156,7 @@ extern long atol(const char *str);
|
|||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
|
extern void _exit(int status);
|
||||||
extern int rand_r(unsigned int * seed);
|
extern int rand_r(unsigned int * seed);
|
||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|||||||
190
library/include/sys/clib2_io.h
Normal file
190
library/include/sys/clib2_io.h
Normal file
@@ -0,0 +1,190 @@
|
|||||||
|
/*
|
||||||
|
* $Id: clib2_io.h,v 1.4 2006-11-16 14:39:23 obarthel Exp $
|
||||||
|
*
|
||||||
|
* :ts=4
|
||||||
|
*
|
||||||
|
* Portable ISO 'C' (1994) runtime library for the Amiga computer
|
||||||
|
* Copyright (c) 2002-2006 by Olaf Barthel <olsen (at) sourcery.han.de>
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
*
|
||||||
|
* - Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* - Neither the name of Olaf Barthel nor the names of contributors
|
||||||
|
* may be used to endorse or promote products derived from this
|
||||||
|
* software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||||
|
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||||
|
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||||
|
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||||
|
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||||
|
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||||
|
* POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
*****************************************************************************
|
||||||
|
*
|
||||||
|
* Documentation and source code for this library, and the most recent library
|
||||||
|
* build are available from <http://sourceforge.net/projects/clib2>.
|
||||||
|
*
|
||||||
|
*****************************************************************************
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _SYS_CLIB2_IO_H
|
||||||
|
#define _SYS_CLIB2_IO_H
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif /* __cplusplus */
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
|
/* The following is not part of the ISO 'C' (1994) standard. */
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
|
/* Operations that can be performed by the file action function. */
|
||||||
|
enum file_action_t
|
||||||
|
{
|
||||||
|
file_action_read,
|
||||||
|
file_action_write,
|
||||||
|
file_action_seek,
|
||||||
|
file_action_close,
|
||||||
|
file_action_set_blocking,
|
||||||
|
file_action_set_async,
|
||||||
|
file_action_examine
|
||||||
|
};
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
|
/* A message sent to a file action function. */
|
||||||
|
struct file_action_message
|
||||||
|
{
|
||||||
|
enum file_action_t fam_Action; /* What to do */
|
||||||
|
char * fam_Data; /* Where to read/write the data */
|
||||||
|
int fam_Size; /* How much data to write */
|
||||||
|
|
||||||
|
long int fam_Offset; /* The seek offset */
|
||||||
|
int fam_Mode; /* The seek mode */
|
||||||
|
|
||||||
|
int fam_Arg; /* Action parameters, e.g. whether or not
|
||||||
|
this file should be set non-blocking or
|
||||||
|
use asynchronous I/O */
|
||||||
|
|
||||||
|
struct FileInfoBlock * fam_FileInfo; /* File information to be filled in */
|
||||||
|
struct MsgPort * fam_FileSystem; /* File system pointer to be filled in */
|
||||||
|
|
||||||
|
int fam_Error; /* Error code, if any... */
|
||||||
|
};
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
|
/* A forward declaration to make the following typedef work. */
|
||||||
|
struct _fd;
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
|
/* The file action function for unbuffered files. */
|
||||||
|
typedef int (*_file_action_fd_t)(struct _fd * _fd,struct file_action_message * fam);
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
|
/* A low level unbuffered file or socket. */
|
||||||
|
struct _fd
|
||||||
|
{
|
||||||
|
int fd_Version; /* Version number of this definition
|
||||||
|
of the '_fd' data structure (see
|
||||||
|
below). */
|
||||||
|
_file_action_fd_t fd_Action; /* Function to invoke to perform actions */
|
||||||
|
void * fd_UserData; /* To be used by custom file action
|
||||||
|
functions */
|
||||||
|
ULONG fd_Flags; /* File properties */
|
||||||
|
|
||||||
|
union
|
||||||
|
{
|
||||||
|
BPTR fdu_File; /* A dos.library file handle */
|
||||||
|
LONG fdu_Socket; /* A socket identifier */
|
||||||
|
} fdu_Default;
|
||||||
|
};
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
|
/* The version of the '_fd' data structure, covering the fields 'fd_Version'
|
||||||
|
through 'fdu_Default' bears version number 1. */
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
|
/* Sneaky preprocessor tricks to make access to the file/socket IDs
|
||||||
|
work smoothly. */
|
||||||
|
#define fd_DefaultFile fdu_Default.fdu_File
|
||||||
|
#define fd_File fdu_Default.fdu_File
|
||||||
|
#define fd_Socket fdu_Default.fdu_Socket
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
|
/* Flag bits that can be set in _fd->fd_Flags; not all of these may be in
|
||||||
|
use, or can be changed. */
|
||||||
|
#define FDF_READ (1UL<<0) /* Data can be read from this file */
|
||||||
|
#define FDF_WRITE (1UL<<1) /* Data can be written to this file */
|
||||||
|
#define FDF_APPEND (1UL<<2) /* Before any data is written to it,
|
||||||
|
the file position must be set to the
|
||||||
|
end of the file */
|
||||||
|
#define FDF_NO_CLOSE (1UL<<3) /* Never close this file */
|
||||||
|
#define FDF_NON_BLOCKING (1UL<<4) /* File was switched into non-blocking
|
||||||
|
mode (console streams only) */
|
||||||
|
#define FDF_IS_SOCKET (1UL<<5) /* This is not a disk file but a socket */
|
||||||
|
#define FDF_IS_LOCKED (1UL<<6) /* This file has an advisory record lock set */
|
||||||
|
#define FDF_IN_USE (1UL<<7) /* This file is in use */
|
||||||
|
#define FDF_CREATED (1UL<<8) /* This file was newly created and may need
|
||||||
|
to have its protection bits updated after
|
||||||
|
it has been closed */
|
||||||
|
#define FDF_CACHE_POSITION (1UL<<9) /* Cache the file position. */
|
||||||
|
#define FDF_ASYNC_IO (1UL<<10) /* File was switched into asynchronous I/O
|
||||||
|
mode (sockets only). */
|
||||||
|
#define FDF_IS_INTERACTIVE (1UL<<11) /* File is attached to a console window or
|
||||||
|
something like it. */
|
||||||
|
#define FDF_STDIO (1UL<<12) /* File is to be attached to one of the
|
||||||
|
standard input/output/error streams. */
|
||||||
|
#define FDF_TERMIOS (1UL<<13) /* File is under termios control.
|
||||||
|
FDF_IS_INTERACTIVE should also be set. */
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
|
/* Obtain a pointer to the _fd data structure associated with a file
|
||||||
|
descriptor number. Note that this does not perform any locking, which
|
||||||
|
means that you have to be absolutely certain that the file will not be
|
||||||
|
closed while you are still looking at it. This function can return
|
||||||
|
NULL if the file descriptor you provided is not valid. */
|
||||||
|
extern struct _fd * __get_fd(int file_descriptor);
|
||||||
|
|
||||||
|
/* Replaces the action callback function and (optionally) returns the old
|
||||||
|
function pointer; returns 0 for success and -1 for failure if you
|
||||||
|
provided an invalid file descriptor. This function performs proper locking
|
||||||
|
and is thus safe to use in a thread-safe environment. */
|
||||||
|
extern int __change_fd_action(int file_descriptor,_file_action_fd_t new_action,_file_action_fd_t * old_action_ptr);
|
||||||
|
|
||||||
|
/* Replaces the user data pointer and (optionally) returns the old user
|
||||||
|
data pointer; returns 0 for success and -1 for failure if you
|
||||||
|
provided an invalid file descriptor. This function performs proper locking
|
||||||
|
and is thus safe to use in a thread-safe environment. */
|
||||||
|
extern int __change_fd_user_data(int file_descriptor,void * new_user_data,void ** old_user_data_ptr);
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif /* __cplusplus */
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
|
#endif /* _SYS_CLIB2_IO_H */
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: unistd.h,v 1.21 2006-08-02 06:49:47 obarthel Exp $
|
* $Id: unistd.h,v 1.23 2007-01-06 10:09:49 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -51,6 +51,10 @@
|
|||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
#endif /* _FCNTL_H */
|
#endif /* _FCNTL_H */
|
||||||
|
|
||||||
|
#ifndef _STDIO_H
|
||||||
|
#include <stdio.h>
|
||||||
|
#endif /* _STDIO_H */
|
||||||
|
|
||||||
#if !defined(__NO_NET_API) && !defined(_SYS_SELECT_H)
|
#if !defined(__NO_NET_API) && !defined(_SYS_SELECT_H)
|
||||||
#include <sys/select.h>
|
#include <sys/select.h>
|
||||||
#endif /* __NO_NET_API && _SYS_SELECT_H */
|
#endif /* __NO_NET_API && _SYS_SELECT_H */
|
||||||
@@ -114,7 +118,7 @@ extern int chdir(const char * path_name);
|
|||||||
extern int lockf(int file_descriptor, int function, off_t size);
|
extern int lockf(int file_descriptor, int function, off_t size);
|
||||||
extern unsigned int sleep(unsigned int seconds);
|
extern unsigned int sleep(unsigned int seconds);
|
||||||
extern void usleep(unsigned long microseconds);
|
extern void usleep(unsigned long microseconds);
|
||||||
extern int getopt(int argc, char * argv[], char *opts);
|
extern int getopt(int argc, char * const argv[], const char *opts);
|
||||||
extern pid_t getpid(void);
|
extern pid_t getpid(void);
|
||||||
extern char *realpath(const char *file_name, char *resolved_name);
|
extern char *realpath(const char *file_name, char *resolved_name);
|
||||||
extern int fsync(int file_descriptor);
|
extern int fsync(int file_descriptor);
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
#
|
#
|
||||||
# $Id: libc.gmk,v 1.1 2006-09-17 17:37:27 obarthel Exp $
|
# $Id: libc.gmk,v 1.4 2006-11-16 14:39:23 obarthel Exp $
|
||||||
#
|
#
|
||||||
# :ts=8
|
# :ts=8
|
||||||
#
|
#
|
||||||
@@ -21,7 +21,6 @@ LIBS += \
|
|||||||
|
|
||||||
C_LIB := \
|
C_LIB := \
|
||||||
c.lib_rev.o \
|
c.lib_rev.o \
|
||||||
crtbegin.o \
|
|
||||||
ctype_isalnum.o \
|
ctype_isalnum.o \
|
||||||
ctype_isalpha.o \
|
ctype_isalpha.o \
|
||||||
ctype_isascii.o \
|
ctype_isascii.o \
|
||||||
@@ -85,11 +84,14 @@ C_LIB := \
|
|||||||
stat_fchmod.o \
|
stat_fchmod.o \
|
||||||
stat_fstat.o \
|
stat_fstat.o \
|
||||||
stat_lstat.o \
|
stat_lstat.o \
|
||||||
|
stat_lock.o \
|
||||||
stat_mkdir.o \
|
stat_mkdir.o \
|
||||||
stat_rmdir.o \
|
stat_rmdir.o \
|
||||||
stat_stat.o \
|
stat_stat.o \
|
||||||
stat_umask.o \
|
stat_umask.o \
|
||||||
stdio_asprintf.o \
|
stdio_asprintf.o \
|
||||||
|
stdio_change_fd_action.o \
|
||||||
|
stdio_change_fd_user_data.o \
|
||||||
stdio_clearerr.o \
|
stdio_clearerr.o \
|
||||||
stdio_dropiobreadbuffer.o \
|
stdio_dropiobreadbuffer.o \
|
||||||
stdio_duplicate_fd.o \
|
stdio_duplicate_fd.o \
|
||||||
@@ -129,6 +131,7 @@ C_LIB := \
|
|||||||
stdio_getchar.o \
|
stdio_getchar.o \
|
||||||
stdio_getchar_unlocked.o \
|
stdio_getchar_unlocked.o \
|
||||||
stdio_gets.o \
|
stdio_gets.o \
|
||||||
|
stdio_get_fd.o \
|
||||||
stdio_get_file_descriptor.o \
|
stdio_get_file_descriptor.o \
|
||||||
stdio_growfdtable.o \
|
stdio_growfdtable.o \
|
||||||
stdio_growiobtable.o \
|
stdio_growiobtable.o \
|
||||||
@@ -154,6 +157,7 @@ C_LIB := \
|
|||||||
stdio_remove.o \
|
stdio_remove.o \
|
||||||
stdio_remove_fd_alias.o \
|
stdio_remove_fd_alias.o \
|
||||||
stdio_rename.o \
|
stdio_rename.o \
|
||||||
|
stdio_resolve_fd_file.o \
|
||||||
stdio_rewind.o \
|
stdio_rewind.o \
|
||||||
stdio_scanf.o \
|
stdio_scanf.o \
|
||||||
stdio_setbuf.o \
|
stdio_setbuf.o \
|
||||||
@@ -359,8 +363,7 @@ C_LIB := \
|
|||||||
unistd_unlink.o \
|
unistd_unlink.o \
|
||||||
unistd_usleep.o \
|
unistd_usleep.o \
|
||||||
utime_utime.o \
|
utime_utime.o \
|
||||||
utsname_uname.o \
|
utsname_uname.o
|
||||||
crtend.o
|
|
||||||
|
|
||||||
##############################################################################
|
##############################################################################
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: libgen_basename.c,v 1.5 2006-09-22 09:02:51 obarthel Exp $
|
* $Id: libgen_basename.c,v 1.8 2006-10-02 07:15:37 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -33,6 +33,7 @@
|
|||||||
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <libgen.h>
|
#include <libgen.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
@@ -45,9 +46,12 @@
|
|||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
char *
|
char *
|
||||||
basename(char *path)
|
basename(const char *path)
|
||||||
{
|
{
|
||||||
|
static char new_path[MAXPATHLEN];
|
||||||
|
const char * str;
|
||||||
char * result;
|
char * result;
|
||||||
|
size_t len;
|
||||||
|
|
||||||
ENTER();
|
ENTER();
|
||||||
|
|
||||||
@@ -56,41 +60,63 @@ basename(char *path)
|
|||||||
else
|
else
|
||||||
SHOWSTRING(path);
|
SHOWSTRING(path);
|
||||||
|
|
||||||
|
/* An empty path always comes out as the "current directory". */
|
||||||
if(path == NULL || path[0] == '\0')
|
if(path == NULL || path[0] == '\0')
|
||||||
{
|
{
|
||||||
result = (char *)".";
|
str = ".";
|
||||||
|
len = 1;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
int len,i;
|
/* Strip all trailing slashes. */
|
||||||
|
|
||||||
len = strlen(path);
|
len = strlen(path);
|
||||||
|
|
||||||
while(len > 0 && path[len-1] == '/')
|
while(len > 0 && path[len-1] == '/')
|
||||||
len--;
|
len--;
|
||||||
|
|
||||||
|
/* Is there anything left? */
|
||||||
if(len > 0)
|
if(len > 0)
|
||||||
{
|
{
|
||||||
result = path;
|
size_t i;
|
||||||
|
|
||||||
path[len] = '\0';
|
/* Return what follows the last slash in the path. That's
|
||||||
|
usually a file or directory name. */
|
||||||
|
str = path;
|
||||||
|
|
||||||
for(i = len-1 ; i >= 0 ; i--)
|
for(i = len - 1 ; ; i--)
|
||||||
{
|
{
|
||||||
if(path[i] == '/')
|
if(path[i] == '/')
|
||||||
{
|
{
|
||||||
result = &path[i+1];
|
len -= i+1;
|
||||||
|
|
||||||
|
str = &path[i+1];
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(i == 0)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
else
|
/* If the whole operation produced an empty string, then it
|
||||||
|
means that we dealt with a string which consisted entirely
|
||||||
|
of slashes. And that's what we will return. */
|
||||||
|
if(len == 0)
|
||||||
{
|
{
|
||||||
result = (char *)"/";
|
str = "/";
|
||||||
|
len = 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
SHOWSTRING(result);
|
/* Truncate the path name we can return. This function always returns
|
||||||
|
a valid pointer rather than NULL because some software expects it
|
||||||
|
to do so (I blame the specifications). */
|
||||||
|
if(len >= sizeof(new_path))
|
||||||
|
len = sizeof(new_path)-1;
|
||||||
|
|
||||||
|
memcpy(new_path,str,len);
|
||||||
|
new_path[len] = '\0';
|
||||||
|
|
||||||
|
result = new_path;
|
||||||
|
|
||||||
RETURN(result);
|
RETURN(result);
|
||||||
return(result);
|
return(result);
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: libgen_dirname.c,v 1.5 2006-09-22 09:02:51 obarthel Exp $
|
* $Id: libgen_dirname.c,v 1.8 2006-10-02 07:15:37 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -33,6 +33,7 @@
|
|||||||
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <libgen.h>
|
#include <libgen.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
@@ -45,9 +46,12 @@
|
|||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
char *
|
char *
|
||||||
dirname(char *path)
|
dirname(const char *path)
|
||||||
{
|
{
|
||||||
|
static char new_path[MAXPATHLEN];
|
||||||
|
const char * str;
|
||||||
char * result;
|
char * result;
|
||||||
|
size_t len;
|
||||||
|
|
||||||
ENTER();
|
ENTER();
|
||||||
|
|
||||||
@@ -56,42 +60,57 @@ dirname(char *path)
|
|||||||
else
|
else
|
||||||
SHOWSTRING(path);
|
SHOWSTRING(path);
|
||||||
|
|
||||||
if(path == NULL || path[0] == '\0')
|
/* An empty path always comes out as the "current directory". */
|
||||||
{
|
str = ".";
|
||||||
result = (char *)".";
|
len = 1;
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
int len,i;
|
|
||||||
|
|
||||||
|
if(path != NULL && path[0] != '\0')
|
||||||
|
{
|
||||||
|
/* Strip all trailing slashes. */
|
||||||
len = strlen(path);
|
len = strlen(path);
|
||||||
|
while(len > 1 && path[len-1] == '/')
|
||||||
while(len > 0 && path[len-1] == '/')
|
|
||||||
len--;
|
len--;
|
||||||
|
|
||||||
|
/* Is there anything left? */
|
||||||
if(len > 0)
|
if(len > 0)
|
||||||
{
|
{
|
||||||
result = (char *)".";
|
size_t i;
|
||||||
|
|
||||||
for(i = len-1 ; i >= 0 ; i--)
|
for(i = len-1 ; ; i--)
|
||||||
{
|
{
|
||||||
if(path[i] == '/')
|
if(path[i] == '/')
|
||||||
{
|
{
|
||||||
path[i] = '\0';
|
/* Return everything up to, but not including
|
||||||
|
the last slash in the path. That's usually
|
||||||
|
the directory name. */
|
||||||
|
str = path;
|
||||||
|
len = i;
|
||||||
|
|
||||||
result = path;
|
/* If that produces an empty string, it means
|
||||||
|
that the entire string consists of slash
|
||||||
|
characters. We'll return only the first. */
|
||||||
|
if(i == 0)
|
||||||
|
len++;
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(i == 0)
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
result = (char *)"/";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
SHOWSTRING(result);
|
/* Truncate the path name we can return. This function always returns
|
||||||
|
a valid pointer rather than NULL because some software expects it
|
||||||
|
to do so (I blame the specifications). */
|
||||||
|
if(len >= sizeof(new_path))
|
||||||
|
len = sizeof(new_path)-1;
|
||||||
|
|
||||||
|
memcpy(new_path,str,len);
|
||||||
|
new_path[len] = '\0';
|
||||||
|
|
||||||
|
result = new_path;
|
||||||
|
|
||||||
RETURN(result);
|
RETURN(result);
|
||||||
return(result);
|
return(result);
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
#
|
#
|
||||||
# $Id: libm.gmk,v 1.1 2006-09-17 17:37:27 obarthel Exp $
|
# $Id: libm.gmk,v 1.3 2007-01-06 10:09:48 obarthel Exp $
|
||||||
#
|
#
|
||||||
# :ts=8
|
# :ts=8
|
||||||
#
|
#
|
||||||
@@ -109,7 +109,6 @@ MATH_LIB := \
|
|||||||
math_kernel_cosf.o \
|
math_kernel_cosf.o \
|
||||||
math_kernel_expm1.o \
|
math_kernel_expm1.o \
|
||||||
math_kernel_rem_pio2.o \
|
math_kernel_rem_pio2.o \
|
||||||
math_kernel_scalbn.o \
|
|
||||||
math_kernel_sin.o \
|
math_kernel_sin.o \
|
||||||
math_kernel_sinf.o \
|
math_kernel_sinf.o \
|
||||||
math_kernel_tan.o \
|
math_kernel_tan.o \
|
||||||
@@ -118,6 +117,7 @@ MATH_LIB := \
|
|||||||
math_ldexpf.o \
|
math_ldexpf.o \
|
||||||
math_lgamma.o \
|
math_lgamma.o \
|
||||||
math_lgammaf.o \
|
math_lgammaf.o \
|
||||||
|
math_llrint.o \
|
||||||
math_log.o \
|
math_log.o \
|
||||||
math_log10.o \
|
math_log10.o \
|
||||||
math_log10f.o \
|
math_log10f.o \
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
#
|
#
|
||||||
# $Id: libunix.gmk,v 1.1 2006-09-17 17:37:27 obarthel Exp $
|
# $Id: libunix.gmk,v 1.3 2006-11-13 09:25:28 obarthel Exp $
|
||||||
#
|
#
|
||||||
# :ts=8
|
# :ts=8
|
||||||
#
|
#
|
||||||
@@ -37,6 +37,7 @@ UNIX_LIB := \
|
|||||||
stat_chmod.o \
|
stat_chmod.o \
|
||||||
stat_fstat.o \
|
stat_fstat.o \
|
||||||
stat_lstat.o \
|
stat_lstat.o \
|
||||||
|
stat_lock.o \
|
||||||
stat_mkdir.o \
|
stat_mkdir.o \
|
||||||
stat_rmdir.o \
|
stat_rmdir.o \
|
||||||
stat_stat.o \
|
stat_stat.o \
|
||||||
@@ -122,6 +123,7 @@ UNIX_LIB := \
|
|||||||
unistd_ttyname_r.o \
|
unistd_ttyname_r.o \
|
||||||
unistd_unix_path_semantics.o \
|
unistd_unix_path_semantics.o \
|
||||||
unistd_unlink.o \
|
unistd_unlink.o \
|
||||||
|
unistd_unlink_retries.o \
|
||||||
unistd_wildcard_expand.o \
|
unistd_wildcard_expand.o \
|
||||||
utime_utime.o
|
utime_utime.o
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: locale_localeconv.c,v 1.6 2006-09-22 09:02:51 obarthel Exp $
|
* $Id: locale_localeconv.c,v 1.7 2006-09-25 14:51:15 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -54,18 +54,18 @@ localeconv(void)
|
|||||||
monetary_locale = __locale_table[LC_MONETARY];
|
monetary_locale = __locale_table[LC_MONETARY];
|
||||||
|
|
||||||
/* This makes up the current locale settings from the various
|
/* This makes up the current locale settings from the various
|
||||||
* components in use.
|
components in use. */
|
||||||
*/
|
loc.decimal_point = ((numeric_locale != NULL) ? ((char *)numeric_locale->loc_DecimalPoint) : (char *)".");
|
||||||
loc.decimal_point = (numeric_locale != NULL) ? ((char *)numeric_locale->loc_DecimalPoint) : (char *)".";
|
loc.thousands_sep = ((numeric_locale != NULL) ? ((char *)numeric_locale->loc_GroupSeparator) : (char *)"");
|
||||||
loc.thousands_sep = (numeric_locale != NULL) ? ((char *)numeric_locale->loc_GroupSeparator) : (char *)"";
|
loc.grouping = ((numeric_locale != NULL) ? ((char *)numeric_locale->loc_Grouping) : (char *)"");
|
||||||
loc.grouping = (numeric_locale != NULL) ? ((char *)numeric_locale->loc_Grouping) : (char *)"";
|
loc.int_curr_symbol = ((monetary_locale != NULL) ? ((char *)monetary_locale->loc_MonIntCS) : (char *)"");
|
||||||
loc.int_curr_symbol = (monetary_locale != NULL) ? ((char *)monetary_locale->loc_MonIntCS) : (char *)"";
|
loc.currency_symbol = ((monetary_locale != NULL) ? ((char *)monetary_locale->loc_MonCS) : (char *)"");
|
||||||
loc.currency_symbol = (monetary_locale != NULL) ? ((char *)monetary_locale->loc_MonCS) : (char *)"";
|
loc.mon_decimal_point = ((monetary_locale != NULL) ? ((char *)monetary_locale->loc_MonDecimalPoint) : (char *)"");
|
||||||
loc.mon_decimal_point = (monetary_locale != NULL) ? ((char *)monetary_locale->loc_MonDecimalPoint) : (char *)"";
|
loc.mon_thousands_sep = ((monetary_locale != NULL) ? ((char *)monetary_locale->loc_MonGroupSeparator) : (char *)"");
|
||||||
loc.mon_thousands_sep = (monetary_locale != NULL) ? ((char *)monetary_locale->loc_MonGroupSeparator) : (char *)"";
|
loc.mon_grouping = ((monetary_locale != NULL) ? ((char *)monetary_locale->loc_MonGrouping) : (char *)"");
|
||||||
loc.mon_grouping = (monetary_locale != NULL) ? ((char *)monetary_locale->loc_MonGrouping) : (char *)"";
|
loc.positive_sign = ((monetary_locale != NULL) ? ((char *)monetary_locale->loc_MonPositiveSign) : (char *)"");
|
||||||
loc.positive_sign = (monetary_locale != NULL) ? ((char *)monetary_locale->loc_MonPositiveSign) : (char *)"";
|
loc.negative_sign = ((monetary_locale != NULL) ? ((char *)monetary_locale->loc_MonNegativeSign) : (char *)"");
|
||||||
loc.negative_sign = (monetary_locale != NULL) ? ((char *)monetary_locale->loc_MonNegativeSign) : (char *)"";
|
|
||||||
loc.int_frac_digits = (monetary_locale != NULL) ? monetary_locale->loc_MonIntFracDigits : CHAR_MAX;
|
loc.int_frac_digits = (monetary_locale != NULL) ? monetary_locale->loc_MonIntFracDigits : CHAR_MAX;
|
||||||
loc.frac_digits = (monetary_locale != NULL) ? monetary_locale->loc_MonFracDigits : CHAR_MAX;
|
loc.frac_digits = (monetary_locale != NULL) ? monetary_locale->loc_MonFracDigits : CHAR_MAX;
|
||||||
loc.p_cs_precedes = (monetary_locale != NULL) ? monetary_locale->loc_MonPositiveCSPos : CHAR_MAX;
|
loc.p_cs_precedes = (monetary_locale != NULL) ? monetary_locale->loc_MonPositiveCSPos : CHAR_MAX;
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
#define VERSION 1
|
#define VERSION 1
|
||||||
#define REVISION 201
|
#define REVISION 202
|
||||||
#define DATE "21.9.2006"
|
#define DATE "16.1.2007"
|
||||||
#define VERS "m.lib 1.201"
|
#define VERS "m.lib 1.202"
|
||||||
#define VSTRING "m.lib 1.201 (21.9.2006)\r\n"
|
#define VSTRING "m.lib 1.202 (16.1.2007)\r\n"
|
||||||
#define VERSTAG "\0$VER: m.lib 1.201 (21.9.2006)"
|
#define VERSTAG "\0$VER: m.lib 1.202 (16.1.2007)"
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
201
|
202
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
#define VERSION 1
|
#define VERSION 1
|
||||||
#define REVISION 201
|
#define REVISION 202
|
||||||
#define DATE "21.9.2006"
|
#define DATE "16.1.2007"
|
||||||
#define VERS "m881.lib 1.201"
|
#define VERS "m881.lib 1.202"
|
||||||
#define VSTRING "m881.lib 1.201 (21.9.2006)\r\n"
|
#define VSTRING "m881.lib 1.202 (16.1.2007)\r\n"
|
||||||
#define VERSTAG "\0$VER: m881.lib 1.201 (21.9.2006)"
|
#define VERSTAG "\0$VER: m881.lib 1.202 (16.1.2007)"
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
201
|
202
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: math_headers.h,v 1.14 2006-01-08 12:04:23 obarthel Exp $
|
* $Id: math_headers.h,v 1.15 2006-11-13 09:51:53 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -216,7 +216,6 @@ extern double __kernel_sin(double x, double y, int iy);
|
|||||||
extern int __rem_pio2(double x, double *y);
|
extern int __rem_pio2(double x, double *y);
|
||||||
extern double __kernel_tan(double x, double y, int iy);
|
extern double __kernel_tan(double x, double y, int iy);
|
||||||
extern double __expm1(double x);
|
extern double __expm1(double x);
|
||||||
extern double __scalbn(double x, int n);
|
|
||||||
extern float __kernel_cosf(float x, float y);
|
extern float __kernel_cosf(float x, float y);
|
||||||
extern float __kernel_sinf(float x, float y, int iy);
|
extern float __kernel_sinf(float x, float y, int iy);
|
||||||
extern LONG __rem_pio2f(float x, float *y);
|
extern LONG __rem_pio2f(float x, float *y);
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: math_kernel_rem_pio2.c,v 1.5 2006-01-08 12:04:23 obarthel Exp $
|
* $Id: math_kernel_rem_pio2.c,v 1.7 2006-11-13 09:51:53 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -55,7 +55,7 @@ static const double PIo2[] = {
|
|||||||
1.57079625129699707031e+00, /* 0x3FF921FB, 0x40000000 */
|
1.57079625129699707031e+00, /* 0x3FF921FB, 0x40000000 */
|
||||||
7.54978941586159635335e-08, /* 0x3E74442D, 0x00000000 */
|
7.54978941586159635335e-08, /* 0x3E74442D, 0x00000000 */
|
||||||
5.39030252995776476554e-15, /* 0x3CF84698, 0x80000000 */
|
5.39030252995776476554e-15, /* 0x3CF84698, 0x80000000 */
|
||||||
3.28200341580791294123e422, /* 0x3B78CC51, 0x60000000 */
|
3.28200341580791294123e-22, /* 0x3B78CC51, 0x60000000 */
|
||||||
1.27065575308067607349e-29, /* 0x39F01B83, 0x80000000 */
|
1.27065575308067607349e-29, /* 0x39F01B83, 0x80000000 */
|
||||||
1.22933308981111328932e-36, /* 0x387A2520, 0x40000000 */
|
1.22933308981111328932e-36, /* 0x387A2520, 0x40000000 */
|
||||||
2.73370053816464559624e-44, /* 0x36E38222, 0x80000000 */
|
2.73370053816464559624e-44, /* 0x36E38222, 0x80000000 */
|
||||||
@@ -102,7 +102,7 @@ recompute:
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* compute n */
|
/* compute n */
|
||||||
z = __scalbn(z,(int)q0); /* actual value of z */
|
z = scalbn(z,(int)q0); /* actual value of z */
|
||||||
z -= 8.0*floor(z*0.125); /* trim off integer >= 8 */
|
z -= 8.0*floor(z*0.125); /* trim off integer >= 8 */
|
||||||
n = (int) z;
|
n = (int) z;
|
||||||
z -= (double)n;
|
z -= (double)n;
|
||||||
@@ -135,7 +135,7 @@ recompute:
|
|||||||
}
|
}
|
||||||
if(ih==2) {
|
if(ih==2) {
|
||||||
z = one - z;
|
z = one - z;
|
||||||
if(carry!=0) z -= __scalbn(one,(int)q0);
|
if(carry!=0) z -= scalbn(one,(int)q0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -161,7 +161,7 @@ recompute:
|
|||||||
jz -= 1; q0 -= 24;
|
jz -= 1; q0 -= 24;
|
||||||
while(iq[jz]==0) { jz--; q0-=24;}
|
while(iq[jz]==0) { jz--; q0-=24;}
|
||||||
} else { /* break z into 24-bit if necessary */
|
} else { /* break z into 24-bit if necessary */
|
||||||
z = __scalbn(z,-(int)q0);
|
z = scalbn(z,-(int)q0);
|
||||||
if(z>=two24) {
|
if(z>=two24) {
|
||||||
fw = (double)((int)(twon24*z));
|
fw = (double)((int)(twon24*z));
|
||||||
iq[jz] = (int)(z-two24*fw);
|
iq[jz] = (int)(z-two24*fw);
|
||||||
@@ -171,7 +171,7 @@ recompute:
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* convert integer "bit" chunk to floating-point value */
|
/* convert integer "bit" chunk to floating-point value */
|
||||||
fw = __scalbn(one,(int)q0);
|
fw = scalbn(one,(int)q0);
|
||||||
for(i=jz;i>=0;i--) {
|
for(i=jz;i>=0;i--) {
|
||||||
q[i] = fw*(double)iq[i]; fw*=twon24;
|
q[i] = fw*(double)iq[i]; fw*=twon24;
|
||||||
}
|
}
|
||||||
@@ -331,7 +331,7 @@ int __rem_pio2(double x, double *y)
|
|||||||
}
|
}
|
||||||
/* keep the compiler happy */
|
/* keep the compiler happy */
|
||||||
z = 0;
|
z = 0;
|
||||||
/* set z = __scalbn(|x|,ilogb(x)-23) */
|
/* set z = scalbn(|x|,ilogb(x)-23) */
|
||||||
GET_LOW_WORD(low,x);
|
GET_LOW_WORD(low,x);
|
||||||
SET_LOW_WORD(z,low);
|
SET_LOW_WORD(z,low);
|
||||||
e0 = (int)((ix>>20)-1046); /* e0 = ilogb(z)-23; */
|
e0 = (int)((ix>>20)-1046); /* e0 = ilogb(z)-23; */
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: math_kernel_scalbn.c,v 1.5 2006-01-08 12:04:23 obarthel Exp $
|
* $Id: math_llrint.c,v 1.1 2007-01-06 10:09:48 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -46,43 +46,83 @@
|
|||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
#if defined(FLOATING_POINT_SUPPORT) && defined(PPC_FLOATING_POINT_SUPPORT)
|
#if defined(FLOATING_POINT_SUPPORT)
|
||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
static const double
|
/* Adding a double, x, to 2^52 will cause the result to be rounded based on
|
||||||
huge = 1.0e+300,
|
the fractional part of x, according to the implementation's current rounding
|
||||||
tiny = 1.0e-300,
|
mode. 2^52 is the smallest double that can be represented using all 52 significant
|
||||||
two54 = 1.80143985094819840000e+16, /* 0x43500000, 0x00000000 */
|
digits. */
|
||||||
twom54 = 5.55111512312578270212e-17; /* 0x3C900000, 0x00000000 */
|
static const double TWO52[2]={
|
||||||
|
4.50359962737049600000e+15, /* 0x43300000, 0x00000000 */
|
||||||
|
-4.50359962737049600000e+15, /* 0xC3300000, 0x00000000 */
|
||||||
|
};
|
||||||
|
|
||||||
double __scalbn (double x, int n)
|
/****************************************************************************/
|
||||||
|
|
||||||
|
long long int
|
||||||
|
llrint(double x)
|
||||||
{
|
{
|
||||||
int k,hx,lx;
|
LONG i0,j0,sx;
|
||||||
EXTRACT_WORDS(hx,lx,x);
|
ULONG i1;
|
||||||
k = (hx&0x7ff00000)>>20; /* extract exponent */
|
double t;
|
||||||
if (k==0) { /* 0 or subnormal x */
|
volatile double w;
|
||||||
if ((lx|(hx&0x7fffffff))==0) return x; /* +-0 */
|
long long int result;
|
||||||
x *= two54;
|
|
||||||
GET_HIGH_WORD(hx,x);
|
EXTRACT_WORDS(i0,i1,x);
|
||||||
k = ((hx&0x7ff00000)>>20) - 54;
|
|
||||||
if (n< -50000) return tiny*x; /*underflow*/
|
/* Extract sign bit. */
|
||||||
|
sx = (i0>>31)&1;
|
||||||
|
|
||||||
|
/* Extract exponent field. */
|
||||||
|
j0 = ((i0 & 0x7ff00000) >> 20) - 1023;
|
||||||
|
|
||||||
|
if(j0 < 20)
|
||||||
|
{
|
||||||
|
if(j0 < -1)
|
||||||
|
return 0;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
w = TWO52[sx] + x;
|
||||||
|
t = w - TWO52[sx];
|
||||||
|
GET_HIGH_WORD(i0, t);
|
||||||
|
/* Detect the all-zeros representation of plus and
|
||||||
|
minus zero, which fails the calculation below. */
|
||||||
|
if ((i0 & ~(1 << 31)) == 0)
|
||||||
|
return 0;
|
||||||
|
j0 = ((i0 & 0x7ff00000) >> 20) - 1023;
|
||||||
|
i0 &= 0x000fffff;
|
||||||
|
i0 |= 0x00100000;
|
||||||
|
result = i0 >> (20 - j0);
|
||||||
}
|
}
|
||||||
if (k==0x7ff) return x+x; /* NaN or Inf */
|
|
||||||
k = k+n;
|
|
||||||
if (k > 0x7fe) return huge*copysign(huge,x); /* overflow */
|
|
||||||
if (k > 0) /* normal result */
|
|
||||||
{SET_HIGH_WORD(x,(hx&0x800fffff)|(k<<20)); return x;}
|
|
||||||
if (k <= -54) {
|
|
||||||
if (n > 50000) /* in case integer overflow in n+k */
|
|
||||||
return huge*copysign(huge,x); /*overflow*/
|
|
||||||
else return tiny*copysign(tiny,x); /*underflow*/
|
|
||||||
}
|
}
|
||||||
k += 54; /* subnormal result */
|
else if (j0 < (int)(8 * sizeof (long long int)) - 1)
|
||||||
SET_HIGH_WORD(x,(hx&0x800fffff)|(k<<20));
|
{
|
||||||
return x*twom54;
|
if (j0 >= 52)
|
||||||
|
result = ((long long int) ((i0 & 0x000fffff) | 0x0010000) << (j0 - 20)) |
|
||||||
|
(i1 << (j0 - 52));
|
||||||
|
else
|
||||||
|
{
|
||||||
|
w = TWO52[sx] + x;
|
||||||
|
t = w - TWO52[sx];
|
||||||
|
EXTRACT_WORDS (i0, i1, t);
|
||||||
|
j0 = ((i0 & 0x7ff00000) >> 20) - 1023;
|
||||||
|
i0 &= 0x000fffff;
|
||||||
|
i0 |= 0x00100000;
|
||||||
|
result = ((long long int) i0 << (j0 - 20)) | (i1 >> (52 - j0));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return (long long int) x;
|
||||||
|
}
|
||||||
|
|
||||||
|
return sx ? -result : result;
|
||||||
}
|
}
|
||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
#endif /* FLOATING_POINT_SUPPORT && PPC_FLOATING_POINT_SUPPORT */
|
#endif /* FLOATING_POINT_SUPPORT */
|
||||||
|
|
||||||
|
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: mount_fstatfs.c,v 1.13 2006-01-08 12:04:24 obarthel Exp $
|
* $Id: mount_fstatfs.c,v 1.14 2006-11-16 14:39:23 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -106,7 +106,7 @@ fstatfs(int file_descriptor, struct statfs *buf)
|
|||||||
}
|
}
|
||||||
|
|
||||||
PROFILE_OFF();
|
PROFILE_OFF();
|
||||||
parent_dir = __safe_parent_of_file_handle(fd->fd_DefaultFile);
|
parent_dir = __safe_parent_of_file_handle(fd->fd_File);
|
||||||
PROFILE_ON();
|
PROFILE_ON();
|
||||||
|
|
||||||
if(parent_dir == ZERO)
|
if(parent_dir == ZERO)
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
#define VERSION 1
|
#define VERSION 1
|
||||||
#define REVISION 201
|
#define REVISION 202
|
||||||
#define DATE "21.9.2006"
|
#define DATE "16.1.2007"
|
||||||
#define VERS "net.lib 1.201"
|
#define VERS "net.lib 1.202"
|
||||||
#define VSTRING "net.lib 1.201 (21.9.2006)\r\n"
|
#define VSTRING "net.lib 1.202 (16.1.2007)\r\n"
|
||||||
#define VERSTAG "\0$VER: net.lib 1.201 (21.9.2006)"
|
#define VERSTAG "\0$VER: net.lib 1.202 (16.1.2007)"
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
201
|
202
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
|
|
|
|
||||||
| $Id: nrcrt0.S,v 1.5 2006-01-08 12:04:24 obarthel Exp $
|
| $Id: nrcrt0.S,v 1.6 2006-11-16 10:09:20 obarthel Exp $
|
||||||
|
|
|
|
||||||
| :ts=4
|
| :ts=4
|
||||||
|
|
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: socket_accept.c,v 1.16 2006-01-08 12:04:24 obarthel Exp $
|
* $Id: socket_accept.c,v 1.17 2006-11-16 10:41:15 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -95,7 +95,7 @@ accept(int sockfd,struct sockaddr *cliaddr,socklen_t *addrlen)
|
|||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
/* Remember the socket number for later. */
|
/* Remember the socket number for later. */
|
||||||
socket_fd = (LONG)fd->fd_DefaultFile;
|
socket_fd = fd->fd_Socket;
|
||||||
|
|
||||||
/* Now let go of the stdio lock, so that the only locking performed
|
/* Now let go of the stdio lock, so that the only locking performed
|
||||||
will be done inside the accept() call. */
|
will be done inside the accept() call. */
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: socket_bind.c,v 1.7 2006-01-08 12:04:24 obarthel Exp $
|
* $Id: socket_bind.c,v 1.8 2006-11-16 10:41:15 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -84,7 +84,7 @@ bind(int sockfd,const struct sockaddr *name,socklen_t namelen)
|
|||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
PROFILE_OFF();
|
PROFILE_OFF();
|
||||||
result = __bind((LONG)fd->fd_DefaultFile,(struct sockaddr *)name,namelen);
|
result = __bind(fd->fd_Socket,(struct sockaddr *)name,namelen);
|
||||||
PROFILE_ON();
|
PROFILE_ON();
|
||||||
|
|
||||||
out:
|
out:
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: socket_connect.c,v 1.8 2006-01-08 12:04:24 obarthel Exp $
|
* $Id: socket_connect.c,v 1.9 2006-11-16 10:41:15 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -84,7 +84,7 @@ connect(int sockfd,const struct sockaddr *name,socklen_t namelen)
|
|||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
PROFILE_OFF();
|
PROFILE_OFF();
|
||||||
result = __connect((LONG)fd->fd_DefaultFile,(struct sockaddr *)name,namelen);
|
result = __connect(fd->fd_Socket,(struct sockaddr *)name,namelen);
|
||||||
PROFILE_ON();
|
PROFILE_ON();
|
||||||
|
|
||||||
out:
|
out:
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: socket_getpeername.c,v 1.7 2006-01-08 12:04:24 obarthel Exp $
|
* $Id: socket_getpeername.c,v 1.8 2006-11-16 10:41:15 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -84,7 +84,7 @@ getpeername(int sockfd,struct sockaddr *name,socklen_t *namelen)
|
|||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
PROFILE_OFF();
|
PROFILE_OFF();
|
||||||
result = __getpeername((LONG)fd->fd_DefaultFile,name,(LONG *)namelen);
|
result = __getpeername(fd->fd_Socket,name,(LONG *)namelen);
|
||||||
PROFILE_ON();
|
PROFILE_ON();
|
||||||
|
|
||||||
out:
|
out:
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: socket_getsockname.c,v 1.7 2006-01-08 12:04:24 obarthel Exp $
|
* $Id: socket_getsockname.c,v 1.8 2006-11-16 10:41:15 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -84,7 +84,7 @@ getsockname(int sockfd,struct sockaddr *name,socklen_t *namelen)
|
|||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
PROFILE_OFF();
|
PROFILE_OFF();
|
||||||
result = __getsockname((LONG)fd->fd_DefaultFile,name,(LONG *)namelen);
|
result = __getsockname(fd->fd_Socket,name,(LONG *)namelen);
|
||||||
PROFILE_ON();
|
PROFILE_ON();
|
||||||
|
|
||||||
out:
|
out:
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: socket_getsockopt.c,v 1.7 2006-01-08 12:04:24 obarthel Exp $
|
* $Id: socket_getsockopt.c,v 1.8 2006-11-16 10:41:15 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -86,7 +86,7 @@ getsockopt(int sockfd,int level,int optname,void *optval,socklen_t *optlen)
|
|||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
PROFILE_OFF();
|
PROFILE_OFF();
|
||||||
result = __getsockopt((LONG)fd->fd_DefaultFile,level,optname,optval,(LONG *)optlen);
|
result = __getsockopt(fd->fd_Socket,level,optname,optval,(LONG *)optlen);
|
||||||
PROFILE_ON();
|
PROFILE_ON();
|
||||||
|
|
||||||
out:
|
out:
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: socket_hook_entry.c,v 1.16 2006-01-08 12:04:24 obarthel Exp $
|
* $Id: socket_hook_entry.c,v 1.17 2006-11-16 10:41:15 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -79,7 +79,7 @@ __socket_hook_entry(
|
|||||||
|
|
||||||
PROFILE_OFF();
|
PROFILE_OFF();
|
||||||
|
|
||||||
result = __recv((LONG)fd->fd_DefaultFile,fam->fam_Data,fam->fam_Size,0);
|
result = __recv(fd->fd_Socket,fam->fam_Data,fam->fam_Size,0);
|
||||||
if(result < 0)
|
if(result < 0)
|
||||||
fam->fam_Error = __get_errno();
|
fam->fam_Error = __get_errno();
|
||||||
|
|
||||||
@@ -99,7 +99,7 @@ __socket_hook_entry(
|
|||||||
|
|
||||||
PROFILE_OFF();
|
PROFILE_OFF();
|
||||||
|
|
||||||
result = __send((LONG)fd->fd_DefaultFile,fam->fam_Data,fam->fam_Size,0);
|
result = __send(fd->fd_Socket,fam->fam_Data,fam->fam_Size,0);
|
||||||
if(result < 0)
|
if(result < 0)
|
||||||
fam->fam_Error = __get_errno();
|
fam->fam_Error = __get_errno();
|
||||||
|
|
||||||
@@ -126,7 +126,7 @@ __socket_hook_entry(
|
|||||||
{
|
{
|
||||||
PROFILE_OFF();
|
PROFILE_OFF();
|
||||||
|
|
||||||
result = __CloseSocket((LONG)fd->fd_DefaultFile);
|
result = __CloseSocket(fd->fd_Socket);
|
||||||
|
|
||||||
PROFILE_ON();
|
PROFILE_ON();
|
||||||
}
|
}
|
||||||
@@ -163,7 +163,7 @@ __socket_hook_entry(
|
|||||||
|
|
||||||
param = (int)(fam->fam_Arg == 0);
|
param = (int)(fam->fam_Arg == 0);
|
||||||
|
|
||||||
result = __IoctlSocket(fd->fd_DefaultFile,FIONBIO,¶m);
|
result = __IoctlSocket(fd->fd_Socket,FIONBIO,¶m);
|
||||||
if(result < 0)
|
if(result < 0)
|
||||||
fam->fam_Error = __get_errno();
|
fam->fam_Error = __get_errno();
|
||||||
|
|
||||||
@@ -175,7 +175,7 @@ __socket_hook_entry(
|
|||||||
|
|
||||||
param = (int)(fam->fam_Arg != 0);
|
param = (int)(fam->fam_Arg != 0);
|
||||||
|
|
||||||
result = __IoctlSocket(fd->fd_DefaultFile,FIOASYNC,¶m);
|
result = __IoctlSocket(fd->fd_Socket,FIOASYNC,¶m);
|
||||||
if(result < 0)
|
if(result < 0)
|
||||||
fam->fam_Error = __get_errno();
|
fam->fam_Error = __get_errno();
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: socket_ioctl.c,v 1.12 2006-09-21 09:24:20 obarthel Exp $
|
* $Id: socket_ioctl.c,v 1.14 2006-11-16 10:41:15 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -84,12 +84,12 @@ ioctl(int sockfd,int request, ... /* char *arg */)
|
|||||||
SHOWPOINTER(param);
|
SHOWPOINTER(param);
|
||||||
|
|
||||||
PROFILE_OFF();
|
PROFILE_OFF();
|
||||||
result = __IoctlSocket((LONG)fd->fd_DefaultFile,request,param);
|
result = __IoctlSocket(fd->fd_Socket,request,param);
|
||||||
PROFILE_ON();
|
PROFILE_ON();
|
||||||
|
|
||||||
if(result == 0)
|
if(result == 0)
|
||||||
{
|
{
|
||||||
int * option = (int *)param;
|
const int * option = (const int *)param;
|
||||||
|
|
||||||
if(request == (int)FIONBIO)
|
if(request == (int)FIONBIO)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: socket_listen.c,v 1.5 2006-01-08 12:04:24 obarthel Exp $
|
* $Id: socket_listen.c,v 1.6 2006-11-16 10:41:15 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -64,7 +64,7 @@ listen(int sockfd,int backlog)
|
|||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
PROFILE_OFF();
|
PROFILE_OFF();
|
||||||
result = __listen((LONG)fd->fd_DefaultFile,backlog);
|
result = __listen(fd->fd_Socket,backlog);
|
||||||
PROFILE_ON();
|
PROFILE_ON();
|
||||||
|
|
||||||
out:
|
out:
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: socket_obtain_daemon.c,v 1.4 2006-01-08 12:04:24 obarthel Exp $
|
* $Id: socket_obtain_daemon.c,v 1.5 2006-11-16 10:41:15 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -93,7 +93,7 @@ __obtain_daemon_message(VOID)
|
|||||||
struct TagItem tags[2];
|
struct TagItem tags[2];
|
||||||
|
|
||||||
/* Check if it is safe to call the IsServerProcess() function. */
|
/* Check if it is safe to call the IsServerProcess() function. */
|
||||||
tags[0].ti_Tag = SBTM_GETREF(SBTC_BREAKMASK);
|
tags[0].ti_Tag = SBTM_GETREF(SBTC_HAVE_SERVER_API);
|
||||||
tags[0].ti_Data = (ULONG)&have_server_api;
|
tags[0].ti_Data = (ULONG)&have_server_api;
|
||||||
tags[1].ti_Tag = TAG_END;
|
tags[1].ti_Tag = TAG_END;
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: socket_recv.c,v 1.6 2006-01-08 12:04:24 obarthel Exp $
|
* $Id: socket_recv.c,v 1.7 2006-11-16 10:41:15 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -86,7 +86,7 @@ recv(int sockfd,void *buff,size_t nbytes,int flags)
|
|||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
PROFILE_OFF();
|
PROFILE_OFF();
|
||||||
result = __recv((LONG)fd->fd_DefaultFile,buff,(LONG)nbytes,flags);
|
result = __recv(fd->fd_Socket,buff,(LONG)nbytes,flags);
|
||||||
PROFILE_ON();
|
PROFILE_ON();
|
||||||
|
|
||||||
out:
|
out:
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: socket_recvfrom.c,v 1.8 2006-01-08 12:04:24 obarthel Exp $
|
* $Id: socket_recvfrom.c,v 1.9 2006-11-16 10:41:15 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -87,7 +87,7 @@ recvfrom(int sockfd,void *buff,size_t len,int flags,struct sockaddr *from,sockle
|
|||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
PROFILE_OFF();
|
PROFILE_OFF();
|
||||||
result = __recvfrom((LONG)fd->fd_DefaultFile,buff,len,flags,from,(LONG *)fromlen);
|
result = __recvfrom(fd->fd_Socket,buff,len,flags,from,(LONG *)fromlen);
|
||||||
PROFILE_ON();
|
PROFILE_ON();
|
||||||
|
|
||||||
out:
|
out:
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: socket_recvmsg.c,v 1.6 2006-01-08 12:04:24 obarthel Exp $
|
* $Id: socket_recvmsg.c,v 1.7 2006-11-16 10:41:15 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -84,7 +84,7 @@ recvmsg(int sockfd,struct msghdr *msg,int flags)
|
|||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
PROFILE_OFF();
|
PROFILE_OFF();
|
||||||
result = __recvmsg((LONG)fd->fd_DefaultFile,msg,flags);
|
result = __recvmsg(fd->fd_Socket,msg,flags);
|
||||||
PROFILE_ON();
|
PROFILE_ON();
|
||||||
|
|
||||||
out:
|
out:
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: socket_select_signal.c,v 1.3 2006-06-22 09:02:44 obarthel Exp $
|
* $Id: socket_select_signal.c,v 1.5 2006-11-16 14:39:23 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -288,7 +288,7 @@ map_descriptor_sets(
|
|||||||
/* Is this a socket descriptor? */
|
/* Is this a socket descriptor? */
|
||||||
if(FLAG_IS_SET(fd->fd_Flags,FDF_IS_SOCKET))
|
if(FLAG_IS_SET(fd->fd_Flags,FDF_IS_SOCKET))
|
||||||
{
|
{
|
||||||
int socket_fd = (int)fd->fd_DefaultFile;
|
int socket_fd = fd->fd_Socket;
|
||||||
|
|
||||||
D(("corresponds to socket #%ld",socket_fd));
|
D(("corresponds to socket #%ld",socket_fd));
|
||||||
|
|
||||||
@@ -326,7 +326,7 @@ map_descriptor_sets(
|
|||||||
|
|
||||||
/* Let's see if we can examine the file. Some file systems
|
/* Let's see if we can examine the file. Some file systems
|
||||||
may not support this. */
|
may not support this. */
|
||||||
if(CANNOT __safe_examine_file_handle(fd->fd_DefaultFile,fib))
|
if(CANNOT __safe_examine_file_handle(fd->fd_File,fib))
|
||||||
{
|
{
|
||||||
SHOWMSG("file is unusable; we cannot examine the file.");
|
SHOWMSG("file is unusable; we cannot examine the file.");
|
||||||
continue;
|
continue;
|
||||||
@@ -415,7 +415,7 @@ remap_descriptor_sets(
|
|||||||
for(output_fd = 0 ; output_fd < num_output_fds ; output_fd++)
|
for(output_fd = 0 ; output_fd < num_output_fds ; output_fd++)
|
||||||
{
|
{
|
||||||
fd = get_file_descriptor(output_fd);
|
fd = get_file_descriptor(output_fd);
|
||||||
if(fd != NULL && FLAG_IS_SET(fd->fd_Flags,FDF_IS_SOCKET) && (int)fd->fd_DefaultFile == socket_fd)
|
if(fd != NULL && FLAG_IS_SET(fd->fd_Flags,FDF_IS_SOCKET) && fd->fd_Socket == socket_fd)
|
||||||
{
|
{
|
||||||
assert( output_fd < num_output_fds );
|
assert( output_fd < num_output_fds );
|
||||||
assert( FLAG_IS_SET(__fd[output_fd]->fd_Flags,FDF_IS_SOCKET) );
|
assert( FLAG_IS_SET(__fd[output_fd]->fd_Flags,FDF_IS_SOCKET) );
|
||||||
@@ -480,7 +480,7 @@ get_num_descriptors_used(int num_fds,int * num_socket_used_ptr,int * num_file_us
|
|||||||
{
|
{
|
||||||
if(FLAG_IS_SET(fd->fd_Flags,FDF_IS_SOCKET))
|
if(FLAG_IS_SET(fd->fd_Flags,FDF_IS_SOCKET))
|
||||||
{
|
{
|
||||||
int which_socket_fd = (int)fd->fd_DefaultFile;
|
int which_socket_fd = fd->fd_Socket;
|
||||||
|
|
||||||
if(num_socket_used < which_socket_fd+1)
|
if(num_socket_used < which_socket_fd+1)
|
||||||
num_socket_used = which_socket_fd+1;
|
num_socket_used = which_socket_fd+1;
|
||||||
@@ -812,7 +812,7 @@ __select(int num_fds,fd_set *read_fds,fd_set *write_fds,fd_set *except_fds,struc
|
|||||||
if(FLAG_IS_SET(fd->fd_Flags,FDF_IS_INTERACTIVE))
|
if(FLAG_IS_SET(fd->fd_Flags,FDF_IS_INTERACTIVE))
|
||||||
{
|
{
|
||||||
/* For an interactive stream, we simply ask. */
|
/* For an interactive stream, we simply ask. */
|
||||||
if(WaitForChar(fd->fd_DefaultFile,1))
|
if(WaitForChar(fd->fd_File,1))
|
||||||
got_input = TRUE;
|
got_input = TRUE;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -824,7 +824,7 @@ __select(int num_fds,fd_set *read_fds,fd_set *write_fds,fd_set *except_fds,struc
|
|||||||
unread data in the file, we will be able to read from it.
|
unread data in the file, we will be able to read from it.
|
||||||
For pipes, any data reported to be in the "file" indicates
|
For pipes, any data reported to be in the "file" indicates
|
||||||
that there is something worth reading available. */
|
that there is something worth reading available. */
|
||||||
if(__safe_examine_file_handle(fd->fd_DefaultFile,fib))
|
if(__safe_examine_file_handle(fd->fd_File,fib))
|
||||||
{
|
{
|
||||||
if(FLAG_IS_SET(fd->fd_Flags,FDF_CACHE_POSITION))
|
if(FLAG_IS_SET(fd->fd_Flags,FDF_CACHE_POSITION))
|
||||||
{
|
{
|
||||||
@@ -1010,14 +1010,14 @@ __select(int num_fds,fd_set *read_fds,fd_set *write_fds,fd_set *except_fds,struc
|
|||||||
|
|
||||||
if(FLAG_IS_SET(fd->fd_Flags,FDF_IS_INTERACTIVE))
|
if(FLAG_IS_SET(fd->fd_Flags,FDF_IS_INTERACTIVE))
|
||||||
{
|
{
|
||||||
if(WaitForChar(fd->fd_DefaultFile,1))
|
if(WaitForChar(fd->fd_File,1))
|
||||||
got_input = TRUE;
|
got_input = TRUE;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
D_S(struct FileInfoBlock,fib);
|
D_S(struct FileInfoBlock,fib);
|
||||||
|
|
||||||
if(__safe_examine_file_handle(fd->fd_DefaultFile,fib))
|
if(__safe_examine_file_handle(fd->fd_File,fib))
|
||||||
{
|
{
|
||||||
if(FLAG_IS_SET(fd->fd_Flags,FDF_CACHE_POSITION))
|
if(FLAG_IS_SET(fd->fd_Flags,FDF_CACHE_POSITION))
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: socket_send.c,v 1.8 2006-01-08 12:04:24 obarthel Exp $
|
* $Id: socket_send.c,v 1.9 2006-11-16 10:41:15 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -86,7 +86,7 @@ send(int sockfd,const void *buff,size_t nbytes,int flags)
|
|||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
PROFILE_OFF();
|
PROFILE_OFF();
|
||||||
result = __send((LONG)fd->fd_DefaultFile,(void *)buff,(LONG)nbytes,flags);
|
result = __send(fd->fd_Socket,(void *)buff,(LONG)nbytes,flags);
|
||||||
PROFILE_ON();
|
PROFILE_ON();
|
||||||
|
|
||||||
out:
|
out:
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: socket_sendmsg.c,v 1.7 2006-01-08 12:04:24 obarthel Exp $
|
* $Id: socket_sendmsg.c,v 1.8 2006-11-16 10:41:15 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -84,7 +84,7 @@ sendmsg(int sockfd,const struct msghdr *msg,int flags)
|
|||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
PROFILE_OFF();
|
PROFILE_OFF();
|
||||||
result = __sendmsg((LONG)fd->fd_DefaultFile,(struct msghdr *)msg,flags);
|
result = __sendmsg(fd->fd_Socket,(struct msghdr *)msg,flags);
|
||||||
PROFILE_ON();
|
PROFILE_ON();
|
||||||
|
|
||||||
out:
|
out:
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: socket_sendto.c,v 1.10 2006-01-08 12:04:24 obarthel Exp $
|
* $Id: socket_sendto.c,v 1.11 2006-11-16 10:41:15 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -87,7 +87,7 @@ sendto(int sockfd,const void *buff,size_t len,int flags,const struct sockaddr *t
|
|||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
PROFILE_OFF();
|
PROFILE_OFF();
|
||||||
result = __sendto((LONG)fd->fd_DefaultFile,(void *)buff,len,flags,(struct sockaddr *)to,tolen);
|
result = __sendto(fd->fd_Socket,(void *)buff,len,flags,(struct sockaddr *)to,tolen);
|
||||||
PROFILE_ON();
|
PROFILE_ON();
|
||||||
|
|
||||||
out:
|
out:
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: socket_setsockopt.c,v 1.9 2006-01-08 12:04:24 obarthel Exp $
|
* $Id: socket_setsockopt.c,v 1.10 2006-11-16 10:41:15 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -86,7 +86,7 @@ setsockopt(int sockfd,int level,int optname,const void *optval,socklen_t optlen)
|
|||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
PROFILE_OFF();
|
PROFILE_OFF();
|
||||||
result = __setsockopt((LONG)fd->fd_DefaultFile,level,optname,(void *)optval,optlen);
|
result = __setsockopt(fd->fd_Socket,level,optname,(void *)optval,optlen);
|
||||||
PROFILE_ON();
|
PROFILE_ON();
|
||||||
|
|
||||||
out:
|
out:
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: socket_shutdown.c,v 1.5 2006-01-08 12:04:24 obarthel Exp $
|
* $Id: socket_shutdown.c,v 1.6 2006-11-16 10:41:15 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -64,7 +64,7 @@ shutdown(int sockfd, int how)
|
|||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
PROFILE_OFF();
|
PROFILE_OFF();
|
||||||
result = __shutdown((LONG)fd->fd_DefaultFile,how);
|
result = __shutdown(fd->fd_Socket,how);
|
||||||
PROFILE_ON();
|
PROFILE_ON();
|
||||||
|
|
||||||
out:
|
out:
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
#define VERSION 1
|
#define VERSION 1
|
||||||
#define REVISION 201
|
#define REVISION 202
|
||||||
#define DATE "21.9.2006"
|
#define DATE "16.1.2007"
|
||||||
#define VERS "stack.lib 1.201"
|
#define VERS "stack.lib 1.202"
|
||||||
#define VSTRING "stack.lib 1.201 (21.9.2006)\r\n"
|
#define VSTRING "stack.lib 1.202 (16.1.2007)\r\n"
|
||||||
#define VERSTAG "\0$VER: stack.lib 1.201 (21.9.2006)"
|
#define VERSTAG "\0$VER: stack.lib 1.202 (16.1.2007)"
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
201
|
202
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: stat_fchmod.c,v 1.12 2006-01-08 12:04:24 obarthel Exp $
|
* $Id: stat_fchmod.c,v 1.13 2006-11-16 14:39:23 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -127,7 +127,7 @@ fchmod(int file_descriptor, mode_t mode)
|
|||||||
SET_FLAG(protection,FIBF_OTR_EXECUTE);
|
SET_FLAG(protection,FIBF_OTR_EXECUTE);
|
||||||
|
|
||||||
PROFILE_OFF();
|
PROFILE_OFF();
|
||||||
parent_dir = __safe_parent_of_file_handle(fd->fd_DefaultFile);
|
parent_dir = __safe_parent_of_file_handle(fd->fd_File);
|
||||||
PROFILE_ON();
|
PROFILE_ON();
|
||||||
|
|
||||||
if(parent_dir == ZERO)
|
if(parent_dir == ZERO)
|
||||||
@@ -139,7 +139,7 @@ fchmod(int file_descriptor, mode_t mode)
|
|||||||
}
|
}
|
||||||
|
|
||||||
PROFILE_OFF();
|
PROFILE_OFF();
|
||||||
success = __safe_examine_file_handle(fd->fd_DefaultFile,fib);
|
success = __safe_examine_file_handle(fd->fd_File,fib);
|
||||||
PROFILE_ON();
|
PROFILE_ON();
|
||||||
|
|
||||||
if(NO success)
|
if(NO success)
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: stat_headers.h,v 1.6 2006-01-08 12:04:24 obarthel Exp $
|
* $Id: stat_headers.h,v 1.7 2006-11-13 09:25:28 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -59,6 +59,7 @@ extern mode_t NOCOMMON __current_umask;
|
|||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
extern void __convert_file_info_to_stat(const struct MsgPort * file_system,const struct FileInfoBlock * fib,struct stat * st);
|
extern void __convert_file_info_to_stat(const struct MsgPort * file_system,const struct FileInfoBlock * fib,struct stat * st);
|
||||||
|
extern BPTR __lock(const char *name,const int mode,int * link_length,char * real_name,size_t real_name_size);
|
||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
|
|||||||
186
library/stat_lock.c
Normal file
186
library/stat_lock.c
Normal file
@@ -0,0 +1,186 @@
|
|||||||
|
/*
|
||||||
|
* $Id: stat_lock.c,v 1.1 2006-11-13 09:25:28 obarthel Exp $
|
||||||
|
*
|
||||||
|
* :ts=4
|
||||||
|
*
|
||||||
|
* Portable ISO 'C' (1994) runtime library for the Amiga computer
|
||||||
|
* Copyright (c) 2002-2006 by Olaf Barthel <olsen (at) sourcery.han.de>
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
*
|
||||||
|
* - Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* - Neither the name of Olaf Barthel nor the names of contributors
|
||||||
|
* may be used to endorse or promote products derived from this
|
||||||
|
* software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||||
|
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||||
|
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||||
|
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||||
|
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||||
|
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||||
|
* POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _STDLIB_NULL_POINTER_CHECK_H
|
||||||
|
#include "stdlib_null_pointer_check.h"
|
||||||
|
#endif /* _STDLIB_NULL_POINTER_CHECK_H */
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
|
#ifndef _STAT_HEADERS_H
|
||||||
|
#include "stat_headers.h"
|
||||||
|
#endif /* _STAT_HEADERS_H */
|
||||||
|
|
||||||
|
#ifndef _LOCALE_HEADERS_H
|
||||||
|
#include "locale_headers.h"
|
||||||
|
#endif /* _LOCALE_HEADERS_H */
|
||||||
|
|
||||||
|
#ifndef _TIME_HEADERS_H
|
||||||
|
#include "time_headers.h"
|
||||||
|
#endif /* _TIME_HEADERS_H */
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
|
/* The following is not part of the ISO 'C' (1994) standard. */
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* __lock(): An implementation of Lock() which remembers whether or
|
||||||
|
* not it resolved soft links.
|
||||||
|
*
|
||||||
|
* Unfortunately is is limited to 255 character names.
|
||||||
|
*/
|
||||||
|
|
||||||
|
BPTR
|
||||||
|
__lock(
|
||||||
|
const char * name,
|
||||||
|
const int mode,
|
||||||
|
int * link_length,
|
||||||
|
char * real_name,
|
||||||
|
size_t real_name_size)
|
||||||
|
{
|
||||||
|
D_S(struct bcpl_name,bname);
|
||||||
|
const size_t name_size = sizeof(bname->name);
|
||||||
|
char * new_name = NULL;
|
||||||
|
struct DevProc * dvp = NULL;
|
||||||
|
BPTR lock = ZERO;
|
||||||
|
size_t name_len;
|
||||||
|
LONG error;
|
||||||
|
|
||||||
|
assert( name != NULL && link_length != NULL );
|
||||||
|
|
||||||
|
if(real_name != NULL && real_name_size > 0)
|
||||||
|
strcpy(real_name,"");
|
||||||
|
|
||||||
|
name_len = strlen(name);
|
||||||
|
if(name_len >= name_size)
|
||||||
|
{
|
||||||
|
SetIoErr(ERROR_LINE_TOO_LONG);
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Convert the name into a BCPL string. */
|
||||||
|
bname->name[0] = name_len;
|
||||||
|
memmove(&bname->name[1],name,name_len);
|
||||||
|
|
||||||
|
while(TRUE)
|
||||||
|
{
|
||||||
|
/* Get a handle on the device, volume or assignment name in the path. */
|
||||||
|
dvp = GetDeviceProc((STRPTR)name,dvp);
|
||||||
|
if(dvp == NULL)
|
||||||
|
goto out;
|
||||||
|
|
||||||
|
/* Try to obtain a lock on the object. */
|
||||||
|
lock = DoPkt(dvp->dvp_Port,ACTION_LOCATE_OBJECT,dvp->dvp_Lock,MKBADDR(bname),mode,0,0);
|
||||||
|
if(lock != ZERO)
|
||||||
|
break;
|
||||||
|
|
||||||
|
error = IoErr();
|
||||||
|
|
||||||
|
if(error == ERROR_OBJECT_NOT_FOUND)
|
||||||
|
{
|
||||||
|
/* If this is part of a multi-volume assignment, try the next part. */
|
||||||
|
if(FLAG_IS_SET(dvp->dvp_Flags,DVPF_ASSIGN))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
/* Not much we can do here... */
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
else if (error == ERROR_IS_SOFT_LINK)
|
||||||
|
{
|
||||||
|
size_t new_name_size = name_size+1;
|
||||||
|
LONG result;
|
||||||
|
|
||||||
|
/* Provide as much buffer space as possible. */
|
||||||
|
if(real_name_size > new_name_size)
|
||||||
|
new_name_size = real_name_size;
|
||||||
|
|
||||||
|
/* For soft link resolution we need a temporary buffer to
|
||||||
|
let the file system store the resolved path name in. */
|
||||||
|
new_name = malloc(new_name_size);
|
||||||
|
if(new_name == NULL)
|
||||||
|
{
|
||||||
|
SetIoErr(ERROR_NO_FREE_STORE);
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Now ask the file system to resolve the entire path. */
|
||||||
|
result = ReadLink(dvp->dvp_Port,dvp->dvp_Lock,(STRPTR)name,(STRPTR)new_name,(LONG)new_name_size);
|
||||||
|
if(result < 0)
|
||||||
|
{
|
||||||
|
/* This will return either -1 (resolution error) or -2
|
||||||
|
(buffer too small). We regard both as trouble. */
|
||||||
|
SetIoErr(ERROR_INVALID_COMPONENT_NAME);
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
assert( result > 0 );
|
||||||
|
|
||||||
|
/* Remember the length of the link name. */
|
||||||
|
(*link_length) = result;
|
||||||
|
|
||||||
|
/* If the caller supplied a buffer, copy as much of the name
|
||||||
|
as possible into it. */
|
||||||
|
if(real_name != NULL && real_name_size > 0)
|
||||||
|
strlcpy(real_name,new_name,real_name_size);
|
||||||
|
|
||||||
|
/* Finished for now. */
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* Some other error; ask if the user wants to have another go at it. */
|
||||||
|
if(ErrorReport(error,REPORT_LOCK,dvp->dvp_Lock,dvp->dvp_Port) != 0)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Retry the lookup. */
|
||||||
|
FreeDeviceProc(dvp);
|
||||||
|
dvp = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
out:
|
||||||
|
|
||||||
|
error = IoErr();
|
||||||
|
|
||||||
|
if(new_name != NULL)
|
||||||
|
free(new_name);
|
||||||
|
|
||||||
|
if(dvp != NULL)
|
||||||
|
FreeDeviceProc(dvp);
|
||||||
|
|
||||||
|
SetIoErr(error);
|
||||||
|
|
||||||
|
return(lock);
|
||||||
|
}
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: stat_lstat.c,v 1.14 2006-09-21 09:24:20 obarthel Exp $
|
* $Id: stat_lstat.c,v 1.15 2006-11-13 09:25:28 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -55,118 +55,6 @@
|
|||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
/*
|
|
||||||
* lstat_lock(): An implementation of Lock() which remembers whether or
|
|
||||||
* not it resolved soft links.
|
|
||||||
*
|
|
||||||
* Unfortunately is is limited to 255 character names.
|
|
||||||
*/
|
|
||||||
|
|
||||||
static BPTR
|
|
||||||
lstat_lock(const char *name,const int mode,int * link_length)
|
|
||||||
{
|
|
||||||
D_S(struct bcpl_name,bname);
|
|
||||||
const size_t name_size = sizeof(bname->name);
|
|
||||||
char * new_name = NULL;
|
|
||||||
struct DevProc * dvp = NULL;
|
|
||||||
BPTR lock = ZERO;
|
|
||||||
size_t name_len;
|
|
||||||
LONG error;
|
|
||||||
|
|
||||||
assert( name != NULL && link_length != NULL );
|
|
||||||
|
|
||||||
name_len = strlen(name);
|
|
||||||
if(name_len >= name_size)
|
|
||||||
{
|
|
||||||
SetIoErr(ERROR_LINE_TOO_LONG);
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Convert the name into a BCPL string. */
|
|
||||||
bname->name[0] = name_len;
|
|
||||||
memmove(&bname->name[1],name,name_len);
|
|
||||||
|
|
||||||
while(TRUE)
|
|
||||||
{
|
|
||||||
/* Get a handle on the device, volume or assignment name in the path. */
|
|
||||||
dvp = GetDeviceProc((STRPTR)name,dvp);
|
|
||||||
if(dvp == NULL)
|
|
||||||
goto out;
|
|
||||||
|
|
||||||
/* Try to obtain a lock on the object. */
|
|
||||||
lock = DoPkt(dvp->dvp_Port,ACTION_LOCATE_OBJECT,dvp->dvp_Lock,MKBADDR(bname),mode,0,0);
|
|
||||||
if(lock != ZERO)
|
|
||||||
break;
|
|
||||||
|
|
||||||
error = IoErr();
|
|
||||||
|
|
||||||
if(error == ERROR_OBJECT_NOT_FOUND)
|
|
||||||
{
|
|
||||||
/* If this is part of a multi-volume assignment, try the next part. */
|
|
||||||
if(FLAG_IS_SET(dvp->dvp_Flags,DVPF_ASSIGN))
|
|
||||||
continue;
|
|
||||||
|
|
||||||
/* Not much we can do here... */
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
else if (error == ERROR_IS_SOFT_LINK)
|
|
||||||
{
|
|
||||||
LONG result;
|
|
||||||
|
|
||||||
/* For soft link resolution we need a temporary buffer to
|
|
||||||
let the file system store the resolved path name in. */
|
|
||||||
new_name = malloc(name_size);
|
|
||||||
if(new_name == NULL)
|
|
||||||
{
|
|
||||||
SetIoErr(ERROR_NO_FREE_STORE);
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Now ask the file system to resolve the entire path. */
|
|
||||||
result = ReadLink(dvp->dvp_Port,dvp->dvp_Lock,(STRPTR)name,(STRPTR)new_name,name_size);
|
|
||||||
|
|
||||||
if(result < 0)
|
|
||||||
{
|
|
||||||
/* This will return either -1 (resolution error) or -2
|
|
||||||
(buffer too small). We regard both as trouble. */
|
|
||||||
SetIoErr(ERROR_INVALID_COMPONENT_NAME);
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
|
|
||||||
assert( result > 0 );
|
|
||||||
|
|
||||||
/* Remember the length of the link name. */
|
|
||||||
(*link_length) = result;
|
|
||||||
|
|
||||||
/* Finished for now. */
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
/* Some other error; ask if the user wants to have another go at it. */
|
|
||||||
if(ErrorReport(error,REPORT_LOCK,dvp->dvp_Lock,dvp->dvp_Port) != 0)
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Retry the lookup. */
|
|
||||||
FreeDeviceProc(dvp);
|
|
||||||
dvp = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
out:
|
|
||||||
|
|
||||||
error = IoErr();
|
|
||||||
|
|
||||||
if(new_name != NULL)
|
|
||||||
free(new_name);
|
|
||||||
|
|
||||||
FreeDeviceProc(dvp);
|
|
||||||
|
|
||||||
SetIoErr(error);
|
|
||||||
|
|
||||||
return(lock);
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
int
|
||||||
lstat(const char * path_name, struct stat * st)
|
lstat(const char * path_name, struct stat * st)
|
||||||
{
|
{
|
||||||
@@ -247,7 +135,7 @@ lstat(const char * path_name, struct stat * st)
|
|||||||
D(("trying to get a lock on '%s'",path_name));
|
D(("trying to get a lock on '%s'",path_name));
|
||||||
|
|
||||||
PROFILE_OFF();
|
PROFILE_OFF();
|
||||||
file_lock = lstat_lock(path_name,SHARED_LOCK,&link_length);
|
file_lock = __lock(path_name,SHARED_LOCK,&link_length,NULL,0);
|
||||||
PROFILE_ON();
|
PROFILE_ON();
|
||||||
|
|
||||||
if(file_lock == ZERO && link_length < 0)
|
if(file_lock == ZERO && link_length < 0)
|
||||||
|
|||||||
72
library/stdio_change_fd_action.c
Normal file
72
library/stdio_change_fd_action.c
Normal file
@@ -0,0 +1,72 @@
|
|||||||
|
/*
|
||||||
|
* $Id: stdio_change_fd_action.c,v 1.1 2006-11-15 09:17:04 obarthel Exp $
|
||||||
|
*
|
||||||
|
* :ts=4
|
||||||
|
*
|
||||||
|
* Portable ISO 'C' (1994) runtime library for the Amiga computer
|
||||||
|
* Copyright (c) 2002-2006 by Olaf Barthel <olsen (at) sourcery.han.de>
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
*
|
||||||
|
* - Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* - Neither the name of Olaf Barthel nor the names of contributors
|
||||||
|
* may be used to endorse or promote products derived from this
|
||||||
|
* software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||||
|
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||||
|
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||||
|
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||||
|
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||||
|
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||||
|
* POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _STDIO_HEADERS_H
|
||||||
|
#include "stdio_headers.h"
|
||||||
|
#endif /* _STDIO_HEADERS_H */
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
|
int
|
||||||
|
__change_fd_action(
|
||||||
|
int file_descriptor,
|
||||||
|
_file_action_fd_t new_action,
|
||||||
|
_file_action_fd_t * old_action_ptr)
|
||||||
|
{
|
||||||
|
int result = -1;
|
||||||
|
struct fd * fd;
|
||||||
|
|
||||||
|
if(old_action_ptr != NULL)
|
||||||
|
(*old_action_ptr) = NULL;
|
||||||
|
|
||||||
|
__stdio_lock();
|
||||||
|
|
||||||
|
fd = __get_file_descriptor(file_descriptor);
|
||||||
|
if(fd != NULL)
|
||||||
|
{
|
||||||
|
__fd_lock(fd);
|
||||||
|
|
||||||
|
if(old_action_ptr != NULL)
|
||||||
|
(*old_action_ptr) = (_file_action_fd_t)fd->fd_Action;
|
||||||
|
|
||||||
|
fd->fd_Action = (file_action_fd_t)new_action;
|
||||||
|
|
||||||
|
__fd_unlock(fd);
|
||||||
|
|
||||||
|
result = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
__stdio_unlock();
|
||||||
|
|
||||||
|
return(result);
|
||||||
|
}
|
||||||
72
library/stdio_change_fd_user_data.c
Normal file
72
library/stdio_change_fd_user_data.c
Normal file
@@ -0,0 +1,72 @@
|
|||||||
|
/*
|
||||||
|
* $Id: stdio_change_fd_user_data.c,v 1.1 2006-11-15 09:17:04 obarthel Exp $
|
||||||
|
*
|
||||||
|
* :ts=4
|
||||||
|
*
|
||||||
|
* Portable ISO 'C' (1994) runtime library for the Amiga computer
|
||||||
|
* Copyright (c) 2002-2006 by Olaf Barthel <olsen (at) sourcery.han.de>
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
*
|
||||||
|
* - Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* - Neither the name of Olaf Barthel nor the names of contributors
|
||||||
|
* may be used to endorse or promote products derived from this
|
||||||
|
* software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||||
|
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||||
|
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||||
|
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||||
|
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||||
|
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||||
|
* POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _STDIO_HEADERS_H
|
||||||
|
#include "stdio_headers.h"
|
||||||
|
#endif /* _STDIO_HEADERS_H */
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
|
int
|
||||||
|
__change_fd_user_data(
|
||||||
|
int file_descriptor,
|
||||||
|
void * new_user_data,
|
||||||
|
void ** old_user_data_ptr)
|
||||||
|
{
|
||||||
|
int result = -1;
|
||||||
|
struct fd * fd;
|
||||||
|
|
||||||
|
if(old_user_data_ptr != NULL)
|
||||||
|
(*old_user_data_ptr) = NULL;
|
||||||
|
|
||||||
|
__stdio_lock();
|
||||||
|
|
||||||
|
fd = __get_file_descriptor(file_descriptor);
|
||||||
|
if(fd != NULL)
|
||||||
|
{
|
||||||
|
__fd_lock(fd);
|
||||||
|
|
||||||
|
if(old_user_data_ptr != NULL)
|
||||||
|
(*old_user_data_ptr) = fd->fd_UserData;
|
||||||
|
|
||||||
|
fd->fd_UserData = new_user_data;
|
||||||
|
|
||||||
|
__fd_unlock(fd);
|
||||||
|
|
||||||
|
result = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
__stdio_unlock();
|
||||||
|
|
||||||
|
return(result);
|
||||||
|
}
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: stdio_duplicate_fd.c,v 1.5 2006-01-08 12:04:24 obarthel Exp $
|
* $Id: stdio_duplicate_fd.c,v 1.6 2006-10-10 13:39:26 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -55,8 +55,8 @@ __duplicate_fd(struct fd * duplicate_fd,struct fd * original_fd)
|
|||||||
duplicate_fd->fd_Original = original_fd;
|
duplicate_fd->fd_Original = original_fd;
|
||||||
|
|
||||||
/* Add the duplicate at the beginning of the list. */
|
/* Add the duplicate at the beginning of the list. */
|
||||||
duplicate_fd->fd_NextLink = duplicate_fd->fd_Original->fd_NextLink;
|
duplicate_fd->fd_NextAlias = duplicate_fd->fd_Original->fd_NextAlias;
|
||||||
duplicate_fd->fd_Original->fd_NextLink = duplicate_fd;
|
duplicate_fd->fd_Original->fd_NextAlias = duplicate_fd;
|
||||||
|
|
||||||
__fd_unlock(original_fd);
|
__fd_unlock(original_fd);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: stdio_fdhookentry.c,v 1.33 2006-09-20 19:46:57 obarthel Exp $
|
* $Id: stdio_fdhookentry.c,v 1.34 2006-11-16 14:39:23 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -81,64 +81,7 @@ __fd_hook_entry(
|
|||||||
|
|
||||||
__fd_lock(fd);
|
__fd_lock(fd);
|
||||||
|
|
||||||
#if defined(__THREAD_SAFE)
|
file = __resolve_fd_file(fd);
|
||||||
{
|
|
||||||
/* Check if this file should be dynamically bound to one of the
|
|
||||||
three standard I/O streams. */
|
|
||||||
if(FLAG_IS_SET(fd->fd_Flags,FDF_STDIO))
|
|
||||||
{
|
|
||||||
switch(fd->fd_DefaultFile)
|
|
||||||
{
|
|
||||||
case STDIN_FILENO:
|
|
||||||
|
|
||||||
file = Input();
|
|
||||||
break;
|
|
||||||
|
|
||||||
case STDOUT_FILENO:
|
|
||||||
|
|
||||||
file = Output();
|
|
||||||
break;
|
|
||||||
|
|
||||||
case STDERR_FILENO:
|
|
||||||
|
|
||||||
#if defined(__amigaos4__)
|
|
||||||
{
|
|
||||||
file = ErrorOutput();
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
{
|
|
||||||
struct Process * this_process = (struct Process *)FindTask(NULL);
|
|
||||||
|
|
||||||
file = this_process->pr_CES;
|
|
||||||
}
|
|
||||||
#endif /* __amigaos4__ */
|
|
||||||
|
|
||||||
/* The following is rather controversial; if the standard error stream
|
|
||||||
is unavailable, we default to reuse the standard output stream. This
|
|
||||||
is problematic if the standard output stream was redirected and should
|
|
||||||
not be the same as the standard error output stream. */
|
|
||||||
if(file == ZERO)
|
|
||||||
file = Output();
|
|
||||||
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
|
|
||||||
file = ZERO;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
file = fd->fd_DefaultFile;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
{
|
|
||||||
file = fd->fd_DefaultFile;
|
|
||||||
}
|
|
||||||
#endif /* __THREAD_SAFE */
|
|
||||||
|
|
||||||
if(file == ZERO)
|
if(file == ZERO)
|
||||||
{
|
{
|
||||||
SHOWMSG("file is closed");
|
SHOWMSG("file is closed");
|
||||||
@@ -246,7 +189,7 @@ __fd_hook_entry(
|
|||||||
{
|
{
|
||||||
/* Should we reset this file into line buffered mode? */
|
/* Should we reset this file into line buffered mode? */
|
||||||
if(FLAG_IS_SET(fd->fd_Flags,FDF_NON_BLOCKING) && FLAG_IS_SET(fd->fd_Flags,FDF_IS_INTERACTIVE))
|
if(FLAG_IS_SET(fd->fd_Flags,FDF_NON_BLOCKING) && FLAG_IS_SET(fd->fd_Flags,FDF_IS_INTERACTIVE))
|
||||||
SetMode(fd->fd_DefaultFile,DOSFALSE);
|
SetMode(fd->fd_File,DOSFALSE);
|
||||||
|
|
||||||
/* Are we allowed to close this file? */
|
/* Are we allowed to close this file? */
|
||||||
if(FLAG_IS_CLEAR(fd->fd_Flags,FDF_NO_CLOSE))
|
if(FLAG_IS_CLEAR(fd->fd_Flags,FDF_NO_CLOSE))
|
||||||
@@ -265,14 +208,14 @@ __fd_hook_entry(
|
|||||||
|
|
||||||
PROFILE_OFF();
|
PROFILE_OFF();
|
||||||
|
|
||||||
parent_dir = __safe_parent_of_file_handle(fd->fd_DefaultFile);
|
parent_dir = __safe_parent_of_file_handle(fd->fd_File);
|
||||||
if(parent_dir != ZERO)
|
if(parent_dir != ZERO)
|
||||||
{
|
{
|
||||||
if(__safe_examine_file_handle(fd->fd_DefaultFile,fib))
|
if(__safe_examine_file_handle(fd->fd_File,fib))
|
||||||
name_and_path_valid = TRUE;
|
name_and_path_valid = TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(CANNOT Close(fd->fd_DefaultFile))
|
if(CANNOT Close(fd->fd_File))
|
||||||
{
|
{
|
||||||
fam->fam_Error = __translate_io_error_to_errno(IoErr());
|
fam->fam_Error = __translate_io_error_to_errno(IoErr());
|
||||||
|
|
||||||
@@ -281,7 +224,7 @@ __fd_hook_entry(
|
|||||||
|
|
||||||
PROFILE_ON();
|
PROFILE_ON();
|
||||||
|
|
||||||
fd->fd_DefaultFile = ZERO;
|
fd->fd_File = ZERO;
|
||||||
|
|
||||||
#if defined(UNIX_PATH_SEMANTICS)
|
#if defined(UNIX_PATH_SEMANTICS)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: stdio_file_init.c,v 1.11 2006-01-08 12:04:24 obarthel Exp $
|
* $Id: stdio_file_init.c,v 1.12 2006-11-16 14:39:23 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -321,7 +321,7 @@ FILE_CONSTRUCTOR(stdio_file_init)
|
|||||||
if(__WBenchMsg != NULL)
|
if(__WBenchMsg != NULL)
|
||||||
{
|
{
|
||||||
PROFILE_OFF();
|
PROFILE_OFF();
|
||||||
__fd[STDERR_FILENO]->fd_DefaultFile = Output();
|
__fd[STDERR_FILENO]->fd_File = Output();
|
||||||
PROFILE_ON();
|
PROFILE_ON();
|
||||||
|
|
||||||
SET_FLAG(__fd[STDERR_FILENO]->fd_Flags,FDF_NO_CLOSE);
|
SET_FLAG(__fd[STDERR_FILENO]->fd_Flags,FDF_NO_CLOSE);
|
||||||
@@ -351,13 +351,13 @@ FILE_CONSTRUCTOR(stdio_file_init)
|
|||||||
Otherwise, try to duplicate the standard output stream. */
|
Otherwise, try to duplicate the standard output stream. */
|
||||||
if(ces != ZERO)
|
if(ces != ZERO)
|
||||||
{
|
{
|
||||||
__fd[STDERR_FILENO]->fd_DefaultFile = ces;
|
__fd[STDERR_FILENO]->fd_File = ces;
|
||||||
|
|
||||||
SET_FLAG(__fd[STDERR_FILENO]->fd_Flags,FDF_NO_CLOSE);
|
SET_FLAG(__fd[STDERR_FILENO]->fd_Flags,FDF_NO_CLOSE);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
__fd[STDERR_FILENO]->fd_DefaultFile = Open("CONSOLE:",MODE_NEWFILE);
|
__fd[STDERR_FILENO]->fd_File = Open("CONSOLE:",MODE_NEWFILE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -366,7 +366,7 @@ FILE_CONSTRUCTOR(stdio_file_init)
|
|||||||
/* Figure out if the standard error stream is bound to a console. */
|
/* Figure out if the standard error stream is bound to a console. */
|
||||||
if(FLAG_IS_CLEAR(__fd[STDERR_FILENO]->fd_Flags,FDF_STDIO))
|
if(FLAG_IS_CLEAR(__fd[STDERR_FILENO]->fd_Flags,FDF_STDIO))
|
||||||
{
|
{
|
||||||
if(IsInteractive(__fd[STDERR_FILENO]->fd_DefaultFile))
|
if(IsInteractive(__fd[STDERR_FILENO]->fd_File))
|
||||||
SET_FLAG(__fd[STDERR_FILENO]->fd_Flags,FDF_IS_INTERACTIVE);
|
SET_FLAG(__fd[STDERR_FILENO]->fd_Flags,FDF_IS_INTERACTIVE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: stdio_fwrite.c,v 1.10 2006-01-08 12:04:24 obarthel Exp $
|
* $Id: stdio_fwrite.c,v 1.11 2006-09-25 15:38:21 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -104,7 +104,7 @@ fwrite(const void *ptr,size_t element_size,size_t count,FILE *stream)
|
|||||||
|
|
||||||
if(element_size > 0 && count > 0)
|
if(element_size > 0 && count > 0)
|
||||||
{
|
{
|
||||||
unsigned char * data = (unsigned char *)ptr;
|
const unsigned char * data = (unsigned char *)ptr;
|
||||||
unsigned char c;
|
unsigned char c;
|
||||||
int buffer_mode;
|
int buffer_mode;
|
||||||
size_t total_bytes_written = 0;
|
size_t total_bytes_written = 0;
|
||||||
|
|||||||
48
library/stdio_get_fd.c
Normal file
48
library/stdio_get_fd.c
Normal file
@@ -0,0 +1,48 @@
|
|||||||
|
/*
|
||||||
|
* $Id: stdio_get_fd.c,v 1.1 2006-11-15 09:17:04 obarthel Exp $
|
||||||
|
*
|
||||||
|
* :ts=4
|
||||||
|
*
|
||||||
|
* Portable ISO 'C' (1994) runtime library for the Amiga computer
|
||||||
|
* Copyright (c) 2002-2006 by Olaf Barthel <olsen (at) sourcery.han.de>
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
*
|
||||||
|
* - Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* - Neither the name of Olaf Barthel nor the names of contributors
|
||||||
|
* may be used to endorse or promote products derived from this
|
||||||
|
* software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||||
|
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||||
|
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||||
|
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||||
|
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||||
|
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||||
|
* POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _STDIO_HEADERS_H
|
||||||
|
#include "stdio_headers.h"
|
||||||
|
#endif /* _STDIO_HEADERS_H */
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
|
struct _fd *
|
||||||
|
__get_fd(int file_descriptor)
|
||||||
|
{
|
||||||
|
struct _fd * result;
|
||||||
|
|
||||||
|
result = (struct _fd *)__get_file_descriptor(file_descriptor);
|
||||||
|
|
||||||
|
return(result);
|
||||||
|
}
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: stdio_grow_file.c,v 1.6 2006-01-08 12:04:24 obarthel Exp $
|
* $Id: stdio_grow_file.c,v 1.7 2006-11-16 14:39:23 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -70,7 +70,7 @@ __grow_file_size(struct fd * fd,int num_bytes)
|
|||||||
|
|
||||||
assert( FLAG_IS_CLEAR(fd->fd_Flags,FDF_STDIO) );
|
assert( FLAG_IS_CLEAR(fd->fd_Flags,FDF_STDIO) );
|
||||||
|
|
||||||
fh = BADDR(fd->fd_DefaultFile);
|
fh = BADDR(fd->fd_File);
|
||||||
if(fh != NULL && fh->fh_Type != NULL && DoPkt(fh->fh_Type,ACTION_DISK_INFO,MKBADDR(id),0,0,0,0))
|
if(fh != NULL && fh->fh_Type != NULL && DoPkt(fh->fh_Type,ACTION_DISK_INFO,MKBADDR(id),0,0,0,0))
|
||||||
block_size = id->id_BytesPerBlock;
|
block_size = id->id_BytesPerBlock;
|
||||||
|
|
||||||
@@ -105,7 +105,7 @@ __grow_file_size(struct fd * fd,int num_bytes)
|
|||||||
memset(aligned_buffer,0,(size_t)buffer_size);
|
memset(aligned_buffer,0,(size_t)buffer_size);
|
||||||
|
|
||||||
PROFILE_OFF();
|
PROFILE_OFF();
|
||||||
seek_position = Seek(fd->fd_DefaultFile,0,OFFSET_END);
|
seek_position = Seek(fd->fd_File,0,OFFSET_END);
|
||||||
PROFILE_ON();
|
PROFILE_ON();
|
||||||
|
|
||||||
if(seek_position == SEEK_ERROR && IoErr() != OK)
|
if(seek_position == SEEK_ERROR && IoErr() != OK)
|
||||||
@@ -117,7 +117,7 @@ __grow_file_size(struct fd * fd,int num_bytes)
|
|||||||
position = (off_t)seek_position;
|
position = (off_t)seek_position;
|
||||||
|
|
||||||
PROFILE_OFF();
|
PROFILE_OFF();
|
||||||
seek_position = Seek(fd->fd_DefaultFile,0,OFFSET_CURRENT);
|
seek_position = Seek(fd->fd_File,0,OFFSET_CURRENT);
|
||||||
PROFILE_ON();
|
PROFILE_ON();
|
||||||
|
|
||||||
current_position = (off_t)seek_position;
|
current_position = (off_t)seek_position;
|
||||||
@@ -147,7 +147,7 @@ __grow_file_size(struct fd * fd,int num_bytes)
|
|||||||
alignment_skip = 0;
|
alignment_skip = 0;
|
||||||
|
|
||||||
PROFILE_OFF();
|
PROFILE_OFF();
|
||||||
bytes_written = Write(fd->fd_DefaultFile,aligned_buffer,size);
|
bytes_written = Write(fd->fd_File,aligned_buffer,size);
|
||||||
PROFILE_ON();
|
PROFILE_ON();
|
||||||
|
|
||||||
if(bytes_written != size)
|
if(bytes_written != size)
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: stdio_headers.h,v 1.26 2006-09-20 19:46:57 obarthel Exp $
|
* $Id: stdio_headers.h,v 1.30 2006-11-16 14:39:23 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -144,6 +144,12 @@
|
|||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
|
#ifndef _SYS_CLIB2_IO_H
|
||||||
|
#include <sys/clib2_io.h>
|
||||||
|
#endif /* _SYS_CLIB2_IO_H */
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
/* Forward declarations for below... */
|
/* Forward declarations for below... */
|
||||||
struct fd;
|
struct fd;
|
||||||
struct iob;
|
struct iob;
|
||||||
@@ -173,42 +179,6 @@ struct iob;
|
|||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
/* Operations that can be performed by the file action function. */
|
|
||||||
enum file_action_t
|
|
||||||
{
|
|
||||||
file_action_read,
|
|
||||||
file_action_write,
|
|
||||||
file_action_seek,
|
|
||||||
file_action_close,
|
|
||||||
file_action_set_blocking,
|
|
||||||
file_action_set_async,
|
|
||||||
file_action_examine
|
|
||||||
};
|
|
||||||
|
|
||||||
/****************************************************************************/
|
|
||||||
|
|
||||||
/* A message sent to a file action function. */
|
|
||||||
struct file_action_message
|
|
||||||
{
|
|
||||||
enum file_action_t fam_Action; /* What to do */
|
|
||||||
char * fam_Data; /* Where to read/write the data */
|
|
||||||
int fam_Size; /* How much data to write */
|
|
||||||
|
|
||||||
long int fam_Offset; /* The seek offset */
|
|
||||||
int fam_Mode; /* The seek mode */
|
|
||||||
|
|
||||||
int fam_Arg; /* Whether or not this file should
|
|
||||||
be set non-blocking or use
|
|
||||||
asynchronous I/O */
|
|
||||||
|
|
||||||
struct FileInfoBlock * fam_FileInfo;
|
|
||||||
struct MsgPort * fam_FileSystem;
|
|
||||||
|
|
||||||
int fam_Error; /* Error code, if any... */
|
|
||||||
};
|
|
||||||
|
|
||||||
/****************************************************************************/
|
|
||||||
|
|
||||||
/* The file action function for buffered files. */
|
/* The file action function for buffered files. */
|
||||||
typedef int (*file_action_iob_t)(struct iob * iob,struct file_action_message * fam);
|
typedef int (*file_action_iob_t)(struct iob * iob,struct file_action_message * fam);
|
||||||
|
|
||||||
@@ -342,31 +312,6 @@ struct iob
|
|||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
#define FDF_READ (1UL<<0) /* Data can be read from this file */
|
|
||||||
#define FDF_WRITE (1UL<<1) /* Data can be written to this file */
|
|
||||||
#define FDF_APPEND (1UL<<2) /* Before any data is written to it,
|
|
||||||
the file position must be set to the
|
|
||||||
end of the file */
|
|
||||||
#define FDF_NO_CLOSE (1UL<<3) /* Never close this file */
|
|
||||||
#define FDF_NON_BLOCKING (1UL<<4) /* File was switched into non-blocking
|
|
||||||
mode (console streams only) */
|
|
||||||
#define FDF_IS_SOCKET (1UL<<5) /* This is not a disk file but a socket */
|
|
||||||
#define FDF_IS_LOCKED (1UL<<6) /* This file has an advisory record lock set */
|
|
||||||
#define FDF_IN_USE (1UL<<7) /* This file is in use */
|
|
||||||
#define FDF_CREATED (1UL<<8) /* This file was newly created and may need
|
|
||||||
to have its protection bits updated after
|
|
||||||
it has been closed */
|
|
||||||
#define FDF_CACHE_POSITION (1UL<<9) /* Cache the file position. */
|
|
||||||
#define FDF_ASYNC_IO (1UL<<10) /* File was switched into asynchronous I/O
|
|
||||||
mode (sockets only). */
|
|
||||||
#define FDF_IS_INTERACTIVE (1UL<<11) /* File is attached to a console window or
|
|
||||||
something like it. */
|
|
||||||
#define FDF_STDIO (1UL<<12) /* File is to be attached to one of the
|
|
||||||
standard input/output/error streams. */
|
|
||||||
#define FDF_TERMIOS (1UL<<13) /* File is under termios control.
|
|
||||||
FDF_IS_INTERACTIVE should also be set. */
|
|
||||||
/****************************************************************************/
|
|
||||||
|
|
||||||
/* The file action function for unbuffered files. */
|
/* The file action function for unbuffered files. */
|
||||||
typedef int (*file_action_fd_t)(struct fd * fd,struct file_action_message * fam);
|
typedef int (*file_action_fd_t)(struct fd * fd,struct file_action_message * fam);
|
||||||
|
|
||||||
@@ -379,19 +324,32 @@ typedef void (*fd_cleanup_t)(struct fd * fd);
|
|||||||
|
|
||||||
struct fd
|
struct fd
|
||||||
{
|
{
|
||||||
|
int fd_Version; /* Version number of this definition
|
||||||
|
of the 'fd' data structure. */
|
||||||
file_action_fd_t fd_Action; /* Function to invoke to perform actions */
|
file_action_fd_t fd_Action; /* Function to invoke to perform actions */
|
||||||
|
void * fd_UserData; /* To be used by custom file action
|
||||||
|
functions */
|
||||||
ULONG fd_Flags; /* File properties */
|
ULONG fd_Flags; /* File properties */
|
||||||
struct fd * fd_Original; /* NULL if this is not a dup()ed file
|
|
||||||
descriptor; points to original
|
union
|
||||||
descriptor if non-NULL */
|
{
|
||||||
struct fd * fd_NextLink; /* Points to next duplicate of this
|
BPTR fdu_File; /* A dos.library file handle */
|
||||||
file descriptor; NULL for none */
|
LONG fdu_Socket; /* A socket identifier */
|
||||||
BPTR fd_DefaultFile; /* A dos.library file handle */
|
} fdu_Default;
|
||||||
|
|
||||||
|
/************************************************************************/
|
||||||
|
/* Public portion ends here */
|
||||||
|
/************************************************************************/
|
||||||
|
|
||||||
|
struct SignalSemaphore * fd_Lock; /* For thread locking */
|
||||||
ULONG fd_Position; /* Cached file position (seek offset). */
|
ULONG fd_Position; /* Cached file position (seek offset). */
|
||||||
fd_cleanup_t fd_Cleanup; /* Cleanup function, if any. */
|
fd_cleanup_t fd_Cleanup; /* Cleanup function, if any. */
|
||||||
|
|
||||||
struct SignalSemaphore * fd_Lock; /* For thread locking */
|
struct fd * fd_Original; /* NULL if this is not a dup()ed file
|
||||||
|
descriptor; points to original
|
||||||
|
descriptor if non-NULL */
|
||||||
|
struct fd * fd_NextAlias; /* Points to next duplicate of this
|
||||||
|
file descriptor; NULL for none */
|
||||||
void * fd_Aux; /* Auxilliary data for "special" files,
|
void * fd_Aux; /* Auxilliary data for "special" files,
|
||||||
e.g. termios support. */
|
e.g. termios support. */
|
||||||
};
|
};
|
||||||
@@ -433,7 +391,7 @@ extern int NOCOMMON __num_fd;
|
|||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
extern char * NOCOMMON __file_lock_semaphore_name;
|
extern const char * NOCOMMON __file_lock_semaphore_name;
|
||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
@@ -481,7 +439,7 @@ extern BOOL NOCOMMON __no_standard_io;
|
|||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
#define __fd_is_aliased(fd) \
|
#define __fd_is_aliased(fd) \
|
||||||
((fd)->fd_Original != NULL || (fd)->fd_NextLink != NULL)
|
((fd)->fd_Original != NULL || (fd)->fd_NextAlias != NULL)
|
||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
@@ -501,6 +459,10 @@ extern void __fd_unlock(struct fd *fd);
|
|||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
|
extern BPTR __resolve_fd_file(struct fd * fd);
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
@@ -517,6 +479,10 @@ extern void __fd_unlock(struct fd *fd);
|
|||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
|
#define __resolve_fd_file(fd) (fd->fd_File)
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
#endif /* __THREAD_SAFE */
|
#endif /* __THREAD_SAFE */
|
||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: stdio_initializefd.c,v 1.6 2006-01-08 12:04:24 obarthel Exp $
|
* $Id: stdio_initializefd.c,v 1.7 2006-10-10 13:39:26 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -49,6 +49,7 @@ __initialize_fd(
|
|||||||
|
|
||||||
memset(fd,0,sizeof(*fd));
|
memset(fd,0,sizeof(*fd));
|
||||||
|
|
||||||
|
fd->fd_Version = 1;
|
||||||
fd->fd_DefaultFile = default_file;
|
fd->fd_DefaultFile = default_file;
|
||||||
fd->fd_Flags = flags;
|
fd->fd_Flags = flags;
|
||||||
fd->fd_Action = action_function;
|
fd->fd_Action = action_function;
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: stdio_locksemaphorename.c,v 1.5 2006-09-22 09:02:51 obarthel Exp $
|
* $Id: stdio_locksemaphorename.c,v 1.6 2006-09-25 14:05:31 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -37,4 +37,4 @@
|
|||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
char * NOCOMMON __file_lock_semaphore_name = (char *)"Advisory File Locking";
|
const char * NOCOMMON __file_lock_semaphore_name = "Advisory File Locking";
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: stdio_record_locking.c,v 1.16 2006-04-05 08:39:45 obarthel Exp $
|
* $Id: stdio_record_locking.c,v 1.19 2006-11-16 14:39:23 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -75,7 +75,7 @@ struct FileLockNode
|
|||||||
struct MinList fln_LockedRegionList; /* List of locked regions */
|
struct MinList fln_LockedRegionList; /* List of locked regions */
|
||||||
|
|
||||||
BPTR fln_FileParentDir; /* Refers to the file's parent directory */
|
BPTR fln_FileParentDir; /* Refers to the file's parent directory */
|
||||||
UBYTE fln_FileName[1]; /* Name of the file; together with the
|
char fln_FileName[1]; /* Name of the file; together with the
|
||||||
* parent directory, this should uniquely
|
* parent directory, this should uniquely
|
||||||
* identify the file.
|
* identify the file.
|
||||||
*/
|
*/
|
||||||
@@ -298,7 +298,7 @@ remove_locked_region_node(struct FileLockSemaphore * fls,struct fd * fd,LONG sta
|
|||||||
/* Find the locked file this descriptor
|
/* Find the locked file this descriptor
|
||||||
* buffer belongs to.
|
* buffer belongs to.
|
||||||
*/
|
*/
|
||||||
if(find_file_lock_node_by_file_handle(fls,fd->fd_DefaultFile,&which_lock) == OK)
|
if(find_file_lock_node_by_file_handle(fls,fd->fd_File,&which_lock) == OK)
|
||||||
{
|
{
|
||||||
struct LockedRegionNode * lrn;
|
struct LockedRegionNode * lrn;
|
||||||
struct LockedRegionNode * lrn_next;
|
struct LockedRegionNode * lrn_next;
|
||||||
@@ -342,7 +342,7 @@ remove_locked_region_node(struct FileLockSemaphore * fls,struct fd * fd,LONG sta
|
|||||||
{
|
{
|
||||||
CLEAR_FLAG(fd->fd_Flags,FDF_IS_LOCKED);
|
CLEAR_FLAG(fd->fd_Flags,FDF_IS_LOCKED);
|
||||||
}
|
}
|
||||||
while((fd = fd->fd_NextLink) != NULL);
|
while((fd = fd->fd_NextAlias) != NULL);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -434,7 +434,7 @@ create_file_lock_node(struct fd * fd,struct FileLockNode ** result_ptr)
|
|||||||
* and the name of the file for later use in
|
* and the name of the file for later use in
|
||||||
* comparisons.
|
* comparisons.
|
||||||
*/
|
*/
|
||||||
if(CANNOT __safe_examine_file_handle(fd->fd_DefaultFile,fib))
|
if(CANNOT __safe_examine_file_handle(fd->fd_File,fib))
|
||||||
{
|
{
|
||||||
SHOWMSG("couldn't examine file handle");
|
SHOWMSG("couldn't examine file handle");
|
||||||
|
|
||||||
@@ -453,7 +453,7 @@ create_file_lock_node(struct fd * fd,struct FileLockNode ** result_ptr)
|
|||||||
|
|
||||||
memset(fln,0,sizeof(*fln));
|
memset(fln,0,sizeof(*fln));
|
||||||
|
|
||||||
fln->fln_FileParentDir = __safe_parent_of_file_handle(fd->fd_DefaultFile);
|
fln->fln_FileParentDir = __safe_parent_of_file_handle(fd->fd_File);
|
||||||
if(fln->fln_FileParentDir == ZERO)
|
if(fln->fln_FileParentDir == ZERO)
|
||||||
{
|
{
|
||||||
SHOWMSG("couldn't get parent directory");
|
SHOWMSG("couldn't get parent directory");
|
||||||
@@ -462,7 +462,7 @@ create_file_lock_node(struct fd * fd,struct FileLockNode ** result_ptr)
|
|||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
strcpy((char *)fln->fln_FileName,fib->fib_FileName);
|
strcpy(fln->fln_FileName,fib->fib_FileName);
|
||||||
|
|
||||||
NewList((struct List *)&fln->fln_LockedRegionList);
|
NewList((struct List *)&fln->fln_LockedRegionList);
|
||||||
|
|
||||||
@@ -678,7 +678,7 @@ cleanup_locked_records(struct fd * fd)
|
|||||||
fls = obtain_file_lock_semaphore(FALSE);
|
fls = obtain_file_lock_semaphore(FALSE);
|
||||||
if(fls != NULL)
|
if(fls != NULL)
|
||||||
{
|
{
|
||||||
BPTR file_handle = fd->fd_DefaultFile;
|
BPTR file_handle = fd->fd_File;
|
||||||
struct FileLockNode * which_lock = NULL;
|
struct FileLockNode * which_lock = NULL;
|
||||||
pid_t this_task = getpid();
|
pid_t this_task = getpid();
|
||||||
LONG error;
|
LONG error;
|
||||||
@@ -725,7 +725,7 @@ cleanup_locked_records(struct fd * fd)
|
|||||||
{
|
{
|
||||||
CLEAR_FLAG(fd->fd_Flags,FDF_IS_LOCKED);
|
CLEAR_FLAG(fd->fd_Flags,FDF_IS_LOCKED);
|
||||||
}
|
}
|
||||||
while((fd = fd->fd_NextLink) != NULL);
|
while((fd = fd->fd_NextAlias) != NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
release_file_lock_semaphore(fls);
|
release_file_lock_semaphore(fls);
|
||||||
@@ -741,7 +741,7 @@ int
|
|||||||
__handle_record_locking(int cmd,struct flock * l,struct fd * fd,int * error_ptr)
|
__handle_record_locking(int cmd,struct flock * l,struct fd * fd,int * error_ptr)
|
||||||
{
|
{
|
||||||
struct FileLockSemaphore * fls = NULL;
|
struct FileLockSemaphore * fls = NULL;
|
||||||
BPTR file_handle = fd->fd_DefaultFile;
|
BPTR file_handle = fd->fd_File;
|
||||||
struct LockedRegionNode * lrn = NULL;
|
struct LockedRegionNode * lrn = NULL;
|
||||||
struct FileLockNode * fln = NULL;
|
struct FileLockNode * fln = NULL;
|
||||||
D_S(struct FileInfoBlock,fib);
|
D_S(struct FileInfoBlock,fib);
|
||||||
@@ -1086,7 +1086,7 @@ __handle_record_locking(int cmd,struct flock * l,struct fd * fd,int * error_ptr)
|
|||||||
{
|
{
|
||||||
SET_FLAG(fd->fd_Flags,FDF_IS_LOCKED);
|
SET_FLAG(fd->fd_Flags,FDF_IS_LOCKED);
|
||||||
}
|
}
|
||||||
while((fd = fd->fd_NextLink) != NULL);
|
while((fd = fd->fd_NextAlias) != NULL);
|
||||||
}
|
}
|
||||||
else if (cmd == F_SETLK)
|
else if (cmd == F_SETLK)
|
||||||
{
|
{
|
||||||
@@ -1164,7 +1164,7 @@ __handle_record_locking(int cmd,struct flock * l,struct fd * fd,int * error_ptr)
|
|||||||
{
|
{
|
||||||
SET_FLAG(fd->fd_Flags,FDF_IS_LOCKED);
|
SET_FLAG(fd->fd_Flags,FDF_IS_LOCKED);
|
||||||
}
|
}
|
||||||
while((fd = fd->fd_NextLink) != NULL);
|
while((fd = fd->fd_NextAlias) != NULL);
|
||||||
}
|
}
|
||||||
else if (cmd == F_GETLK)
|
else if (cmd == F_GETLK)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: stdio_remove_fd_alias.c,v 1.4 2006-01-08 12:04:25 obarthel Exp $
|
* $Id: stdio_remove_fd_alias.c,v 1.5 2006-10-10 13:39:26 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -54,36 +54,36 @@ __remove_fd_alias(struct fd * fd)
|
|||||||
/* Remove this alias from the list. */
|
/* Remove this alias from the list. */
|
||||||
for(list_fd = fd->fd_Original ;
|
for(list_fd = fd->fd_Original ;
|
||||||
list_fd != NULL ;
|
list_fd != NULL ;
|
||||||
list_fd = list_fd->fd_NextLink)
|
list_fd = list_fd->fd_NextAlias)
|
||||||
{
|
{
|
||||||
if(list_fd->fd_NextLink == fd)
|
if(list_fd->fd_NextAlias == fd)
|
||||||
{
|
{
|
||||||
list_fd->fd_NextLink = fd->fd_NextLink;
|
list_fd->fd_NextAlias = fd->fd_NextAlias;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (fd->fd_NextLink != NULL) /* this one has aliases attached; it is the 'original' resource */
|
else if (fd->fd_NextAlias != NULL) /* this one has aliases attached; it is the 'original' resource */
|
||||||
{
|
{
|
||||||
struct fd * first_alias;
|
struct fd * first_alias;
|
||||||
struct fd * next_alias;
|
struct fd * next_alias;
|
||||||
struct fd * list_fd;
|
struct fd * list_fd;
|
||||||
|
|
||||||
/* The first link now becomes the original resource */
|
/* The first link now becomes the original resource */
|
||||||
first_alias = fd->fd_NextLink;
|
first_alias = fd->fd_NextAlias;
|
||||||
next_alias = first_alias->fd_NextLink;
|
next_alias = first_alias->fd_NextAlias;
|
||||||
|
|
||||||
/* Structure copy... */
|
/* Structure copy... */
|
||||||
(*first_alias) = (*fd);
|
(*first_alias) = (*fd);
|
||||||
|
|
||||||
/* Fix up the linkage. */
|
/* Fix up the linkage. */
|
||||||
first_alias->fd_NextLink = next_alias;
|
first_alias->fd_NextAlias = next_alias;
|
||||||
first_alias->fd_Original = NULL;
|
first_alias->fd_Original = NULL;
|
||||||
|
|
||||||
/* The resources are migrated to the first link. */
|
/* The resources are migrated to the first link. */
|
||||||
for(list_fd = next_alias ;
|
for(list_fd = next_alias ;
|
||||||
list_fd != NULL ;
|
list_fd != NULL ;
|
||||||
list_fd = list_fd->fd_NextLink)
|
list_fd = list_fd->fd_NextAlias)
|
||||||
{
|
{
|
||||||
list_fd->fd_Original = first_alias;
|
list_fd->fd_Original = first_alias;
|
||||||
}
|
}
|
||||||
|
|||||||
115
library/stdio_resolve_fd_file.c
Normal file
115
library/stdio_resolve_fd_file.c
Normal file
@@ -0,0 +1,115 @@
|
|||||||
|
/*
|
||||||
|
* $Id: stdio_resolve_fd_file.c,v 1.1 2006-11-16 14:39:23 obarthel Exp $
|
||||||
|
*
|
||||||
|
* :ts=4
|
||||||
|
*
|
||||||
|
* Portable ISO 'C' (1994) runtime library for the Amiga computer
|
||||||
|
* Copyright (c) 2002-2006 by Olaf Barthel <olsen (at) sourcery.han.de>
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
*
|
||||||
|
* - Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* - Neither the name of Olaf Barthel nor the names of contributors
|
||||||
|
* may be used to endorse or promote products derived from this
|
||||||
|
* software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||||
|
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||||
|
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||||
|
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||||
|
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||||
|
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||||
|
* POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _FCNTL_HEADERS_H
|
||||||
|
#include "fcntl_headers.h"
|
||||||
|
#endif /* _FCNTL_HEADERS_H */
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
|
/* The following is not part of the ISO 'C' (1994) standard. */
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
|
#if defined(__THREAD_SAFE)
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
|
#ifdef __resolve_fd_file
|
||||||
|
#undef __resolve_fd_file
|
||||||
|
#endif /* __resolve_fd_file */
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
|
BPTR
|
||||||
|
__resolve_fd_file(struct fd * fd)
|
||||||
|
{
|
||||||
|
BPTR file;
|
||||||
|
|
||||||
|
/* Is this one the standard I/O streams for which the associated file
|
||||||
|
handle should be determined dynamically? */
|
||||||
|
if(FLAG_IS_SET(fd->fd_Flags,FDF_STDIO))
|
||||||
|
{
|
||||||
|
switch(fd->fd_File)
|
||||||
|
{
|
||||||
|
case STDIN_FILENO:
|
||||||
|
|
||||||
|
file = Input();
|
||||||
|
break;
|
||||||
|
|
||||||
|
case STDOUT_FILENO:
|
||||||
|
|
||||||
|
file = Output();
|
||||||
|
break;
|
||||||
|
|
||||||
|
case STDERR_FILENO:
|
||||||
|
|
||||||
|
#if defined(__amigaos4__)
|
||||||
|
{
|
||||||
|
file = ErrorOutput();
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
{
|
||||||
|
struct Process * this_process = (struct Process *)FindTask(NULL);
|
||||||
|
|
||||||
|
file = this_process->pr_CES;
|
||||||
|
}
|
||||||
|
#endif /* __amigaos4__ */
|
||||||
|
|
||||||
|
/* The following is rather controversial; if the standard error stream
|
||||||
|
is unavailable, we default to reuse the standard output stream. This
|
||||||
|
is problematic if the standard output stream was redirected and should
|
||||||
|
not be the same as the standard error output stream. */
|
||||||
|
if(file == ZERO)
|
||||||
|
file = Output();
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
|
||||||
|
file = ZERO;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* Just return what's there. */
|
||||||
|
file = fd->fd_File;
|
||||||
|
}
|
||||||
|
|
||||||
|
return(file);
|
||||||
|
}
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
|
#endif /* __THREAD_SAFE */
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: stdio_vfprintf.c,v 1.22 2006-09-22 09:02:51 obarthel Exp $
|
* $Id: stdio_vfprintf.c,v 1.25 2006-11-13 09:32:28 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -141,7 +141,7 @@ vfprintf(FILE * stream,const char * format, va_list arg)
|
|||||||
int buffer_mode;
|
int buffer_mode;
|
||||||
char *output_buffer;
|
char *output_buffer;
|
||||||
int output_len;
|
int output_len;
|
||||||
char *prefix;
|
const char *prefix;
|
||||||
char prefix_buffer[8];
|
char prefix_buffer[8];
|
||||||
int result = EOF;
|
int result = EOF;
|
||||||
int len = 0;
|
int len = 0;
|
||||||
@@ -580,7 +580,7 @@ vfprintf(FILE * stream,const char * format, va_list arg)
|
|||||||
|
|
||||||
conversion_type = 'x';
|
conversion_type = 'x';
|
||||||
|
|
||||||
SET_FLAG(format_flags,FORMATF_AlternateConversion);
|
SET_FLAG(format_flags,FORMATF_HexPrefix);
|
||||||
|
|
||||||
fill_character = '0';
|
fill_character = '0';
|
||||||
minimum_field_width = 8;
|
minimum_field_width = 8;
|
||||||
@@ -1269,6 +1269,16 @@ vfprintf(FILE * stream,const char * format, va_list arg)
|
|||||||
const char * digit_encoding;
|
const char * digit_encoding;
|
||||||
int radix;
|
int radix;
|
||||||
|
|
||||||
|
/* Only add the zero (%o) or hex (%x) prefix if the value to
|
||||||
|
be converted is non-zero. */
|
||||||
|
if(FLAG_IS_SET(format_flags,FORMATF_AlternateConversion) && v != 0)
|
||||||
|
{
|
||||||
|
if(conversion_type == 'o')
|
||||||
|
SET_FLAG(format_flags,FORMATF_ZeroPrefix);
|
||||||
|
else if (conversion_type == 'x')
|
||||||
|
SET_FLAG(format_flags,FORMATF_HexPrefix);
|
||||||
|
}
|
||||||
|
|
||||||
if(conversion_type == 'o')
|
if(conversion_type == 'o')
|
||||||
radix = 8;
|
radix = 8;
|
||||||
else if (conversion_type == 'x')
|
else if (conversion_type == 'x')
|
||||||
@@ -1291,14 +1301,6 @@ vfprintf(FILE * stream,const char * format, va_list arg)
|
|||||||
}
|
}
|
||||||
while(v > 0 && buffer < output_buffer);
|
while(v > 0 && buffer < output_buffer);
|
||||||
|
|
||||||
if(FLAG_IS_SET(format_flags,FORMATF_AlternateConversion))
|
|
||||||
{
|
|
||||||
if(conversion_type == 'o')
|
|
||||||
SET_FLAG(format_flags,FORMATF_ZeroPrefix);
|
|
||||||
else if (conversion_type == 'x')
|
|
||||||
SET_FLAG(format_flags,FORMATF_HexPrefix);
|
|
||||||
}
|
|
||||||
|
|
||||||
while(output_len < precision && output_buffer > buffer)
|
while(output_len < precision && output_buffer > buffer)
|
||||||
{
|
{
|
||||||
output_buffer--;
|
output_buffer--;
|
||||||
@@ -1329,12 +1331,18 @@ vfprintf(FILE * stream,const char * format, va_list arg)
|
|||||||
#if defined(NDEBUG)
|
#if defined(NDEBUG)
|
||||||
{
|
{
|
||||||
if(output_buffer == NULL)
|
if(output_buffer == NULL)
|
||||||
output_buffer = (char *)"";
|
{
|
||||||
|
output_buffer = buffer;
|
||||||
|
strcpy(output_buffer,"");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
{
|
{
|
||||||
if(output_buffer == NULL)
|
if(output_buffer == NULL)
|
||||||
output_buffer = "*NULL POINTER*";
|
{
|
||||||
|
output_buffer = buffer;
|
||||||
|
strcpy(output_buffer,"*NULL POINTER*");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
#endif /* NDEBUG */
|
#endif /* NDEBUG */
|
||||||
|
|
||||||
@@ -1504,13 +1512,13 @@ vfprintf(FILE * stream,const char * format, va_list arg)
|
|||||||
|
|
||||||
/* Get ready to prefix a sign character, if required. */
|
/* Get ready to prefix a sign character, if required. */
|
||||||
if(FLAG_IS_SET(format_flags,FORMATF_IsNegative))
|
if(FLAG_IS_SET(format_flags,FORMATF_IsNegative))
|
||||||
prefix = (char *)"-";
|
prefix = "-";
|
||||||
else if (FLAG_IS_SET(format_flags,FORMATF_ProduceSign))
|
else if (FLAG_IS_SET(format_flags,FORMATF_ProduceSign))
|
||||||
prefix = (char *)"+";
|
prefix = "+";
|
||||||
else if (FLAG_IS_SET(format_flags,FORMATF_ProduceSpace))
|
else if (FLAG_IS_SET(format_flags,FORMATF_ProduceSpace))
|
||||||
prefix = (char *)" ";
|
prefix = " ";
|
||||||
else if (FLAG_IS_SET(format_flags,FORMATF_ZeroPrefix))
|
else if (FLAG_IS_SET(format_flags,FORMATF_ZeroPrefix))
|
||||||
prefix = (char *)"0";
|
prefix = "0";
|
||||||
else
|
else
|
||||||
prefix = NULL;
|
prefix = NULL;
|
||||||
|
|
||||||
@@ -1528,7 +1536,6 @@ vfprintf(FILE * stream,const char * format, va_list arg)
|
|||||||
|
|
||||||
if(prefix != NULL)
|
if(prefix != NULL)
|
||||||
{
|
{
|
||||||
|
|
||||||
for(i = 0 ; prefix[i] != '\0' ; i++)
|
for(i = 0 ; prefix[i] != '\0' ; i++)
|
||||||
{
|
{
|
||||||
/* One less character to fill the output with. */
|
/* One less character to fill the output with. */
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: stdio_vfscanf.c,v 1.20 2006-01-08 12:04:25 obarthel Exp $
|
* $Id: stdio_vfscanf.c,v 1.21 2006-09-25 14:51:15 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -897,9 +897,9 @@ vfscanf(FILE *stream, const char *format, va_list arg)
|
|||||||
*/
|
*/
|
||||||
if(__locale_table[LC_NUMERIC] != NULL)
|
if(__locale_table[LC_NUMERIC] != NULL)
|
||||||
{
|
{
|
||||||
unsigned char * point;
|
const unsigned char * point;
|
||||||
|
|
||||||
point = (unsigned char *)__locale_table[LC_NUMERIC]->loc_DecimalPoint;
|
point = (const unsigned char *)__locale_table[LC_NUMERIC]->loc_DecimalPoint;
|
||||||
|
|
||||||
if(c == (*point) || c == '.')
|
if(c == (*point) || c == '.')
|
||||||
{
|
{
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user