diff options
author | cvs2hg <devnull@localhost> | 2001-08-15 14:30:45 +0000 |
---|---|---|
committer | cvs2hg <devnull@localhost> | 2001-08-15 14:30:45 +0000 |
commit | ca12884f39d1906e2a120ae0ea1c247abbfc154f (patch) | |
tree | bd4e0c5f809c0c94981ef1446233f20ae162e21d | |
parent | f7b843b8dec17be6d612b30c52e39cfb35e62848 (diff) | |
download | nspr-hg-ca12884f39d1906e2a120ae0ea1c247abbfc154f.tar.gz |
fixup commit for branch 'NSPRPUB_PRE_4_2_CLIENT_BRANCH'
-rw-r--r-- | pr/include/md/_solaris.h | 784 | ||||
-rw-r--r-- | pr/include/prlog.h | 253 | ||||
-rw-r--r-- | pr/src/io/prlog.c | 504 | ||||
-rw-r--r-- | pr/src/io/prsocket.c | 1805 | ||||
-rw-r--r-- | pr/src/md/os2/os2io.c | 798 |
5 files changed, 0 insertions, 4144 deletions
diff --git a/pr/include/md/_solaris.h b/pr/include/md/_solaris.h deleted file mode 100644 index fdc2ef64..00000000 --- a/pr/include/md/_solaris.h +++ /dev/null @@ -1,784 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* - * The contents of this file are subject to the Mozilla Public - * License Version 1.1 (the "License"); you may not use this file - * except in compliance with the License. You may obtain a copy of - * the License at http://www.mozilla.org/MPL/ - * - * Software distributed under the License is distributed on an "AS - * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or - * implied. See the License for the specific language governing - * rights and limitations under the License. - * - * The Original Code is the Netscape Portable Runtime (NSPR). - * - * The Initial Developer of the Original Code is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998-2000 Netscape Communications Corporation. All - * Rights Reserved. - * - * Contributor(s): - * - * Alternatively, the contents of this file may be used under the - * terms of the GNU General Public License Version 2 or later (the - * "GPL"), in which case the provisions of the GPL are applicable - * instead of those above. If you wish to allow use of your - * version of this file only under the terms of the GPL and not to - * allow others to use your version of this file under the MPL, - * indicate your decision by deleting the provisions above and - * replace them with the notice and other provisions required by - * the GPL. If you do not delete the provisions above, a recipient - * may use your version of this file under either the MPL or the - * GPL. - */ - -#ifndef nspr_solaris_defs_h___ -#define nspr_solaris_defs_h___ - -/* - * Internal configuration macros - */ - -#define PR_LINKER_ARCH "solaris" -#define _PR_SI_SYSNAME "SOLARIS" -#define _PR_SI_ARCHITECTURE "sparc" -#define PR_DLL_SUFFIX ".so" - -#define _PR_VMBASE 0x30000000 -#define _PR_STACK_VMBASE 0x50000000 -#define _MD_DEFAULT_STACK_SIZE (2*65536L) -#define _MD_MMAP_FLAGS MAP_SHARED - -#undef HAVE_STACK_GROWING_UP - -#ifndef HAVE_WEAK_IO_SYMBOLS -#define HAVE_WEAK_IO_SYMBOLS -#endif - -#undef HAVE_WEAK_MALLOC_SYMBOLS -#define HAVE_DLL -#define USE_DLFCN -#define NEED_STRFTIME_LOCK - -/* - * Intel x86 has atomic instructions. - * - * Sparc v8 does not have instructions to efficiently implement - * atomic increment/decrement operations. In the local threads - * only and pthreads versions, we use the default atomic routine - * implementation in pratom.c. The obsolete global threads only - * version uses a global mutex_t to implement the atomic routines - * in solaris.c, which is actually equivalent to the default - * implementation. - * - * 64-bit Solaris requires sparc v9, which has atomic instructions. - */ -#if defined(i386) || defined(_PR_GLOBAL_THREADS_ONLY) || defined(IS_64) -#define _PR_HAVE_ATOMIC_OPS -#endif - -#if defined(_PR_GLOBAL_THREADS_ONLY) || defined(_PR_PTHREADS) -/* - * We have assembly language implementation of atomic - * stacks for the 32-bit sparc and x86 architectures only. - */ -#if !defined(sparc) || !defined(IS_64) -#define _PR_HAVE_ATOMIC_CAS -#endif -#endif - -#define _PR_POLL_AVAILABLE -#define _PR_USE_POLL -#define _PR_STAT_HAS_ST_ATIM -#ifdef SOLARIS2_5 -#define _PR_HAVE_SYSV_SEMAPHORES -#define PR_HAVE_SYSV_NAMED_SHARED_MEMORY -#else -#define _PR_HAVE_POSIX_SEMAPHORES -#define PR_HAVE_POSIX_NAMED_SHARED_MEMORY -#endif -#define _PR_HAVE_GETIPNODEBYNAME -#define _PR_HAVE_GETIPNODEBYADDR -#define _PR_INET6_PROBE -#define _PR_ACCEPT_INHERIT_NONBLOCK -#ifndef _PR_INET6 -#define AF_INET6 26 -#define AI_V4MAPPED 0x0001 -#define AI_ALL 0x0002 -#define AI_ADDRCONFIG 0x0004 -#define _PR_HAVE_MD_SOCKADDR_IN6 -/* isomorphic to struct in6_addr on Solaris 8 */ -struct _md_in6_addr { - union { - PRUint8 _S6_u8[16]; - PRUint32 _S6_u32[4]; - PRUint32 __S6_align; - } _S6_un; -}; -/* isomorphic to struct sockaddr_in6 on Solaris 8 */ -struct _md_sockaddr_in6 { - PRUint16 sin6_family; - PRUint16 sin6_port; - PRUint32 sin6_flowinfo; - struct _md_in6_addr sin6_addr; - PRUint32 sin6_scope_id; - PRUint32 __sin6_src_id; -}; -#endif -#if defined(_PR_GLOBAL_THREADS_ONLY) || defined(_PR_PTHREADS) -#define _PR_HAVE_GETHOST_R -#define _PR_HAVE_GETHOST_R_POINTER -#endif - -#include "prinrval.h" -NSPR_API(PRIntervalTime) _MD_Solaris_GetInterval(void); -#define _MD_GET_INTERVAL _MD_Solaris_GetInterval -NSPR_API(PRIntervalTime) _MD_Solaris_TicksPerSecond(void); -#define _MD_INTERVAL_PER_SEC _MD_Solaris_TicksPerSecond - -#if defined(_PR_HAVE_ATOMIC_OPS) -/* -** Atomic Operations -*/ -#define _MD_INIT_ATOMIC() - -NSPR_API(PRInt32) _MD_AtomicIncrement(PRInt32 *val); -#define _MD_ATOMIC_INCREMENT _MD_AtomicIncrement - -NSPR_API(PRInt32) _MD_AtomicAdd(PRInt32 *ptr, PRInt32 val); -#define _MD_ATOMIC_ADD _MD_AtomicAdd - -NSPR_API(PRInt32) _MD_AtomicDecrement(PRInt32 *val); -#define _MD_ATOMIC_DECREMENT _MD_AtomicDecrement - -NSPR_API(PRInt32) _MD_AtomicSet(PRInt32 *val, PRInt32 newval); -#define _MD_ATOMIC_SET _MD_AtomicSet -#endif /* _PR_HAVE_ATOMIC_OPS */ - -#if defined(_PR_PTHREADS) - -NSPR_API(void) _MD_EarlyInit(void); - -#define _MD_EARLY_INIT _MD_EarlyInit -#define _MD_FINAL_INIT _PR_UnixInit - -#elif defined(_PR_GLOBAL_THREADS_ONLY) - -#include "prthread.h" - -#include <ucontext.h> - -/* -** Iinitialization Related definitions -*/ - -NSPR_API(void) _MD_EarlyInit(void); - -#define _MD_EARLY_INIT _MD_EarlyInit -#define _MD_FINAL_INIT _PR_UnixInit - -#define _MD_GET_SP(threadp) threadp->md.sp - -/* -** Clean-up the thread machine dependent data structure -*/ -#define _MD_INIT_THREAD _MD_InitializeThread -#define _MD_INIT_ATTACHED_THREAD _MD_InitializeThread - -NSPR_API(PRStatus) _MD_CreateThread(PRThread *thread, - void (*start)(void *), - PRThreadPriority priority, - PRThreadScope scope, - PRThreadState state, - PRUint32 stackSize); -#define _MD_CREATE_THREAD _MD_CreateThread - -#define _PR_CONTEXT_TYPE ucontext_t - -#define CONTEXT(_thread) (&(_thread)->md.context) - -#include <thread.h> -#include <sys/lwp.h> -#include <synch.h> - -extern struct PRLock *_pr_schedLock; - -/* -** Thread Local Storage -*/ - -#define THREAD_KEY_T thread_key_t - -extern struct PRThread *_pr_current_thread_tls(); -extern struct _PRCPU *_pr_current_cpu_tls(); -extern struct PRThread *_pr_last_thread_tls(); - -extern THREAD_KEY_T threadid_key; -extern THREAD_KEY_T cpuid_key; -extern THREAD_KEY_T last_thread_key; - -#define _MD_CURRENT_THREAD() _pr_current_thread_tls() -#define _MD_CURRENT_CPU() _pr_current_cpu_tls() -#define _MD_LAST_THREAD() _pr_last_thread_tls() - -#define _MD_SET_CURRENT_THREAD(newval) \ - PR_BEGIN_MACRO \ - thr_setspecific(threadid_key, (void *)newval); \ - PR_END_MACRO - -#define _MD_SET_CURRENT_CPU(newval) \ - PR_BEGIN_MACRO \ - thr_setspecific(cpuid_key, (void *)newval); \ - PR_END_MACRO - -#define _MD_SET_LAST_THREAD(newval) \ - PR_BEGIN_MACRO \ - thr_setspecific(last_thread_key, (void *)newval); \ - PR_END_MACRO - -#define _MD_CLEAN_THREAD(_thread) _MD_cleanup_thread(_thread) -extern void _MD_exit_thread(PRThread *thread); -#define _MD_EXIT_THREAD(thread) _MD_exit_thread(thread) - -#define _MD_SUSPEND_THREAD(thread) _MD_Suspend(thread) -#define _MD_RESUME_THREAD(thread) thr_continue((thread)->md.handle) - -/* XXXX Needs to be defined - Prashant */ -#define _MD_SUSPEND_CPU(cpu) -#define _MD_RESUME_CPU(cpu) - -extern void _MD_Begin_SuspendAll(void); -extern void _MD_End_SuspendAll(void); -extern void _MD_End_ResumeAll(void); -#define _MD_BEGIN_SUSPEND_ALL() _MD_Begin_SuspendAll() -#define _MD_BEGIN_RESUME_ALL() -#define _MD_END_SUSPEND_ALL() _MD_End_SuspendAll() -#define _MD_END_RESUME_ALL() _MD_End_ResumeAll() - -#define _MD_INIT_LOCKS() -#define _MD_NEW_LOCK(md_lockp) (mutex_init(&((md_lockp)->lock),USYNC_THREAD,NULL) ? PR_FAILURE : PR_SUCCESS) -#define _MD_FREE_LOCK(md_lockp) mutex_destroy(&((md_lockp)->lock)) -#define _MD_UNLOCK(md_lockp) mutex_unlock(&((md_lockp)->lock)) -#define _MD_TEST_AND_LOCK(md_lockp) mutex_trylock(&((md_lockp)->lock)) -struct _MDLock; -NSPR_API(void) _MD_lock(struct _MDLock *md_lock); -#undef PROFILE_LOCKS -#ifndef PROFILE_LOCKS -#define _MD_LOCK(md_lockp) _MD_lock(md_lockp) -#else -#define _MD_LOCK(md_lockp) \ - PR_BEGIN_MACRO \ - int rv = _MD_TEST_AND_LOCK(md_lockp); \ - if (rv == 0) { \ - (md_lockp)->hitcount++; \ - } else { \ - (md_lockp)->misscount++; \ - _MD_lock(md_lockp); \ - } \ - PR_END_MACRO -#endif - -#define _PR_LOCK_HEAP() if (_pr_heapLock) _MD_LOCK(&_pr_heapLock->md) -#define _PR_UNLOCK_HEAP() if (_pr_heapLock) _MD_UNLOCK(&_pr_heapLock->md) - -#define _MD_ATTACH_THREAD(threadp) - - -#define THR_KEYCREATE thr_keycreate -#define THR_SELF thr_self -#define _MD_NEW_CV(condp) cond_init(&((condp)->cv), USYNC_THREAD, 0) -#define COND_WAIT(condp, mutexp) cond_wait(condp, mutexp) -#define COND_TIMEDWAIT(condp, mutexp, tspec) \ - cond_timedwait(condp, mutexp, tspec) -#define _MD_NOTIFY_CV(condp, lockp) cond_signal(&((condp)->cv)) -#define _MD_NOTIFYALL_CV(condp,unused) cond_broadcast(&((condp)->cv)) -#define _MD_FREE_CV(condp) cond_destroy(&((condp)->cv)) -#define _MD_YIELD() thr_yield() -#include <time.h> -/* - * Because clock_gettime() on Solaris/x86 2.4 always generates a - * segmentation fault, we use an emulated version _pr_solx86_clock_gettime(), - * which is implemented using gettimeofday(). - */ -#if defined(i386) && defined(SOLARIS2_4) -extern int _pr_solx86_clock_gettime(clockid_t clock_id, struct timespec *tp); -#define GETTIME(tt) _pr_solx86_clock_gettime(CLOCK_REALTIME, (tt)) -#else -#define GETTIME(tt) clock_gettime(CLOCK_REALTIME, (tt)) -#endif /* i386 && SOLARIS2_4 */ - -#define MUTEX_T mutex_t -#define COND_T cond_t - -#define _MD_NEW_SEM(md_semp,_val) sema_init(&((md_semp)->sem),_val,USYNC_THREAD,NULL) -#define _MD_DESTROY_SEM(md_semp) sema_destroy(&((md_semp)->sem)) -#define _MD_WAIT_SEM(md_semp) sema_wait(&((md_semp)->sem)) -#define _MD_POST_SEM(md_semp) sema_post(&((md_semp)->sem)) - -#define _MD_SAVE_ERRNO(_thread) -#define _MD_RESTORE_ERRNO(_thread) -#define _MD_INIT_RUNNING_CPU(cpu) _MD_unix_init_running_cpu(cpu) - -extern struct _MDLock _pr_ioq_lock; -#define _MD_IOQ_LOCK() _MD_LOCK(&_pr_ioq_lock) -#define _MD_IOQ_UNLOCK() _MD_UNLOCK(&_pr_ioq_lock) - -extern PRStatus _MD_wait(struct PRThread *, PRIntervalTime timeout); -#define _MD_WAIT _MD_wait - -extern PRStatus _MD_WakeupWaiter(struct PRThread *); -#define _MD_WAKEUP_WAITER _MD_WakeupWaiter - -NSPR_API(void) _MD_InitIO(void); -#define _MD_INIT_IO _MD_InitIO - -#define _MD_INIT_CONTEXT(_thread, _sp, _main, status) -#define _MD_SWITCH_CONTEXT(_thread) -#define _MD_RESTORE_CONTEXT(_newThread) - -struct _MDLock { - MUTEX_T lock; -#ifdef PROFILE_LOCKS - PRInt32 hitcount; - PRInt32 misscount; -#endif -}; - -struct _MDCVar { - COND_T cv; -}; - -struct _MDSemaphore { - sema_t sem; -}; - -struct _MDThread { - _PR_CONTEXT_TYPE context; - thread_t handle; - lwpid_t lwpid; - uint_t sp; /* stack pointer */ - uint_t threadID; /* ptr to solaris-internal thread id structures */ - struct _MDSemaphore waiter_sem; -}; - -struct _MDThreadStack { - PRInt8 notused; -}; - -struct _MDSegment { - PRInt8 notused; -}; - -/* - * md-specific cpu structure field, common to all Unix platforms - */ -#define _PR_MD_MAX_OSFD FD_SETSIZE - -struct _MDCPU_Unix { - PRCList ioQ; - PRUint32 ioq_timeout; - PRInt32 ioq_max_osfd; - PRInt32 ioq_osfd_cnt; -#ifndef _PR_USE_POLL - fd_set fd_read_set, fd_write_set, fd_exception_set; - PRInt16 fd_read_cnt[_PR_MD_MAX_OSFD],fd_write_cnt[_PR_MD_MAX_OSFD], - fd_exception_cnt[_PR_MD_MAX_OSFD]; -#else - struct pollfd *ioq_pollfds; - int ioq_pollfds_size; -#endif /* _PR_USE_POLL */ -}; - -#define _PR_IOQ(_cpu) ((_cpu)->md.md_unix.ioQ) -#define _PR_ADD_TO_IOQ(_pq, _cpu) PR_APPEND_LINK(&_pq.links, &_PR_IOQ(_cpu)) -#define _PR_FD_READ_SET(_cpu) ((_cpu)->md.md_unix.fd_read_set) -#define _PR_FD_READ_CNT(_cpu) ((_cpu)->md.md_unix.fd_read_cnt) -#define _PR_FD_WRITE_SET(_cpu) ((_cpu)->md.md_unix.fd_write_set) -#define _PR_FD_WRITE_CNT(_cpu) ((_cpu)->md.md_unix.fd_write_cnt) -#define _PR_FD_EXCEPTION_SET(_cpu) ((_cpu)->md.md_unix.fd_exception_set) -#define _PR_FD_EXCEPTION_CNT(_cpu) ((_cpu)->md.md_unix.fd_exception_cnt) -#define _PR_IOQ_TIMEOUT(_cpu) ((_cpu)->md.md_unix.ioq_timeout) -#define _PR_IOQ_MAX_OSFD(_cpu) ((_cpu)->md.md_unix.ioq_max_osfd) -#define _PR_IOQ_OSFD_CNT(_cpu) ((_cpu)->md.md_unix.ioq_osfd_cnt) -#define _PR_IOQ_POLLFDS(_cpu) ((_cpu)->md.md_unix.ioq_pollfds) -#define _PR_IOQ_POLLFDS_SIZE(_cpu) ((_cpu)->md.md_unix.ioq_pollfds_size) - -#define _PR_IOQ_MIN_POLLFDS_SIZE(_cpu) 32 - - -struct _MDCPU { - struct _MDCPU_Unix md_unix; -}; - -/* The following defines the unwrapped versions of select() and poll(). */ -extern int _select(int nfds, fd_set *readfds, fd_set *writefds, - fd_set *exceptfds, struct timeval *timeout); -#define _MD_SELECT _select - -#include <poll.h> -#define _MD_POLL _poll -extern int _poll(struct pollfd *fds, unsigned long nfds, int timeout); - -PR_BEGIN_EXTERN_C - -/* -** Missing function prototypes -*/ -extern int gethostname (char *name, int namelen); - -PR_END_EXTERN_C - -#else /* _PR_GLOBAL_THREADS_ONLY */ - -/* - * LOCAL_THREADS_ONLY implementation on Solaris - */ - -#include "prthread.h" - -#include <errno.h> -#include <ucontext.h> -#include <sys/stack.h> -#include <synch.h> - -/* -** Iinitialization Related definitions -*/ - -NSPR_API(void) _MD_EarlyInit(void); -NSPR_API(void) _MD_SolarisInit(); -#define _MD_EARLY_INIT _MD_EarlyInit -#define _MD_FINAL_INIT _MD_SolarisInit -#define _MD_INIT_THREAD _MD_InitializeThread - -#ifdef USE_SETJMP - -#include <setjmp.h> - -#define _PR_CONTEXT_TYPE jmp_buf - -#ifdef sparc -#define _MD_GET_SP(_t) (_t)->md.context[2] -#else -#define _MD_GET_SP(_t) (_t)->md.context[4] -#endif - -#define PR_NUM_GCREGS _JBLEN -#define CONTEXT(_thread) (_thread)->md.context - -#else /* ! USE_SETJMP */ - -#ifdef sparc -#define _PR_CONTEXT_TYPE ucontext_t -#define _MD_GET_SP(_t) (_t)->md.context.uc_mcontext.gregs[REG_SP] -/* -** Sparc's use register windows. the _MD_GetRegisters for the sparc's -** doesn't actually store anything into the argument buffer; instead the -** register windows are homed to the stack. I assume that the stack -** always has room for the registers to spill to... -*/ -#define PR_NUM_GCREGS 0 -#else -#define _PR_CONTEXT_TYPE unsigned int edi; sigset_t oldMask, blockMask; ucontext_t -#define _MD_GET_SP(_t) (_t)->md.context.uc_mcontext.gregs[USP] -#define PR_NUM_GCREGS _JBLEN -#endif - -#define CONTEXT(_thread) (&(_thread)->md.context) - -#endif /* ! USE_SETJMP */ - -#include <time.h> -/* - * Because clock_gettime() on Solaris/x86 always generates a - * segmentation fault, we use an emulated version _pr_solx86_clock_gettime(), - * which is implemented using gettimeofday(). - */ -#ifdef i386 -#define GETTIME(tt) _pr_solx86_clock_gettime(CLOCK_REALTIME, (tt)) -#else -#define GETTIME(tt) clock_gettime(CLOCK_REALTIME, (tt)) -#endif /* i386 */ - -#define _MD_SAVE_ERRNO(_thread) (_thread)->md.errcode = errno; -#define _MD_RESTORE_ERRNO(_thread) errno = (_thread)->md.errcode; - -#ifdef sparc - -#ifdef USE_SETJMP -#define _MD_INIT_CONTEXT(_thread, _sp, _main, status) \ - PR_BEGIN_MACRO \ - int *context = (_thread)->md.context; \ - *status = PR_TRUE; \ - (void) setjmp(context); \ - (_thread)->md.context[1] = (int) ((_sp) - 64); \ - (_thread)->md.context[2] = (int) _main; \ - (_thread)->md.context[3] = (int) _main + 4; \ - _thread->no_sched = 0; \ - PR_END_MACRO - -#define _MD_SWITCH_CONTEXT(_thread) \ - if (!setjmp(CONTEXT(_thread))) { \ - _MD_SAVE_ERRNO(_thread) \ - _MD_SET_LAST_THREAD(_thread); \ - _MD_SET_CURRENT_THREAD(_thread); \ - _PR_Schedule(); \ - } - -#define _MD_RESTORE_CONTEXT(_newThread) \ -{ \ - _MD_RESTORE_ERRNO(_newThread) \ - _MD_SET_CURRENT_THREAD(_newThread); \ - longjmp(CONTEXT(_newThread), 1); \ -} - -#else -/* -** Initialize the thread context preparing it to execute _main. -*/ -#define _MD_INIT_CONTEXT(_thread, _sp, _main, status) \ - PR_BEGIN_MACRO \ - ucontext_t *uc = CONTEXT(_thread); \ - *status = PR_TRUE; \ - getcontext(uc); \ - uc->uc_stack.ss_sp = (char *) ((unsigned long)(_sp - WINDOWSIZE - SA(MINFRAME)) & 0xfffffff8); \ - uc->uc_stack.ss_size = _thread->stack->stackSize; \ - uc->uc_stack.ss_flags = 0; /* ? */ \ - uc->uc_mcontext.gregs[REG_SP] = (unsigned int) uc->uc_stack.ss_sp; \ - uc->uc_mcontext.gregs[REG_PC] = (unsigned int) _main; \ - uc->uc_mcontext.gregs[REG_nPC] = (unsigned int) ((char*)_main)+4; \ - uc->uc_flags = UC_ALL; \ - _thread->no_sched = 0; \ - PR_END_MACRO - -/* -** Switch away from the current thread context by saving its state and -** calling the thread scheduler. Reload cpu when we come back from the -** context switch because it might have changed. -*/ -#define _MD_SWITCH_CONTEXT(_thread) \ - PR_BEGIN_MACRO \ - if (!getcontext(CONTEXT(_thread))) { \ - _MD_SAVE_ERRNO(_thread); \ - _MD_SET_LAST_THREAD(_thread); \ - _PR_Schedule(); \ - } \ - PR_END_MACRO - -/* -** Restore a thread context that was saved by _MD_SWITCH_CONTEXT or -** initialized by _MD_INIT_CONTEXT. -*/ -#define _MD_RESTORE_CONTEXT(_newThread) \ - PR_BEGIN_MACRO \ - ucontext_t *uc = CONTEXT(_newThread); \ - uc->uc_mcontext.gregs[11] = 1; \ - _MD_RESTORE_ERRNO(_newThread); \ - _MD_SET_CURRENT_THREAD(_newThread); \ - setcontext(uc); \ - PR_END_MACRO -#endif - -#else /* x86 solaris */ - -#ifdef USE_SETJMP - -#define _MD_INIT_CONTEXT(_thread, _sp, _main, status) \ - PR_BEGIN_MACRO \ - *status = PR_TRUE; \ - if (setjmp(CONTEXT(_thread))) _main(); \ - _MD_GET_SP(_thread) = (int) ((_sp) - 64); \ - PR_END_MACRO - -#define _MD_SWITCH_CONTEXT(_thread) \ - if (!setjmp(CONTEXT(_thread))) { \ - _MD_SAVE_ERRNO(_thread) \ - _PR_Schedule(); \ - } - -#define _MD_RESTORE_CONTEXT(_newThread) \ -{ \ - _MD_RESTORE_ERRNO(_newThread) \ - _MD_SET_CURRENT_THREAD(_newThread); \ - longjmp(CONTEXT(_newThread), 1); \ -} - -#else /* USE_SETJMP */ - -#define WINDOWSIZE 0 - -int getedi(void); -void setedi(int); - -#define _MD_INIT_CONTEXT(_thread, _sp, _main, status) \ - PR_BEGIN_MACRO \ - ucontext_t *uc = CONTEXT(_thread); \ - *status = PR_TRUE; \ - getcontext(uc); \ - /* Force sp to be double aligned! */ \ - uc->uc_mcontext.gregs[USP] = (int) ((unsigned long)(_sp - WINDOWSIZE - SA(MINFRAME)) & 0xfffffff8); \ - uc->uc_mcontext.gregs[PC] = (int) _main; \ - (_thread)->no_sched = 0; \ - PR_END_MACRO - -/* getcontext() may return 1, contrary to what the man page says */ -#define _MD_SWITCH_CONTEXT(_thread) \ - PR_BEGIN_MACRO \ - ucontext_t *uc = CONTEXT(_thread); \ - PR_ASSERT(_thread->no_sched); \ - sigfillset(&((_thread)->md.blockMask)); \ - sigprocmask(SIG_BLOCK, &((_thread)->md.blockMask), \ - &((_thread)->md.oldMask)); \ - (_thread)->md.edi = getedi(); \ - if (! getcontext(uc)) { \ - sigprocmask(SIG_SETMASK, &((_thread)->md.oldMask), NULL); \ - uc->uc_mcontext.gregs[EDI] = (_thread)->md.edi; \ - _MD_SAVE_ERRNO(_thread) \ - _MD_SET_LAST_THREAD(_thread); \ - _PR_Schedule(); \ - } else { \ - sigprocmask(SIG_SETMASK, &((_thread)->md.oldMask), NULL); \ - setedi((_thread)->md.edi); \ - PR_ASSERT(_MD_LAST_THREAD() !=_MD_CURRENT_THREAD()); \ - _MD_LAST_THREAD()->no_sched = 0; \ - } \ - PR_END_MACRO - -/* -** Restore a thread context, saved by _PR_SWITCH_CONTEXT -*/ -#define _MD_RESTORE_CONTEXT(_newthread) \ - PR_BEGIN_MACRO \ - ucontext_t *uc = CONTEXT(_newthread); \ - uc->uc_mcontext.gregs[EAX] = 1; \ - _MD_RESTORE_ERRNO(_newthread) \ - _MD_SET_CURRENT_THREAD(_newthread); \ - (_newthread)->no_sched = 1; \ - setcontext(uc); \ - PR_END_MACRO -#endif /* USE_SETJMP */ - -#endif /* sparc */ - -struct _MDLock { - PRInt8 notused; -}; - -struct _MDCVar { - PRInt8 notused; -}; - -struct _MDSemaphore { - PRInt8 notused; -}; - -struct _MDThread { - _PR_CONTEXT_TYPE context; - int errcode; - int id; -}; - -struct _MDThreadStack { - PRInt8 notused; -}; - -struct _MDSegment { - PRInt8 notused; -}; - -/* - * md-specific cpu structure field - */ -#define _PR_MD_MAX_OSFD FD_SETSIZE - -struct _MDCPU_Unix { - PRCList ioQ; - PRUint32 ioq_timeout; - PRInt32 ioq_max_osfd; - PRInt32 ioq_osfd_cnt; -#ifndef _PR_USE_POLL - fd_set fd_read_set, fd_write_set, fd_exception_set; - PRInt16 fd_read_cnt[_PR_MD_MAX_OSFD],fd_write_cnt[_PR_MD_MAX_OSFD], - fd_exception_cnt[_PR_MD_MAX_OSFD]; -#else - struct pollfd *ioq_pollfds; - int ioq_pollfds_size; -#endif /* _PR_USE_POLL */ -}; - -#define _PR_IOQ(_cpu) ((_cpu)->md.md_unix.ioQ) -#define _PR_ADD_TO_IOQ(_pq, _cpu) PR_APPEND_LINK(&_pq.links, &_PR_IOQ(_cpu)) -#define _PR_FD_READ_SET(_cpu) ((_cpu)->md.md_unix.fd_read_set) -#define _PR_FD_READ_CNT(_cpu) ((_cpu)->md.md_unix.fd_read_cnt) -#define _PR_FD_WRITE_SET(_cpu) ((_cpu)->md.md_unix.fd_write_set) -#define _PR_FD_WRITE_CNT(_cpu) ((_cpu)->md.md_unix.fd_write_cnt) -#define _PR_FD_EXCEPTION_SET(_cpu) ((_cpu)->md.md_unix.fd_exception_set) -#define _PR_FD_EXCEPTION_CNT(_cpu) ((_cpu)->md.md_unix.fd_exception_cnt) -#define _PR_IOQ_TIMEOUT(_cpu) ((_cpu)->md.md_unix.ioq_timeout) -#define _PR_IOQ_MAX_OSFD(_cpu) ((_cpu)->md.md_unix.ioq_max_osfd) -#define _PR_IOQ_OSFD_CNT(_cpu) ((_cpu)->md.md_unix.ioq_osfd_cnt) -#define _PR_IOQ_POLLFDS(_cpu) ((_cpu)->md.md_unix.ioq_pollfds) -#define _PR_IOQ_POLLFDS_SIZE(_cpu) ((_cpu)->md.md_unix.ioq_pollfds_size) - -#define _PR_IOQ_MIN_POLLFDS_SIZE(_cpu) 32 - -struct _MDCPU { - struct _MDCPU_Unix md_unix; -}; - -#ifndef _PR_PTHREADS -#define _MD_INIT_LOCKS() -#endif -#define _MD_NEW_LOCK(lock) PR_SUCCESS -#define _MD_FREE_LOCK(lock) -#define _MD_LOCK(lock) -#define _MD_UNLOCK(lock) -#define _MD_INIT_IO() -#define _MD_IOQ_LOCK() -#define _MD_IOQ_UNLOCK() - -#define _MD_INIT_RUNNING_CPU(cpu) _MD_unix_init_running_cpu(cpu) -#define _MD_INIT_THREAD _MD_InitializeThread -#define _MD_EXIT_THREAD(thread) -#define _MD_SUSPEND_THREAD(thread) -#define _MD_RESUME_THREAD(thread) -#define _MD_CLEAN_THREAD(_thread) - -extern PRStatus _MD_WAIT(struct PRThread *, PRIntervalTime timeout); -extern PRStatus _MD_WAKEUP_WAITER(struct PRThread *); -extern void _MD_YIELD(void); -extern PRStatus _MD_InitializeThread(PRThread *thread); -extern void _MD_SET_PRIORITY(struct _MDThread *thread, - PRThreadPriority newPri); -extern PRStatus _MD_CREATE_THREAD(PRThread *thread, void (*start) (void *), - PRThreadPriority priority, PRThreadScope scope, PRThreadState state, - PRUint32 stackSize); - -NSPR_API(PRIntervalTime) _MD_Solaris_GetInterval(void); -#define _MD_GET_INTERVAL _MD_Solaris_GetInterval -NSPR_API(PRIntervalTime) _MD_Solaris_TicksPerSecond(void); -#define _MD_INTERVAL_PER_SEC _MD_Solaris_TicksPerSecond - -/* The following defines the unwrapped versions of select() and poll(). */ -extern int _select(int nfds, fd_set *readfds, fd_set *writefds, - fd_set *exceptfds, struct timeval *timeout); -#define _MD_SELECT _select - -#include <stropts.h> -#include <poll.h> -#define _MD_POLL _poll -extern int _poll(struct pollfd *fds, unsigned long nfds, int timeout); - -PR_BEGIN_EXTERN_C - -/* -** Missing function prototypes -*/ -extern int gethostname (char *name, int namelen); - -PR_END_EXTERN_C - -#endif /* _PR_GLOBAL_THREADS_ONLY */ - -#endif /* nspr_solaris_defs_h___ */ - diff --git a/pr/include/prlog.h b/pr/include/prlog.h deleted file mode 100644 index b7a7b5a0..00000000 --- a/pr/include/prlog.h +++ /dev/null @@ -1,253 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* - * The contents of this file are subject to the Mozilla Public - * License Version 1.1 (the "License"); you may not use this file - * except in compliance with the License. You may obtain a copy of - * the License at http://www.mozilla.org/MPL/ - * - * Software distributed under the License is distributed on an "AS - * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or - * implied. See the License for the specific language governing - * rights and limitations under the License. - * - * The Original Code is the Netscape Portable Runtime (NSPR). - * - * The Initial Developer of the Original Code is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998-2000 Netscape Communications Corporation. All - * Rights Reserved. - * - * Contributor(s): - * - * Alternatively, the contents of this file may be used under the - * terms of the GNU General Public License Version 2 or later (the - * "GPL"), in which case the provisions of the GPL are applicable - * instead of those above. If you wish to allow use of your - * version of this file only under the terms of the GPL and not to - * allow others to use your version of this file under the MPL, - * indicate your decision by deleting the provisions above and - * replace them with the notice and other provisions required by - * the GPL. If you do not delete the provisions above, a recipient - * may use your version of this file under either the MPL or the - * GPL. - */ - -#ifndef prlog_h___ -#define prlog_h___ - -#include "prtypes.h" - -PR_BEGIN_EXTERN_C - -/* -** prlog.h -- Declare interfaces to NSPR's Logging service -** -** NSPR provides a logging service that is used by NSPR itself and is -** available to client programs. -** -** To use the service from a client program, you should create a -** PRLogModuleInfo structure by calling PR_NewLogModule(). After -** creating the LogModule, you can write to the log using the PR_LOG() -** macro. -** -** Initialization of the log service is handled by NSPR initialization. -** -** At execution time, you must enable the log service. To enable the -** log service, set the environment variable: NSPR_LOG_MODULES -** variable. -** -** NSPR_LOG_MODULES variable has the form: -** -** <moduleName>:<value>[, <moduleName>:<value>]* -** -** Where: -** <moduleName> is the name passed to PR_NewLogModule(). -** <value> is a numeric constant, e.g. 5. This value is the maximum -** value of a log event, enumerated by PRLogModuleLevel, that you want -** written to the log. -** -** For example: to record all events of greater value than or equal to -** PR_LOG_ERROR for a LogModule names "gizmo", say: -** -** set NSPR_LOG_MODULES=gizmo:2 -** -** Note that you must specify the numeric value of PR_LOG_ERROR. -** -** Special LogModule names are provided for controlling NSPR's log -** service at execution time. These controls should be set in the -** NSPR_LOG_MODULES environment variable at execution time to affect -** NSPR's log service for your application. -** -** The special LogModule "all" enables all LogModules. To enable all -** LogModule calls to PR_LOG(), say: -** -** set NSPR_LOG_MODULES=all:5 -** -** The special LogModule name "sync" tells the NSPR log service to do -** unbuffered logging. -** -** The special LogModule name "bufsize:<size>" tells NSPR to set the -** log buffer to <size>. -** -** The environment variable NSPR_LOG_FILE specifies the log file to use -** unless the default of "stderr" is acceptable. For MS Windows -** systems, NSPR_LOG_FILE can be set to a special value: "WinDebug" -** (case sensitive). This value causes PR_LOG() output to be written -** using the Windows API OutputDebugString(). OutputDebugString() -** writes to the debugger window; some people find this helpful. -** -** -** To put log messages in your programs, use the PR_LOG macro: -** -** PR_LOG(<module>, <level>, (<printfString>, <args>*)); -** -** Where <module> is the address of a PRLogModuleInfo structure, and -** <level> is one of the levels defined by the enumeration: -** PRLogModuleLevel. <args> is a printf() style of argument list. That -** is: (fmtstring, ...). -** -** Example: -** -** main() { -** PRIntn one = 1; -** PRLogModuleInfo * myLm = PR_NewLogModule("gizmo"); -** PR_LOG( myLm, PR_LOG_ALWAYS, ("Log this! %d\n", one)); -** return; -** } -** -** Note the use of printf() style arguments as the third agrument(s) to -** PR_LOG(). -** -** After compiling and linking you application, set the environment: -** -** set NSPR_LOG_MODULES=gizmo:5 -** set NSPR_LOG_FILE=logfile.txt -** -** When you execute your application, the string "Log this! 1" will be -** written to the file "logfile.txt". -** -** Note to NSPR engineers: a number of PRLogModuleInfo structures are -** defined and initialized in prinit.c. See this module for ideas on -** what to log where. -** -*/ - -typedef enum PRLogModuleLevel { - PR_LOG_NONE = 0, /* nothing */ - PR_LOG_ALWAYS = 1, /* always printed */ - PR_LOG_ERROR = 2, /* error messages */ - PR_LOG_WARNING = 3, /* warning messages */ - PR_LOG_DEBUG = 4, /* debug messages */ - - PR_LOG_NOTICE = PR_LOG_DEBUG, /* notice messages */ - PR_LOG_WARN = PR_LOG_WARNING, /* warning messages */ - PR_LOG_MIN = PR_LOG_DEBUG, /* minimal debugging messages */ - PR_LOG_MAX = PR_LOG_DEBUG /* maximal debugging messages */ -} PRLogModuleLevel; - -/* -** One of these structures is created for each module that uses logging. -** "name" is the name of the module -** "level" is the debugging level selected for that module -*/ -typedef struct PRLogModuleInfo { - const char *name; - PRLogModuleLevel level; - struct PRLogModuleInfo *next; -} PRLogModuleInfo; - -/* -** Create a new log module. -*/ -NSPR_API(PRLogModuleInfo*) PR_NewLogModule(const char *name); - -/* -** Set the file to use for logging. Returns PR_FALSE if the file cannot -** be created -*/ -NSPR_API(PRBool) PR_SetLogFile(const char *name); - -/* -** Set the size of the logging buffer. If "buffer_size" is zero then the -** logging becomes "synchronous" (or unbuffered). -*/ -NSPR_API(void) PR_SetLogBuffering(PRIntn buffer_size); - -/* -** Print a string to the log. "fmt" is a PR_snprintf format type. All -** messages printed to the log are preceeded by the name of the thread -** and a time stamp. Also, the routine provides a missing newline if one -** is not provided. -*/ -NSPR_API(void) PR_LogPrint(const char *fmt, ...); - -/* -** Flush the log to its file. -*/ -NSPR_API(void) PR_LogFlush(void); - -/* -** Windoze 16 can't support a large static string space for all of the -** various debugging strings so logging is not enabled for it. -*/ -#if (defined(DEBUG) || defined(FORCE_PR_LOG)) && !defined(WIN16) -#define PR_LOGGING 1 - -#define PR_LOG_TEST(_module,_level) \ - ((_module)->level >= (_level)) - -/* -** Log something. -** "module" is the address of a PRLogModuleInfo structure -** "level" is the desired logging level -** "args" is a variable length list of arguments to print, in the following -** format: ("printf style format string", ...) -*/ -#define PR_LOG(_module,_level,_args) \ - PR_BEGIN_MACRO \ - if (PR_LOG_TEST(_module,_level)) { \ - PR_LogPrint _args; \ - } \ - PR_END_MACRO - -#else /* (defined(DEBUG) || defined(FORCE_PR_LOG)) && !defined(WIN16) */ - -#undef PR_LOGGING -#define PR_LOG_TEST(module,level) 0 -#define PR_LOG(module,level,args) - -#endif /* (defined(DEBUG) || defined(FORCE_PR_LOG)) && !defined(WIN16) */ - -#ifndef NO_NSPR_10_SUPPORT - -#ifdef PR_LOGGING -#define PR_LOG_BEGIN PR_LOG -#define PR_LOG_END PR_LOG -#define PR_LOG_DEFINE PR_NewLogModule -#else -#define PR_LOG_BEGIN(module,level,args) -#define PR_LOG_END(module,level,args) -#define PR_LOG_DEFINE(_name) NULL -#endif /* PR_LOGGING */ - -#endif /* NO_NSPR_10_SUPPORT */ - -#if defined(DEBUG) - -NSPR_API(void) PR_Assert(const char *s, const char *file, PRIntn ln); -#define PR_ASSERT(_expr) \ - ((_expr)?((void)0):PR_Assert(# _expr,__FILE__,__LINE__)) - -#define PR_NOT_REACHED(_reasonStr) \ - PR_Assert(_reasonStr,__FILE__,__LINE__) - -#else - -#define PR_ASSERT(expr) ((void) 0) -#define PR_NOT_REACHED(reasonStr) - -#endif /* defined(DEBUG) */ - -PR_END_EXTERN_C - -#endif /* prlog_h___ */ diff --git a/pr/src/io/prlog.c b/pr/src/io/prlog.c deleted file mode 100644 index f541a036..00000000 --- a/pr/src/io/prlog.c +++ /dev/null @@ -1,504 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ - -/* - * The contents of this file are subject to the Mozilla Public - * License Version 1.1 (the "License"); you may not use this file - * except in compliance with the License. You may obtain a copy of - * the License at http://www.mozilla.org/MPL/ - * - * Software distributed under the License is distributed on an "AS - * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or - * implied. See the License for the specific language governing - * rights and limitations under the License. - * - * The Original Code is the Netscape Portable Runtime (NSPR). - * - * The Initial Developer of the Original Code is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998-2000 Netscape Communications Corporation. All - * Rights Reserved. - * - * Contributor(s): - * - * Alternatively, the contents of this file may be used under the - * terms of the GNU General Public License Version 2 or later (the - * "GPL"), in which case the provisions of the GPL are applicable - * instead of those above. If you wish to allow use of your - * version of this file only under the terms of the GPL and not to - * allow others to use your version of this file under the MPL, - * indicate your decision by deleting the provisions above and - * replace them with the notice and other provisions required by - * the GPL. If you do not delete the provisions above, a recipient - * may use your version of this file under either the MPL or the - * GPL. - */ - -/* - * Contributors: - * - * This Original Code has been modified by IBM Corporation. - * Modifications made by IBM described herein are - * Copyright (c) International Business Machines Corporation, 2000. - * Modifications to Mozilla code or documentation identified per - * MPL Section 3.3 - * - * Date Modified by Description of modification - * 04/10/2000 IBM Corp. Added DebugBreak() definitions for OS/2 - */ - -#include "primpl.h" -#include "prenv.h" -#include "prprf.h" -#include <string.h> - -/* - * Lock used to lock the log. - * - * We can't define _PR_LOCK_LOG simply as PR_Lock because PR_Lock may - * contain assertions. We have to avoid assertions in _PR_LOCK_LOG - * because PR_ASSERT calls PR_LogPrint, which in turn calls _PR_LOCK_LOG. - * This can lead to infinite recursion. - */ -static PRLock *_pr_logLock; -#if defined(_PR_PTHREADS) || defined(_PR_BTHREADS) -#define _PR_LOCK_LOG() PR_Lock(_pr_logLock); -#define _PR_UNLOCK_LOG() PR_Unlock(_pr_logLock); -#elif defined(_PR_GLOBAL_THREADS_ONLY) -#define _PR_LOCK_LOG() { _PR_LOCK_LOCK(_pr_logLock) -#define _PR_UNLOCK_LOG() _PR_LOCK_UNLOCK(_pr_logLock); } -#else - -#define _PR_LOCK_LOG() \ -{ \ - PRIntn _is; \ - PRThread *_me = _PR_MD_CURRENT_THREAD(); \ - if (!_PR_IS_NATIVE_THREAD(_me)) \ - _PR_INTSOFF(_is); \ - _PR_LOCK_LOCK(_pr_logLock) - -#define _PR_UNLOCK_LOG() \ - _PR_LOCK_UNLOCK(_pr_logLock); \ - PR_ASSERT(_me == _PR_MD_CURRENT_THREAD()); \ - if (!_PR_IS_NATIVE_THREAD(_me)) \ - _PR_INTSON(_is); \ -} - -#endif - -#if defined(XP_PC) -#define strcasecmp stricmp -#define strncasecmp strnicmp -#endif - -/* - * On NT, we can't define _PUT_LOG as PR_Write or _PR_MD_WRITE, - * because every asynchronous file io operation leads to a fiber context - * switch. So we define _PUT_LOG as fputs (from stdio.h). A side - * benefit is that fputs handles the LF->CRLF translation. This - * code can also be used on other platforms with file stream io. - */ -#if defined(WIN32) || defined(XP_OS2) -#define _PR_USE_STDIO_FOR_LOGGING -#endif - -/* -** Coerce Win32 log output to use OutputDebugString() when -** NSPR_LOG_FILE is set to "WinDebug". -*/ -#if defined(XP_PC) -#define WIN32_DEBUG_FILE (FILE*)-2 -#endif - -/* Macros used to reduce #ifdef pollution */ - -#if defined(_PR_USE_STDIO_FOR_LOGGING) -#define _PUT_LOG(fd, buf, nb) {fputs(buf, fd); fflush(fd);} -#elif defined(_PR_PTHREADS) -#define _PUT_LOG(fd, buf, nb) PR_Write(fd, buf, nb) -#elif defined(XP_MAC) -#define _PUT_LOG(fd, buf, nb) _PR_MD_WRITE_SYNC(fd, buf, nb) -#else -#define _PUT_LOG(fd, buf, nb) _PR_MD_WRITE(fd, buf, nb) -#endif - -/************************************************************************/ - -static PRLogModuleInfo *logModules; - -static char *logBuf = NULL; -static char *logp; -static char *logEndp; -#ifdef _PR_USE_STDIO_FOR_LOGGING -static FILE *logFile = NULL; -#else -static PRFileDesc *logFile = 0; -#endif - -#define LINE_BUF_SIZE 512 -#define DEFAULT_BUF_SIZE 16384 - -#ifdef _PR_NEED_STRCASECMP - -/* - * strcasecmp is defined in /usr/ucblib/libucb.a on some platforms - * such as NCR and Unixware. Linking with both libc and libucb - * may cause some problem, so I just provide our own implementation - * of strcasecmp here. - */ - -static const unsigned char uc[] = -{ - '\000', '\001', '\002', '\003', '\004', '\005', '\006', '\007', - '\010', '\011', '\012', '\013', '\014', '\015', '\016', '\017', - '\020', '\021', '\022', '\023', '\024', '\025', '\026', '\027', - '\030', '\031', '\032', '\033', '\034', '\035', '\036', '\037', - ' ', '!', '"', '#', '$', '%', '&', '\'', - '(', ')', '*', '+', ',', '-', '.', '/', - '0', '1', '2', '3', '4', '5', '6', '7', - '8', '9', ':', ';', '<', '=', '>', '?', - '@', 'A', 'B', 'C', 'D', 'E', 'F', 'G', - 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', - 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', - 'X', 'Y', 'Z', '[', '\\', ']', '^', '_', - '`', 'A', 'B', 'C', 'D', 'E', 'F', 'G', - 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', - 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', - 'X', 'Y', 'Z', '{', '|', '}', '~', '\177' -}; - -PRIntn strcasecmp(const char *a, const char *b) -{ - const unsigned char *ua = (const unsigned char *)a; - const unsigned char *ub = (const unsigned char *)b; - - if( ((const char *)0 == a) || (const char *)0 == b ) - return (PRIntn)(a-b); - - while( (uc[*ua] == uc[*ub]) && ('\0' != *a) ) - { - a++; - ua++; - ub++; - } - - return (PRIntn)(uc[*ua] - uc[*ub]); -} - -#endif /* _PR_NEED_STRCASECMP */ - -void _PR_InitLog(void) -{ - char *ev; - - _pr_logLock = PR_NewLock(); - - ev = PR_GetEnv("NSPR_LOG_MODULES"); - if (ev && ev[0]) { - char module[64]; - PRBool isSync = PR_FALSE; - PRIntn evlen = strlen(ev), pos = 0; - PRInt32 bufSize = DEFAULT_BUF_SIZE; - while (pos < evlen) { - PRIntn level = 1, count = 0, delta = 0; - count = sscanf(&ev[pos], "%64[ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789]%n:%d%n", - module, &delta, &level, &delta); - pos += delta; - if (count == 0) break; - - /* - ** If count == 2, then we got module and level. If count - ** == 1, then level defaults to 1 (module enabled). - */ - if (strcasecmp(module, "sync") == 0) { - isSync = PR_TRUE; - } else if (strcasecmp(module, "bufsize") == 0) { - if (level >= LINE_BUF_SIZE) { - bufSize = level; - } - } else { - PRLogModuleInfo *lm = logModules; - PRBool skip_modcheck = - (0 == strcasecmp (module, "all")) ? PR_TRUE : PR_FALSE; - - while (lm != NULL) { - if (skip_modcheck) lm -> level = (PRLogModuleLevel)level; - else if (strcasecmp(module, lm->name) == 0) { - lm->level = (PRLogModuleLevel)level; - break; - } - lm = lm->next; - } - } - /*found:*/ - count = sscanf(&ev[pos], " , %n", &delta); - pos += delta; - if (count == -1) break; - } - PR_SetLogBuffering(isSync ? bufSize : 0); - - ev = PR_GetEnv("NSPR_LOG_FILE"); - if (ev && ev[0]) { - if (!PR_SetLogFile(ev)) { -#ifdef XP_PC - char* str = PR_smprintf("Unable to create nspr log file '%s'\n", ev); - if (str) { - OutputDebugString(str); - PR_smprintf_free(str); - } -#else - fprintf(stderr, "Unable to create nspr log file '%s'\n", ev); -#endif - } - } else { -#ifdef _PR_USE_STDIO_FOR_LOGGING - logFile = stderr; -#else - logFile = _pr_stderr; -#endif - } - } -} - -void _PR_LogCleanup(void) -{ - PR_LogFlush(); - -#ifdef _PR_USE_STDIO_FOR_LOGGING - if (logFile && logFile != stdout && logFile != stderr) { - fclose(logFile); - } -#else - if (logFile && logFile != _pr_stdout && logFile != _pr_stderr) { - PR_Close(logFile); - } -#endif -} - -static void _PR_SetLogModuleLevel( PRLogModuleInfo *lm ) -{ - char *ev; - - ev = PR_GetEnv("NSPR_LOG_MODULES"); - if (ev && ev[0]) { - char module[64]; - PRIntn evlen = strlen(ev), pos = 0; - while (pos < evlen) { - PRIntn level = 1, count = 0, delta = 0; - - count = sscanf(&ev[pos], "%64[ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789]%n:%d%n", - module, &delta, &level, &delta); - pos += delta; - if (count == 0) break; - - /* - ** If count == 2, then we got module and level. If count - ** == 1, then level defaults to 1 (module enabled). - */ - if (lm != NULL) - { - if ((strcasecmp(module, "all") == 0) - || (strcasecmp(module, lm->name) == 0)) - { - lm->level = (PRLogModuleLevel)level; - } - } - count = sscanf(&ev[pos], " , %n", &delta); - pos += delta; - if (count == -1) break; - } - } -} /* end _PR_SetLogModuleLevel() */ - -PR_IMPLEMENT(PRLogModuleInfo*) PR_NewLogModule(const char *name) -{ - PRLogModuleInfo *lm; - - if (!_pr_initialized) _PR_ImplicitInitialization(); - - lm = PR_NEWZAP(PRLogModuleInfo); - if (lm) { - lm->name = strdup(name); - lm->level = PR_LOG_NONE; - lm->next = logModules; - logModules = lm; - } - _PR_SetLogModuleLevel(lm); - return lm; -} - -PR_IMPLEMENT(PRBool) PR_SetLogFile(const char *file) -{ -#ifdef _PR_USE_STDIO_FOR_LOGGING - FILE *newLogFile; - -#ifdef XP_PC - if ( strcmp( file, "WinDebug") == 0) - { - logFile = WIN32_DEBUG_FILE; - return(PR_TRUE); - } -#endif - newLogFile = fopen(file, "w"); - if (newLogFile) { - /* We do buffering ourselves. */ - setvbuf(newLogFile, NULL, _IONBF, 0); - if (logFile && logFile != stdout && logFile != stderr) { - fclose(logFile); - } - logFile = newLogFile; - } - return (PRBool) (newLogFile != 0); -#else - PRFileDesc *newLogFile; - - newLogFile = PR_Open(file, PR_WRONLY|PR_CREATE_FILE, 0666); - if (newLogFile) { - if (logFile && logFile != _pr_stdout && logFile != _pr_stderr) { - PR_Close(logFile); - } - logFile = newLogFile; -#if defined(XP_MAC) - SetLogFileTypeCreator(file); -#endif - } - return (PRBool) (newLogFile != 0); -#endif /* _PR_USE_STDIO_FOR_LOGGING */ -} - -PR_IMPLEMENT(void) PR_SetLogBuffering(PRIntn buffer_size) -{ - PR_LogFlush(); - - if (logBuf) - PR_DELETE(logBuf); - logBuf = 0; - - if (buffer_size >= LINE_BUF_SIZE) { - logp = logBuf = (char*) PR_MALLOC(buffer_size); - logEndp = logp + buffer_size; - } -} - -PR_IMPLEMENT(void) PR_LogPrint(const char *fmt, ...) -{ - va_list ap; - char line[LINE_BUF_SIZE]; - PRUint32 nb; - PRThread *me; - - if (!_pr_initialized) _PR_ImplicitInitialization(); - - if (!logFile) { - return; - } - - va_start(ap, fmt); - me = PR_GetCurrentThread(); - nb = PR_snprintf(line, sizeof(line)-1, "%ld[%p]: ", -#if defined(_PR_DCETHREADS) - /* The problem is that for _PR_DCETHREADS, pthread_t is not a - * pointer, but a structure; so you can't easily print it... - */ - me ? &(me->id): 0L, me); -#elif defined(_PR_BTHREADS) - me, me); -#else - me ? me->id : 0L, me); -#endif - - nb += PR_vsnprintf(line+nb, sizeof(line)-nb-1, fmt, ap); - if (nb && (line[nb-1] != '\n')) { -#ifndef XP_MAC - line[nb++] = '\n'; -#else - line[nb++] = '\015'; -#endif - line[nb] = '\0'; - } else { -#ifdef XP_MAC - line[nb-1] = '\015'; -#endif - } - va_end(ap); - - _PR_LOCK_LOG(); - if (logBuf == 0) { -#ifdef XP_PC - if ( logFile == WIN32_DEBUG_FILE) - OutputDebugString( line ); - else - _PUT_LOG(logFile, line, nb); -#else - _PUT_LOG(logFile, line, nb); -#endif - } else { - if (logp + nb > logEndp) { - _PUT_LOG(logFile, logBuf, logp - logBuf); - logp = logBuf; - } - memcpy(logp, line, nb); - logp += nb; - } - _PR_UNLOCK_LOG(); - PR_LogFlush(); -} - -PR_IMPLEMENT(void) PR_LogFlush(void) -{ - if (logBuf && logFile) { - _PR_LOCK_LOG(); - if (logp > logBuf) { - _PUT_LOG(logFile, logBuf, logp - logBuf); - logp = logBuf; - } - _PR_UNLOCK_LOG(); - } -} - -PR_IMPLEMENT(void) PR_Abort(void) -{ - PR_LogPrint("Aborting"); - abort(); -} - -#if defined(XP_OS2) -/* - * Added definitions for DebugBreak() for 2 different OS/2 compilers. - * Doing the int3 on purpose for Visual Age so that a developer can - * step over the instruction if so desired. Not always possible if - * trapping due to exception handling IBM-AKR - */ -#if defined(XP_OS2_VACPP) -#include <builtin.h> -static void DebugBreak(void) { _interrupt(3); } -#elif defined(XP_OS2_EMX) -/* Force a trap */ -static void DebugBreak(void) { int *pTrap=NULL; *pTrap = 1; } -#else -static void DebugBreak(void) { } -#endif -#endif /* XP_OS2 */ - -PR_IMPLEMENT(void) PR_Assert(const char *s, const char *file, PRIntn ln) -{ - PR_LogPrint("Assertion failure: %s, at %s:%d\n", s, file, ln); -#if defined(XP_UNIX) || defined(XP_OS2) || defined(XP_BEOS) - fprintf(stderr, "Assertion failure: %s, at %s:%d\n", s, file, ln); -#endif -#ifdef XP_MAC - dprintf("Assertion failure: %s, at %s:%d\n", s, file, ln); -#endif -#if defined(WIN32) || defined(XP_OS2) - DebugBreak(); -#endif -#ifndef XP_MAC - abort(); -#endif -} - -#ifdef XP_MAC -PR_IMPLEMENT(void) PR_Init_Log(void) -{ - _PR_InitLog(); -} -#endif diff --git a/pr/src/io/prsocket.c b/pr/src/io/prsocket.c deleted file mode 100644 index 2483f963..00000000 --- a/pr/src/io/prsocket.c +++ /dev/null @@ -1,1805 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* - * The contents of this file are subject to the Mozilla Public - * License Version 1.1 (the "License"); you may not use this file - * except in compliance with the License. You may obtain a copy of - * the License at http://www.mozilla.org/MPL/ - * - * Software distributed under the License is distributed on an "AS - * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or - * implied. See the License for the specific language governing - * rights and limitations under the License. - * - * The Original Code is the Netscape Portable Runtime (NSPR). - * - * The Initial Developer of the Original Code is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998-2000 Netscape Communications Corporation. All - * Rights Reserved. - * - * Contributor(s): - * - * Alternatively, the contents of this file may be used under the - * terms of the GNU General Public License Version 2 or later (the - * "GPL"), in which case the provisions of the GPL are applicable - * instead of those above. If you wish to allow use of your - * version of this file only under the terms of the GPL and not to - * allow others to use your version of this file under the MPL, - * indicate your decision by deleting the provisions above and - * replace them with the notice and other provisions required by - * the GPL. If you do not delete the provisions above, a recipient - * may use your version of this file under either the MPL or the - * GPL. - */ - -#include "primpl.h" - -#include <string.h> - -/************************************************************************/ - -/* These two functions are only used in assertions. */ -#if defined(DEBUG) - -PRBool IsValidNetAddr(const PRNetAddr *addr) -{ - if ((addr != NULL) -#ifdef XP_UNIX - && (addr->raw.family != PR_AF_LOCAL) -#endif - && (addr->raw.family != PR_AF_INET6) - && (addr->raw.family != PR_AF_INET)) { - return PR_FALSE; - } - return PR_TRUE; -} - -static PRBool IsValidNetAddrLen(const PRNetAddr *addr, PRInt32 addr_len) -{ - /* - * The definition of the length of a Unix domain socket address - * is not uniform, so we don't check it. - */ - if ((addr != NULL) -#ifdef XP_UNIX - && (addr->raw.family != AF_UNIX) -#endif - && (PR_NETADDR_SIZE(addr) != addr_len)) { -#if defined(LINUX) && __GLIBC__ == 2 && __GLIBC_MINOR__ == 1 - /* - * In glibc 2.1, struct sockaddr_in6 is 24 bytes. In glibc 2.2 - * and in the 2.4 kernel, struct sockaddr_in6 has the scope_id - * field and is 28 bytes. It is possible for socket functions - * to return an addr_len greater than sizeof(struct sockaddr_in6). - * We need to allow that. (Bugzilla bug #77264) - */ - if ((PR_AF_INET6 == addr->raw.family) - && (sizeof(addr->ipv6) == addr_len)) { - return PR_TRUE; - } -#endif - /* - * The accept(), getsockname(), etc. calls on some platforms - * do not set the actual socket address length on return. - * In this case, we verifiy addr_len is still the value we - * passed in (i.e., sizeof(PRNetAddr)). - */ -#if defined(QNX) - if (sizeof(PRNetAddr) == addr_len) { - return PR_TRUE; - } -#endif - return PR_FALSE; - } - return PR_TRUE; -} - -#endif /* DEBUG */ - -static PRInt32 PR_CALLBACK SocketWritev(PRFileDesc *fd, const PRIOVec *iov, -PRInt32 iov_size, PRIntervalTime timeout) -{ - PRThread *me = _PR_MD_CURRENT_THREAD(); - int w = 0; - const PRIOVec *tmp_iov; -#define LOCAL_MAXIOV 8 - PRIOVec local_iov[LOCAL_MAXIOV]; - PRIOVec *iov_copy = NULL; - int tmp_out; - int index, iov_cnt; - int count=0, sz = 0; /* 'count' is the return value. */ - - if (_PR_PENDING_INTERRUPT(me)) { - me->flags &= ~_PR_INTERRUPT; - PR_SetError(PR_PENDING_INTERRUPT_ERROR, 0); - return -1; - } - if (_PR_IO_PENDING(me)) { - PR_SetError(PR_IO_PENDING_ERROR, 0); - return -1; - } - - /* - * Assume the first writev will succeed. Copy iov's only on - * failure. - */ - tmp_iov = iov; - for (index = 0; index < iov_size; index++) - sz += iov[index].iov_len; - - iov_cnt = iov_size; - - while (sz > 0) { - - w = _PR_MD_WRITEV(fd, tmp_iov, iov_cnt, timeout); - if (w < 0) { - count = -1; - break; - } - count += w; - if (fd->secret->nonblocking) { - break; - } - sz -= w; - - if (sz > 0) { - /* find the next unwritten vector */ - for ( index = 0, tmp_out = count; - tmp_out >= iov[index].iov_len; - tmp_out -= iov[index].iov_len, index++){;} /* nothing to execute */ - - if (tmp_iov == iov) { - /* - * The first writev failed so we - * must copy iov's around. - * Avoid calloc/free if there - * are few enough iov's. - */ - if (iov_size - index <= LOCAL_MAXIOV) - iov_copy = local_iov; - else if ((iov_copy = (PRIOVec *) PR_CALLOC((iov_size - index) * - sizeof *iov_copy)) == NULL) { - PR_SetError(PR_OUT_OF_MEMORY_ERROR, 0); - return -1; - } - tmp_iov = iov_copy; - } - - PR_ASSERT(tmp_iov == iov_copy); - - /* fill in the first partial read */ - iov_copy[0].iov_base = &(((char *)iov[index].iov_base)[tmp_out]); - iov_copy[0].iov_len = iov[index].iov_len - tmp_out; - index++; - - /* copy the remaining vectors */ - for (iov_cnt=1; index<iov_size; iov_cnt++, index++) { - iov_copy[iov_cnt].iov_base = iov[index].iov_base; - iov_copy[iov_cnt].iov_len = iov[index].iov_len; - } - } - } - - if (iov_copy != local_iov) - PR_DELETE(iov_copy); - return count; -} - -/************************************************************************/ - -PR_IMPLEMENT(PRFileDesc *) PR_ImportTCPSocket(PRInt32 osfd) -{ -PRFileDesc *fd; - - if (!_pr_initialized) _PR_ImplicitInitialization(); - fd = PR_AllocFileDesc(osfd, PR_GetTCPMethods()); - if (fd != NULL) { - _PR_MD_MAKE_NONBLOCK(fd); - _PR_MD_INIT_FD_INHERITABLE(fd, PR_TRUE); - } else - _PR_MD_CLOSE_SOCKET(osfd); - return(fd); -} - -PR_IMPLEMENT(PRFileDesc *) PR_ImportUDPSocket(PRInt32 osfd) -{ -PRFileDesc *fd; - - if (!_pr_initialized) _PR_ImplicitInitialization(); - fd = PR_AllocFileDesc(osfd, PR_GetUDPMethods()); - if (fd != NULL) { - _PR_MD_MAKE_NONBLOCK(fd); - _PR_MD_INIT_FD_INHERITABLE(fd, PR_TRUE); - } else - _PR_MD_CLOSE_SOCKET(osfd); - return(fd); -} - - -static const PRIOMethods* PR_GetSocketPollFdMethods(void); - -PR_IMPLEMENT(PRFileDesc*) PR_CreateSocketPollFd(PRInt32 osfd) -{ - PRFileDesc *fd; - - if (!_pr_initialized) _PR_ImplicitInitialization(); - - fd = _PR_Getfd(); - - if (fd == NULL) PR_SetError(PR_OUT_OF_MEMORY_ERROR, 0); - else - { - fd->secret->md.osfd = osfd; - fd->secret->inheritable = _PR_TRI_FALSE; - fd->secret->state = _PR_FILEDESC_OPEN; - fd->methods = PR_GetSocketPollFdMethods(); - } - - return fd; -} /* PR_CreateSocketPollFD */ - -PR_IMPLEMENT(PRStatus) PR_DestroySocketPollFd(PRFileDesc *fd) -{ - if (NULL == fd) - { - PR_SetError(PR_BAD_DESCRIPTOR_ERROR, 0); - return PR_FAILURE; - } - fd->secret->state = _PR_FILEDESC_CLOSED; - _PR_Putfd(fd); - return PR_SUCCESS; -} /* PR_DestroySocketPollFd */ - -static PRStatus PR_CALLBACK SocketConnect( - PRFileDesc *fd, const PRNetAddr *addr, PRIntervalTime timeout) -{ - PRInt32 rv; /* Return value of _PR_MD_CONNECT */ - const PRNetAddr *addrp = addr; -#if defined(_PR_INET6) - PRNetAddr addrCopy; -#endif - PRThread *me = _PR_MD_CURRENT_THREAD(); - - if (_PR_PENDING_INTERRUPT(me)) { - me->flags &= ~_PR_INTERRUPT; - PR_SetError(PR_PENDING_INTERRUPT_ERROR, 0); - return PR_FAILURE; - } -#if defined(_PR_INET6) - if (addr->raw.family == PR_AF_INET6) { - addrCopy = *addr; - addrCopy.raw.family = AF_INET6; - addrp = &addrCopy; - } -#endif - - rv = _PR_MD_CONNECT(fd, addrp, PR_NETADDR_SIZE(addr), timeout); - PR_LOG(_pr_io_lm, PR_LOG_MAX, ("connect -> %d", rv)); - if (rv == 0) - return PR_SUCCESS; - else - return PR_FAILURE; -} - -static PRStatus PR_CALLBACK SocketConnectContinue( - PRFileDesc *fd, PRInt16 out_flags) -{ - PRInt32 osfd; - int err; - - if (out_flags & PR_POLL_NVAL) { - PR_SetError(PR_BAD_DESCRIPTOR_ERROR, 0); - return PR_FAILURE; - } - if ((out_flags & (PR_POLL_WRITE | PR_POLL_EXCEPT | PR_POLL_ERR)) == 0) { - PR_ASSERT(out_flags == 0); - PR_SetError(PR_IN_PROGRESS_ERROR, 0); - return PR_FAILURE; - } - - osfd = fd->secret->md.osfd; - -#if defined(XP_UNIX) - - err = _MD_unix_get_nonblocking_connect_error(osfd); - if (err != 0) { - _PR_MD_MAP_CONNECT_ERROR(err); - return PR_FAILURE; - } - return PR_SUCCESS; - -#elif defined(WIN32) || defined(WIN16) - -#if defined(WIN32) - /* - * The sleep circumvents a bug in Win32 WinSock. - * See Microsoft Knowledge Base article ID: Q165989. - */ - Sleep(0); -#endif /* WIN32 */ - - if (out_flags & PR_POLL_EXCEPT) { - int len = sizeof(err); - if (getsockopt(osfd, (int)SOL_SOCKET, SO_ERROR, (char *) &err, &len) - == SOCKET_ERROR) { - _PR_MD_MAP_GETSOCKOPT_ERROR(WSAGetLastError()); - return PR_FAILURE; - } - if (err != 0) { - _PR_MD_MAP_CONNECT_ERROR(err); - } else { - PR_SetError(PR_UNKNOWN_ERROR, 0); - } - return PR_FAILURE; - } - - PR_ASSERT(out_flags & PR_POLL_WRITE); - return PR_SUCCESS; - -#elif defined(XP_OS2) - - if (out_flags & PR_POLL_EXCEPT) { - int len = sizeof(err); - if (getsockopt(osfd, SOL_SOCKET, SO_ERROR, (char *) &err, &len) - < 0) { - _PR_MD_MAP_GETSOCKOPT_ERROR(sock_errno()); - return PR_FAILURE; - } - if (err != 0) { - _PR_MD_MAP_CONNECT_ERROR(err); - } else { - PR_SetError(PR_UNKNOWN_ERROR, 0); - } - return PR_FAILURE; - } - - PR_ASSERT(out_flags & PR_POLL_WRITE); - return PR_SUCCESS; - -#elif defined(XP_MAC) - - err = _MD_mac_get_nonblocking_connect_error(osfd); - if (err == -1) - return PR_FAILURE; - else - return PR_SUCCESS; - -#elif defined(XP_BEOS) - - err = _MD_beos_get_nonblocking_connect_error(fd); - if( err != 0 ) { - _PR_MD_MAP_CONNECT_ERROR(err); - return PR_FAILURE; - } - else - return PR_SUCCESS; - -#else - PR_SetError(PR_NOT_IMPLEMENTED_ERROR, 0); - return PR_FAILURE; -#endif -} - -PR_IMPLEMENT(PRStatus) PR_GetConnectStatus(const PRPollDesc *pd) -{ - /* Find the NSPR layer and invoke its connectcontinue method */ - PRFileDesc *bottom = PR_GetIdentitiesLayer(pd->fd, PR_NSPR_IO_LAYER); - - if (NULL == bottom) { - PR_SetError(PR_INVALID_ARGUMENT_ERROR, 0); - return PR_FAILURE; - } - return SocketConnectContinue(bottom, pd->out_flags); -} - -static PRFileDesc* PR_CALLBACK SocketAccept(PRFileDesc *fd, PRNetAddr *addr, -PRIntervalTime timeout) -{ - PRInt32 osfd; - PRFileDesc *fd2; - PRUint32 al; - PRThread *me = _PR_MD_CURRENT_THREAD(); -#ifdef WINNT - PRNetAddr addrCopy; -#endif - - if (_PR_PENDING_INTERRUPT(me)) { - me->flags &= ~_PR_INTERRUPT; - PR_SetError(PR_PENDING_INTERRUPT_ERROR, 0); - return 0; - } - if (_PR_IO_PENDING(me)) { - PR_SetError(PR_IO_PENDING_ERROR, 0); - return 0; - } - -#ifdef WINNT - if (addr == NULL) { - addr = &addrCopy; - } -#endif - al = sizeof(PRNetAddr); - osfd = _PR_MD_ACCEPT(fd, addr, &al, timeout); - if (osfd == -1) - return 0; - - fd2 = PR_AllocFileDesc(osfd, PR_GetTCPMethods()); - if (!fd2) { - _PR_MD_CLOSE_SOCKET(osfd); - return NULL; - } - - fd2->secret->nonblocking = fd->secret->nonblocking; - fd2->secret->inheritable = fd->secret->inheritable; -#ifdef WINNT - if (!fd2->secret->nonblocking && fd2->secret->inheritable != _PR_TRI_TRUE) { - /* - * The new socket has been associated with an I/O - * completion port. There is no going back. - */ - fd2->secret->md.io_model_committed = PR_TRUE; - } - PR_ASSERT(al == PR_NETADDR_SIZE(addr)); - fd2->secret->md.accepted_socket = PR_TRUE; - memcpy(&fd2->secret->md.peer_addr, addr, al); -#endif - - /* - * On some platforms, the new socket created by accept() - * inherits the nonblocking (or overlapped io) attribute - * of the listening socket. As an optimization, these - * platforms can skip the following _PR_MD_MAKE_NONBLOCK - * call. - * - * On Mac, we MUST make this call, because _PR_MD_MAKE_NONBLOCK - * (which maps to _MD_makenonblock, see macsockotpt.c) - * installs the async notifier routine needed to make blocking - * I/O work properly. - */ -#if !defined(SOLARIS) && !defined(IRIX) && !defined(WINNT) - _PR_MD_MAKE_NONBLOCK(fd2); -#endif - -#ifdef _PR_INET6 - if (addr && (AF_INET6 == addr->raw.family)) - addr->raw.family = PR_AF_INET6; -#endif - PR_ASSERT(IsValidNetAddr(addr) == PR_TRUE); - PR_ASSERT(IsValidNetAddrLen(addr, al) == PR_TRUE); - - return fd2; -} - -#ifdef WINNT -PR_IMPLEMENT(PRFileDesc*) PR_NTFast_Accept(PRFileDesc *fd, PRNetAddr *addr, -PRIntervalTime timeout) -{ - PRInt32 osfd; - PRFileDesc *fd2; - PRIntn al; - PRThread *me = _PR_MD_CURRENT_THREAD(); - PRNetAddr addrCopy; - - if (_PR_PENDING_INTERRUPT(me)) { - me->flags &= ~_PR_INTERRUPT; - PR_SetError(PR_PENDING_INTERRUPT_ERROR, 0); - return 0; - } - if (_PR_IO_PENDING(me)) { - PR_SetError(PR_IO_PENDING_ERROR, 0); - return 0; - } - - if (addr == NULL) { - addr = &addrCopy; - } - al = PR_NETADDR_SIZE(addr); - osfd = _PR_MD_FAST_ACCEPT(fd, addr, &al, timeout, PR_TRUE, NULL, NULL); - if (osfd == -1) { - return 0; - } - - fd2 = PR_AllocFileDesc(osfd, PR_GetTCPMethods()); - if (!fd2) { - _PR_MD_CLOSE_SOCKET(osfd); - } else { - fd2->secret->nonblocking = fd->secret->nonblocking; - fd2->secret->md.io_model_committed = PR_TRUE; - PR_ASSERT(al == PR_NETADDR_SIZE(addr)); - fd2->secret->md.accepted_socket = PR_TRUE; - memcpy(&fd2->secret->md.peer_addr, addr, al); -#ifdef _PR_INET6 - if (AF_INET6 == addr->raw.family) - addr->raw.family = PR_AF_INET6; -#endif - } - return fd2; -} -#endif /* WINNT */ - - -static PRStatus PR_CALLBACK SocketBind(PRFileDesc *fd, const PRNetAddr *addr) -{ - PRInt32 result; - const PRNetAddr *addrp = addr; -#if defined(_PR_INET6) - PRNetAddr addrCopy; -#endif - - PR_ASSERT(IsValidNetAddr(addr) == PR_TRUE); - -#ifdef XP_UNIX - if (addr->raw.family == AF_UNIX) { - /* Disallow relative pathnames */ - if (addr->local.path[0] != '/') { - PR_SetError(PR_INVALID_ARGUMENT_ERROR, 0); - return PR_FAILURE; - } - } -#endif /* XP_UNIX */ - -#if defined(_PR_INET6) - if (addr->raw.family == PR_AF_INET6) { - addrCopy = *addr; - addrCopy.raw.family = AF_INET6; - addrp = &addrCopy; - } -#endif - result = _PR_MD_BIND(fd, addrp, PR_NETADDR_SIZE(addr)); - if (result < 0) { - return PR_FAILURE; - } - return PR_SUCCESS; -} - -static PRStatus PR_CALLBACK SocketListen(PRFileDesc *fd, PRIntn backlog) -{ - PRInt32 result; - - result = _PR_MD_LISTEN(fd, backlog); - if (result < 0) { - return PR_FAILURE; - } - return PR_SUCCESS; -} - -static PRStatus PR_CALLBACK SocketShutdown(PRFileDesc *fd, PRIntn how) -{ - PRInt32 result; - - result = _PR_MD_SHUTDOWN(fd, how); - if (result < 0) { - return PR_FAILURE; - } - return PR_SUCCESS; -} - -static PRInt32 PR_CALLBACK SocketRecv(PRFileDesc *fd, void *buf, PRInt32 amount, PRIntn flags, -PRIntervalTime timeout) -{ - PRInt32 rv; - PRThread *me = _PR_MD_CURRENT_THREAD(); - - if ((flags != 0) && (flags != PR_MSG_PEEK)) { - PR_SetError(PR_INVALID_ARGUMENT_ERROR, 0); - return -1; - } - if (_PR_PENDING_INTERRUPT(me)) { - me->flags &= ~_PR_INTERRUPT; - PR_SetError(PR_PENDING_INTERRUPT_ERROR, 0); - return -1; - } - if (_PR_IO_PENDING(me)) { - PR_SetError(PR_IO_PENDING_ERROR, 0); - return -1; - } - - PR_LOG(_pr_io_lm, PR_LOG_MAX, ("recv: fd=%p osfd=%d buf=%p amount=%d flags=%d", - fd, fd->secret->md.osfd, buf, amount, flags)); - -#ifdef _PR_HAVE_PEEK_BUFFER - if (fd->secret->peekBytes != 0) { - rv = (amount < fd->secret->peekBytes) ? - amount : fd->secret->peekBytes; - memcpy(buf, fd->secret->peekBuffer, rv); - if (flags == 0) { - /* consume the bytes in the peek buffer */ - fd->secret->peekBytes -= rv; - if (fd->secret->peekBytes != 0) { - memmove(fd->secret->peekBuffer, - fd->secret->peekBuffer + rv, - fd->secret->peekBytes); - } - } - return rv; - } - - /* allocate peek buffer, if necessary */ - if ((PR_MSG_PEEK == flags) && _PR_FD_NEED_EMULATE_MSG_PEEK(fd)) { - PR_ASSERT(0 == fd->secret->peekBytes); - /* impose a max size on the peek buffer */ - if (amount > _PR_PEEK_BUFFER_MAX) { - amount = _PR_PEEK_BUFFER_MAX; - } - if (fd->secret->peekBufSize < amount) { - if (fd->secret->peekBuffer) { - PR_Free(fd->secret->peekBuffer); - } - fd->secret->peekBufSize = amount; - fd->secret->peekBuffer = PR_Malloc(amount); - if (NULL == fd->secret->peekBuffer) { - fd->secret->peekBufSize = 0; - PR_SetError(PR_OUT_OF_MEMORY_ERROR, 0); - return -1; - } - } - } -#endif - - rv = _PR_MD_RECV(fd, buf, amount, flags, timeout); - PR_LOG(_pr_io_lm, PR_LOG_MAX, ("recv -> %d, error = %d, os error = %d", - rv, PR_GetError(), PR_GetOSError())); - -#ifdef _PR_HAVE_PEEK_BUFFER - if ((PR_MSG_PEEK == flags) && _PR_FD_NEED_EMULATE_MSG_PEEK(fd)) { - if (rv > 0) { - memcpy(fd->secret->peekBuffer, buf, rv); - fd->secret->peekBytes = rv; - } - } -#endif - - return rv; -} - -static PRInt32 PR_CALLBACK SocketRead(PRFileDesc *fd, void *buf, PRInt32 amount) -{ - return SocketRecv(fd, buf, amount, 0, PR_INTERVAL_NO_TIMEOUT); -} - -static PRInt32 PR_CALLBACK SocketSend(PRFileDesc *fd, const void *buf, PRInt32 amount, -PRIntn flags, PRIntervalTime timeout) -{ - PRInt32 temp, count; - PRThread *me = _PR_MD_CURRENT_THREAD(); - - if (_PR_PENDING_INTERRUPT(me)) { - me->flags &= ~_PR_INTERRUPT; - PR_SetError(PR_PENDING_INTERRUPT_ERROR, 0); - return -1; - } - if (_PR_IO_PENDING(me)) { - PR_SetError(PR_IO_PENDING_ERROR, 0); - return -1; - } - - count = 0; - while (amount > 0) { - PR_LOG(_pr_io_lm, PR_LOG_MAX, - ("send: fd=%p osfd=%d buf=%p amount=%d", - fd, fd->secret->md.osfd, buf, amount)); - temp = _PR_MD_SEND(fd, buf, amount, flags, timeout); - if (temp < 0) { - count = -1; - break; - } - - count += temp; - if (fd->secret->nonblocking) { - break; - } - buf = (const void*) ((const char*)buf + temp); - - amount -= temp; - } - PR_LOG(_pr_io_lm, PR_LOG_MAX, ("send -> %d", count)); - return count; -} - -static PRInt32 PR_CALLBACK SocketWrite(PRFileDesc *fd, const void *buf, PRInt32 amount) -{ - return SocketSend(fd, buf, amount, 0, PR_INTERVAL_NO_TIMEOUT); -} - -static PRStatus PR_CALLBACK SocketClose(PRFileDesc *fd) -{ - if (!fd || !fd->secret - || (fd->secret->state != _PR_FILEDESC_OPEN - && fd->secret->state != _PR_FILEDESC_CLOSED)) { - PR_SetError(PR_BAD_DESCRIPTOR_ERROR, 0); - return PR_FAILURE; - } - - if (fd->secret->state == _PR_FILEDESC_OPEN) { - if (_PR_MD_CLOSE_SOCKET(fd->secret->md.osfd) < 0) { - return PR_FAILURE; - } - fd->secret->state = _PR_FILEDESC_CLOSED; - } - -#ifdef _PR_HAVE_PEEK_BUFFER - if (fd->secret->peekBuffer) { - PR_ASSERT(fd->secret->peekBufSize > 0); - PR_DELETE(fd->secret->peekBuffer); - fd->secret->peekBufSize = 0; - fd->secret->peekBytes = 0; - } -#endif - - PR_FreeFileDesc(fd); - return PR_SUCCESS; -} - -static PRInt32 PR_CALLBACK SocketAvailable(PRFileDesc *fd) -{ - PRInt32 rv; -#ifdef _PR_HAVE_PEEK_BUFFER - if (fd->secret->peekBytes != 0) { - return fd->secret->peekBytes; - } -#endif - rv = _PR_MD_SOCKETAVAILABLE(fd); - return rv; -} - -static PRInt64 PR_CALLBACK SocketAvailable64(PRFileDesc *fd) -{ - PRInt64 rv; -#ifdef _PR_HAVE_PEEK_BUFFER - if (fd->secret->peekBytes != 0) { - LL_I2L(rv, fd->secret->peekBytes); - return rv; - } -#endif - LL_I2L(rv, _PR_MD_SOCKETAVAILABLE(fd)); - return rv; -} - -static PRStatus PR_CALLBACK SocketSync(PRFileDesc *fd) -{ -#if defined(XP_MAC) -#pragma unused (fd) -#endif - - return PR_SUCCESS; -} - -static PRInt32 PR_CALLBACK SocketSendTo( - PRFileDesc *fd, const void *buf, PRInt32 amount, - PRIntn flags, const PRNetAddr *addr, PRIntervalTime timeout) -{ - PRInt32 temp, count; - const PRNetAddr *addrp = addr; -#if defined(_PR_INET6) - PRNetAddr addrCopy; -#endif - PRThread *me = _PR_MD_CURRENT_THREAD(); - - if (_PR_PENDING_INTERRUPT(me)) { - me->flags &= ~_PR_INTERRUPT; - PR_SetError(PR_PENDING_INTERRUPT_ERROR, 0); - return -1; - } - if (_PR_IO_PENDING(me)) { - PR_SetError(PR_IO_PENDING_ERROR, 0); - return -1; - } - - PR_ASSERT(IsValidNetAddr(addr) == PR_TRUE); -#if defined(_PR_INET6) - if (addr->raw.family == PR_AF_INET6) { - addrCopy = *addr; - addrCopy.raw.family = AF_INET6; - addrp = &addrCopy; - } -#endif - - count = 0; - while (amount > 0) { - temp = _PR_MD_SENDTO(fd, buf, amount, flags, - addrp, PR_NETADDR_SIZE(addr), timeout); - if (temp < 0) { - count = -1; - break; - } - count += temp; - if (fd->secret->nonblocking) { - break; - } - buf = (const void*) ((const char*)buf + temp); - amount -= temp; - } - return count; -} - -static PRInt32 PR_CALLBACK SocketRecvFrom(PRFileDesc *fd, void *buf, PRInt32 amount, -PRIntn flags, PRNetAddr *addr, PRIntervalTime timeout) -{ - PRInt32 rv; - PRUint32 al; - PRThread *me = _PR_MD_CURRENT_THREAD(); - - if (_PR_PENDING_INTERRUPT(me)) { - me->flags &= ~_PR_INTERRUPT; - PR_SetError(PR_PENDING_INTERRUPT_ERROR, 0); - return -1; - } - if (_PR_IO_PENDING(me)) { - PR_SetError(PR_IO_PENDING_ERROR, 0); - return -1; - } - - al = sizeof(PRNetAddr); - rv = _PR_MD_RECVFROM(fd, buf, amount, flags, addr, &al, timeout); -#ifdef _PR_INET6 - if (addr && (AF_INET6 == addr->raw.family)) - addr->raw.family = PR_AF_INET6; -#endif - return rv; -} - -static PRInt32 PR_CALLBACK SocketAcceptRead(PRFileDesc *sd, PRFileDesc **nd, -PRNetAddr **raddr, void *buf, PRInt32 amount, -PRIntervalTime timeout) -{ - PRInt32 rv; - PRThread *me = _PR_MD_CURRENT_THREAD(); - - if (_PR_PENDING_INTERRUPT(me)) { - me->flags &= ~_PR_INTERRUPT; - PR_SetError(PR_PENDING_INTERRUPT_ERROR, 0); - return -1; - } - if (_PR_IO_PENDING(me)) { - PR_SetError(PR_IO_PENDING_ERROR, 0); - return -1; - } - /* The socket must be in blocking mode. */ - if (sd->secret->nonblocking) { - PR_SetError(PR_INVALID_ARGUMENT_ERROR, 0); - return -1; - } - *nd = NULL; - -#if defined(WINNT) - { - PRInt32 newSock; - PRNetAddr *raddrCopy; - - if (raddr == NULL) { - raddr = &raddrCopy; - } - rv = _PR_MD_ACCEPT_READ(sd, &newSock, raddr, buf, amount, timeout); - if (rv < 0) { - rv = -1; - } else { - /* Successfully accepted and read; create the new PRFileDesc */ - *nd = PR_AllocFileDesc(newSock, PR_GetTCPMethods()); - if (*nd == 0) { - _PR_MD_CLOSE_SOCKET(newSock); - /* PR_AllocFileDesc() has invoked PR_SetError(). */ - rv = -1; - } else { - (*nd)->secret->md.io_model_committed = PR_TRUE; - (*nd)->secret->md.accepted_socket = PR_TRUE; - memcpy(&(*nd)->secret->md.peer_addr, *raddr, - PR_NETADDR_SIZE(*raddr)); -#ifdef _PR_INET6 - if (AF_INET6 == *raddr->raw.family) - *raddr->raw.family = PR_AF_INET6; -#endif - } - } - } -#else - rv = PR_EmulateAcceptRead(sd, nd, raddr, buf, amount, timeout); -#endif - return rv; -} - -#ifdef WINNT -PR_IMPLEMENT(PRInt32) PR_NTFast_AcceptRead(PRFileDesc *sd, PRFileDesc **nd, -PRNetAddr **raddr, void *buf, PRInt32 amount, -PRIntervalTime timeout) -{ - PRInt32 rv; - PRInt32 newSock; - PRThread *me = _PR_MD_CURRENT_THREAD(); - PRNetAddr *raddrCopy; - - if (_PR_PENDING_INTERRUPT(me)) { - me->flags &= ~_PR_INTERRUPT; - PR_SetError(PR_PENDING_INTERRUPT_ERROR, 0); - return -1; - } - if (_PR_IO_PENDING(me)) { - PR_SetError(PR_IO_PENDING_ERROR, 0); - return -1; - } - *nd = NULL; - - if (raddr == NULL) { - raddr = &raddrCopy; - } - rv = _PR_MD_FAST_ACCEPT_READ(sd, &newSock, raddr, buf, amount, - timeout, PR_TRUE, NULL, NULL); - if (rv < 0) { - rv = -1; - } else { - /* Successfully accepted and read; create the new PRFileDesc */ - *nd = PR_AllocFileDesc(newSock, PR_GetTCPMethods()); - if (*nd == 0) { - _PR_MD_CLOSE_SOCKET(newSock); - /* PR_AllocFileDesc() has invoked PR_SetError(). */ - rv = -1; - } else { - (*nd)->secret->md.io_model_committed = PR_TRUE; - (*nd)->secret->md.accepted_socket = PR_TRUE; - memcpy(&(*nd)->secret->md.peer_addr, *raddr, - PR_NETADDR_SIZE(*raddr)); -#ifdef _PR_INET6 - if (AF_INET6 == *raddr->raw.family) - *raddr->raw.family = PR_AF_INET6; -#endif - } - } - return rv; -} - -PR_IMPLEMENT(PRInt32) PR_NTFast_AcceptRead_WithTimeoutCallback( -PRFileDesc *sd, PRFileDesc **nd, -PRNetAddr **raddr, void *buf, PRInt32 amount, -PRIntervalTime timeout, -_PR_AcceptTimeoutCallback callback, -void *callbackArg) -{ - PRInt32 rv; - PRInt32 newSock; - PRThread *me = _PR_MD_CURRENT_THREAD(); - PRNetAddr *raddrCopy; - - if (_PR_PENDING_INTERRUPT(me)) { - me->flags &= ~_PR_INTERRUPT; - PR_SetError(PR_PENDING_INTERRUPT_ERROR, 0); - return -1; - } - if (_PR_IO_PENDING(me)) { - PR_SetError(PR_IO_PENDING_ERROR, 0); - return -1; - } - *nd = NULL; - - if (raddr == NULL) { - raddr = &raddrCopy; - } - rv = _PR_MD_FAST_ACCEPT_READ(sd, &newSock, raddr, buf, amount, - timeout, PR_TRUE, callback, callbackArg); - if (rv < 0) { - rv = -1; - } else { - /* Successfully accepted and read; create the new PRFileDesc */ - *nd = PR_AllocFileDesc(newSock, PR_GetTCPMethods()); - if (*nd == 0) { - _PR_MD_CLOSE_SOCKET(newSock); - /* PR_AllocFileDesc() has invoked PR_SetError(). */ - rv = -1; - } else { - (*nd)->secret->md.io_model_committed = PR_TRUE; - (*nd)->secret->md.accepted_socket = PR_TRUE; - memcpy(&(*nd)->secret->md.peer_addr, *raddr, - PR_NETADDR_SIZE(*raddr)); -#ifdef _PR_INET6 - if (AF_INET6 == *raddr->raw.family) - *raddr->raw.family = PR_AF_INET6; -#endif - } - } - return rv; -} -#endif /* WINNT */ - -#ifdef WINNT -PR_IMPLEMENT(void) -PR_NTFast_UpdateAcceptContext(PRFileDesc *socket, PRFileDesc *acceptSocket) -{ - _PR_MD_UPDATE_ACCEPT_CONTEXT( - socket->secret->md.osfd, acceptSocket->secret->md.osfd); -} -#endif /* WINNT */ - -static PRInt32 PR_CALLBACK SocketSendFile( - PRFileDesc *sd, PRSendFileData *sfd, - PRTransmitFileFlags flags, PRIntervalTime timeout) -{ - PRInt32 rv; - PRThread *me = _PR_MD_CURRENT_THREAD(); - - if (_PR_PENDING_INTERRUPT(me)) { - me->flags &= ~_PR_INTERRUPT; - PR_SetError(PR_PENDING_INTERRUPT_ERROR, 0); - return -1; - } - if (_PR_IO_PENDING(me)) { - PR_SetError(PR_IO_PENDING_ERROR, 0); - return -1; - } - /* The socket must be in blocking mode. */ - if (sd->secret->nonblocking) { - PR_SetError(PR_INVALID_ARGUMENT_ERROR, 0); - return -1; - } -#if defined(WINNT) - rv = _PR_MD_SENDFILE(sd, sfd, flags, timeout); - if ((rv >= 0) && (flags == PR_TRANSMITFILE_CLOSE_SOCKET)) { - /* - * This should be kept the same as SocketClose, except - * that _PR_MD_CLOSE_SOCKET(sd->secret->md.osfd) should - * not be called because the socket will be recycled. - */ - PR_FreeFileDesc(sd); - } -#else - rv = PR_EmulateSendFile(sd, sfd, flags, timeout); -#endif /* WINNT */ - - return rv; -} - -static PRInt32 PR_CALLBACK SocketTransmitFile(PRFileDesc *sd, PRFileDesc *fd, -const void *headers, PRInt32 hlen, PRTransmitFileFlags flags, -PRIntervalTime timeout) -{ - PRSendFileData sfd; - - sfd.fd = fd; - sfd.file_offset = 0; - sfd.file_nbytes = 0; - sfd.header = headers; - sfd.hlen = hlen; - sfd.trailer = NULL; - sfd.tlen = 0; - - return(SocketSendFile(sd, &sfd, flags, timeout)); -} - -static PRStatus PR_CALLBACK SocketGetName(PRFileDesc *fd, PRNetAddr *addr) -{ - PRInt32 result; - PRUint32 addrlen; - - addrlen = sizeof(PRNetAddr); - result = _PR_MD_GETSOCKNAME(fd, addr, &addrlen); - if (result < 0) { - return PR_FAILURE; - } -#ifdef _PR_INET6 - if (AF_INET6 == addr->raw.family) - addr->raw.family = PR_AF_INET6; -#endif - PR_ASSERT(IsValidNetAddr(addr) == PR_TRUE); - PR_ASSERT(IsValidNetAddrLen(addr, addrlen) == PR_TRUE); - return PR_SUCCESS; -} - -static PRStatus PR_CALLBACK SocketGetPeerName(PRFileDesc *fd, PRNetAddr *addr) -{ - PRInt32 result; - PRUint32 addrlen; - - addrlen = sizeof(PRNetAddr); - result = _PR_MD_GETPEERNAME(fd, addr, &addrlen); - if (result < 0) { - return PR_FAILURE; - } -#ifdef _PR_INET6 - if (AF_INET6 == addr->raw.family) - addr->raw.family = PR_AF_INET6; -#endif - PR_ASSERT(IsValidNetAddr(addr) == PR_TRUE); - PR_ASSERT(IsValidNetAddrLen(addr, addrlen) == PR_TRUE); - return PR_SUCCESS; -} - -static PRInt16 PR_CALLBACK SocketPoll( - PRFileDesc *fd, PRInt16 in_flags, PRInt16 *out_flags) -{ -#ifdef XP_MAC -#pragma unused( fd, in_flags ) -#endif - *out_flags = 0; - return in_flags; -} /* SocketPoll */ - -static PRIOMethods tcpMethods = { - PR_DESC_SOCKET_TCP, - SocketClose, - SocketRead, - SocketWrite, - SocketAvailable, - SocketAvailable64, - SocketSync, - (PRSeekFN)_PR_InvalidInt, - (PRSeek64FN)_PR_InvalidInt64, - (PRFileInfoFN)_PR_InvalidStatus, - (PRFileInfo64FN)_PR_InvalidStatus, - SocketWritev, - SocketConnect, - SocketAccept, - SocketBind, - SocketListen, - SocketShutdown, - SocketRecv, - SocketSend, - (PRRecvfromFN)_PR_InvalidInt, - (PRSendtoFN)_PR_InvalidInt, - SocketPoll, - SocketAcceptRead, - SocketTransmitFile, - SocketGetName, - SocketGetPeerName, - (PRReservedFN)_PR_InvalidInt, - (PRReservedFN)_PR_InvalidInt, - _PR_SocketGetSocketOption, - _PR_SocketSetSocketOption, - SocketSendFile, - SocketConnectContinue, - (PRReservedFN)_PR_InvalidInt, - (PRReservedFN)_PR_InvalidInt, - (PRReservedFN)_PR_InvalidInt, - (PRReservedFN)_PR_InvalidInt -}; - -static PRIOMethods udpMethods = { - PR_DESC_SOCKET_UDP, - SocketClose, - SocketRead, - SocketWrite, - SocketAvailable, - SocketAvailable64, - SocketSync, - (PRSeekFN)_PR_InvalidInt, - (PRSeek64FN)_PR_InvalidInt64, - (PRFileInfoFN)_PR_InvalidStatus, - (PRFileInfo64FN)_PR_InvalidStatus, - SocketWritev, - SocketConnect, - (PRAcceptFN)_PR_InvalidDesc, - SocketBind, - SocketListen, - SocketShutdown, - SocketRecv, - SocketSend, - SocketRecvFrom, - SocketSendTo, - SocketPoll, - (PRAcceptreadFN)_PR_InvalidInt, - (PRTransmitfileFN)_PR_InvalidInt, - SocketGetName, - SocketGetPeerName, - (PRReservedFN)_PR_InvalidInt, - (PRReservedFN)_PR_InvalidInt, - _PR_SocketGetSocketOption, - _PR_SocketSetSocketOption, - (PRSendfileFN)_PR_InvalidInt, - (PRConnectcontinueFN)_PR_InvalidStatus, - (PRReservedFN)_PR_InvalidInt, - (PRReservedFN)_PR_InvalidInt, - (PRReservedFN)_PR_InvalidInt, - (PRReservedFN)_PR_InvalidInt -}; - - -static PRIOMethods socketpollfdMethods = { - (PRDescType) 0, - (PRCloseFN)_PR_InvalidStatus, - (PRReadFN)_PR_InvalidInt, - (PRWriteFN)_PR_InvalidInt, - (PRAvailableFN)_PR_InvalidInt, - (PRAvailable64FN)_PR_InvalidInt64, - (PRFsyncFN)_PR_InvalidStatus, - (PRSeekFN)_PR_InvalidInt, - (PRSeek64FN)_PR_InvalidInt64, - (PRFileInfoFN)_PR_InvalidStatus, - (PRFileInfo64FN)_PR_InvalidStatus, - (PRWritevFN)_PR_InvalidInt, - (PRConnectFN)_PR_InvalidStatus, - (PRAcceptFN)_PR_InvalidDesc, - (PRBindFN)_PR_InvalidStatus, - (PRListenFN)_PR_InvalidStatus, - (PRShutdownFN)_PR_InvalidStatus, - (PRRecvFN)_PR_InvalidInt, - (PRSendFN)_PR_InvalidInt, - (PRRecvfromFN)_PR_InvalidInt, - (PRSendtoFN)_PR_InvalidInt, - SocketPoll, - (PRAcceptreadFN)_PR_InvalidInt, - (PRTransmitfileFN)_PR_InvalidInt, - (PRGetsocknameFN)_PR_InvalidStatus, - (PRGetpeernameFN)_PR_InvalidStatus, - (PRReservedFN)_PR_InvalidInt, - (PRReservedFN)_PR_InvalidInt, - (PRGetsocketoptionFN)_PR_InvalidStatus, - (PRSetsocketoptionFN)_PR_InvalidStatus, - (PRSendfileFN)_PR_InvalidInt, - (PRConnectcontinueFN)_PR_InvalidStatus, - (PRReservedFN)_PR_InvalidInt, - (PRReservedFN)_PR_InvalidInt, - (PRReservedFN)_PR_InvalidInt, - (PRReservedFN)_PR_InvalidInt -}; - -PR_IMPLEMENT(const PRIOMethods*) PR_GetTCPMethods() -{ - return &tcpMethods; -} - -PR_IMPLEMENT(const PRIOMethods*) PR_GetUDPMethods() -{ - return &udpMethods; -} - -static const PRIOMethods* PR_GetSocketPollFdMethods() -{ - return &socketpollfdMethods; -} /* PR_GetSocketPollFdMethods */ - -#if !defined(_PR_INET6) || defined(_PR_INET6_PROBE) -PR_EXTERN(PRStatus) _pr_push_ipv6toipv4_layer(PRFileDesc *fd); - -#if defined(_PR_INET6_PROBE) - -PR_EXTERN(PRBool) _pr_ipv6_is_present; - -PR_IMPLEMENT(PRBool) _pr_test_ipv6_socket() -{ -PRInt32 osfd; - - osfd = _PR_MD_SOCKET(AF_INET6, SOCK_STREAM, 0); - if (osfd != -1) { - _PR_MD_CLOSE_SOCKET(osfd); - return PR_TRUE; - } - return PR_FALSE; -} -#endif /* _PR_INET6_PROBE */ - -#endif - -PR_IMPLEMENT(PRFileDesc*) PR_Socket(PRInt32 domain, PRInt32 type, PRInt32 proto) -{ - PRInt32 osfd; - PRFileDesc *fd; - PRInt32 tmp_domain = domain; - - if (!_pr_initialized) _PR_ImplicitInitialization(); - if (PR_AF_INET != domain - && PR_AF_INET6 != domain -#if defined(XP_UNIX) - && PR_AF_LOCAL != domain -#endif - ) { - PR_SetError(PR_ADDRESS_NOT_SUPPORTED_ERROR, 0); - return NULL; - } - -#if defined(_PR_INET6_PROBE) - if (PR_AF_INET6 == domain) { - if (_pr_ipv6_is_present == PR_FALSE) - domain = AF_INET; - else - domain = AF_INET6; - } -#elif defined(_PR_INET6) - if (PR_AF_INET6 == domain) - domain = AF_INET6; -#else - if (PR_AF_INET6 == domain) - domain = AF_INET; -#endif /* _PR_INET6 */ - osfd = _PR_MD_SOCKET(domain, type, proto); - if (osfd == -1) { - return 0; - } - if (type == SOCK_STREAM) - fd = PR_AllocFileDesc(osfd, PR_GetTCPMethods()); - else - fd = PR_AllocFileDesc(osfd, PR_GetUDPMethods()); - /* - * Make the sockets non-blocking - */ - if (fd != NULL) { - _PR_MD_MAKE_NONBLOCK(fd); - _PR_MD_INIT_FD_INHERITABLE(fd, PR_FALSE); -#if defined(_PR_INET6_PROBE) || !defined(_PR_INET6) - /* - * For platforms with no support for IPv6 - * create layered socket for IPv4-mapped IPv6 addresses - */ - if (PR_AF_INET6 == tmp_domain && PR_AF_INET == domain) { - if (PR_FAILURE == _pr_push_ipv6toipv4_layer(fd)) { - PR_Close(fd); - fd = NULL; - } - } -#endif - } else - _PR_MD_CLOSE_SOCKET(osfd); - - return fd; -} - -PR_IMPLEMENT(PRFileDesc *) PR_NewTCPSocket(void) -{ - PRInt32 domain = AF_INET; - - return PR_Socket(domain, SOCK_STREAM, 0); -} - -PR_IMPLEMENT(PRFileDesc*) PR_NewUDPSocket(void) -{ - PRInt32 domain = AF_INET; - - return PR_Socket(domain, SOCK_DGRAM, 0); -} - -PR_IMPLEMENT(PRFileDesc *) PR_OpenTCPSocket(PRIntn af) -{ - return PR_Socket(af, SOCK_STREAM, 0); -} - -PR_IMPLEMENT(PRFileDesc*) PR_OpenUDPSocket(PRIntn af) -{ - return PR_Socket(af, SOCK_DGRAM, 0); -} - -PR_IMPLEMENT(PRStatus) PR_NewTCPSocketPair(PRFileDesc *f[]) -{ -#ifdef XP_UNIX - PRInt32 rv, osfd[2]; - - if (!_pr_initialized) _PR_ImplicitInitialization(); - - rv = _PR_MD_SOCKETPAIR(AF_UNIX, SOCK_STREAM, 0, osfd); - if (rv == -1) { - return PR_FAILURE; - } - - f[0] = PR_AllocFileDesc(osfd[0], PR_GetTCPMethods()); - if (!f[0]) { - _PR_MD_CLOSE_SOCKET(osfd[0]); - _PR_MD_CLOSE_SOCKET(osfd[1]); - /* PR_AllocFileDesc() has invoked PR_SetError(). */ - return PR_FAILURE; - } - f[1] = PR_AllocFileDesc(osfd[1], PR_GetTCPMethods()); - if (!f[1]) { - PR_Close(f[0]); - _PR_MD_CLOSE_SOCKET(osfd[1]); - /* PR_AllocFileDesc() has invoked PR_SetError(). */ - return PR_FAILURE; - } - _PR_MD_MAKE_NONBLOCK(f[0]); - _PR_MD_INIT_FD_INHERITABLE(f[0], PR_FALSE); - _PR_MD_MAKE_NONBLOCK(f[1]); - _PR_MD_INIT_FD_INHERITABLE(f[1], PR_FALSE); - return PR_SUCCESS; -#elif defined(WINNT) - /* - * A socket pair is often used for interprocess communication, - * so we need to make sure neither socket is associated with - * the I/O completion port; otherwise it can't be used by a - * child process. - * - * The default implementation below cannot be used for NT - * because PR_Accept would have associated the I/O completion - * port with the listening and accepted sockets. - */ - SOCKET listenSock; - SOCKET osfd[2]; - struct sockaddr_in selfAddr; - int addrLen; - - if (!_pr_initialized) _PR_ImplicitInitialization(); - - osfd[0] = osfd[1] = INVALID_SOCKET; - listenSock = socket(AF_INET, SOCK_STREAM, 0); - if (listenSock == INVALID_SOCKET) { - goto failed; - } - selfAddr.sin_family = AF_INET; - selfAddr.sin_port = 0; - selfAddr.sin_addr.s_addr = htonl(INADDR_LOOPBACK); /* BugZilla: 35408 */ - addrLen = sizeof(selfAddr); - if (bind(listenSock, (struct sockaddr *) &selfAddr, - addrLen) == SOCKET_ERROR) { - goto failed; - } - if (getsockname(listenSock, (struct sockaddr *) &selfAddr, - &addrLen) == SOCKET_ERROR) { - goto failed; - } - if (listen(listenSock, 5) == SOCKET_ERROR) { - goto failed; - } - osfd[0] = socket(AF_INET, SOCK_STREAM, 0); - if (osfd[0] == INVALID_SOCKET) { - goto failed; - } - selfAddr.sin_addr.s_addr = htonl(INADDR_LOOPBACK); - - /* - * Only a thread is used to do the connect and accept. - * I am relying on the fact that connect returns - * successfully as soon as the connect request is put - * into the listen queue (but before accept is called). - * This is the behavior of the BSD socket code. If - * connect does not return until accept is called, we - * will need to create another thread to call connect. - */ - if (connect(osfd[0], (struct sockaddr *) &selfAddr, - addrLen) == SOCKET_ERROR) { - goto failed; - } - osfd[1] = accept(listenSock, NULL, NULL); - if (osfd[1] == INVALID_SOCKET) { - goto failed; - } - closesocket(listenSock); - - f[0] = PR_AllocFileDesc(osfd[0], PR_GetTCPMethods()); - if (!f[0]) { - closesocket(osfd[0]); - closesocket(osfd[1]); - /* PR_AllocFileDesc() has invoked PR_SetError(). */ - return PR_FAILURE; - } - f[1] = PR_AllocFileDesc(osfd[1], PR_GetTCPMethods()); - if (!f[1]) { - PR_Close(f[0]); - closesocket(osfd[1]); - /* PR_AllocFileDesc() has invoked PR_SetError(). */ - return PR_FAILURE; - } - _PR_MD_INIT_FD_INHERITABLE(f[0], PR_FALSE); - _PR_MD_INIT_FD_INHERITABLE(f[1], PR_FALSE); - return PR_SUCCESS; - -failed: - if (listenSock != INVALID_SOCKET) { - closesocket(listenSock); - } - if (osfd[0] != INVALID_SOCKET) { - closesocket(osfd[0]); - } - if (osfd[1] != INVALID_SOCKET) { - closesocket(osfd[1]); - } - return PR_FAILURE; -#else /* not Unix or NT */ - /* - * default implementation - */ - PRFileDesc *listenSock; - PRNetAddr selfAddr; - PRUint16 port; - - f[0] = f[1] = NULL; - listenSock = PR_NewTCPSocket(); - if (listenSock == NULL) { - goto failed; - } - PR_InitializeNetAddr(PR_IpAddrLoopback, 0, &selfAddr); /* BugZilla: 35408 */ - if (PR_Bind(listenSock, &selfAddr) == PR_FAILURE) { - goto failed; - } - if (PR_GetSockName(listenSock, &selfAddr) == PR_FAILURE) { - goto failed; - } - port = ntohs(selfAddr.inet.port); - if (PR_Listen(listenSock, 5) == PR_FAILURE) { - goto failed; - } - f[0] = PR_NewTCPSocket(); - if (f[0] == NULL) { - goto failed; - } - PR_InitializeNetAddr(PR_IpAddrLoopback, port, &selfAddr); - - /* - * Only a thread is used to do the connect and accept. - * I am relying on the fact that PR_Connect returns - * successfully as soon as the connect request is put - * into the listen queue (but before PR_Accept is called). - * This is the behavior of the BSD socket code. If - * connect does not return until accept is called, we - * will need to create another thread to call connect. - */ - if (PR_Connect(f[0], &selfAddr, PR_INTERVAL_NO_TIMEOUT) - == PR_FAILURE) { - goto failed; - } - f[1] = PR_Accept(listenSock, NULL, PR_INTERVAL_NO_TIMEOUT); - if (f[1] == NULL) { - goto failed; - } - PR_Close(listenSock); - return PR_SUCCESS; - -failed: - if (listenSock) { - PR_Close(listenSock); - } - if (f[0]) { - PR_Close(f[0]); - } - return PR_FAILURE; -#endif -} - -PR_IMPLEMENT(PRInt32) -PR_FileDesc2NativeHandle(PRFileDesc *fd) -{ - if (fd) { - /* - * The fd may be layered. Chase the links to the - * bottom layer to get the osfd. - */ - PRFileDesc *bottom = fd; - while (bottom->lower != NULL) { - bottom = bottom->lower; - } - return bottom->secret->md.osfd; - } else { - PR_SetError(PR_INVALID_ARGUMENT_ERROR, 0); - return -1; - } -} - -PR_IMPLEMENT(void) -PR_ChangeFileDescNativeHandle(PRFileDesc *fd, PRInt32 handle) -{ - if (fd) - fd->secret->md.osfd = handle; -} - -/* -** Select compatibility -** -*/ - -PR_IMPLEMENT(void) PR_FD_ZERO(PR_fd_set *set) -{ - memset(set, 0, sizeof(PR_fd_set)); -} - -PR_IMPLEMENT(void) PR_FD_SET(PRFileDesc *fh, PR_fd_set *set) -{ - PR_ASSERT( set->hsize < PR_MAX_SELECT_DESC ); - - set->harray[set->hsize++] = fh; -} - -PR_IMPLEMENT(void) PR_FD_CLR(PRFileDesc *fh, PR_fd_set *set) -{ - PRUint32 index, index2; - - for (index = 0; index<set->hsize; index++) - if (set->harray[index] == fh) { - for (index2=index; index2 < (set->hsize-1); index2++) { - set->harray[index2] = set->harray[index2+1]; - } - set->hsize--; - break; - } -} - -PR_IMPLEMENT(PRInt32) PR_FD_ISSET(PRFileDesc *fh, PR_fd_set *set) -{ - PRUint32 index; - for (index = 0; index<set->hsize; index++) - if (set->harray[index] == fh) { - return 1; - } - return 0; -} - -PR_IMPLEMENT(void) PR_FD_NSET(PRInt32 fd, PR_fd_set *set) -{ - PR_ASSERT( set->nsize < PR_MAX_SELECT_DESC ); - - set->narray[set->nsize++] = fd; -} - -PR_IMPLEMENT(void) PR_FD_NCLR(PRInt32 fd, PR_fd_set *set) -{ - PRUint32 index, index2; - - for (index = 0; index<set->nsize; index++) - if (set->narray[index] == fd) { - for (index2=index; index2 < (set->nsize-1); index2++) { - set->narray[index2] = set->narray[index2+1]; - } - set->nsize--; - break; - } -} - -PR_IMPLEMENT(PRInt32) PR_FD_NISSET(PRInt32 fd, PR_fd_set *set) -{ - PRUint32 index; - for (index = 0; index<set->nsize; index++) - if (set->narray[index] == fd) { - return 1; - } - return 0; -} - - -#if !defined(NEED_SELECT) -#if !defined(XP_MAC) -#include "obsolete/probslet.h" -#else -#include "probslet.h" -#endif - -#define PD_INCR 20 - -static PRPollDesc *_pr_setfd( - PR_fd_set *set, PRInt16 flags, PRPollDesc *polldesc) -{ - PRUintn fsidx, pdidx; - PRPollDesc *poll = polldesc; - - if (NULL == set) return poll; - - /* First set the pr file handle osfds */ - for (fsidx = 0; fsidx < set->hsize; fsidx++) - { - for (pdidx = 0; 1; pdidx++) - { - if ((PRFileDesc*)-1 == poll[pdidx].fd) - { - /* our vector is full - extend and condition it */ - poll = (PRPollDesc*)PR_Realloc( - poll, (pdidx + 1 + PD_INCR) * sizeof(PRPollDesc)); - if (NULL == poll) goto out_of_memory; - memset( - poll + pdidx * sizeof(PRPollDesc), - 0, PD_INCR * sizeof(PRPollDesc)); - poll[pdidx + PD_INCR].fd = (PRFileDesc*)-1; - } - if ((NULL == poll[pdidx].fd) - || (poll[pdidx].fd == set->harray[fsidx])) - { - /* PR_ASSERT(0 == (poll[pdidx].in_flags & flags)); */ - /* either empty or prevously defined */ - poll[pdidx].fd = set->harray[fsidx]; /* possibly redundant */ - poll[pdidx].in_flags |= flags; /* possibly redundant */ - break; - } - } - } - -#if 0 - /* Second set the native osfds */ - for (fsidx = 0; fsidx < set->nsize; fsidx++) - { - for (pdidx = 0; ((PRFileDesc*)-1 != poll[pdidx].fd); pdidx++) - { - if ((PRFileDesc*)-1 == poll[pdidx].fd) - { - /* our vector is full - extend and condition it */ - poll = PR_Realloc( - poll, (pdidx + PD_INCR) * sizeof(PRPollDesc)); - if (NULL == poll) goto out_of_memory; - memset( - poll + pdidx * sizeof(PRPollDesc), - 0, PD_INCR * sizeof(PRPollDesc)); - poll[(pdidx + PD_INCR)].fd = (PRFileDesc*)-1; - } - if ((NULL == poll[pdidx].fd) - || (poll[pdidx].fd == set->narray[fsidx])) - { - /* either empty or prevously defined */ - poll[pdidx].fd = set->narray[fsidx]; - PR_ASSERT(0 == (poll[pdidx].in_flags & flags)); - poll[pdidx].in_flags |= flags; - break; - } - } - } -#endif /* 0 */ - - return poll; - -out_of_memory: - if (NULL != polldesc) PR_DELETE(polldesc); - return NULL; -} /* _pr_setfd */ - -#endif /* !defined(NEED_SELECT) */ - -PR_IMPLEMENT(PRInt32) PR_Select( - PRInt32 unused, PR_fd_set *pr_rd, PR_fd_set *pr_wr, - PR_fd_set *pr_ex, PRIntervalTime timeout) -{ - -#if !defined(NEED_SELECT) - PRInt32 npds = 0; - /* - ** Find out how many fds are represented in the three lists. - ** Then allocate a polling descriptor for the logical union - ** (there can't be any overlapping) and call PR_Poll(). - */ - - PRPollDesc *copy, *poll; - - static PRBool warning = PR_TRUE; - if (warning) warning = _PR_Obsolete( "PR_Select()", "PR_Poll()"); - - /* try to get an initial guesss at how much space we need */ - npds = 0; - if ((NULL != pr_rd) && ((pr_rd->hsize + pr_rd->nsize - npds) > 0)) - npds = pr_rd->hsize + pr_rd->nsize; - if ((NULL != pr_wr) && ((pr_wr->hsize + pr_wr->nsize - npds) > 0)) - npds = pr_wr->hsize + pr_wr->nsize; - if ((NULL != pr_ex) && ((pr_ex->hsize + pr_ex->nsize - npds) > 0)) - npds = pr_ex->hsize + pr_ex->nsize; - - if (0 == npds) - { - PR_Sleep(timeout); - return 0; - } - - copy = poll = (PRPollDesc*)PR_Calloc(npds + PD_INCR, sizeof(PRPollDesc)); - if (NULL == poll) goto out_of_memory; - poll[npds + PD_INCR - 1].fd = (PRFileDesc*)-1; - - poll = _pr_setfd(pr_rd, PR_POLL_READ, poll); - if (NULL == poll) goto out_of_memory; - poll = _pr_setfd(pr_wr, PR_POLL_WRITE, poll); - if (NULL == poll) goto out_of_memory; - poll = _pr_setfd(pr_ex, PR_POLL_EXCEPT, poll); - if (NULL == poll) goto out_of_memory; - unused = 0; - while (NULL != poll[unused].fd && (PRFileDesc*)-1 != poll[unused].fd) - { - ++unused; - } - - PR_ASSERT(unused > 0); - npds = PR_Poll(poll, unused, timeout); - - if (npds > 0) - { - /* Copy the results back into the fd sets */ - if (NULL != pr_rd) pr_rd->nsize = pr_rd->hsize = 0; - if (NULL != pr_wr) pr_wr->nsize = pr_wr->hsize = 0; - if (NULL != pr_ex) pr_ex->nsize = pr_ex->hsize = 0; - for (copy = &poll[unused - 1]; copy >= poll; --copy) - { - if (copy->out_flags & PR_POLL_NVAL) - { - PR_SetError(PR_BAD_DESCRIPTOR_ERROR, 0); - npds = -1; - break; - } - if (copy->out_flags & PR_POLL_READ) - if (NULL != pr_rd) pr_rd->harray[pr_rd->hsize++] = copy->fd; - if (copy->out_flags & PR_POLL_WRITE) - if (NULL != pr_wr) pr_wr->harray[pr_wr->hsize++] = copy->fd; - if (copy->out_flags & PR_POLL_EXCEPT) - if (NULL != pr_ex) pr_ex->harray[pr_ex->hsize++] = copy->fd; - } - } - PR_DELETE(poll); - - return npds; -out_of_memory: - PR_SetError(PR_OUT_OF_MEMORY_ERROR, 0); - return -1; - -#endif /* !defined(NEED_SELECT) */ - -} diff --git a/pr/src/md/os2/os2io.c b/pr/src/md/os2/os2io.c deleted file mode 100644 index 926d6e10..00000000 --- a/pr/src/md/os2/os2io.c +++ /dev/null @@ -1,798 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* - * The contents of this file are subject to the Mozilla Public - * License Version 1.1 (the "License"); you may not use this file - * except in compliance with the License. You may obtain a copy of - * the License at http://www.mozilla.org/MPL/ - * - * Software distributed under the License is distributed on an "AS - * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or - * implied. See the License for the specific language governing - * rights and limitations under the License. - * - * The Original Code is the Netscape Portable Runtime (NSPR). - * - * The Initial Developer of the Original Code is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998-2000 Netscape Communications Corporation. All - * Rights Reserved. - * - * Contributor(s): - * - * Alternatively, the contents of this file may be used under the - * terms of the GNU General Public License Version 2 or later (the - * "GPL"), in which case the provisions of the GPL are applicable - * instead of those above. If you wish to allow use of your - * version of this file only under the terms of the GPL and not to - * allow others to use your version of this file under the MPL, - * indicate your decision by deleting the provisions above and - * replace them with the notice and other provisions required by - * the GPL. If you do not delete the provisions above, a recipient - * may use your version of this file under either the MPL or the - * GPL. - */ - - -/* - * This Original Code has been modified by IBM Corporation. - * Modifications made by IBM described herein are - * Copyright (c) International Business Machines - * Corporation, 2000 - * - * Modifications to Mozilla code or documentation - * identified per MPL Section 3.3 - * - * Date Modified by Description of modification - * 03/23/2000 IBM Corp. Changed write() to DosWrite(). EMX i/o - * calls cannot be intermixed with DosXXX - * calls since EMX remaps file/socket - * handles. - * 04/27/2000 IBM Corp. Changed open file to be more like NT and - * better handle PR_TRUNCATE | PR_CREATE_FILE - * and also fixed _PR_MD_SET_FD_INHERITABLE - */ - -/* OS2 IO module - * - * Assumes synchronous I/O. - * - */ - -#include "primpl.h" -#include "prio.h" -#include <ctype.h> -#ifdef XP_OS2_VACPP -#include <direct.h> -#else -#include <limits.h> -#include <dirent.h> -#include <fcntl.h> -#include <io.h> -#endif - -struct _MDLock _pr_ioq_lock; - -PRStatus -_PR_MD_WAIT(PRThread *thread, PRIntervalTime ticks) -{ - PRInt32 rv; - ULONG count; - - PRUint32 msecs = (ticks == PR_INTERVAL_NO_TIMEOUT) ? - SEM_INDEFINITE_WAIT : PR_IntervalToMilliseconds(ticks); - rv = DosWaitEventSem(thread->md.blocked_sema.sem, msecs); - DosResetEventSem(thread->md.blocked_sema.sem, &count); - switch(rv) - { - case NO_ERROR: - return PR_SUCCESS; - break; - case ERROR_TIMEOUT: - _PR_THREAD_LOCK(thread); - if (thread->state == _PR_IO_WAIT) { - ; - } else { - if (thread->wait.cvar != NULL) { - thread->wait.cvar = NULL; - _PR_THREAD_UNLOCK(thread); - } else { - /* The CVAR was notified just as the timeout - * occurred. This led to us being notified twice. - * call SemRequest() to clear the semaphore. - */ - _PR_THREAD_UNLOCK(thread); - rv = DosWaitEventSem(thread->md.blocked_sema.sem, 0); - DosResetEventSem(thread->md.blocked_sema.sem, &count); - PR_ASSERT(rv == NO_ERROR); - } - } - return PR_SUCCESS; - break; - default: - break; - } - return PR_FAILURE; -} -PRStatus -_PR_MD_WAKEUP_WAITER(PRThread *thread) -{ - if ( _PR_IS_NATIVE_THREAD(thread) ) - { - if (DosPostEventSem(thread->md.blocked_sema.sem) != NO_ERROR) - return PR_FAILURE; - else - return PR_SUCCESS; - } -} - - -/* --- FILE IO ----------------------------------------------------------- */ -/* - * _PR_MD_OPEN() -- Open a file - * - * returns: a fileHandle - * - * The NSPR open flags (osflags) are translated into flags for OS/2 - * - * Mode seems to be passed in as a unix style file permissions argument - * as in 0666, in the case of opening the logFile. - * - */ -PRInt32 -_PR_MD_OPEN(const char *name, PRIntn osflags, int mode) -{ - HFILE file; - PRInt32 access = OPEN_SHARE_DENYNONE; - PRInt32 flags = 0L; - PRInt32 rc; - PRUword actionTaken; - - ULONG CurMaxFH = 0; - LONG ReqCount = 1; - ULONG fattr; - - if (osflags & PR_SYNC) access |= OPEN_FLAGS_WRITE_THROUGH; - - if (osflags & PR_RDONLY) - access |= OPEN_ACCESS_READONLY; - else if (osflags & PR_WRONLY) - access |= OPEN_ACCESS_WRITEONLY; - else if(osflags & PR_RDWR) - access |= OPEN_ACCESS_READWRITE; - - if ( osflags & PR_CREATE_FILE && osflags & PR_EXCL ) - { - flags = OPEN_ACTION_CREATE_IF_NEW | OPEN_ACTION_FAIL_IF_EXISTS; - } - else if (osflags & PR_CREATE_FILE) - { - if (osflags & PR_TRUNCATE) - flags = OPEN_ACTION_CREATE_IF_NEW | OPEN_ACTION_REPLACE_IF_EXISTS; - else - flags = OPEN_ACTION_CREATE_IF_NEW | OPEN_ACTION_OPEN_IF_EXISTS; - } - else - { - if (osflags & PR_TRUNCATE) - flags = OPEN_ACTION_FAIL_IF_NEW | OPEN_ACTION_REPLACE_IF_EXISTS; - else - flags = OPEN_ACTION_FAIL_IF_NEW | OPEN_ACTION_OPEN_IF_EXISTS; - } - - if (isxdigit(mode) == 0) /* file attribs are hex, UNIX modes octal */ - fattr = ((ULONG)mode == FILE_HIDDEN) ? FILE_HIDDEN : FILE_NORMAL; - else fattr = FILE_NORMAL; - - /* OS/2 sets the Max file handles per process to 20 by default */ - DosSetRelMaxFH(&ReqCount, &CurMaxFH); - - rc = DosOpen((char*)name, - &file, /* file handle if successful */ - &actionTaken, /* reason for failure */ - 0, /* initial size of new file */ - fattr, /* file system attributes */ - flags, /* Open flags */ - access, /* Open mode and rights */ - 0); /* OS/2 Extended Attributes */ - if (rc != NO_ERROR) { - _PR_MD_MAP_OPEN_ERROR(rc); - return -1; - } - - return (PRInt32)file; -} - -PRInt32 -_PR_MD_READ(PRFileDesc *fd, void *buf, PRInt32 len) -{ - ULONG bytes; - int rv; - - rv = DosRead((HFILE)fd->secret->md.osfd, - (PVOID)buf, - len, - &bytes); - - if (rv != NO_ERROR) - { - /* ERROR_HANDLE_EOF can only be returned by async io */ - PR_ASSERT(rv != ERROR_HANDLE_EOF); - if (rv == ERROR_BROKEN_PIPE) - return 0; - else { - _PR_MD_MAP_READ_ERROR(rv); - return -1; - } - } - return (PRInt32)bytes; -} - -PRInt32 -_PR_MD_WRITE(PRFileDesc *fd, const void *buf, PRInt32 len) -{ - PRInt32 bytes; - int rv; - - rv = DosWrite((HFILE)fd->secret->md.osfd, - (PVOID)buf, - len, - (PULONG)&bytes); - - if (rv != NO_ERROR) - { - _PR_MD_MAP_WRITE_ERROR(rv); - return -1; - } - - return bytes; -} /* --- end _PR_MD_WRITE() --- */ - -PRInt32 -_PR_MD_LSEEK(PRFileDesc *fd, PRInt32 offset, PRSeekWhence whence) -{ - PRInt32 rv; - PRUword newLocation; - - rv = DosSetFilePtr((HFILE)fd->secret->md.osfd, offset, whence, &newLocation); - - if (rv != NO_ERROR) { - _PR_MD_MAP_LSEEK_ERROR(rv); - return -1; - } else - return newLocation; -} - -PRInt64 -_PR_MD_LSEEK64(PRFileDesc *fd, PRInt64 offset, PRSeekWhence whence) -{ -#ifdef NO_LONG_LONG - PRInt64 result; - PRInt32 rv, low = offset.lo, hi = offset.hi; - PRUword newLocation; - - rv = DosSetFilePtr((HFILE)fd->secret->md.osfd, low, whence, &newLocation); - rv = DosSetFilePtr((HFILE)fd->secret->md.osfd, hi, FILE_CURRENT, &newLocation); - - if (rv != NO_ERROR) { - _PR_MD_MAP_LSEEK_ERROR(rv); - hi = newLocation = -1; - } - - result.lo = newLocation; - result.hi = hi; - return result; - -#else - PRInt32 where, rc, lo = (PRInt32)offset, hi = (PRInt32)(offset >> 32); - PRUint64 rv; - PRUint32 newLocation, uhi; - - switch (whence) - { - case PR_SEEK_SET: - where = FILE_BEGIN; - break; - case PR_SEEK_CUR: - where = FILE_CURRENT; - break; - case PR_SEEK_END: - where = FILE_END; - break; - default: - PR_SetError(PR_INVALID_ARGUMENT_ERROR, 0); - return -1; -} - - rc = DosSetFilePtr((HFILE)fd->secret->md.osfd, lo, where, (PULONG)&newLocation); - - if (rc != NO_ERROR) { - _PR_MD_MAP_LSEEK_ERROR(rc); - return -1; - } - - uhi = (PRUint32)hi; - PR_ASSERT((PRInt32)uhi >= 0); - rv = uhi; - PR_ASSERT((PRInt64)rv >= 0); - rv = (rv << 32); - PR_ASSERT((PRInt64)rv >= 0); - rv += newLocation; - PR_ASSERT((PRInt64)rv >= 0); - return (PRInt64)rv; -#endif -} - -PRInt32 -_PR_MD_FSYNC(PRFileDesc *fd) -{ - PRInt32 rc = DosResetBuffer((HFILE)fd->secret->md.osfd); - - if (rc != NO_ERROR) { - if (rc != ERROR_ACCESS_DENIED) { - _PR_MD_MAP_FSYNC_ERROR(rc); - return -1; - } - } - return 0; -} - -PRInt32 -_MD_CloseFile(PRInt32 osfd) -{ - PRInt32 rv; - - rv = DosClose((HFILE)osfd); - if (rv != NO_ERROR) - _PR_MD_MAP_CLOSE_ERROR(rv); - return rv; -} - - -/* --- DIR IO ------------------------------------------------------------ */ -#define GetFileFromDIR(d) (d)->d_entry.achName -#define GetFileAttr(d) (d)->d_entry.attrFile - -void FlipSlashes(char *cp, int len) -{ - while (--len >= 0) { - if (cp[0] == '/') { - cp[0] = PR_DIRECTORY_SEPARATOR; - } - cp++; - } -} - -/* -** -** Local implementations of standard Unix RTL functions which are not provided -** by the VAC RTL. -** -*/ - -PRInt32 -_PR_MD_CLOSE_DIR(_MDDir *d) -{ - PRInt32 rc; - - if ( d ) { - rc = DosFindClose(d->d_hdl); - if(rc == NO_ERROR){ - d->magic = (PRUint32)-1; - return PR_SUCCESS; - } else { - _PR_MD_MAP_CLOSEDIR_ERROR(rc); - return PR_FAILURE; - } - } - PR_SetError(PR_INVALID_ARGUMENT_ERROR, 0); - return PR_FAILURE; -} - - -PRStatus -_PR_MD_OPEN_DIR(_MDDir *d, const char *name) -{ - char filename[ CCHMAXPATH ]; - PRUword numEntries, rc; - - numEntries = 1; - - PR_snprintf(filename, CCHMAXPATH, "%s%s%s", - name, PR_DIRECTORY_SEPARATOR_STR, "*.*"); - FlipSlashes( filename, strlen(filename) ); - - d->d_hdl = HDIR_CREATE; - - rc = DosFindFirst( filename, - &d->d_hdl, - FILE_DIRECTORY | FILE_HIDDEN, - &(d->d_entry), - sizeof(d->d_entry), - &numEntries, - FIL_STANDARD); - if ( rc != NO_ERROR ) { - _PR_MD_MAP_OPENDIR_ERROR(rc); - return PR_FAILURE; - } - d->firstEntry = PR_TRUE; - d->magic = _MD_MAGIC_DIR; - return PR_SUCCESS; -} - -char * -_PR_MD_READ_DIR(_MDDir *d, PRIntn flags) -{ - PRUword numFiles = 1; - BOOL rv; - char *fileName; - USHORT fileAttr; - - if ( d ) { - while (1) { - if (d->firstEntry) { - d->firstEntry = PR_FALSE; - rv = NO_ERROR; - } else { - rv = DosFindNext(d->d_hdl, - &(d->d_entry), - sizeof(d->d_entry), - &numFiles); - } - if (rv != NO_ERROR) { - break; - } - fileName = GetFileFromDIR(d); - fileAttr = GetFileAttr(d); - if ( (flags & PR_SKIP_DOT) && - (fileName[0] == '.') && (fileName[1] == '\0')) - continue; - if ( (flags & PR_SKIP_DOT_DOT) && - (fileName[0] == '.') && (fileName[1] == '.') && - (fileName[2] == '\0')) - continue; - /* - * XXX - * Is this the correct definition of a hidden file on OS/2? - */ - if ((flags & PR_SKIP_NONE) && (fileAttr & FILE_HIDDEN)) - return fileName; - else if ((flags & PR_SKIP_HIDDEN) && (fileAttr & FILE_HIDDEN)) - continue; - return fileName; - } - PR_ASSERT(NO_ERROR != rv); - _PR_MD_MAP_READDIR_ERROR(rv); - return NULL; - } - PR_SetError(PR_INVALID_ARGUMENT_ERROR, 0); - return NULL; -} - -PRInt32 -_PR_MD_DELETE(const char *name) -{ - PRInt32 rc = DosDelete((char*)name); - if(rc == NO_ERROR) { - return 0; - } else { - _PR_MD_MAP_DELETE_ERROR(rc); - return -1; - } -} - -PRInt32 -_PR_MD_STAT(const char *fn, struct stat *info) -{ - PRInt32 rv; - char filename[CCHMAXPATH]; - - PR_snprintf(filename, CCHMAXPATH, "%s", fn); - FlipSlashes(filename, strlen(filename)); - - rv = _stat((char*)filename, info); - if (-1 == rv) { - /* - * Check for MSVC runtime library _stat() bug. - * (It's really a bug in FindFirstFile().) - * If a pathname ends in a backslash or slash, - * e.g., c:\temp\ or c:/temp/, _stat() will fail. - * Note: a pathname ending in a slash (e.g., c:/temp/) - * can be handled by _stat() on NT but not on Win95. - * - * We remove the backslash or slash at the end and - * try again. - * - * Not sure if this happens on OS/2 or not, - * but it doesn't hurt to be careful. - */ - - int len = strlen(fn); - if (len > 0 && len <= _MAX_PATH - && (fn[len - 1] == '\\' || fn[len - 1] == '/')) { - char newfn[_MAX_PATH + 1]; - - strcpy(newfn, fn); - newfn[len - 1] = '\0'; - rv = _stat(newfn, info); - } - } - - if (-1 == rv) { - _PR_MD_MAP_STAT_ERROR(errno); - } - return rv; -} - -PRInt32 -_PR_MD_GETFILEINFO(const char *fn, PRFileInfo *info) -{ - struct stat sb; - PRInt32 rv; - PRInt64 s, s2us; - - if ( (rv = _PR_MD_STAT(fn, &sb)) == 0 ) { - if (info) { - if (S_IFREG & sb.st_mode) - info->type = PR_FILE_FILE ; - else if (S_IFDIR & sb.st_mode) - info->type = PR_FILE_DIRECTORY; - else - info->type = PR_FILE_OTHER; - info->size = sb.st_size; - LL_I2L(s2us, PR_USEC_PER_SEC); - LL_I2L(s, sb.st_mtime); - LL_MUL(s, s, s2us); - info->modifyTime = s; - LL_I2L(s, sb.st_ctime); - LL_MUL(s, s, s2us); - info->creationTime = s; - } - } - return rv; -} - -PRInt32 -_PR_MD_GETFILEINFO64(const char *fn, PRFileInfo64 *info) -{ - PRFileInfo info32; - PRInt32 rv = _PR_MD_GETFILEINFO(fn, &info32); - if (0 == rv) - { - info->type = info32.type; - LL_UI2L(info->size,info32.size); - info->modifyTime = info32.modifyTime; - info->creationTime = info32.creationTime; - } - return rv; -} - -PRInt32 -_PR_MD_GETOPENFILEINFO(const PRFileDesc *fd, PRFileInfo *info) -{ - /* For once, the VAC compiler/library did a nice thing. - * The file handle used by the C runtime is the same one - * returned by the OS when you call DosOpen(). This means - * that you can take an OS HFILE and use it with C file - * functions. The only caveat is that you have to call - * _setmode() first to initialize some junk. This is - * immensely useful because I did not have a clue how to - * implement this function otherwise. The windows folks - * took the source from the Microsoft C library source, but - * IBM wasn't kind enough to ship the source with VAC. - * On second thought, the needed function could probably - * be gotten from the OS/2 GNU library source, but the - * point is now moot. - */ - struct stat hinfo; - PRInt64 s, s2us; - - _setmode(fd->secret->md.osfd, O_BINARY); - if(fstat((int)fd->secret->md.osfd, &hinfo) != NO_ERROR) { - _PR_MD_MAP_FSTAT_ERROR(errno); - return -1; - } - - if (hinfo.st_mode & S_IFDIR) - info->type = PR_FILE_DIRECTORY; - else - info->type = PR_FILE_FILE; - - info->size = hinfo.st_size; - LL_I2L(s2us, PR_USEC_PER_SEC); - LL_I2L(s, hinfo.st_mtime); - LL_MUL(s, s, s2us); - info->modifyTime = s; - LL_I2L(s, hinfo.st_ctime); - LL_MUL(s, s, s2us); - info->creationTime = s; - - return 0; -} - -PRInt32 -_PR_MD_GETOPENFILEINFO64(const PRFileDesc *fd, PRFileInfo64 *info) -{ - PRFileInfo info32; - PRInt32 rv = _PR_MD_GETOPENFILEINFO(fd, &info32); - if (0 == rv) - { - info->type = info32.type; - LL_UI2L(info->size,info32.size); - - info->modifyTime = info32.modifyTime; - info->creationTime = info32.creationTime; - } - return rv; -} - - -PRInt32 -_PR_MD_RENAME(const char *from, const char *to) -{ - PRInt32 rc; - /* Does this work with dot-relative pathnames? */ - if ( (rc = DosMove((char *)from, (char *)to)) == NO_ERROR) { - return 0; - } else { - _PR_MD_MAP_RENAME_ERROR(rc); - return -1; - } -} - -PRInt32 -_PR_MD_ACCESS(const char *name, PRAccessHow how) -{ - PRInt32 rv; - switch (how) { - case PR_ACCESS_WRITE_OK: - rv = access(name, 02); - break; - case PR_ACCESS_READ_OK: - rv = access(name, 04); - break; - case PR_ACCESS_EXISTS: - return access(name, 00); - break; - default: - PR_SetError(PR_INVALID_ARGUMENT_ERROR, 0); - return -1; - } - if (rv < 0) - _PR_MD_MAP_ACCESS_ERROR(errno); - return rv; -} - -PRInt32 -_PR_MD_MKDIR(const char *name, PRIntn mode) -{ - PRInt32 rc; - /* XXXMB - how to translate the "mode"??? */ - if ((rc = DosCreateDir((char *)name, NULL))== NO_ERROR) { - return 0; - } else { - _PR_MD_MAP_MKDIR_ERROR(rc); - return -1; - } -} - -PRInt32 -_PR_MD_RMDIR(const char *name) -{ - PRInt32 rc; - if ( (rc = DosDeleteDir((char *)name)) == NO_ERROR) { - return 0; - } else { - _PR_MD_MAP_RMDIR_ERROR(rc); - return -1; - } -} - -PRStatus -_PR_MD_LOCKFILE(PRInt32 f) -{ - PRInt32 rv; - FILELOCK lock, unlock; - - lock.lOffset = 0; - lock.lRange = 0xffffffff; - unlock.lOffset = 0; - unlock.lRange = 0; - - /* - * loop trying to DosSetFileLocks(), - * pause for a few miliseconds when can't get the lock - * and try again - */ - for( rv = FALSE; rv == FALSE; /* do nothing */ ) - { - - rv = DosSetFileLocks( (HFILE) f, - &unlock, &lock, - 0, 0); - if ( rv != NO_ERROR ) - { - DosSleep( 50 ); /* Sleep() a few milisecs and try again. */ - } - } /* end for() */ - return PR_SUCCESS; -} /* end _PR_MD_LOCKFILE() */ - -PRStatus -_PR_MD_TLOCKFILE(PRInt32 f) -{ - return _PR_MD_LOCKFILE(f); -} /* end _PR_MD_TLOCKFILE() */ - - -PRStatus -_PR_MD_UNLOCKFILE(PRInt32 f) -{ - PRInt32 rv; - FILELOCK lock, unlock; - - lock.lOffset = 0; - lock.lRange = 0; - unlock.lOffset = 0; - unlock.lRange = 0xffffffff; - - rv = DosSetFileLocks( (HFILE) f, - &unlock, &lock, - 0, 0); - - if ( rv != NO_ERROR ) - { - return PR_SUCCESS; - } - else - { - return PR_FAILURE; - } -} /* end _PR_MD_UNLOCKFILE() */ - -PRStatus -_PR_MD_SET_FD_INHERITABLE(PRFileDesc *fd, PRBool inheritable) -{ - int rv = 0; - ULONG flags; - - rv = DosQueryFHState((HFILE)fd->secret->md.osfd, &flags); - if (rv != 0) { - PR_SetError(PR_UNKNOWN_ERROR, _MD_ERRNO()); - return PR_FAILURE; - } - - if (inheritable) - flags &= ~OPEN_FLAGS_NOINHERIT; - else - flags |= OPEN_FLAGS_NOINHERIT; - - rv = DosSetFHState((HFILE)fd->secret->md.osfd, flags); - if (rv != 0) { - PR_SetError(PR_UNKNOWN_ERROR, _MD_ERRNO()); - return PR_FAILURE; - } - return PR_SUCCESS; -} - -void -_PR_MD_INIT_FD_INHERITABLE(PRFileDesc *fd, PRBool imported) -{ - /* XXX this function needs to be implemented */ - fd->secret->inheritable = _PR_TRI_UNKNOWN; -} - -void -_PR_MD_QUERY_FD_INHERITABLE(PRFileDesc *fd) -{ - /* XXX this function needs to be reviewed */ - ULONG flags; - - PR_ASSERT(_PR_TRI_UNKNOWN == fd->secret->inheritable); - if (DosQueryFHState((HFILE)fd->secret->md.osfd, &flags) == 0) { - if (flags & OPEN_FLAGS_NOINHERIT) { - fd->secret->inheritable = _PR_TRI_FALSE; - } else { - fd->secret->inheritable = _PR_TRI_TRUE; - } - } -} |