diff options
Diffstat (limited to 'sal/osl/unx')
47 files changed, 0 insertions, 23220 deletions
diff --git a/sal/osl/unx/asm/interlck_sparc.s b/sal/osl/unx/asm/interlck_sparc.s deleted file mode 100644 index a33e35393..000000000 --- a/sal/osl/unx/asm/interlck_sparc.s +++ /dev/null @@ -1,267 +0,0 @@ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2000, 2010 Oracle and/or its affiliates. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * <http://www.openoffice.org/license.html> - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - - -/* - * Implements osl_[increment|decrement]InterlockedCount in two ways: - * sparcv8 architecture: use the "swap" instruction - * sparcv9/sparcv8plus architecture: use the "cas" instruction - * - * 32 bit mode with v8 and v8plus support: - * Initialize once with osl_InterlockedCountSetV9(int bv9) if you want to - * use the "cas" instruction, which is faster (no spinlock needed) - * Default is to use the "swap" instruction, which works on all supported - * SPARC cpu's - * - * osl_InterlockedCountSetV9(int bv9) - * bv9 = 0 use sparcv8 "swap" (spinlock) - * bv9 = 1 use sparcv9/sparcv8plus "cas" (no spinlock) - * - * 32 bit mode without v8 support (implies v8plus) or 64 bit mode: - * No need (nor the possibilty) to call osl_InterlockedCountSetV9(), - * sparcv9 mode is implied. Assemble with -xarch=v8plus (32 bit) or - * -xarch=v9 (64 bit). - * - */ - -#if !defined(__sparcv8plus) && !defined(__sparcv9) && !defined(__sparc_v9__) - -.section ".data" -.align 4 -osl_incrementInterLockCountFuncPtr: -.word osl_incrementInterlockedCountV8 -.type osl_incrementInterLockCountFuncPtr,#object -.size osl_incrementInterLockCountFuncPtr,4 - -.align 4 -osl_decrementInterLockCountFuncPtr: -.word osl_decrementInterlockedCountV8 -.type osl_decrementInterLockCountFuncPtr,#object -.size osl_decrementInterLockCountFuncPtr,4 - -.section ".text" - -#if defined(NETBSD) || defined(LINUX) -/* add the address of the calling "call" instruction (stored in %o7) to - * %o5 which contains _GLOBAL_OFFSET_TABLE_ - */ -.Laddoseven: - retl - add %o7, %o5, %o5 -#endif - - .global osl_incrementInterlockedCount - .align 4 - -osl_incrementInterlockedCount: - -#if defined(NETBSD) || defined(LINUX) - mov %o7, %g1 - sethi %hi(_GLOBAL_OFFSET_TABLE_-4), %o5 - call .Laddoseven - add %o5, %lo(_GLOBAL_OFFSET_TABLE_+4), %o5 - mov %g1, %o7 -#endif - set osl_incrementInterLockCountFuncPtr, %o1 -#if defined(NETBSD) - ld [%o1 + %o5], %o1 -#endif - ld [%o1], %o1 - jmp %o1 - nop ! delay slot - .type osl_incrementInterlockedCount,#function - .size osl_incrementInterlockedCount,.-osl_incrementInterlockedCount - -.section ".text" - .global osl_decrementInterlockedCount - .align 4 - -osl_decrementInterlockedCount: - -#if defined(NETBSD) || defined(LINUX) - mov %o7, %g1 - sethi %hi(_GLOBAL_OFFSET_TABLE_-4), %o5 - call .Laddoseven - add %o5, %lo(_GLOBAL_OFFSET_TABLE_+4), %o5 - mov %g1, %o7 -#endif - set osl_decrementInterLockCountFuncPtr, %o1 -#if defined(NETBSD) || defined(LINUX) - ld [%o1 + %o5], %o1 -#endif - ld [%o1], %o1 - jmp %o1 - nop ! delay slot - .type osl_decrementInterlockedCount,#function - .size osl_decrementInterlockedCount,.-osl_decrementInterlockedCount - -.section ".text" - .global osl_InterlockedCountSetV9 - .align 4 - -osl_InterlockedCountSetV9: - -#if defined(NETBSD) || defined(LINUX) - mov %o7, %g1 - sethi %hi(_GLOBAL_OFFSET_TABLE_-4), %o5 - call .Laddoseven - add %o5, %lo(_GLOBAL_OFFSET_TABLE_+4), %o5 - mov %g1, %o7 -#endif - set osl_incrementInterLockCountFuncPtr, %o1 - set osl_decrementInterLockCountFuncPtr, %o2 - cmp %o0, %g0 - bnz 1f - nop ! delay slot - set osl_incrementInterlockedCountV8, %o0 - set osl_decrementInterlockedCountV8, %o3 -#if defined(NETBSD) || defined(LINUX) - ld [%o0 + %o5], %o0 - ld [%o1 + %o5], %o1 - ld [%o2 + %o5], %o2 - ld [%o3 + %o5], %o3 -#endif - st %o3,[%o2] - retl - st %o0,[%o1] -1: set osl_incrementInterlockedCountV9, %o0 - set osl_decrementInterlockedCountV9, %o3 -#if defined(NETBSD) || defined(LINUX) - ld [%o0 + %o5], %o0 - ld [%o1 + %o5], %o1 - ld [%o2 + %o5], %o2 - ld [%o3 + %o5], %o3 -#endif - st %o3,[%o2] - retl - st %o0,[%o1] - - .type osl_InterlockedCountSetV9,#function - .size osl_InterlockedCountSetV9,.-osl_InterlockedCountSetV9 - - -.section ".text" - .local osl_incrementInterlockedCountV8 - .align 4 - -! Implements osl_[increment|decrement]InterlockedCount with sparcv8 "swap" instruction. -! Uses -4096 as lock value for spinlock to allow for small negative counts. - -osl_incrementInterlockedCountV8: - -1: ld [%o0], %o1 - cmp %o1, -4096 ! test spinlock - be 1b - mov -4096, %o1 ! delay slot - swap [%o0], %o1 - cmp %o1, -4096 - be 1b - inc %o1 ! delay slot, if we got spinlock, increment count - st %o1, [%o0] - retl - mov %o1, %o0 ! delay slot - - .type osl_incrementInterlockedCountV8,#function - .size osl_incrementInterlockedCountV8,.-osl_incrementInterlockedCountV8 - - -.section ".text" - .local osl_decrementInterlockedCountV8 - .align 4 - -osl_decrementInterlockedCountV8: - -1: ld [%o0], %o1 - cmp %o1, -4096 ! test spinlock - be 1b - mov -4096, %o1 ! delay slot - swap [%o0], %o1 - cmp %o1, -4096 - be 1b - dec %o1 ! delay slot, if we got spinlock, decrement count - st %o1, [%o0] ! delay slot - retl - mov %o1, %o0 ! delay slot - - .type osl_decrementInterlockedCountV8,#function - .size osl_decrementInterlockedCountV8,.-osl_decrementInterlockedCountV8 - -#endif /* !__sparcv8plus && !__sparcv9 && !_sparcv9__ */ - -.section ".text" -#if defined(__sparcv8plus) || defined(__sparcv9) || defined(__sparc_v9__) -#define osl_incrementInterlockedCountV9 osl_incrementInterlockedCount - .global osl_incrementInterlockedCountV9 -#else - .local osl_incrementInterlockedCountV9 -#endif - .align 8 - -! Implements osl_[increment|decrement]InterlockedCount with sparcv9(sparcv8plus) "cas" -! instruction. - -osl_incrementInterlockedCountV9: - -1: ld [%o0], %o1 - add %o1, 1, %o2 -! allow linux to build for v8 - .word 0xD5E21009 -! cas [%o0], %o1, %o2 - cmp %o1, %o2 - bne 1b - nop ! delay slot - retl - add %o2, 1, %o0 ! delay slot - - .type osl_incrementInterlockedCountV9,#function - .size osl_incrementInterlockedCountV9,.-osl_incrementInterlockedCountV9 - - -.section ".text" -#if defined(__sparcv8plus) || defined(__sparcv9) || defined(__sparc_v9__) -#define osl_decrementInterlockedCountV9 osl_decrementInterlockedCount - .global osl_decrementInterlockedCountV9 -#else - .local osl_decrementInterlockedCountV9 -#endif - .align 8 - -osl_decrementInterlockedCountV9: - -1: ld [%o0], %o1 - sub %o1, 1, %o2 -! allow linux to build for v8 - .word 0xD5E21009 -! cas [%o0], %o1, %o2 - cmp %o1, %o2 - bne 1b - nop ! delay slot - retl - sub %o2, 1, %o0 ! delay slot - - .type osl_decrementInterlockedCountV9,#function - .size osl_decrementInterlockedCountV9,.-osl_decrementInterlockedCountV9 diff --git a/sal/osl/unx/asm/interlck_x86.s b/sal/osl/unx/asm/interlck_x86.s deleted file mode 100644 index c1f99008d..000000000 --- a/sal/osl/unx/asm/interlck_x86.s +++ /dev/null @@ -1,92 +0,0 @@ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2000, 2010 Oracle and/or its affiliates. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * <http://www.openoffice.org/license.html> - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - - -.section .text,"ax" - .globl osl_incrementInterlockedCount - -osl_incrementInterlockedCount: - - push %ebp - mov %esp,%ebp - push %ebx - call 1f -1: - pop %ebx - add $_GLOBAL_OFFSET_TABLE_+0x1,%ebx - mov 8(%ebp),%ecx - mov $1,%eax - mov osl_isSingleCPU@GOT(%ebx),%edx - cmp $0,(%edx) - je 2f - xadd %eax,(%ecx) - jmp 3f -2: - lock - xadd %eax,(%ecx) -3: - inc %eax - pop %ebx - mov %ebp,%esp - pop %ebp - ret - - .type osl_incrementInterlockedCount,@function - .size osl_incrementInterlockedCount,.-osl_incrementInterlockedCount - -.section .text,"ax" - .globl osl_decrementInterlockedCount - -osl_decrementInterlockedCount: - - push %ebp - mov %esp,%ebp - push %ebx - call 1f -1: - pop %ebx - add $_GLOBAL_OFFSET_TABLE_+0x1,%ebx - mov 8(%ebp),%ecx - orl $-1,%eax - mov osl_isSingleCPU@GOT(%ebx),%edx - cmp $0,(%edx) - je 2f - xadd %eax,(%ecx) - jmp 3f -2: - lock - xadd %eax,(%ecx) -3: - dec %eax - pop %ebx - mov %ebp,%esp - pop %ebp - ret - - .type osl_decrementInterlockedCount,@function - .size osl_decrementInterlockedCount,.-osl_decrementInterlockedCount - diff --git a/sal/osl/unx/backtrace.c b/sal/osl/unx/backtrace.c deleted file mode 100644 index ed29a9208..000000000 --- a/sal/osl/unx/backtrace.c +++ /dev/null @@ -1,375 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2000, 2010 Oracle and/or its affiliates. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * <http://www.openoffice.org/license.html> - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - - -#ifdef SOLARIS - -#include <dlfcn.h> -#include <pthread.h> -#include <setjmp.h> -#include <stdio.h> -#include <sys/frame.h> -#include "backtrace.h" - -#if defined(SPARC) - -#if defined IS_LP64 - -#define FRAME_PTR_OFFSET 1 -#define FRAME_OFFSET 0 -#define STACK_BIAS 0x7ff - -#else - -#define FRAME_PTR_OFFSET 1 -#define FRAME_OFFSET 0 -#define STACK_BIAS 0 - -#endif - -#elif defined( INTEL ) - -#define FRAME_PTR_OFFSET 3 -#define FRAME_OFFSET 0 -#define STACK_BIAS 0 - -#else - -#error Unknown Solaris target platform. - -#endif /* defined SPARC or INTEL */ - - -int backtrace( void **buffer, int max_frames ) -{ - jmp_buf ctx; - long fpval; - struct frame *fp; - int i; - - /* flush register windows */ -#ifdef SPARC - asm("ta 3"); -#endif - - /* get stack- and framepointer */ - setjmp(ctx); - - fpval = ((long*)(ctx))[FRAME_PTR_OFFSET]; - fp = (struct frame*)((char*)(fpval) + STACK_BIAS); - - for (i = 0; (i < FRAME_OFFSET) && (fp != 0); i++) - fp = (struct frame*)((char*)(fp->fr_savfp) + STACK_BIAS); - - /* iterate through backtrace */ - for (i = 0; (fp != 0) && (fp->fr_savpc != 0) && (i < max_frames); i++) - { - /* saved (prev) frame */ - struct frame * prev = (struct frame*)((char*)(fp->fr_savfp) + STACK_BIAS); - - /* store frame */ - *(buffer++) = (void*)(fp->fr_savpc); - - /* prev frame (w/ stack growing top down) */ - fp = (prev > fp) ? prev : 0; - } - - /* return number of frames stored */ - return i; -} - -void backtrace_symbols_fd( void **buffer, int size, int fd ) -{ - FILE *fp = fdopen( fd, "w" ); - - if ( fp ) - { - void **pFramePtr; - - for ( pFramePtr = buffer; size > 0 && pFramePtr && *pFramePtr; pFramePtr++, size-- ) - { - Dl_info dli; - ptrdiff_t offset; - - if ( 0 != dladdr( *pFramePtr, &dli ) ) - { - if ( dli.dli_fname && dli.dli_fbase ) - { - offset = (ptrdiff_t)*pFramePtr - (ptrdiff_t)dli.dli_fbase; - fprintf( fp, "%s+0x%x", dli.dli_fname, offset ); - } - if ( dli.dli_sname && dli.dli_saddr ) - { - offset = (ptrdiff_t)*pFramePtr - (ptrdiff_t)dli.dli_saddr; - fprintf( fp, "(%s+0x%x)", dli.dli_sname, offset ); - } - } - fprintf( fp, "[0x%x]\n", *pFramePtr ); - } - - fflush( fp ); - fclose( fp ); - } -} - -#endif /* defined SOLARIS */ - - -#if defined FREEBSD || defined NETBSD || defined OPENBSD || defined(DRAGONFLY) -#include <dlfcn.h> -#include <pthread.h> -#include <setjmp.h> -#include <stddef.h> -#include <stdio.h> -#include "backtrace.h" - -#define FRAME_PTR_OFFSET 1 -#define FRAME_OFFSET 0 - -int backtrace( void **buffer, int max_frames ) -{ - struct frame *fp; - jmp_buf ctx; - int i; - /* get stack- and framepointer */ - setjmp(ctx); - fp = (struct frame*)(((size_t*)(ctx))[FRAME_PTR_OFFSET]); - for ( i=0; (i<FRAME_OFFSET) && (fp!=0); i++) - fp = fp->fr_savfp; - /* iterate through backtrace */ - for (i=0; fp && fp->fr_savpc && i<max_frames; i++) - { - /* store frame */ - *(buffer++) = (void *)fp->fr_savpc; - /* next frame */ - fp=fp->fr_savfp; - } - return i; -} - -void backtrace_symbols_fd( void **buffer, int size, int fd ) -{ - FILE *fp = fdopen( fd, "w" ); - - if ( fp ) - { - void **pFramePtr; - for ( pFramePtr = buffer; size > 0 && pFramePtr && *pFramePtr; pFramePtr++, size-- ) - { - Dl_info dli; - ptrdiff_t offset; - - if ( 0 != dladdr( *pFramePtr, &dli ) ) - { - if ( dli.dli_fname && dli.dli_fbase ) - { - offset = (ptrdiff_t)*pFramePtr - (ptrdiff_t)dli.dli_fbase; - fprintf( fp, "%s+0x%x", dli.dli_fname, offset ); - } - if ( dli.dli_sname && dli.dli_saddr ) - { - offset = (ptrdiff_t)*pFramePtr - (ptrdiff_t)dli.dli_saddr; - fprintf( fp, "(%s+0x%x)", dli.dli_sname, offset ); - } - } - fprintf( fp, "[0x%x]\n", *pFramePtr ); - } - fflush( fp ); - fclose( fp ); - } -} -#endif /* defined FREEBSD */ - -#ifdef LINUX - -#ifndef _GNU_SOURCE -#define _GNU_SOURCE -#endif - -#include <dlfcn.h> -#include <pthread.h> -#include <setjmp.h> -#include <stdio.h> -#include "backtrace.h" - -#if defined(SPARC) - -#define FRAME_PTR_OFFSET 1 -#define FRAME_OFFSET 0 - -#else - -#error Unknown Linux target platform. - -#endif /* defined SPARC or INTEL */ - -typedef int ptrdiff_t; - -int backtrace( void **buffer, int max_frames ) -{ - struct frame *fp; - jmp_buf ctx; - int i; - - /* flush register windows */ -#ifdef SPARC - asm("ta 3"); -#endif - /* get stack- and framepointer */ - setjmp(ctx); - fp = (struct frame*)(((size_t*)(ctx))[FRAME_PTR_OFFSET]); - for ( i=0; (i<FRAME_OFFSET) && (fp!=0); i++) - fp = fp->fr_savfp; - - /* iterate through backtrace */ - for (i=0; fp && fp->fr_savpc && i<max_frames; i++) - { - /* store frame */ - *(buffer++) = (void *)fp->fr_savpc; - /* next frame */ - fp=fp->fr_savfp; - } - return i; -} - -void backtrace_symbols_fd( void **buffer, int size, int fd ) -{ - FILE *fp = fdopen( fd, "w" ); - - if ( fp ) - { - void **pFramePtr; - - for ( pFramePtr = buffer; size > 0 && pFramePtr && *pFramePtr; pFramePtr++, size-- ) - { - Dl_info dli; - - if ( 0 != dladdr( *pFramePtr, &dli ) ) - { - ptrdiff_t offset; - - if ( dli.dli_fname && dli.dli_fbase ) - { - offset = (ptrdiff_t)*pFramePtr - (ptrdiff_t)dli.dli_fbase; - fprintf( fp, "%s+0x%x", dli.dli_fname, offset ); - } - if ( dli.dli_sname && dli.dli_saddr ) - { - offset = (ptrdiff_t)*pFramePtr - (ptrdiff_t)dli.dli_saddr; - fprintf( fp, "(%s+0x%x)", dli.dli_sname, offset ); - } - } - fprintf( fp, "[0x%x]\n", *pFramePtr ); - } - - fflush( fp ); - fclose( fp ); - } -} - -#endif /* defined LINUX */ - -#if defined( MACOSX ) - -#include <dlfcn.h> -#include <stdio.h> -#include "backtrace.h" - -typedef unsigned ptrdiff_t; - -/* glib backtrace is only available on MacOsX 10.5 or higher - so we do it on our own */ - -int backtrace( void **buffer, int max_frames ) -{ - void **frame = (void **)__builtin_frame_address(0); - void **bp = ( void **)(*frame); - void *ip = frame[1]; - int i; - - for ( i = 0; bp && ip && i < max_frames; i++ ) - { - *(buffer++) = ip; - - ip = bp[1]; - bp = (void**)(bp[0]); - } - - return i; -} - - -void backtrace_symbols_fd( void **buffer, int size, int fd ) -{ - FILE *fp = fdopen( fd, "w" ); - - if ( fp ) - { - void **pFramePtr; - - for ( pFramePtr = buffer; size > 0 && pFramePtr && *pFramePtr; pFramePtr++, size-- ) - { - Dl_info dli; - - if ( 0 != dladdr( *pFramePtr, &dli ) ) - { - ptrdiff_t offset; - - if ( dli.dli_fname && dli.dli_fbase ) - { - offset = (ptrdiff_t)*pFramePtr - (ptrdiff_t)dli.dli_fbase; - fprintf( fp, "%s+0x%x", dli.dli_fname, offset ); - } - if ( dli.dli_sname && dli.dli_saddr ) - { - offset = (ptrdiff_t)*pFramePtr - (ptrdiff_t)dli.dli_saddr; - fprintf( fp, "(%s+0x%x)", dli.dli_sname, offset ); - } - } - fprintf( fp, "[0x%x]\n", (unsigned int)*pFramePtr ); - } - - fflush( fp ); - fclose( fp ); - } -} - -#endif /* defined MACOSX */ - -#if defined(AIX) -int backtrace( void **buffer, int max_frames ) -{ - return 0; -} - -void backtrace_symbols_fd( void **buffer, int size, int fd ) -{ -} -#endif - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sal/osl/unx/backtrace.h b/sal/osl/unx/backtrace.h deleted file mode 100644 index a8465de62..000000000 --- a/sal/osl/unx/backtrace.h +++ /dev/null @@ -1,104 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2000, 2010 Oracle and/or its affiliates. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * <http://www.openoffice.org/license.html> - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - - -#if defined (SOLARIS) || defined (FREEBSD) || defined (NETBSD) || \ - defined (OPENBSD) || defined (DRAGONFLY) - -#ifdef __cplusplus -extern "C" { -#endif - -/* backtrace function with same behaviour as defined in GNU libc */ - -int backtrace( void **buffer, int max_frames ); - -void backtrace_symbols_fd( void **buffer, int size, int fd ); - -/* no frame.h on FreeBSD */ -#if defined (FREEBSD) || defined (NETBSD) || defined (OPENBSD) || \ - defined (DRAGONFLY) -struct frame { - long arg0[8]; - long arg1[6]; - struct frame *fr_savfp; - long fr_savpc; -}; -#endif - - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /* defined SOLARIS || FREEBSD || NETBSD || OPENBSD */ - -#if defined (LINUX) && defined (SPARC) -#ifdef __cplusplus -extern "C" { -#endif - -/* backtrace function with same behaviour as defined in GNU libc */ - -int backtrace( void **buffer, int max_frames ); - -void backtrace_symbols_fd( void **buffer, int size, int fd ); - -/* no frame.h on linux sparc */ -struct frame { - long arg0[8]; - long arg1[6]; - struct frame *fr_savfp; - long fr_savpc; -}; - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /* defined LINUX && SPARC */ - -#if defined (MACOSX) - -#ifdef __cplusplus -extern "C" { -#endif - -/* backtrace function with same behaviour as defined in GNU libc */ - -int backtrace( void **buffer, int max_frames ); - -void backtrace_symbols_fd( void **buffer, int size, int fd ); - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /* defined MACOSX */ - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sal/osl/unx/conditn.c b/sal/osl/unx/conditn.c deleted file mode 100644 index 4b407df35..000000000 --- a/sal/osl/unx/conditn.c +++ /dev/null @@ -1,352 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2000, 2010 Oracle and/or its affiliates. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * <http://www.openoffice.org/license.html> - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - - -#include "system.h" -#include <sal/types.h> - -#include <osl/conditn.h> -#include <osl/diagnose.h> -#include <osl/time.h> - - -typedef struct _oslConditionImpl -{ - pthread_cond_t m_Condition; - pthread_mutex_t m_Lock; - sal_Bool m_State; -} oslConditionImpl; - - -/*****************************************************************************/ -/* osl_createCondition */ -/*****************************************************************************/ -oslCondition SAL_CALL osl_createCondition() -{ - oslConditionImpl* pCond; - int nRet=0; - - pCond = (oslConditionImpl*) malloc(sizeof(oslConditionImpl)); - - OSL_ASSERT(pCond); - - if ( pCond == 0 ) - { - return 0; - } - - pCond->m_State = sal_False; - - /* init condition variable with default attr. (PTHREAD_PROCESS_PRIVAT) */ - nRet = pthread_cond_init(&pCond->m_Condition, PTHREAD_CONDATTR_DEFAULT); - if ( nRet != 0 ) - { - OSL_TRACE("osl_createCondition : condition init failed. Errno: %d; '%s'\n", - nRet, strerror(nRet)); - - free(pCond); - return 0; - } - - nRet = pthread_mutex_init(&pCond->m_Lock, PTHREAD_MUTEXATTR_DEFAULT); - if ( nRet != 0 ) - { - OSL_TRACE("osl_createCondition : mutex init failed. Errno: %d; %s\n", - nRet, strerror(nRet)); - - nRet = pthread_cond_destroy(&pCond->m_Condition); - if ( nRet != 0 ) - { - OSL_TRACE("osl_createCondition : destroy condition failed. Errno: %d; '%s'\n", - nRet, strerror(nRet)); - } - - free(pCond); - pCond = 0; - } - - return (oslCondition)pCond; -} - -/*****************************************************************************/ -/* osl_destroyCondition */ -/*****************************************************************************/ -void SAL_CALL osl_destroyCondition(oslCondition Condition) -{ - oslConditionImpl* pCond; - int nRet = 0; - - if ( Condition ) - { - pCond = (oslConditionImpl*)Condition; - - nRet = pthread_cond_destroy(&pCond->m_Condition); - if ( nRet != 0 ) - { - OSL_TRACE("osl_destroyCondition : destroy condition failed. Errno: %d; '%s'\n", - nRet, strerror(nRet)); - } - nRet = pthread_mutex_destroy(&pCond->m_Lock); - if ( nRet != 0 ) - { - OSL_TRACE("osl_destroyCondition : destroy mutex failed. Errno: %d; '%s'\n", - nRet, strerror(nRet)); - } - - free(Condition); - } - - return; -} - -/*****************************************************************************/ -/* osl_setCondition */ -/*****************************************************************************/ -sal_Bool SAL_CALL osl_setCondition(oslCondition Condition) -{ - oslConditionImpl* pCond; - int nRet=0; - - OSL_ASSERT(Condition); - pCond = (oslConditionImpl*)Condition; - - if ( pCond == 0 ) - { - return sal_False; - } - - nRet = pthread_mutex_lock(&pCond->m_Lock); - if ( nRet != 0 ) - { - OSL_TRACE("osl_setCondition : mutex lock failed. Errno: %d; %s\n", - nRet, strerror(nRet)); - return sal_False; - } - - pCond->m_State = sal_True; - nRet = pthread_cond_broadcast(&pCond->m_Condition); - if ( nRet != 0 ) - { - OSL_TRACE("osl_setCondition : condition broadcast failed. Errno: %d; %s\n", - nRet, strerror(nRet)); - return sal_False; - } - - nRet = pthread_mutex_unlock(&pCond->m_Lock); - if ( nRet != 0 ) - { - OSL_TRACE("osl_setCondition : mutex unlock failed. Errno: %d; %s\n", - nRet, strerror(nRet)); - return sal_False; - } - - return sal_True; - -} - -/*****************************************************************************/ -/* osl_resetCondition */ -/*****************************************************************************/ -sal_Bool SAL_CALL osl_resetCondition(oslCondition Condition) -{ - oslConditionImpl* pCond; - int nRet=0; - - OSL_ASSERT(Condition); - - pCond = (oslConditionImpl*)Condition; - - if ( pCond == 0 ) - { - return sal_False; - } - - nRet = pthread_mutex_lock(&pCond->m_Lock); - if ( nRet != 0 ) - { - OSL_TRACE("osl_resetCondition : mutex lock failed. Errno: %d; %s\n", - nRet, strerror(nRet)); - return sal_False; - } - - pCond->m_State = sal_False; - - nRet = pthread_mutex_unlock(&pCond->m_Lock); - if ( nRet != 0 ) - { - OSL_TRACE("osl_resetCondition : mutex unlock failed. Errno: %d; %s\n", - nRet, strerror(nRet)); - return sal_False; - } - - return sal_True; -} - -/*****************************************************************************/ -/* osl_waitCondition */ -/*****************************************************************************/ -oslConditionResult SAL_CALL osl_waitCondition(oslCondition Condition, const TimeValue* pTimeout) -{ - oslConditionImpl* pCond; - int nRet=0; - oslConditionResult Result = osl_cond_result_ok; - - OSL_ASSERT(Condition); - pCond = (oslConditionImpl*)Condition; - - if ( pCond == 0 ) - { - return osl_cond_result_error; - } - - nRet = pthread_mutex_lock(&pCond->m_Lock); - if ( nRet != 0 ) - { - OSL_TRACE("osl_waitCondition : mutex lock failed. Errno: %d; %s\n", - nRet, strerror(nRet)); - return osl_cond_result_error; - } - - if ( pTimeout ) - { - if ( ! pCond->m_State ) - { - int ret; - struct timeval tp; - struct timespec to; - - gettimeofday(&tp, NULL); - - SET_TIMESPEC( to, tp.tv_sec + pTimeout->Seconds, - tp.tv_usec * 1000 + pTimeout->Nanosec ); - - /* spurious wake up prevention */ - do - { - ret = pthread_cond_timedwait(&pCond->m_Condition, &pCond->m_Lock, &to); - if ( ret != 0 ) - { - if ( ret == ETIME || ret == ETIMEDOUT ) - { - Result = osl_cond_result_timeout; - nRet = pthread_mutex_unlock(&pCond->m_Lock); - if (nRet != 0) - { - OSL_TRACE("osl_waitCondition : mutex unlock failed. Errno: %d; %s\n", - nRet, strerror(nRet)); - } - - return Result; - } - else if ( ret != EINTR ) - { - Result = osl_cond_result_error; - nRet = pthread_mutex_unlock(&pCond->m_Lock); - if ( nRet != 0 ) - { - OSL_TRACE("osl_waitCondition : mutex unlock failed. Errno: %d; %s\n", - nRet, strerror(nRet)); - } - return Result; - } -/* OSL_TRACE("EINTR\n");*/ - } - } - while ( !pCond->m_State ); - } - } - else - { - while ( !pCond->m_State ) - { - nRet = pthread_cond_wait(&pCond->m_Condition, &pCond->m_Lock); - if ( nRet != 0 ) - { - OSL_TRACE("osl_waitCondition : condition wait failed. Errno: %d; %s\n", - nRet, strerror(nRet)); - Result = osl_cond_result_error; - nRet = pthread_mutex_unlock(&pCond->m_Lock); - if ( nRet != 0 ) - { - OSL_TRACE("osl_waitCondition : mutex unlock failed. Errno: %d; %s\n", - nRet, strerror(nRet)); - } - - return Result; - } - } - } - - nRet = pthread_mutex_unlock(&pCond->m_Lock); - if ( nRet != 0 ) - { - OSL_TRACE("osl_waitCondition : mutex unlock failed. Errno: %d; %s\n", - nRet, strerror(nRet)); - } - - return Result; -} - -/*****************************************************************************/ -/* osl_checkCondition */ -/*****************************************************************************/ -sal_Bool SAL_CALL osl_checkCondition(oslCondition Condition) -{ - sal_Bool State; - oslConditionImpl* pCond; - int nRet=0; - - OSL_ASSERT(Condition); - pCond = (oslConditionImpl*)Condition; - - if ( pCond == 0 ) - { - return sal_False; - } - - nRet = pthread_mutex_lock(&pCond->m_Lock); - if ( nRet != 0 ) - { - OSL_TRACE("osl_checkCondition : mutex unlock failed. Errno: %d; %s\n", - nRet, strerror(nRet)); - } - - State = pCond->m_State; - - nRet = pthread_mutex_unlock(&pCond->m_Lock); - if ( nRet != 0 ) - { - OSL_TRACE("osl_checkCondition : mutex unlock failed. Errno: %d; %s\n", - nRet, strerror(nRet)); - } - - return State; -} - - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sal/osl/unx/diagnose.c b/sal/osl/unx/diagnose.c deleted file mode 100644 index 0f89ddd06..000000000 --- a/sal/osl/unx/diagnose.c +++ /dev/null @@ -1,321 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2000, 2010 Oracle and/or its affiliates. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * <http://www.openoffice.org/license.html> - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -#include "osl/diagnose.h" -#include "system.h" - -#ifndef HAVE_DLFCN_H - -#if defined(LINUX) || defined(SOLARIS) -#define HAVE_DLFCN_H -#endif /* LINUX || SOLARIS */ - -#endif /* HAVE_DLFCN_H */ - - -#ifdef HAVE_DLFCN_H - -#ifndef INCLUDED_DLFCN_H -#include <dlfcn.h> -#define INCLUDED_DLFCN_H -#endif - -#endif /* HAVE_DLFCN_H */ -#include "osl/thread.h" - -#ifndef INCLUDED_PTHREAD_H -#include <pthread.h> -#define INCLUDED_PTHREAD_H -#endif - -#ifndef INCLUDED_STDDEF_H -#include <stddef.h> -#define INCLUDED_STDDEF_H -#endif - -#include "printtrace.h" - -/************************************************************************/ -/* Internal data structures and functions */ -/************************************************************************/ - -static pthread_mutex_t g_mutex = PTHREAD_MUTEX_INITIALIZER; - -typedef pfunc_osl_printDebugMessage oslDebugMessageFunc; -static oslDebugMessageFunc volatile g_pDebugMessageFunc = 0; - -typedef pfunc_osl_printDetailedDebugMessage oslDetailedDebugMessageFunc; -static oslDetailedDebugMessageFunc volatile g_pDetailedDebugMessageFunc = 0; - -static void osl_diagnose_backtrace_Impl ( - oslDebugMessageFunc f); - -#define OSL_DIAGNOSE_OUTPUTMESSAGE(f, s) \ -((f != 0) ? (*(f))((s)) : (void)fprintf(stderr, "%s", (s))) - -#if defined (LINUX) || defined (SOLARIS) -/************************************************************************/ -/* osl_diagnose_frame_Impl */ -/************************************************************************/ -static void osl_diagnose_frame_Impl ( - oslDebugMessageFunc f, - int depth, - void * pc) -{ - const char *fname = 0, *sname = 0; - void *fbase = 0, *saddr = 0; - ptrdiff_t offset; - char szMessage[1024]; - -#ifdef INCLUDED_DLFCN_H - Dl_info dli; - if (dladdr (pc, &dli) != 0) - { - fname = dli.dli_fname; - fbase = dli.dli_fbase; - sname = dli.dli_sname; - saddr = dli.dli_saddr; - } -#endif /* INCLUDED_DLFCN_H */ - - if (saddr) - offset = (ptrdiff_t)(pc) - (ptrdiff_t)(saddr); - else if (fbase) - offset = (ptrdiff_t)(pc) - (ptrdiff_t)(fbase); - else - offset = (ptrdiff_t)(pc); - - snprintf (szMessage, sizeof(szMessage), - "Backtrace: [%d] %s: %s+0x%" SAL_PRI_PTRDIFFT "x\n", - depth, - fname ? fname : "<unknown>", - sname ? sname : "???", - offset); - - OSL_DIAGNOSE_OUTPUTMESSAGE(f, szMessage); -} -#endif - -/************************************************************************/ -/* osl_diagnose_backtrace_Impl */ -/************************************************************************/ -#if defined(LINUX) - -#include <execinfo.h> - -#define FRAME_COUNT 64 -#define FRAME_OFFSET 1 - -static void osl_diagnose_backtrace_Impl (oslDebugMessageFunc f) -{ - void * ppFrames[FRAME_COUNT]; - int i, n; - - n = backtrace (ppFrames, FRAME_COUNT); - for (i = FRAME_OFFSET; i < n; i++) - { - osl_diagnose_frame_Impl (f, (i - FRAME_OFFSET), ppFrames[i]); - } -} - -#elif defined(SOLARIS) - -#include <pthread.h> -#include <setjmp.h> -#include <sys/frame.h> - -#if defined(SPARC) - -#if defined IS_LP64 - -#define FRAME_PTR_OFFSET 1 -#define FRAME_OFFSET 0 -#define STACK_BIAS 0x7ff - -#else - -#define FRAME_PTR_OFFSET 1 -#define FRAME_OFFSET 0 -#define STACK_BIAS 0 - -#endif - -#elif defined(INTEL) - -#define FRAME_PTR_OFFSET 3 -#define FRAME_OFFSET 0 -#define STACK_BIAS 0 - -#endif /* (SPARC || INTEL) */ - -static void osl_diagnose_backtrace_Impl (oslDebugMessageFunc f) -{ - jmp_buf ctx; - long fpval; - struct frame * fp; - int i; - -#if defined(SPARC) - asm("ta 3"); -#endif /* SPARC */ - setjmp (ctx); - - fpval = ((long*)(ctx))[FRAME_PTR_OFFSET]; - fp = (struct frame*)((char*)(fpval) + STACK_BIAS); - - for (i = 0; (i < FRAME_OFFSET) && (fp != 0); i++) - fp = (struct frame*)((char*)(fp->fr_savfp) + STACK_BIAS); - - for (i = 0; (fp != 0) && (fp->fr_savpc != 0); i++) - { - struct frame * prev = (struct frame*)((char*)(fp->fr_savfp) + STACK_BIAS); - osl_diagnose_frame_Impl (f, i, (void*)(fp->fr_savpc)); - fp = (prev > fp) ? prev : 0; - } -} - -#else /* (LINUX || SOLARIS) */ - -static void osl_diagnose_backtrace_Impl (oslDebugMessageFunc f) -{ - /* not yet implemented */ -} - -#endif /* (LINUX || SOLARIS) */ - -/************************************************************************/ -/* osl_assertFailedLine */ -/************************************************************************/ -sal_Bool SAL_CALL osl_assertFailedLine ( - const sal_Char* pszFileName, - sal_Int32 nLine, - const sal_Char* pszMessage) -{ - oslDebugMessageFunc f = g_pDebugMessageFunc; - char szMessage[1024]; - - // after reporting the assertion, abort if told so by SAL_DIAGNOSE_ABORT, but *not* if - // assertions are routed to some external instance - char const * env = getenv( "SAL_DIAGNOSE_ABORT" ); - sal_Bool const doAbort = ( ( env != NULL ) && ( *env != '\0' ) && ( f == NULL ) ); - - /* If there's a callback for detailed messages, use it */ - if ( g_pDetailedDebugMessageFunc != NULL ) - { - g_pDetailedDebugMessageFunc( pszFileName, nLine, pszMessage ); - return sal_False; - } - - /* if SAL assertions are disabled in general, stop here */ - if ( getenv("DISABLE_SAL_DBGBOX") ) - return doAbort; - - /* format message into buffer */ - if (pszMessage != 0) - { - snprintf(szMessage, sizeof(szMessage), - "Error: File %s, Line %" SAL_PRIdINT32 ": %s\n", - pszFileName, nLine, pszMessage); - } - else - { - snprintf(szMessage, sizeof(szMessage), - "Error: File %s, Line %" SAL_PRIdINT32 "\n", - pszFileName, nLine); - } - - /* acquire lock to serialize output message(s) */ - pthread_mutex_lock(&g_mutex); - - /* output message buffer */ - OSL_DIAGNOSE_OUTPUTMESSAGE(f, szMessage); - - /* should we output backtrace? */ - char const * envBacktrace = getenv( "SAL_DIAGNOSE_BACKTRACE" ); - if( envBacktrace != NULL && *envBacktrace != '\0' ) - osl_diagnose_backtrace_Impl(f); - - /* release lock and leave */ - pthread_mutex_unlock(&g_mutex); - - return doAbort; -} - -/************************************************************************/ -/* osl_breakDebug */ -/************************************************************************/ -void SAL_CALL osl_breakDebug() -{ - abort(); -} - -/************************************************************************/ -/* osl_reportError */ -/************************************************************************/ -sal_Int32 SAL_CALL osl_reportError ( - sal_uInt32 nType, - const sal_Char* pszMessage) -{ - (void) nType; /* unused */ - fputs(pszMessage, stderr); - return 0; -} - -/************************************************************************/ -/* osl_setDebugMessageFunc */ -/************************************************************************/ -oslDebugMessageFunc SAL_CALL osl_setDebugMessageFunc ( - oslDebugMessageFunc pNewFunc) -{ - oslDebugMessageFunc pOldFunc = g_pDebugMessageFunc; - g_pDebugMessageFunc = pNewFunc; - return pOldFunc; -} - -/************************************************************************/ -/* osl_setDetailedDebugMessageFunc */ -/************************************************************************/ -pfunc_osl_printDetailedDebugMessage SAL_CALL osl_setDetailedDebugMessageFunc ( - pfunc_osl_printDetailedDebugMessage pNewFunc) -{ - oslDetailedDebugMessageFunc pOldFunc = g_pDetailedDebugMessageFunc; - g_pDetailedDebugMessageFunc = pNewFunc; - return pOldFunc; -} - -/************************************************************************/ -/* osl_trace */ -/************************************************************************/ -void osl_trace(char const * pszFormat, ...) { - va_list args; - va_start(args, pszFormat); - printTrace((unsigned long) getpid(), pszFormat, args); - va_end(args); -} - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sal/osl/unx/file.cxx b/sal/osl/unx/file.cxx deleted file mode 100644 index 6507d9cd6..000000000 --- a/sal/osl/unx/file.cxx +++ /dev/null @@ -1,1404 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2000, 2010 Oracle and/or its affiliates. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * <http://www.openoffice.org/license.html> - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -// MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_sal.hxx" - -#include "osl/file.hxx" - -#include "osl/diagnose.h" -#include "rtl/alloc.h" - -#include "system.h" -#include "file_error_transl.h" -#include "file_url.h" - -#include <algorithm> -#include <limits> - -#include <string.h> -#include <pthread.h> -#include <sys/mman.h> - -#if defined(MACOSX) - -#include <sys/param.h> -#include <sys/mount.h> -#define HAVE_O_EXLOCK - -// add MACOSX Time Value -#define TimeValue CFTimeValue -#include <CoreFoundation/CoreFoundation.h> -#undef TimeValue - -#endif /* MACOSX */ - -#ifdef DEBUG_OSL_FILE -# define OSL_FILE_TRACE osl_trace -# define PERROR( a, b ) perror( a ); fprintf( stderr, b ) -#else -# define OSL_FILE_TRACE(fmt, ...) -# define PERROR( a, b ) -#endif - - - -/******************************************************************* - * - * FileHandle_Impl interface - * - ******************************************************************/ -struct FileHandle_Impl -{ - pthread_mutex_t m_mutex; - rtl_String * m_strFilePath; /* holds native file path */ - int m_fd; - - /** State - */ - enum StateBits - { - STATE_SEEKABLE = 1, /* default */ - STATE_READABLE = 2, /* default */ - STATE_WRITEABLE = 4, /* open() sets, write() requires, else osl_File_E_BADF */ - STATE_MODIFIED = 8 /* write() sets, flush() resets */ - }; - int m_state; - - sal_uInt64 m_size; /* file size */ - off_t m_offset; /* physical offset from begin of file */ - off_t m_fileptr; /* logical offset from begin of file */ - - off_t m_bufptr; /* buffer offset from begin of file */ - size_t m_buflen; /* buffer filled [0, m_bufsiz - 1] */ - - size_t m_bufsiz; - sal_uInt8 * m_buffer; - - explicit FileHandle_Impl (int fd, char const * path = "<anon>"); - ~FileHandle_Impl(); - - static void* operator new (size_t n); - static void operator delete (void * p, size_t); - - static size_t getpagesize(); - - sal_uInt64 getPos() const; - oslFileError setPos (sal_uInt64 uPos); - - sal_uInt64 getSize() const; - oslFileError setSize (sal_uInt64 uSize); - - oslFileError readAt ( - off_t nOffset, - void * pBuffer, - size_t nBytesRequested, - sal_uInt64 * pBytesRead); - - oslFileError writeAt ( - off_t nOffset, - void const * pBuffer, - size_t nBytesToWrite, - sal_uInt64 * pBytesWritten); - - oslFileError readFileAt ( - off_t nOffset, - void * pBuffer, - size_t nBytesRequested, - sal_uInt64 * pBytesRead); - - oslFileError writeFileAt ( - off_t nOffset, - void const * pBuffer, - size_t nBytesToWrite, - sal_uInt64 * pBytesWritten); - - oslFileError readLineAt ( - off_t nOffset, - sal_Sequence ** ppSequence, - sal_uInt64 * pBytesRead); - - oslFileError writeSequence_Impl ( - sal_Sequence ** ppSequence, - size_t * pnOffset, - const void * pBuffer, - size_t nBytes); - - oslFileError syncFile(); - - /** Buffer cache / allocator. - */ - class Allocator - { - rtl_cache_type * m_cache; - size_t m_bufsiz; - - Allocator (Allocator const &); - Allocator & operator= (Allocator const &); - - public: - static Allocator & get(); - - void allocate (sal_uInt8 ** ppBuffer, size_t * pnSize); - void deallocate (sal_uInt8 * pBuffer); - - protected: - Allocator(); - ~Allocator(); - }; - - /** Guard. - */ - class Guard - { - pthread_mutex_t * m_mutex; - - public: - explicit Guard(pthread_mutex_t * pMutex); - ~Guard(); - }; -}; - -/******************************************************************* - * - * FileHandle_Impl implementation - * - ******************************************************************/ - -FileHandle_Impl::Allocator & -FileHandle_Impl::Allocator::get() -{ - static Allocator g_aBufferAllocator; - return g_aBufferAllocator; -} - -FileHandle_Impl::Allocator::Allocator() - : m_cache (0), - m_bufsiz (0) -{ - size_t const pagesize = FileHandle_Impl::getpagesize(); - if (size_t(-1) != pagesize) - { - m_cache = rtl_cache_create ( - "osl_file_buffer_cache", pagesize, 0, 0, 0, 0, 0, 0, 0); - if (0 != m_cache) - m_bufsiz = pagesize; - } -} -FileHandle_Impl::Allocator::~Allocator() -{ - rtl_cache_destroy (m_cache), m_cache = 0; -} - -void FileHandle_Impl::Allocator::allocate (sal_uInt8 ** ppBuffer, size_t * pnSize) -{ - OSL_PRECOND((0 != ppBuffer) && (0 != pnSize), "FileHandle_Impl::Allocator::allocate(): contract violation"); - if ((0 != ppBuffer) && (0 != pnSize)) - *ppBuffer = static_cast< sal_uInt8* >(rtl_cache_alloc(m_cache)), *pnSize = m_bufsiz; -} -void FileHandle_Impl::Allocator::deallocate (sal_uInt8 * pBuffer) -{ - if (0 != pBuffer) - rtl_cache_free (m_cache, pBuffer); -} - -FileHandle_Impl::Guard::Guard(pthread_mutex_t * pMutex) - : m_mutex (pMutex) -{ - OSL_PRECOND (m_mutex != 0, "FileHandle_Impl::Guard::Guard(): null pointer."); - (void) pthread_mutex_lock (m_mutex); // ignoring EINVAL ... -} -FileHandle_Impl::Guard::~Guard() -{ - OSL_PRECOND (m_mutex != 0, "FileHandle_Impl::Guard::~Guard(): null pointer."); - (void) pthread_mutex_unlock (m_mutex); -} - -FileHandle_Impl::FileHandle_Impl (int fd, char const * path) - : m_strFilePath (0), - m_fd (fd), - m_state (STATE_SEEKABLE | STATE_READABLE), - m_size (0), - m_offset (0), - m_fileptr (0), - m_bufptr (-1), - m_buflen (0), - m_bufsiz (0), - m_buffer (0) -{ - (void) pthread_mutex_init(&m_mutex, 0); - rtl_string_newFromStr (&m_strFilePath, path); - Allocator::get().allocate (&m_buffer, &m_bufsiz); - if (0 != m_buffer) - memset (m_buffer, 0, m_bufsiz); -} -FileHandle_Impl::~FileHandle_Impl() -{ - Allocator::get().deallocate (m_buffer), m_buffer = 0; - rtl_string_release (m_strFilePath), m_strFilePath = 0; - (void) pthread_mutex_destroy(&m_mutex); // ignoring EBUSY ... -} - -void* FileHandle_Impl::operator new (size_t n) -{ - return rtl_allocateMemory(n); -} -void FileHandle_Impl::operator delete (void * p, size_t) -{ - rtl_freeMemory(p); -} - -size_t FileHandle_Impl::getpagesize() -{ -#if defined(FREEBSD) || defined(NETBSD) || defined(MACOSX) || \ - defined(OPENBSD) || defined(DRAGONFLY) - return sal::static_int_cast< size_t >(::getpagesize()); -#else /* POSIX */ - return sal::static_int_cast< size_t >(::sysconf(_SC_PAGESIZE)); -#endif /* xBSD || POSIX */ -} - -sal_uInt64 FileHandle_Impl::getPos() const -{ - return sal::static_int_cast< sal_uInt64 >(m_fileptr); -} - -oslFileError FileHandle_Impl::setPos (sal_uInt64 uPos) -{ - OSL_FILE_TRACE("FileHandle_Impl::setPos(%d, %lld) => %lld", m_fd, getPos(), uPos); - m_fileptr = sal::static_int_cast< off_t >(uPos); - return osl_File_E_None; -} - -sal_uInt64 FileHandle_Impl::getSize() const -{ - off_t const bufend = std::max((off_t)(0), m_bufptr) + m_buflen; - return std::max(m_size, sal::static_int_cast< sal_uInt64 >(bufend)); -} - -oslFileError FileHandle_Impl::setSize (sal_uInt64 uSize) -{ - off_t const nSize = sal::static_int_cast< off_t >(uSize); - if (-1 == ftruncate (m_fd, nSize)) - { - /* Failure. Save original result. Try fallback algorithm */ - oslFileError result = oslTranslateFileError (OSL_FET_ERROR, errno); - - /* Check against current size. Fail upon 'shrink' */ - if (uSize <= getSize()) - { - /* Failure upon 'shrink'. Return original result */ - return (result); - } - - /* Save current position */ - off_t const nCurPos = (off_t)lseek (m_fd, (off_t)0, SEEK_CUR); - if (nCurPos == (off_t)(-1)) - return (result); - - /* Try 'expand' via 'lseek()' and 'write()' */ - if (-1 == lseek (m_fd, (off_t)(nSize - 1), SEEK_SET)) - return (result); - - if (-1 == write (m_fd, (char*)"", (size_t)1)) - { - /* Failure. Restore saved position */ - (void) lseek (m_fd, (off_t)(nCurPos), SEEK_SET); - return (result); - } - - /* Success. Restore saved position */ - if (-1 == lseek (m_fd, (off_t)nCurPos, SEEK_SET)) - return (result); - } - - OSL_FILE_TRACE("osl_setFileSize(%d, %lld) => %ld", m_fd, getSize(), nSize); - m_size = sal::static_int_cast< sal_uInt64 >(nSize); - return osl_File_E_None; -} - -oslFileError FileHandle_Impl::readAt ( - off_t nOffset, - void * pBuffer, - size_t nBytesRequested, - sal_uInt64 * pBytesRead) -{ - OSL_PRECOND((m_state & STATE_SEEKABLE), "FileHandle_Impl::readAt(): not seekable"); - if (!(m_state & STATE_SEEKABLE)) - return osl_File_E_SPIPE; - - OSL_PRECOND((m_state & STATE_READABLE), "FileHandle_Impl::readAt(): not readable"); - if (!(m_state & STATE_READABLE)) - return osl_File_E_BADF; - -#if defined(LINUX) || defined(SOLARIS) - - ssize_t nBytes = ::pread (m_fd, pBuffer, nBytesRequested, nOffset); - if ((-1 == nBytes) && (EOVERFLOW == errno)) - { - /* Some 'pread()'s fail with EOVERFLOW when reading at (or past) - * end-of-file, different from 'lseek() + read()' behaviour. - * Returning '0 bytes read' and 'osl_File_E_None' instead. - */ - nBytes = 0; - } - if (-1 == nBytes) - return oslTranslateFileError (OSL_FET_ERROR, errno); - -#else /* !(LINUX || SOLARIS) */ - - if (nOffset != m_offset) - { - if (-1 == ::lseek (m_fd, nOffset, SEEK_SET)) - return oslTranslateFileError (OSL_FET_ERROR, errno); - m_offset = nOffset; - } - - ssize_t nBytes = ::read (m_fd, pBuffer, nBytesRequested); - if (-1 == nBytes) - return oslTranslateFileError (OSL_FET_ERROR, errno); - m_offset += nBytes; - -#endif /* !(LINUX || SOLARIS) */ - - OSL_FILE_TRACE("FileHandle_Impl::readAt(%d, %lld, %ld)", m_fd, nOffset, nBytes); - *pBytesRead = nBytes; - return osl_File_E_None; -} - -oslFileError FileHandle_Impl::writeAt ( - off_t nOffset, - void const * pBuffer, - size_t nBytesToWrite, - sal_uInt64 * pBytesWritten) -{ - OSL_PRECOND((m_state & STATE_SEEKABLE), "FileHandle_Impl::writeAt(): not seekable"); - if (!(m_state & STATE_SEEKABLE)) - return osl_File_E_SPIPE; - - OSL_PRECOND((m_state & STATE_WRITEABLE), "FileHandle_Impl::writeAt(): not writeable"); - if (!(m_state & STATE_WRITEABLE)) - return osl_File_E_BADF; - -#if defined(LINUX) || defined(SOLARIS) - - ssize_t nBytes = ::pwrite (m_fd, pBuffer, nBytesToWrite, nOffset); - if (-1 == nBytes) - return oslTranslateFileError (OSL_FET_ERROR, errno); - -#else /* !(LINUX || SOLARIS) */ - - if (nOffset != m_offset) - { - if (-1 == ::lseek (m_fd, nOffset, SEEK_SET)) - return oslTranslateFileError (OSL_FET_ERROR, errno); - m_offset = nOffset; - } - - ssize_t nBytes = ::write (m_fd, pBuffer, nBytesToWrite); - if (-1 == nBytes) - return oslTranslateFileError (OSL_FET_ERROR, errno); - m_offset += nBytes; - -#endif /* !(LINUX || SOLARIS) */ - - OSL_FILE_TRACE("FileHandle_Impl::writeAt(%d, %lld, %ld)", m_fd, nOffset, nBytes); - m_size = std::max (m_size, sal::static_int_cast< sal_uInt64 >(nOffset + nBytes)); - - *pBytesWritten = nBytes; - return osl_File_E_None; -} - -oslFileError FileHandle_Impl::readFileAt ( - off_t nOffset, - void * pBuffer, - size_t nBytesRequested, - sal_uInt64 * pBytesRead) -{ - if (0 == (m_state & STATE_SEEKABLE)) - { - // not seekable (pipe) - ssize_t nBytes = ::read (m_fd, pBuffer, nBytesRequested); - if (-1 == nBytes) - return oslTranslateFileError (OSL_FET_ERROR, errno); - *pBytesRead = nBytes; - return osl_File_E_None; - } - else if (0 == m_buffer) - { - // not buffered - return readAt (nOffset, pBuffer, nBytesRequested, pBytesRead); - } - else - { - sal_uInt8 * buffer = static_cast<sal_uInt8*>(pBuffer); - for (*pBytesRead = 0; nBytesRequested > 0; ) - { - off_t const bufptr = (nOffset / m_bufsiz) * m_bufsiz; - size_t const bufpos = (nOffset % m_bufsiz); - - if (bufptr != m_bufptr) - { - // flush current buffer - oslFileError result = syncFile(); - if (result != osl_File_E_None) - return (result); - m_bufptr = -1, m_buflen = 0; - - if (nBytesRequested >= m_bufsiz) - { - // buffer too small, read through from file - sal_uInt64 uDone = 0; - result = readAt (nOffset, &(buffer[*pBytesRead]), nBytesRequested, &uDone); - if (result != osl_File_E_None) - return (result); - - nBytesRequested -= uDone, *pBytesRead += uDone; - return osl_File_E_None; - } - - // update buffer (pointer) - sal_uInt64 uDone = 0; - result = readAt (bufptr, m_buffer, m_bufsiz, &uDone); - if (result != osl_File_E_None) - return (result); - m_bufptr = bufptr, m_buflen = uDone; - } - if (bufpos >= m_buflen) - { - // end of file - return osl_File_E_None; - } - - size_t const bytes = std::min (m_buflen - bufpos, nBytesRequested); - OSL_FILE_TRACE("FileHandle_Impl::readFileAt(%d, %lld, %ld)", m_fd, nOffset, bytes); - - memcpy (&(buffer[*pBytesRead]), &(m_buffer[bufpos]), bytes); - nBytesRequested -= bytes, *pBytesRead += bytes, nOffset += bytes; - } - return osl_File_E_None; - } -} - -oslFileError FileHandle_Impl::writeFileAt ( - off_t nOffset, - void const * pBuffer, - size_t nBytesToWrite, - sal_uInt64 * pBytesWritten) -{ - if (0 == (m_state & STATE_SEEKABLE)) - { - // not seekable (pipe) - ssize_t nBytes = ::write (m_fd, pBuffer, nBytesToWrite); - if (-1 == nBytes) - return oslTranslateFileError (OSL_FET_ERROR, errno); - *pBytesWritten = nBytes; - return osl_File_E_None; - } - else if (0 == m_buffer) - { - // not buffered - return writeAt (nOffset, pBuffer, nBytesToWrite, pBytesWritten); - } - else - { - sal_uInt8 const * buffer = static_cast<sal_uInt8 const *>(pBuffer); - for (*pBytesWritten = 0; nBytesToWrite > 0; ) - { - off_t const bufptr = (nOffset / m_bufsiz) * m_bufsiz; - size_t const bufpos = (nOffset % m_bufsiz); - if (bufptr != m_bufptr) - { - // flush current buffer - oslFileError result = syncFile(); - if (result != osl_File_E_None) - return (result); - m_bufptr = -1, m_buflen = 0; - - if (nBytesToWrite >= m_bufsiz) - { - // buffer to small, write through to file - sal_uInt64 uDone = 0; - result = writeAt (nOffset, &(buffer[*pBytesWritten]), nBytesToWrite, &uDone); - if (result != osl_File_E_None) - return (result); - if (uDone != nBytesToWrite) - return osl_File_E_IO; - - nBytesToWrite -= uDone, *pBytesWritten += uDone; - return osl_File_E_None; - } - - // update buffer (pointer) - sal_uInt64 uDone = 0; - result = readAt (bufptr, m_buffer, m_bufsiz, &uDone); - if (result != osl_File_E_None) - return (result); - m_bufptr = bufptr, m_buflen = uDone; - } - - size_t const bytes = std::min (m_bufsiz - bufpos, nBytesToWrite); - OSL_FILE_TRACE("FileHandle_Impl::writeFileAt(%d, %lld, %ld)", m_fd, nOffset, bytes); - - memcpy (&(m_buffer[bufpos]), &(buffer[*pBytesWritten]), bytes); - nBytesToWrite -= bytes, *pBytesWritten += bytes, nOffset += bytes; - - m_buflen = std::max(m_buflen, bufpos + bytes); - m_state |= STATE_MODIFIED; - } - return osl_File_E_None; - } -} - -oslFileError FileHandle_Impl::readLineAt ( - off_t nOffset, - sal_Sequence ** ppSequence, - sal_uInt64 * pBytesRead) -{ - oslFileError result = osl_File_E_None; - - off_t bufptr = nOffset / m_bufsiz * m_bufsiz; - if (bufptr != m_bufptr) - { - /* flush current buffer */ - result = syncFile(); - if (result != osl_File_E_None) - return (result); - - /* update buffer (pointer) */ - sal_uInt64 uDone = 0; - result = readAt (bufptr, m_buffer, m_bufsiz, &uDone); - if (result != osl_File_E_None) - return (result); - - m_bufptr = bufptr, m_buflen = uDone; - } - - static int const LINE_STATE_BEGIN = 0; - static int const LINE_STATE_CR = 1; - static int const LINE_STATE_LF = 2; - - size_t bufpos = nOffset - m_bufptr, curpos = bufpos, dstpos = 0; - int state = (bufpos >= m_buflen) ? LINE_STATE_LF : LINE_STATE_BEGIN; - - for ( ; state != LINE_STATE_LF; ) - { - if (curpos >= m_buflen) - { - /* buffer examined */ - if (0 < (curpos - bufpos)) - { - /* flush buffer to sequence */ - result = writeSequence_Impl ( - ppSequence, &dstpos, &(m_buffer[bufpos]), curpos - bufpos); - if (result != osl_File_E_None) - return (result); - *pBytesRead += curpos - bufpos, nOffset += curpos - bufpos; - } - - bufptr = nOffset / m_bufsiz * m_bufsiz; - if (bufptr != m_bufptr) - { - /* update buffer (pointer) */ - sal_uInt64 uDone = 0; - result = readAt (bufptr, m_buffer, m_bufsiz, &uDone); - if (result != osl_File_E_None) - return (result); - m_bufptr = bufptr, m_buflen = uDone; - } - - bufpos = nOffset - m_bufptr, curpos = bufpos; - if (bufpos >= m_buflen) - break; - } - switch (state) - { - case LINE_STATE_CR: - state = LINE_STATE_LF; - switch (m_buffer[curpos]) - { - case 0x0A: /* CRLF */ - /* eat current char */ - curpos++; - break; - default: /* single CR */ - /* keep current char */ - break; - } - break; - default: - /* determine next state */ - switch (m_buffer[curpos]) - { - case 0x0A: /* single LF */ - state = LINE_STATE_LF; - break; - case 0x0D: /* CR */ - state = LINE_STATE_CR; - break; - default: /* advance to next char */ - curpos++; - break; - } - if (state != LINE_STATE_BEGIN) - { - /* store (and eat) the newline char */ - m_buffer[curpos] = 0x0A, curpos++; - - /* flush buffer to sequence */ - result = writeSequence_Impl ( - ppSequence, &dstpos, &(m_buffer[bufpos]), curpos - bufpos - 1); - if (result != osl_File_E_None) - return (result); - *pBytesRead += curpos - bufpos, nOffset += curpos - bufpos; - } - break; - } - } - - result = writeSequence_Impl (ppSequence, &dstpos, 0, 0); - if (result != osl_File_E_None) - return (result); - if (0 < dstpos) - return osl_File_E_None; - if (bufpos >= m_buflen) - return osl_File_E_AGAIN; - return osl_File_E_None; -} - -oslFileError FileHandle_Impl::writeSequence_Impl ( - sal_Sequence ** ppSequence, - size_t * pnOffset, - const void * pBuffer, - size_t nBytes) -{ - sal_Int32 nElements = *pnOffset + nBytes; - if (!*ppSequence) - { - /* construct sequence */ - rtl_byte_sequence_constructNoDefault(ppSequence, nElements); - } - else if (nElements != (*ppSequence)->nElements) - { - /* resize sequence */ - rtl_byte_sequence_realloc(ppSequence, nElements); - } - if (*ppSequence != 0) - { - /* fill sequence */ - memcpy(&((*ppSequence)->elements[*pnOffset]), pBuffer, nBytes), *pnOffset += nBytes; - } - return (*ppSequence != 0) ? osl_File_E_None : osl_File_E_NOMEM; -} - -oslFileError FileHandle_Impl::syncFile() -{ - oslFileError result = osl_File_E_None; - if (m_state & STATE_MODIFIED) - { - sal_uInt64 uDone = 0; - result = writeAt (m_bufptr, m_buffer, m_buflen, &uDone); - if (result != osl_File_E_None) - return (result); - if (uDone != m_buflen) - return osl_File_E_IO; - m_state &= ~STATE_MODIFIED; - } - return (result); -} - -/**************************************************************************** - * osl_createFileHandleFromFD - ***************************************************************************/ -extern "C" oslFileHandle osl_createFileHandleFromFD( int fd ) -{ - if (-1 == fd) - return 0; // EINVAL - - struct stat aFileStat; - if (-1 == fstat (fd, &aFileStat)) - return 0; // EBADF - - FileHandle_Impl * pImpl = new FileHandle_Impl (fd); - if (0 == pImpl) - return 0; // ENOMEM - - // assume writeable - pImpl->m_state |= FileHandle_Impl::STATE_WRITEABLE; - if (!S_ISREG(aFileStat.st_mode)) - { - /* not a regular file, mark not seekable */ - pImpl->m_state &= ~FileHandle_Impl::STATE_SEEKABLE; - } - else - { - /* regular file, init current size */ - pImpl->m_size = sal::static_int_cast< sal_uInt64 >(aFileStat.st_size); - } - - OSL_FILE_TRACE("osl_createFileHandleFromFD(%d, writeable) => %s", - pImpl->m_fd, rtl_string_getStr(pImpl->m_strFilePath)); - return (oslFileHandle)(pImpl); -} - -/******************************************************************* - * osl_file_adjustLockFlags - ******************************************************************/ -static int osl_file_adjustLockFlags (const char * path, int flags) -{ -#ifdef MACOSX - /* - * The AFP implementation of MacOS X 10.4 treats O_EXLOCK in a way - * that makes it impossible for OOo to create a backup copy of the - * file it keeps opened. OTOH O_SHLOCK for AFP behaves as desired by - * the OOo file handling, so we need to check the path of the file - * for the filesystem name. - */ - struct statfs s; - if( 0 <= statfs( path, &s ) ) - { - if( 0 == strncmp("afpfs", s.f_fstypename, 5) ) - { - flags &= ~O_EXLOCK; - flags |= O_SHLOCK; - } - else - { - /* Needed flags to allow opening a webdav file */ - flags &= ~(O_EXLOCK | O_SHLOCK | O_NONBLOCK); - } - } -#endif /* MACOSX */ - - (void) path; - return flags; -} - -/**************************************************************************** - * osl_file_queryLocking - ***************************************************************************/ -struct Locking_Impl -{ - int m_enabled; - Locking_Impl() : m_enabled(0) - { -#ifndef HAVE_O_EXLOCK - m_enabled = ((getenv("SAL_ENABLE_FILE_LOCKING") != 0) || (getenv("STAR_ENABLE_FILE_LOCKING") != 0)); -#endif /* HAVE_O_EXLOCK */ - } -}; -static int osl_file_queryLocking (sal_uInt32 uFlags) -{ - if (!(uFlags & osl_File_OpenFlag_NoLock)) - { - if ((uFlags & osl_File_OpenFlag_Write) || (uFlags & osl_File_OpenFlag_Create)) - { - static Locking_Impl g_locking; - return (g_locking.m_enabled != 0); - } - } - return 0; -} - -/**************************************************************************** - * osl_openFile - ***************************************************************************/ -#ifdef HAVE_O_EXLOCK -#define OPEN_WRITE_FLAGS ( O_RDWR | O_EXLOCK | O_NONBLOCK ) -#define OPEN_CREATE_FLAGS ( O_CREAT | O_EXCL | O_RDWR | O_EXLOCK | O_NONBLOCK ) -#else -#define OPEN_WRITE_FLAGS ( O_RDWR ) -#define OPEN_CREATE_FLAGS ( O_CREAT | O_EXCL | O_RDWR ) -#endif - -oslFileError -SAL_CALL osl_openFile( rtl_uString* ustrFileURL, oslFileHandle* pHandle, sal_uInt32 uFlags ) -{ - oslFileError eRet; - - if ((ustrFileURL == 0) || (ustrFileURL->length == 0) || (pHandle == 0)) - return osl_File_E_INVAL; - - /* convert file URL to system path */ - char buffer[PATH_MAX]; - eRet = FileURLToPath (buffer, sizeof(buffer), ustrFileURL); - if (eRet != osl_File_E_None) - return eRet; -#ifdef MACOSX - if (macxp_resolveAlias (buffer, sizeof(buffer)) != 0) - return oslTranslateFileError (OSL_FET_ERROR, errno); -#endif /* MACOSX */ - - /* set mode and flags */ - int mode = S_IRUSR | S_IRGRP | S_IROTH; - int flags = O_RDONLY; - if (uFlags & osl_File_OpenFlag_Write) - { - mode |= S_IWUSR | S_IWGRP | S_IWOTH; - flags = OPEN_WRITE_FLAGS; - } - if (uFlags & osl_File_OpenFlag_Create) - { - mode |= S_IWUSR | S_IWGRP | S_IWOTH; - flags = OPEN_CREATE_FLAGS; - } - if (uFlags & osl_File_OpenFlag_NoLock) - { -#ifdef HAVE_O_EXLOCK - flags &= ~(O_EXLOCK | O_SHLOCK | O_NONBLOCK); -#endif /* HAVE_O_EXLOCK */ - } - else - { - flags = osl_file_adjustLockFlags (buffer, flags); - } - - /* open the file */ - int fd = open( buffer, flags, mode ); - if (-1 == fd) - return oslTranslateFileError (OSL_FET_ERROR, errno); - - /* reset O_NONBLOCK flag */ - if (flags & O_NONBLOCK) - { - int f = fcntl (fd, F_GETFL, 0); - if (-1 == f) - { - eRet = oslTranslateFileError (OSL_FET_ERROR, errno); - (void) close(fd); - return eRet; - } - if (-1 == fcntl (fd, F_SETFL, (f & ~O_NONBLOCK))) - { - eRet = oslTranslateFileError (OSL_FET_ERROR, errno); - (void) close(fd); - return eRet; - } - } - - /* get file status (mode, size) */ - struct stat aFileStat; - if (-1 == fstat (fd, &aFileStat)) - { - eRet = oslTranslateFileError (OSL_FET_ERROR, errno); - (void) close(fd); - return eRet; - } - if (!S_ISREG(aFileStat.st_mode)) - { - /* we only open regular files here */ - (void) close(fd); - return osl_File_E_INVAL; - } - - if (osl_file_queryLocking (uFlags)) - { -#ifdef MACOSX - if (-1 == flock (fd, LOCK_EX | LOCK_NB)) - { - /* Mac OSX returns ENOTSUP for webdav drives. We should try read lock */ - if ((errno != ENOTSUP) || ((-1 == flock (fd, LOCK_SH | LOCK_NB)) && (errno != ENOTSUP))) - { - eRet = oslTranslateFileError (OSL_FET_ERROR, errno); - (void) close(fd); - return eRet; - } - } -#else /* F_SETLK */ - { - struct flock aflock; - - aflock.l_type = F_WRLCK; - aflock.l_whence = SEEK_SET; - aflock.l_start = 0; - aflock.l_len = 0; - - if (-1 == fcntl (fd, F_SETLK, &aflock)) - { - eRet = oslTranslateFileError (OSL_FET_ERROR, errno); - (void) close(fd); - return eRet; - } - } -#endif /* F_SETLK */ - } - - /* allocate memory for impl structure */ - FileHandle_Impl * pImpl = new FileHandle_Impl (fd, buffer); - if (!pImpl) - { - eRet = oslTranslateFileError (OSL_FET_ERROR, ENOMEM); - (void) close(fd); - return eRet; - } - if (flags & O_RDWR) - pImpl->m_state |= FileHandle_Impl::STATE_WRITEABLE; - pImpl->m_size = sal::static_int_cast< sal_uInt64 >(aFileStat.st_size); - - OSL_TRACE("osl_openFile(%d, %s) => %s", pImpl->m_fd, - flags & O_RDWR ? "writeable":"readonly", - rtl_string_getStr(pImpl->m_strFilePath)); - - *pHandle = (oslFileHandle)(pImpl); - return osl_File_E_None; -} - -/****************************************************************************/ -/* osl_closeFile */ -/****************************************************************************/ -oslFileError -SAL_CALL osl_closeFile( oslFileHandle Handle ) -{ - FileHandle_Impl* pImpl = static_cast<FileHandle_Impl*>(Handle); - - if ((pImpl == 0) || (pImpl->m_fd < 0)) - return osl_File_E_INVAL; - - (void) pthread_mutex_lock (&(pImpl->m_mutex)); - - /* close(2) implicitly (and unconditionally) unlocks */ - OSL_TRACE("osl_closeFile(%d) => %s", pImpl->m_fd, rtl_string_getStr(pImpl->m_strFilePath)); - oslFileError result = pImpl->syncFile(); - if (result != osl_File_E_None) - { - /* close, ignoring double failure */ - (void) close (pImpl->m_fd); - } - else if (-1 == close (pImpl->m_fd)) - { - /* translate error code */ - result = oslTranslateFileError (OSL_FET_ERROR, errno); - } - - (void) pthread_mutex_unlock (&(pImpl->m_mutex)); - delete pImpl; - return (result); -} - -/************************************************ - * osl_syncFile - ***********************************************/ -oslFileError -SAL_CALL osl_syncFile(oslFileHandle Handle) -{ - FileHandle_Impl* pImpl = static_cast<FileHandle_Impl*>(Handle); - - if ((0 == pImpl) || (-1 == pImpl->m_fd)) - return osl_File_E_INVAL; - - FileHandle_Impl::Guard lock (&(pImpl->m_mutex)); - - OSL_TRACE("osl_syncFile(%d)", pImpl->m_fd); - oslFileError result = pImpl->syncFile(); - if (result != osl_File_E_None) - return (result); - if (-1 == fsync (pImpl->m_fd)) - return oslTranslateFileError (OSL_FET_ERROR, errno); - - return osl_File_E_None; -} - -/******************************************* - osl_mapFile -********************************************/ -oslFileError -SAL_CALL osl_mapFile ( - oslFileHandle Handle, - void** ppAddr, - sal_uInt64 uLength, - sal_uInt64 uOffset, - sal_uInt32 uFlags -) -{ - FileHandle_Impl* pImpl = static_cast<FileHandle_Impl*>(Handle); - - if ((0 == pImpl) || (-1 == pImpl->m_fd) || (0 == ppAddr)) - return osl_File_E_INVAL; - *ppAddr = 0; - - static sal_uInt64 const g_limit_size_t = std::numeric_limits< size_t >::max(); - if (g_limit_size_t < uLength) - return osl_File_E_OVERFLOW; - size_t const nLength = sal::static_int_cast< size_t >(uLength); - - static sal_uInt64 const g_limit_off_t = std::numeric_limits< off_t >::max(); - if (g_limit_off_t < uOffset) - return osl_File_E_OVERFLOW; - off_t const nOffset = sal::static_int_cast< off_t >(uOffset); - - void* p = mmap(NULL, nLength, PROT_READ, MAP_SHARED, pImpl->m_fd, nOffset); - if (MAP_FAILED == p) - return oslTranslateFileError(OSL_FET_ERROR, errno); - *ppAddr = p; - - if (uFlags & osl_File_MapFlag_RandomAccess) - { - // Determine memory pagesize. - size_t const nPageSize = FileHandle_Impl::getpagesize(); - if (size_t(-1) != nPageSize) - { - /* - * Pagein, touching first byte of every memory page. - * Note: volatile disables optimizing the loop away. - */ - sal_uInt8 * pData (reinterpret_cast<sal_uInt8*>(*ppAddr)); - size_t nSize (nLength); - - volatile sal_uInt8 c = 0; - while (nSize > nPageSize) - { - c ^= pData[0]; - pData += nPageSize; - nSize -= nPageSize; - } - if (nSize > 0) - { - c^= pData[0]; - pData += nSize; - nSize -= nSize; - } - } - } - if (uFlags & osl_File_MapFlag_WillNeed) - { - // On Linux, madvise(..., MADV_WILLNEED) appears to have the undesirable - // effect of not returning until the data has actually been paged in, so - // that its net effect would typically be to slow down the process - // (which could start processing at the beginning of the data while the - // OS simultaneously pages in the rest); on other platforms, it remains - // to be evaluated whether madvise or equivalent is available and - // actually useful: -#if defined MACOSX - int e = posix_madvise(p, nLength, POSIX_MADV_WILLNEED); - if (e != 0) - { - OSL_TRACE( - "posix_madvise(..., POSIX_MADV_WILLNEED) failed with %d", e); - } -#elif defined SOLARIS - if (madvise(static_cast< caddr_t >(p), nLength, MADV_WILLNEED) != 0) - { - OSL_TRACE("madvise(..., MADV_WILLNEED) failed with %d", errno); - } -#endif - } - return osl_File_E_None; -} - -/******************************************* - osl_unmapFile -********************************************/ -oslFileError -SAL_CALL osl_unmapFile (void* pAddr, sal_uInt64 uLength) -{ - if (0 == pAddr) - return osl_File_E_INVAL; - - static sal_uInt64 const g_limit_size_t = std::numeric_limits< size_t >::max(); - if (g_limit_size_t < uLength) - return osl_File_E_OVERFLOW; - size_t const nLength = sal::static_int_cast< size_t >(uLength); - - if (-1 == munmap(static_cast<char*>(pAddr), nLength)) - return oslTranslateFileError(OSL_FET_ERROR, errno); - - return osl_File_E_None; -} - -/******************************************* - osl_readLine -********************************************/ -oslFileError -SAL_CALL osl_readLine ( - oslFileHandle Handle, - sal_Sequence ** ppSequence) -{ - FileHandle_Impl * pImpl = static_cast<FileHandle_Impl*>(Handle); - - if ((0 == pImpl) || (-1 == pImpl->m_fd) || (0 == ppSequence)) - return osl_File_E_INVAL; - sal_uInt64 uBytesRead = 0; - - // read at current fileptr; fileptr += uBytesRead; - FileHandle_Impl::Guard lock (&(pImpl->m_mutex)); - oslFileError result = pImpl->readLineAt ( - pImpl->m_fileptr, ppSequence, &uBytesRead); - if (result == osl_File_E_None) - pImpl->m_fileptr += uBytesRead; - return (result); -} - -/******************************************* - osl_readFile -********************************************/ -oslFileError -SAL_CALL osl_readFile ( - oslFileHandle Handle, - void * pBuffer, - sal_uInt64 uBytesRequested, - sal_uInt64 * pBytesRead) -{ - FileHandle_Impl* pImpl = static_cast<FileHandle_Impl*>(Handle); - - if ((0 == pImpl) || (-1 == pImpl->m_fd) || (0 == pBuffer) || (0 == pBytesRead)) - return osl_File_E_INVAL; - - static sal_uInt64 const g_limit_ssize_t = std::numeric_limits< ssize_t >::max(); - if (g_limit_ssize_t < uBytesRequested) - return osl_File_E_OVERFLOW; - size_t const nBytesRequested = sal::static_int_cast< size_t >(uBytesRequested); - - // read at current fileptr; fileptr += *pBytesRead; - FileHandle_Impl::Guard lock (&(pImpl->m_mutex)); - oslFileError result = pImpl->readFileAt ( - pImpl->m_fileptr, pBuffer, nBytesRequested, pBytesRead); - if (result == osl_File_E_None) - pImpl->m_fileptr += *pBytesRead; - return (result); -} - -/******************************************* - osl_writeFile -********************************************/ -oslFileError -SAL_CALL osl_writeFile ( - oslFileHandle Handle, - const void * pBuffer, - sal_uInt64 uBytesToWrite, - sal_uInt64 * pBytesWritten) -{ - FileHandle_Impl* pImpl = static_cast<FileHandle_Impl*>(Handle); - - if ((0 == pImpl) || (-1 == pImpl->m_fd) || (0 == pBuffer) || (0 == pBytesWritten)) - return osl_File_E_INVAL; - if (0 == (pImpl->m_state & FileHandle_Impl::STATE_WRITEABLE)) - return osl_File_E_BADF; - - static sal_uInt64 const g_limit_ssize_t = std::numeric_limits< ssize_t >::max(); - if (g_limit_ssize_t < uBytesToWrite) - return osl_File_E_OVERFLOW; - size_t const nBytesToWrite = sal::static_int_cast< size_t >(uBytesToWrite); - - // write at current fileptr; fileptr += *pBytesWritten; - FileHandle_Impl::Guard lock (&(pImpl->m_mutex)); - oslFileError result = pImpl->writeFileAt ( - pImpl->m_fileptr, pBuffer, nBytesToWrite, pBytesWritten); - if (result == osl_File_E_None) - pImpl->m_fileptr += *pBytesWritten; - return (result); -} - -/******************************************* - osl_readFileAt -********************************************/ -oslFileError -SAL_CALL osl_readFileAt ( - oslFileHandle Handle, - sal_uInt64 uOffset, - void* pBuffer, - sal_uInt64 uBytesRequested, - sal_uInt64* pBytesRead) -{ - FileHandle_Impl* pImpl = static_cast<FileHandle_Impl*>(Handle); - - if ((0 == pImpl) || (-1 == pImpl->m_fd) || (0 == pBuffer) || (0 == pBytesRead)) - return osl_File_E_INVAL; - if (0 == (pImpl->m_state & FileHandle_Impl::STATE_SEEKABLE)) - return osl_File_E_SPIPE; - - static sal_uInt64 const g_limit_off_t = std::numeric_limits< off_t >::max(); - if (g_limit_off_t < uOffset) - return osl_File_E_OVERFLOW; - off_t const nOffset = sal::static_int_cast< off_t >(uOffset); - - static sal_uInt64 const g_limit_ssize_t = std::numeric_limits< ssize_t >::max(); - if (g_limit_ssize_t < uBytesRequested) - return osl_File_E_OVERFLOW; - size_t const nBytesRequested = sal::static_int_cast< size_t >(uBytesRequested); - - // read at specified fileptr - FileHandle_Impl::Guard lock (&(pImpl->m_mutex)); - return pImpl->readFileAt (nOffset, pBuffer, nBytesRequested, pBytesRead); -} - -/******************************************* - osl_writeFileAt -********************************************/ -oslFileError -SAL_CALL osl_writeFileAt ( - oslFileHandle Handle, - sal_uInt64 uOffset, - const void* pBuffer, - sal_uInt64 uBytesToWrite, - sal_uInt64* pBytesWritten) -{ - FileHandle_Impl* pImpl = static_cast<FileHandle_Impl*>(Handle); - - if ((0 == pImpl) || (-1 == pImpl->m_fd) || (0 == pBuffer) || (0 == pBytesWritten)) - return osl_File_E_INVAL; - if (0 == (pImpl->m_state & FileHandle_Impl::STATE_SEEKABLE)) - return osl_File_E_SPIPE; - if (0 == (pImpl->m_state & FileHandle_Impl::STATE_WRITEABLE)) - return osl_File_E_BADF; - - static sal_uInt64 const g_limit_off_t = std::numeric_limits< off_t >::max(); - if (g_limit_off_t < uOffset) - return osl_File_E_OVERFLOW; - off_t const nOffset = sal::static_int_cast< off_t >(uOffset); - - static sal_uInt64 const g_limit_ssize_t = std::numeric_limits< ssize_t >::max(); - if (g_limit_ssize_t < uBytesToWrite) - return osl_File_E_OVERFLOW; - size_t const nBytesToWrite = sal::static_int_cast< size_t >(uBytesToWrite); - - // write at specified fileptr - FileHandle_Impl::Guard lock (&(pImpl->m_mutex)); - return pImpl->writeFileAt (nOffset, pBuffer, nBytesToWrite, pBytesWritten); -} - -/****************************************************************************/ -/* osl_isEndOfFile */ -/****************************************************************************/ -oslFileError -SAL_CALL osl_isEndOfFile( oslFileHandle Handle, sal_Bool *pIsEOF ) -{ - FileHandle_Impl* pImpl = static_cast<FileHandle_Impl*>(Handle); - - if ((0 == pImpl) || (-1 == pImpl->m_fd) || (0 == pIsEOF)) - return osl_File_E_INVAL; - - FileHandle_Impl::Guard lock (&(pImpl->m_mutex)); - *pIsEOF = (pImpl->getPos() == pImpl->getSize()); - return osl_File_E_None; -} - -/************************************************ - * osl_getFilePos - ***********************************************/ -oslFileError -SAL_CALL osl_getFilePos( oslFileHandle Handle, sal_uInt64* pPos ) -{ - FileHandle_Impl* pImpl = static_cast<FileHandle_Impl*>(Handle); - - if ((0 == pImpl) || (-1 == pImpl->m_fd) || (0 == pPos)) - return osl_File_E_INVAL; - - FileHandle_Impl::Guard lock (&(pImpl->m_mutex)); - *pPos = pImpl->getPos(); - return osl_File_E_None; -} - -/******************************************* - osl_setFilePos -********************************************/ -oslFileError -SAL_CALL osl_setFilePos (oslFileHandle Handle, sal_uInt32 uHow, sal_Int64 uOffset) -{ - FileHandle_Impl* pImpl = static_cast<FileHandle_Impl*>(Handle); - - if ((0 == pImpl) || (-1 == pImpl->m_fd)) - return osl_File_E_INVAL; - - static sal_Int64 const g_limit_off_t = std::numeric_limits< off_t >::max(); - if (g_limit_off_t < uOffset) - return osl_File_E_OVERFLOW; - off_t nPos = 0, nOffset = sal::static_int_cast< off_t >(uOffset); - - FileHandle_Impl::Guard lock (&(pImpl->m_mutex)); - switch(uHow) - { - case osl_Pos_Absolut: - if (0 > nOffset) - return osl_File_E_INVAL; - break; - - case osl_Pos_Current: - nPos = sal::static_int_cast< off_t >(pImpl->getPos()); - if ((0 > nOffset) && (-1*nOffset > nPos)) - return osl_File_E_INVAL; - if (g_limit_off_t < nPos + nOffset) - return osl_File_E_OVERFLOW; - break; - - case osl_Pos_End: - nPos = sal::static_int_cast< off_t >(pImpl->getSize()); - if ((0 > nOffset) && (-1*nOffset > nPos)) - return osl_File_E_INVAL; - if (g_limit_off_t < nPos + nOffset) - return osl_File_E_OVERFLOW; - break; - - default: - return osl_File_E_INVAL; - } - - return pImpl->setPos (nPos + nOffset); -} - -/**************************************************************************** - * osl_getFileSize - ****************************************************************************/ -oslFileError -SAL_CALL osl_getFileSize( oslFileHandle Handle, sal_uInt64* pSize ) -{ - FileHandle_Impl* pImpl = static_cast<FileHandle_Impl*>(Handle); - - if ((0 == pImpl) || (-1 == pImpl->m_fd) || (0 == pSize)) - return osl_File_E_INVAL; - - FileHandle_Impl::Guard lock (&(pImpl->m_mutex)); - *pSize = pImpl->getSize(); - return osl_File_E_None; -} - -/************************************************ - * osl_setFileSize - ***********************************************/ -oslFileError -SAL_CALL osl_setFileSize( oslFileHandle Handle, sal_uInt64 uSize ) -{ - FileHandle_Impl* pImpl = static_cast<FileHandle_Impl*>(Handle); - - if ((0 == pImpl) || (-1 == pImpl->m_fd)) - return osl_File_E_INVAL; - if (0 == (pImpl->m_state & FileHandle_Impl::STATE_WRITEABLE)) - return osl_File_E_BADF; - - static sal_uInt64 const g_limit_off_t = std::numeric_limits< off_t >::max(); - if (g_limit_off_t < uSize) - return osl_File_E_OVERFLOW; - - oslFileError result = pImpl->syncFile(); - if (result != osl_File_E_None) - return (result); - pImpl->m_bufptr = -1, pImpl->m_buflen = 0; - - return pImpl->setSize (uSize); -} - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sal/osl/unx/file_error_transl.cxx b/sal/osl/unx/file_error_transl.cxx deleted file mode 100644 index b7b334d9a..000000000 --- a/sal/osl/unx/file_error_transl.cxx +++ /dev/null @@ -1,256 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2000, 2010 Oracle and/or its affiliates. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * <http://www.openoffice.org/license.html> - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -// MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_sal.hxx" - - #ifndef _ERRNO_H - #include <errno.h> - #endif - - #ifndef _FILE_ERROR_TRANSL_H_ - #include "file_error_transl.h" - #endif - - #ifndef _OSL_DIAGNOSE_H_ - #include <osl/diagnose.h> - #endif - - -/******************************************** - * oslTranslateFileError - *******************************************/ - -oslFileError oslTranslateFileError(sal_Bool bIsError, int Errno) -{ - oslFileError osl_error = osl_File_E_invalidError; - - OSL_ENSURE((bIsError && (0 != Errno)) || (!bIsError && (0 == Errno)), "oslTranslateFileError strange input combination!"); - - /* Have a look at file_error_transl.h for - the reason that we do this here */ - if (bIsError && (0 == Errno)) - return osl_error; - - switch(Errno) - { - case 0: - osl_error = osl_File_E_None; - break; - - case EPERM: - osl_error = osl_File_E_PERM; - break; - - case ENOENT: - osl_error = osl_File_E_NOENT; - break; - - case ESRCH: - osl_error = osl_File_E_SRCH; - break; - - case EINTR: - osl_error = osl_File_E_INTR; - break; - - case EIO: - osl_error = osl_File_E_IO; - break; - - case ENXIO: - osl_error = osl_File_E_IO; - break; - - case E2BIG: - osl_error = osl_File_E_2BIG; - break; - - case ENOEXEC: - osl_error = osl_File_E_NOEXEC; - break; - - case EBADF: - osl_error = osl_File_E_BADF; - break; - - case ECHILD: - osl_error = osl_File_E_CHILD; - break; - - case EAGAIN: - osl_error = osl_File_E_AGAIN; - break; - - case ENOMEM: - osl_error = osl_File_E_NOMEM; - break; - - case EACCES: - osl_error = osl_File_E_ACCES; - break; - - case EFAULT: - osl_error = osl_File_E_FAULT; - break; - - case EBUSY: - osl_error = osl_File_E_BUSY; - break; - - case EEXIST: - osl_error = osl_File_E_EXIST; - break; - - case EXDEV: - osl_error = osl_File_E_XDEV; - break; - - case ENODEV: - osl_error = osl_File_E_NODEV; - break; - - case ENOTDIR: - osl_error = osl_File_E_NOTDIR; - break; - - case EISDIR: - osl_error = osl_File_E_ISDIR; - break; - - case EINVAL: - osl_error = osl_File_E_INVAL; - break; - - case ENFILE: - osl_error = osl_File_E_NFILE; - break; - - case EMFILE: - osl_error = osl_File_E_MFILE; - break; - - case ENOTTY: - osl_error = osl_File_E_NOTTY; - break; - - case EFBIG: - osl_error = osl_File_E_FBIG; - break; - - case ENOSPC: - osl_error = osl_File_E_NOSPC; - break; - - case ESPIPE: - osl_error = osl_File_E_SPIPE; - break; - - case EROFS: - osl_error = osl_File_E_ROFS; - break; - - case EMLINK: - osl_error = osl_File_E_MLINK; - break; - - case EPIPE: - osl_error = osl_File_E_PIPE; - break; - - case EDOM: - osl_error = osl_File_E_DOM; - break; - - case ERANGE: - osl_error = osl_File_E_RANGE; - break; - - case EDEADLK: - osl_error = osl_File_E_DEADLK; - break; - - case ENAMETOOLONG: - osl_error = osl_File_E_NAMETOOLONG; - break; - - case ENOLCK: - osl_error = osl_File_E_NOLCK; - break; - - case ENOSYS: - osl_error = osl_File_E_NOSYS; - break; - -#if !defined(AIX) || !(defined(_ALL_SOURCE) && !defined(_LINUX_SOURCE_COMPAT)) - case ENOTEMPTY: - osl_error = osl_File_E_NOTEMPTY; - break; -#endif - - case ELOOP: - osl_error = osl_File_E_LOOP; - break; - -#if !(defined(MACOSX) || defined(NETBSD) || defined(FREEBSD) || defined(OPENBSD) || defined(DRAGONFLY)) - case EILSEQ: - osl_error = osl_File_E_ILSEQ; - break; - - case ENOLINK: - osl_error = osl_File_E_NOLINK; - break; - - case EMULTIHOP: - osl_error = osl_File_E_MULTIHOP; - break; -#endif /* MACOSX */ - - case EUSERS: - osl_error = osl_File_E_USERS; - break; - - case EOVERFLOW: - osl_error = osl_File_E_OVERFLOW; - break; - - case ETIMEDOUT: - osl_error = osl_File_E_TIMEDOUT; - break; - - default: - /* FIXME translateFileError: is this alright? Or add a new one: osl_File_E_Unknown? */ - osl_error = osl_File_E_invalidError; - break; - } - - return osl_error; -} - - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sal/osl/unx/file_error_transl.h b/sal/osl/unx/file_error_transl.h deleted file mode 100644 index fbaf054fb..000000000 --- a/sal/osl/unx/file_error_transl.h +++ /dev/null @@ -1,73 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2000, 2010 Oracle and/or its affiliates. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * <http://www.openoffice.org/license.html> - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -#ifndef _FILE_ERROR_TRANSL_H_ -#define _FILE_ERROR_TRANSL_H_ - -#include <osl/file.h> -#include <sal/types.h> - -#ifdef __cplusplus -extern "C" -{ -#endif - -/********************************************* - oslTranslateFileError - Translate errno's to osl file errors - - @param bIsError [in] specifies if nErrno - should be interpreted as error, - some libc functions signaling an error - but errno is nevertheless 0 in this - case the function should at least - return osl_File_E_Unknown but in no - case osl_File_E_None! - - @param nErrno [in] the errno if errno is 0 - and bIsError is true the function - returns osl_File_E_Unknown - - @returns the osl error code appropriate to - the errno - - *********************************************/ - -#define OSL_FET_SUCCESS sal_False -#define OSL_FET_ERROR sal_True - -oslFileError oslTranslateFileError(sal_Bool bIsError, int Errno); - - -#ifdef __cplusplus -} -#endif - -#endif - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sal/osl/unx/file_impl.hxx b/sal/osl/unx/file_impl.hxx deleted file mode 100644 index 591da90bc..000000000 --- a/sal/osl/unx/file_impl.hxx +++ /dev/null @@ -1,57 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2000, 2010 Oracle and/or its affiliates. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * <http://www.openoffice.org/license.html> - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -#ifndef INCLUDED_FILE_IMPL_HXX -#define INCLUDED_FILE_IMPL_HXX - -#include "osl/file.h" -#include <stddef.h> - -struct DirectoryItem_Impl -{ - sal_Int32 m_RefCount; - - rtl_uString * m_ustrFilePath; /* holds native file name */ - unsigned char m_DType; - - explicit DirectoryItem_Impl( - rtl_uString * ustrFilePath, unsigned char DType = 0); - ~DirectoryItem_Impl(); - - static void * operator new(size_t n); - static void operator delete (void * p, size_t); - - void acquire(); /* @see osl_acquireDirectoryItem() */ - void release(); /* @see osl_releaseDirectoryItem() */ - - oslFileType getFileType() const; -}; - -#endif /* INCLUDED_FILE_IMPL_HXX */ - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sal/osl/unx/file_misc.cxx b/sal/osl/unx/file_misc.cxx deleted file mode 100644 index 319971bad..000000000 --- a/sal/osl/unx/file_misc.cxx +++ /dev/null @@ -1,1052 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2000, 2010 Oracle and/or its affiliates. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * <http://www.openoffice.org/license.html> - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -#include "osl/file.hxx" - -#include "osl/diagnose.h" -#include "osl/thread.h" -#include <osl/signal.h> -#include "rtl/alloc.h" - -#include "system.h" -#include "file_impl.hxx" -#include "file_error_transl.h" -#include "file_path_helper.hxx" -#include "file_url.h" -#include "uunxapi.hxx" -#include "readwrite_helper.h" - -#include <sys/types.h> -#include <errno.h> -#include <dirent.h> -#include <limits.h> -#include <stdio.h> -#include <string.h> -#include <unistd.h> -#include <sys/stat.h> -#include <sys/mman.h> - -#include <algorithm> - -/************************************************************************ - * ToDo - * - * - Fix: check for corresponding struct sizes in exported functions - * - check size/use of oslDirectory - * - check size/use of oslDirectoryItem - ***********************************************************************/ -/****************************************************************************** - * - * Data Type Definition - * - ******************************************************************************/ - -typedef struct -{ - rtl_uString* ustrPath; /* holds native directory path */ - DIR* pDirStruct; -} oslDirectoryImpl; - -DirectoryItem_Impl::DirectoryItem_Impl( - rtl_uString * ustrFilePath, unsigned char DType) - : m_RefCount (1), - m_ustrFilePath (ustrFilePath), - m_DType (DType) -{ - if (m_ustrFilePath != 0) - rtl_uString_acquire(m_ustrFilePath); -} -DirectoryItem_Impl::~DirectoryItem_Impl() -{ - if (m_ustrFilePath != 0) - rtl_uString_release(m_ustrFilePath); -} - -void * DirectoryItem_Impl::operator new(size_t n) -{ - return rtl_allocateMemory(n); -} -void DirectoryItem_Impl::operator delete(void * p, size_t) -{ - rtl_freeMemory(p); -} - -void DirectoryItem_Impl::acquire() -{ - ++m_RefCount; -} -void DirectoryItem_Impl::release() -{ - if (0 == --m_RefCount) - delete this; -} - -oslFileType DirectoryItem_Impl::getFileType() const -{ - switch (m_DType) - { -#ifdef _DIRENT_HAVE_D_TYPE - case DT_LNK: - return osl_File_Type_Link; - case DT_DIR: - return osl_File_Type_Directory; - case DT_REG: - return osl_File_Type_Regular; - case DT_FIFO: - return osl_File_Type_Fifo; - case DT_SOCK: - return osl_File_Type_Socket; - case DT_CHR: - case DT_BLK: - return osl_File_Type_Special; -#endif /* _DIRENT_HAVE_D_TYPE */ - default: - break; - } - return osl_File_Type_Unknown; -} - -/****************************************************************************** - * - * C-String Function Declarations - * - *****************************************************************************/ - -static oslFileError osl_psz_createDirectory(const sal_Char* pszPath); -static oslFileError osl_psz_removeDirectory(const sal_Char* pszPath); - -/******************************************************************* - * osl_openDirectory - ******************************************************************/ - -oslFileError SAL_CALL osl_openDirectory(rtl_uString* ustrDirectoryURL, oslDirectory* pDirectory) -{ - rtl_uString* ustrSystemPath = NULL; - oslFileError eRet; - - char path[PATH_MAX]; - - if ((0 == ustrDirectoryURL) || (0 == ustrDirectoryURL->length) || (0 == pDirectory)) - return osl_File_E_INVAL; - - /* convert file URL to system path */ - eRet = osl_getSystemPathFromFileURL_Ex(ustrDirectoryURL, &ustrSystemPath, sal_False); - - if( osl_File_E_None != eRet ) - return eRet; - - osl_systemPathRemoveSeparator(ustrSystemPath); - - /* convert unicode path to text */ - if ( UnicodeToText( path, PATH_MAX, ustrSystemPath->buffer, ustrSystemPath->length ) -#ifdef MACOSX - && macxp_resolveAlias( path, PATH_MAX ) == 0 -#endif /* MACOSX */ - ) - { - /* open directory */ - DIR *pdir = opendir( path ); - - if( pdir ) - { - /* create and initialize impl structure */ - oslDirectoryImpl* pDirImpl = (oslDirectoryImpl*) rtl_allocateMemory( sizeof(oslDirectoryImpl) ); - - if( pDirImpl ) - { - pDirImpl->pDirStruct = pdir; - pDirImpl->ustrPath = ustrSystemPath; - - *pDirectory = (oslDirectory) pDirImpl; - return osl_File_E_None; - } - else - { - errno = ENOMEM; - closedir( pdir ); - } - } - else - { -#ifdef DEBUG_OSL_FILE - perror ("osl_openDirectory"); fprintf (stderr, path); -#endif - } - } - - rtl_uString_release( ustrSystemPath ); - - return oslTranslateFileError(OSL_FET_ERROR, errno); -} - -/****************************************************************************/ -/* osl_closeDirectory */ -/****************************************************************************/ - -oslFileError SAL_CALL osl_closeDirectory( oslDirectory Directory ) -{ - oslDirectoryImpl* pDirImpl = (oslDirectoryImpl*) Directory; - oslFileError err = osl_File_E_None; - - OSL_ASSERT( Directory ); - - if( NULL == pDirImpl ) - return osl_File_E_INVAL; - - /* close directory */ - if( closedir( pDirImpl->pDirStruct ) ) - { - err = oslTranslateFileError(OSL_FET_ERROR, errno); - } - - /* cleanup members */ - rtl_uString_release( pDirImpl->ustrPath ); - - rtl_freeMemory( pDirImpl ); - - return err; -} - -/********************************************** - * osl_readdir_impl_ - * - * readdir wrapper, filters out "." and ".." - * on request - *********************************************/ - -static struct dirent* osl_readdir_impl_(DIR* pdir, sal_Bool bFilterLocalAndParentDir) -{ - struct dirent* pdirent; - - while ((pdirent = readdir(pdir)) != NULL) - { - if (bFilterLocalAndParentDir && - ((0 == strcmp(pdirent->d_name, ".")) || (0 == strcmp(pdirent->d_name, "..")))) - continue; - else - break; - } - - return pdirent; -} - -/**************************************************************************** - * osl_getNextDirectoryItem - ***************************************************************************/ - -oslFileError SAL_CALL osl_getNextDirectoryItem(oslDirectory Directory, oslDirectoryItem* pItem, sal_uInt32 /*uHint*/) -{ - oslDirectoryImpl* pDirImpl = (oslDirectoryImpl*)Directory; - rtl_uString* ustrFileName = NULL; - rtl_uString* ustrFilePath = NULL; - struct dirent* pEntry; - - OSL_ASSERT(Directory); - OSL_ASSERT(pItem); - - if ((NULL == Directory) || (NULL == pItem)) - return osl_File_E_INVAL; - - pEntry = osl_readdir_impl_(pDirImpl->pDirStruct, sal_True); - - if (NULL == pEntry) - return osl_File_E_NOENT; - - -#if defined(MACOSX) - - // convert decomposed filename to precomposed unicode - char composed_name[BUFSIZ]; - CFMutableStringRef strRef = CFStringCreateMutable (NULL, 0 ); - CFStringAppendCString( strRef, pEntry->d_name, kCFStringEncodingUTF8 ); //UTF8 is default on Mac OSX - CFStringNormalize( strRef, kCFStringNormalizationFormC ); - CFStringGetCString( strRef, composed_name, BUFSIZ, kCFStringEncodingUTF8 ); - CFRelease( strRef ); - rtl_string2UString( &ustrFileName, composed_name, strlen( composed_name), - osl_getThreadTextEncoding(), OSTRING_TO_OUSTRING_CVTFLAGS ); - -#else // not MACOSX - /* convert file name to unicode */ - rtl_string2UString( &ustrFileName, pEntry->d_name, strlen( pEntry->d_name ), - osl_getThreadTextEncoding(), OSTRING_TO_OUSTRING_CVTFLAGS ); - OSL_ASSERT(ustrFileName != 0); - -#endif - - osl_systemPathMakeAbsolutePath(pDirImpl->ustrPath, ustrFileName, &ustrFilePath); - rtl_uString_release( ustrFileName ); - - DirectoryItem_Impl * pImpl = static_cast< DirectoryItem_Impl* >(*pItem); - if (0 != pImpl) - { - pImpl->release(), pImpl = 0; - } -#ifdef _DIRENT_HAVE_D_TYPE - pImpl = new DirectoryItem_Impl(ustrFilePath, pEntry->d_type); -#else - pImpl = new DirectoryItem_Impl(ustrFilePath); -#endif /* _DIRENT_HAVE_D_TYPE */ - *pItem = pImpl; - rtl_uString_release( ustrFilePath ); - - return osl_File_E_None; -} - -/****************************************************************************/ -/* osl_getDirectoryItem */ -/****************************************************************************/ - -oslFileError SAL_CALL osl_getDirectoryItem( rtl_uString* ustrFileURL, oslDirectoryItem* pItem ) -{ - rtl_uString* ustrSystemPath = NULL; - oslFileError osl_error = osl_File_E_INVAL; - - OSL_ASSERT((0 != ustrFileURL) && (0 != pItem)); - if ((0 == ustrFileURL) || (0 == ustrFileURL->length) || (0 == pItem)) - return osl_File_E_INVAL; - - osl_error = osl_getSystemPathFromFileURL_Ex(ustrFileURL, &ustrSystemPath, sal_False); - if (osl_File_E_None != osl_error) - return osl_error; - - osl_systemPathRemoveSeparator(ustrSystemPath); - - if (-1 == access_u(ustrSystemPath, F_OK)) - { - osl_error = oslTranslateFileError(OSL_FET_ERROR, errno); - } - else - { - *pItem = new DirectoryItem_Impl(ustrSystemPath); - } - rtl_uString_release(ustrSystemPath); - - return osl_error; -} - - -/****************************************************************************/ -/* osl_acquireDirectoryItem */ -/****************************************************************************/ - -oslFileError SAL_CALL osl_acquireDirectoryItem( oslDirectoryItem Item ) -{ - DirectoryItem_Impl * pImpl = static_cast< DirectoryItem_Impl* >(Item); - if (0 == pImpl) - return osl_File_E_INVAL; - - pImpl->acquire(); - return osl_File_E_None; -} - -/****************************************************************************/ -/* osl_releaseDirectoryItem */ -/****************************************************************************/ - -oslFileError SAL_CALL osl_releaseDirectoryItem( oslDirectoryItem Item ) -{ - DirectoryItem_Impl * pImpl = static_cast< DirectoryItem_Impl* >(Item); - if (0 == pImpl) - return osl_File_E_INVAL; - - pImpl->release(); - return osl_File_E_None; -} - -/****************************************************************************/ -/* osl_createDirectory */ -/****************************************************************************/ - -oslFileError SAL_CALL osl_createDirectory( rtl_uString* ustrDirectoryURL ) -{ - char path[PATH_MAX]; - oslFileError eRet; - - OSL_ASSERT( ustrDirectoryURL ); - - /* convert directory url to system path */ - eRet = FileURLToPath( path, PATH_MAX, ustrDirectoryURL ); - if( eRet != osl_File_E_None ) - return eRet; - -#ifdef MACOSX - if ( macxp_resolveAlias( path, PATH_MAX ) != 0 ) - return oslTranslateFileError( OSL_FET_ERROR, errno ); -#endif/* MACOSX */ - - return osl_psz_createDirectory( path ); -} - -/****************************************************************************/ -/* osl_removeDirectory */ -/****************************************************************************/ - -oslFileError SAL_CALL osl_removeDirectory( rtl_uString* ustrDirectoryURL ) -{ - char path[PATH_MAX]; - oslFileError eRet; - - OSL_ASSERT( ustrDirectoryURL ); - - /* convert directory url to system path */ - eRet = FileURLToPath( path, PATH_MAX, ustrDirectoryURL ); - if( eRet != osl_File_E_None ) - return eRet; - -#ifdef MACOSX - if ( macxp_resolveAlias( path, PATH_MAX ) != 0 ) - return oslTranslateFileError( OSL_FET_ERROR, errno ); -#endif/* MACOSX */ - - return osl_psz_removeDirectory( path ); -} - -/***************************************** - * osl_psz_createDirectory - ****************************************/ - -static oslFileError osl_psz_createDirectory( const sal_Char* pszPath ) -{ - int nRet=0; - int mode = S_IRWXU | S_IRWXG | S_IRWXO; - - nRet = mkdir(pszPath,mode); - - if ( nRet < 0 ) - { - nRet=errno; - return oslTranslateFileError(OSL_FET_ERROR, nRet); - } - - return osl_File_E_None; -} - -/***************************************** - * osl_psz_removeDirectory - ****************************************/ - -static oslFileError osl_psz_removeDirectory( const sal_Char* pszPath ) -{ - int nRet=0; - - nRet = rmdir(pszPath); - - if ( nRet < 0 ) - { - nRet=errno; - return oslTranslateFileError(OSL_FET_ERROR, nRet); - } - - return osl_File_E_None; -} - -/****************************************************************************/ -/* osl_createDirectoryPath */ -/****************************************************************************/ - -static int path_make_parent(sal_Unicode* path) -{ - int i = rtl_ustr_lastIndexOfChar(path, '/'); - - if (i > 0) - { - *(path + i) = 0; - return i; - } - else - return 0; -} - -static int create_dir_with_callback( - sal_Unicode* directory_path, - oslDirectoryCreationCallbackFunc aDirectoryCreationCallbackFunc, - void* pData) -{ - int mode = S_IRWXU | S_IRWXG | S_IRWXO; - - if (osl::mkdir(directory_path, mode) == 0) - { - if (aDirectoryCreationCallbackFunc) - { - rtl::OUString url; - osl::FileBase::getFileURLFromSystemPath(directory_path, url); - aDirectoryCreationCallbackFunc(pData, url.pData); - } - return 0; - } - return errno; -} - -static oslFileError create_dir_recursively_( - sal_Unicode* dir_path, - oslDirectoryCreationCallbackFunc aDirectoryCreationCallbackFunc, - void* pData) -{ - OSL_PRECOND((rtl_ustr_getLength(dir_path) > 0) && ((dir_path + (rtl_ustr_getLength(dir_path) - 1)) != (dir_path + rtl_ustr_lastIndexOfChar(dir_path, '/'))), \ - "Path must not end with a slash"); - - int native_err = create_dir_with_callback( - dir_path, aDirectoryCreationCallbackFunc, pData); - - if (native_err == 0) - return osl_File_E_None; - - if (native_err != ENOENT) - return oslTranslateFileError(OSL_FET_ERROR, native_err); - - // we step back until '/a_dir' at maximum because - // we should get an error unequal ENOENT when - // we try to create 'a_dir' at '/' and would so - // return before - int pos = path_make_parent(dir_path); - - oslFileError osl_error = create_dir_recursively_( - dir_path, aDirectoryCreationCallbackFunc, pData); - - if (osl_File_E_None != osl_error) - return osl_error; - - dir_path[pos] = '/'; - - return create_dir_recursively_(dir_path, aDirectoryCreationCallbackFunc, pData); -} - -oslFileError SAL_CALL osl_createDirectoryPath( - rtl_uString* aDirectoryUrl, - oslDirectoryCreationCallbackFunc aDirectoryCreationCallbackFunc, - void* pData) -{ - if (aDirectoryUrl == NULL) - return osl_File_E_INVAL; - - rtl::OUString sys_path; - oslFileError osl_error = osl_getSystemPathFromFileURL_Ex( - aDirectoryUrl, &sys_path.pData, sal_False); - - if (osl_error != osl_File_E_None) - return osl_error; - - osl::systemPathRemoveSeparator(sys_path); - - // const_cast because sys_path is a local copy which we want to modify inplace instead of - // coyp it into another buffer on the heap again - return create_dir_recursively_(sys_path.pData->buffer, aDirectoryCreationCallbackFunc, pData); -} - -/****************************************************************************** - * - * C-String Function Declarations - * - *****************************************************************************/ - -static oslFileError osl_psz_removeFile(const sal_Char* pszPath); -static oslFileError osl_psz_copyFile(const sal_Char* pszPath, const sal_Char* pszDestPath); -static oslFileError osl_psz_moveFile(const sal_Char* pszPath, const sal_Char* pszDestPath); - - -/****************************************************************************** - * - * Static Module Utility Function Declarations - * - *****************************************************************************/ - -static oslFileError oslDoCopy(const sal_Char* pszSourceFileName, const sal_Char* pszDestFileName, mode_t nMode, size_t nSourceSize, int DestFileExists); -static oslFileError oslChangeFileModes(const sal_Char* pszFileName, mode_t nMode, time_t nAcTime, time_t nModTime, uid_t nUID, gid_t nGID); -static int oslDoCopyLink(const sal_Char* pszSourceFileName, const sal_Char* pszDestFileName); -static int oslDoCopyFile(const sal_Char* pszSourceFileName, const sal_Char* pszDestFileName, size_t nSourceSize, mode_t mode); -static oslFileError oslDoMoveFile(const sal_Char* pszPath, const sal_Char* pszDestPath); - -/****************************************************************************/ -/* osl_moveFile */ -/****************************************************************************/ - -oslFileError SAL_CALL osl_moveFile( rtl_uString* ustrFileURL, rtl_uString* ustrDestURL ) -{ - char srcPath[PATH_MAX]; - char destPath[PATH_MAX]; - oslFileError eRet; - - OSL_ASSERT( ustrFileURL ); - OSL_ASSERT( ustrDestURL ); - - /* convert source url to system path */ - eRet = FileURLToPath( srcPath, PATH_MAX, ustrFileURL ); - if( eRet != osl_File_E_None ) - return eRet; - - /* convert destination url to system path */ - eRet = FileURLToPath( destPath, PATH_MAX, ustrDestURL ); - if( eRet != osl_File_E_None ) - return eRet; - -#ifdef MACOSX - if ( macxp_resolveAlias( srcPath, PATH_MAX ) != 0 || macxp_resolveAlias( destPath, PATH_MAX ) != 0 ) - return oslTranslateFileError( OSL_FET_ERROR, errno ); -#endif/* MACOSX */ - - return oslDoMoveFile( srcPath, destPath ); -} - -/****************************************************************************/ -/* osl_copyFile */ -/****************************************************************************/ - -oslFileError SAL_CALL osl_copyFile( rtl_uString* ustrFileURL, rtl_uString* ustrDestURL ) -{ - char srcPath[PATH_MAX]; - char destPath[PATH_MAX]; - oslFileError eRet; - - OSL_ASSERT( ustrFileURL ); - OSL_ASSERT( ustrDestURL ); - - /* convert source url to system path */ - eRet = FileURLToPath( srcPath, PATH_MAX, ustrFileURL ); - if( eRet != osl_File_E_None ) - return eRet; - - /* convert destination url to system path */ - eRet = FileURLToPath( destPath, PATH_MAX, ustrDestURL ); - if( eRet != osl_File_E_None ) - return eRet; - -#ifdef MACOSX - if ( macxp_resolveAlias( srcPath, PATH_MAX ) != 0 || macxp_resolveAlias( destPath, PATH_MAX ) != 0 ) - return oslTranslateFileError( OSL_FET_ERROR, errno ); -#endif/* MACOSX */ - - return osl_psz_copyFile( srcPath, destPath ); -} - -/****************************************************************************/ -/* osl_removeFile */ -/****************************************************************************/ - -oslFileError SAL_CALL osl_removeFile( rtl_uString* ustrFileURL ) -{ - char path[PATH_MAX]; - oslFileError eRet; - - OSL_ASSERT( ustrFileURL ); - - /* convert file url to system path */ - eRet = FileURLToPath( path, PATH_MAX, ustrFileURL ); - if( eRet != osl_File_E_None ) - return eRet; - -#ifdef MACOSX - if ( macxp_resolveAlias( path, PATH_MAX ) != 0 ) - return oslTranslateFileError( OSL_FET_ERROR, errno ); -#endif/* MACOSX */ - - return osl_psz_removeFile( path ); -} - -/****************************************************************************** - * - * Utility Functions - * - *****************************************************************************/ - -/***************************************** - * oslDoMoveFile - ****************************************/ - -static oslFileError oslDoMoveFile( const sal_Char* pszPath, const sal_Char* pszDestPath) -{ - oslFileError tErr=osl_File_E_invalidError; - - tErr = osl_psz_moveFile(pszPath,pszDestPath); - if ( tErr == osl_File_E_None ) - { - return tErr; - } - - if ( tErr != osl_File_E_XDEV ) - { - return tErr; - } - - tErr=osl_psz_copyFile(pszPath,pszDestPath); - - if ( tErr != osl_File_E_None ) - { - osl_psz_removeFile(pszDestPath); - return tErr; - } - - tErr=osl_psz_removeFile(pszPath); - - return tErr; -} - -/***************************************** - * osl_psz_removeFile - ****************************************/ -static oslFileError osl_psz_removeFile( const sal_Char* pszPath ) -{ - int nRet=0; - struct stat aStat; - - nRet = lstat(pszPath,&aStat); - if ( nRet < 0 ) - { - nRet=errno; - return oslTranslateFileError(OSL_FET_ERROR, nRet); - } - - if ( S_ISDIR(aStat.st_mode) ) - { - return osl_File_E_ISDIR; - } - - nRet = unlink(pszPath); - if ( nRet < 0 ) - { - nRet=errno; - return oslTranslateFileError(OSL_FET_ERROR, nRet); - } - - return osl_File_E_None; -} - -/***************************************** - * osl_psz_moveFile - ****************************************/ - -static oslFileError osl_psz_moveFile(const sal_Char* pszPath, const sal_Char* pszDestPath) -{ - - int nRet = 0; - - nRet = rename(pszPath,pszDestPath); - - if ( nRet < 0 ) - { - nRet=errno; - return oslTranslateFileError(OSL_FET_ERROR, nRet); - } - - return osl_File_E_None; -} - -/***************************************** - * osl_psz_copyFile - ****************************************/ - -static oslFileError osl_psz_copyFile( const sal_Char* pszPath, const sal_Char* pszDestPath ) -{ - time_t nAcTime=0; - time_t nModTime=0; - uid_t nUID=0; - gid_t nGID=0; - int nRet=0; - mode_t nMode=0; - struct stat aFileStat; - oslFileError tErr=osl_File_E_invalidError; - size_t nSourceSize=0; - int DestFileExists=1; - - /* mfe: does the source file really exists? */ - nRet = lstat(pszPath,&aFileStat); - - if ( nRet < 0 ) - { - nRet=errno; - return oslTranslateFileError(OSL_FET_ERROR, nRet); - } - - /* mfe: we do only copy files here! */ - if ( S_ISDIR(aFileStat.st_mode) ) - { - return osl_File_E_ISDIR; - } - - nSourceSize=(size_t)aFileStat.st_size; - nMode=aFileStat.st_mode; - nAcTime=aFileStat.st_atime; - nModTime=aFileStat.st_mtime; - nUID=aFileStat.st_uid; - nGID=aFileStat.st_gid; - - nRet = stat(pszDestPath,&aFileStat); - if ( nRet < 0 ) - { - nRet=errno; - - if ( nRet == ENOENT ) - { - DestFileExists=0; - } -/* return oslTranslateFileError(nRet);*/ - } - - /* mfe: the destination file must not be a directory! */ - if ( nRet == 0 && S_ISDIR(aFileStat.st_mode) ) - { - return osl_File_E_ISDIR; - } - else - { - /* mfe: file does not exists or is no dir */ - } - - tErr = oslDoCopy(pszPath,pszDestPath,nMode,nSourceSize,DestFileExists); - - if ( tErr != osl_File_E_None ) - { - return tErr; - } - - /* - * mfe: ignore return code - * since only the success of the copy is - * important - */ - oslChangeFileModes(pszDestPath,nMode,nAcTime,nModTime,nUID,nGID); - - return tErr; -} - - -/****************************************************************************** - * - * Utility Functions - * - *****************************************************************************/ - -/***************************************** - * oslDoCopy - ****************************************/ - -#define TMP_DEST_FILE_EXTENSION ".osl-tmp" - -static oslFileError oslDoCopy(const sal_Char* pszSourceFileName, const sal_Char* pszDestFileName, mode_t nMode, size_t nSourceSize, int DestFileExists) -{ - int nRet=0; - sal_Char pszTmpDestFile[PATH_MAX]; - size_t size_tmp_dest_buff = sizeof(pszTmpDestFile); - - /* Quick fix for #106048, the whole copy file function seems - to be erroneous anyway and needs to be rewritten. - Besides osl_copyFile is currently not used from OO/SO code. - */ - memset(pszTmpDestFile, 0, size_tmp_dest_buff); - - if ( DestFileExists ) - { - strncpy(pszTmpDestFile, pszDestFileName, size_tmp_dest_buff - 1); - - if ((strlen(pszTmpDestFile) + strlen(TMP_DEST_FILE_EXTENSION)) >= size_tmp_dest_buff) - return osl_File_E_NAMETOOLONG; - - strncat(pszTmpDestFile, TMP_DEST_FILE_EXTENSION, strlen(TMP_DEST_FILE_EXTENSION)); - - /* FIXME: what if pszTmpDestFile already exists? */ - /* with getcanonical??? */ - nRet=rename(pszDestFileName,pszTmpDestFile); - } - - /* mfe: should be S_ISREG */ - if ( !S_ISLNK(nMode) ) - { - /* copy SourceFile to DestFile */ - nRet = oslDoCopyFile(pszSourceFileName,pszDestFileName,nSourceSize, nMode); - } - /* mfe: OK redundant at the moment */ - else if ( S_ISLNK(nMode) ) - { - nRet = oslDoCopyLink(pszSourceFileName,pszDestFileName); - } - else - { - /* mfe: what to do here? */ - nRet=ENOSYS; - } - - if ( nRet > 0 && DestFileExists == 1 ) - { - unlink(pszDestFileName); - rename(pszTmpDestFile,pszDestFileName); - } - - if ( nRet > 0 ) - { - return oslTranslateFileError(OSL_FET_ERROR, nRet); - } - - if ( DestFileExists == 1 ) - { - unlink(pszTmpDestFile); - } - - return osl_File_E_None; -} - -/***************************************** - * oslChangeFileModes - ****************************************/ - -static oslFileError oslChangeFileModes( const sal_Char* pszFileName, mode_t nMode, time_t nAcTime, time_t nModTime, uid_t nUID, gid_t nGID) -{ - int nRet=0; - struct utimbuf aTimeBuffer; - - nRet = chmod(pszFileName,nMode); - if ( nRet < 0 ) - { - nRet=errno; - return oslTranslateFileError(OSL_FET_ERROR, nRet); - } - - aTimeBuffer.actime=nAcTime; - aTimeBuffer.modtime=nModTime; - nRet=utime(pszFileName,&aTimeBuffer); - if ( nRet < 0 ) - { - nRet=errno; - return oslTranslateFileError(OSL_FET_ERROR, nRet); - } - - if ( nUID != getuid() ) - { - nUID=getuid(); - } - - nRet=chown(pszFileName,nUID,nGID); - if ( nRet < 0 ) - { - nRet=errno; - - /* mfe: do not return an error here! */ - /* return oslTranslateFileError(nRet);*/ - } - - return osl_File_E_None; -} - -/***************************************** - * oslDoCopyLink - ****************************************/ - -static int oslDoCopyLink(const sal_Char* pszSourceFileName, const sal_Char* pszDestFileName) -{ - int nRet=0; - - /* mfe: if dest file is symbolic link remove the link and place the file instead (hro says so) */ - /* mfe: if source is a link copy the link and not the file it points to (hro says so) */ - sal_Char pszLinkContent[PATH_MAX]; - - pszLinkContent[0] = '\0'; - - nRet = readlink(pszSourceFileName,pszLinkContent,PATH_MAX); - - if ( nRet < 0 ) - { - nRet=errno; - return nRet; - } - else - pszLinkContent[ nRet ] = 0; - - nRet = symlink(pszLinkContent,pszDestFileName); - - if ( nRet < 0 ) - { - nRet=errno; - return nRet; - } - - return 0; -} - -/***************************************** - * oslDoCopyFile - ****************************************/ - -static int oslDoCopyFile(const sal_Char* pszSourceFileName, const sal_Char* pszDestFileName, size_t nSourceSize, mode_t mode) -{ - int SourceFileFD=0; - int DestFileFD=0; - int nRet=0; - - SourceFileFD=open(pszSourceFileName,O_RDONLY); - if ( SourceFileFD < 0 ) - { - nRet=errno; - return nRet; - } - - DestFileFD=open(pszDestFileName, O_WRONLY | O_CREAT, mode); - - if ( DestFileFD < 0 ) - { - nRet=errno; - close(SourceFileFD); - return nRet; - } - - size_t nRemains = nSourceSize; - - if ( nRemains ) - { - /* mmap has problems, try the direct streaming */ - char pBuffer[0x7FFF]; - - do - { - size_t nToRead = std::min( sizeof(pBuffer), nRemains ); - sal_Bool succeeded = safeRead( SourceFileFD, pBuffer, nToRead ); - if ( !succeeded ) - break; - - succeeded = safeWrite( DestFileFD, pBuffer, nToRead ); - if ( !succeeded ) - break; - - nRemains -= nToRead; - } - while( nRemains ); - } - - if ( nRemains ) - { - if ( errno ) - nRet = errno; - else - nRet = ENOSPC; - } - - close( SourceFileFD ); - if ( close( DestFileFD ) == -1 && nRet == 0 ) - nRet = errno; - - return nRet; -} - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sal/osl/unx/file_path_helper.cxx b/sal/osl/unx/file_path_helper.cxx deleted file mode 100644 index 578b205a6..000000000 --- a/sal/osl/unx/file_path_helper.cxx +++ /dev/null @@ -1,351 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2000, 2010 Oracle and/or its affiliates. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * <http://www.openoffice.org/license.html> - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -// MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_sal.hxx" - - /******************************************* - Includes - ******************************************/ - - #ifndef _OSL_FILE_PATH_HELPER_H_ - #include "file_path_helper.h" - #endif - - #ifndef _OSL_FILE_PATH_HELPER_HXX_ - #include "file_path_helper.hxx" - #endif - - #ifndef _OSL_UUNXAPI_HXX_ - #include "uunxapi.hxx" - #endif - - #ifndef _OSL_DIAGNOSE_H_ - #include <osl/diagnose.h> - #endif - - #ifndef _RTL_USTRING_HXX_ - #include <rtl/ustring.hxx> - #endif - - /******************************************* - Constants - ******************************************/ - - const sal_Unicode FPH_CHAR_PATH_SEPARATOR = (sal_Unicode)'/'; - const sal_Unicode FPH_CHAR_DOT = (sal_Unicode)'.'; - const sal_Unicode FPH_CHAR_COLON = (sal_Unicode)':'; - - inline const rtl::OUString FPH_PATH_SEPARATOR() - { return rtl::OUString(FPH_CHAR_PATH_SEPARATOR); } - inline const rtl::OUString FPH_LOCAL_DIR_ENTRY() - { return rtl::OUString(FPH_CHAR_PATH_SEPARATOR); } - inline const rtl::OUString FPH_PARENT_DIR_ENTRY() - { return rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("..")); } - - /******************************************* - * osl_systemPathRemoveSeparator - ******************************************/ - - void SAL_CALL osl_systemPathRemoveSeparator(rtl_uString* pustrPath) - { - OSL_PRECOND(0 != pustrPath, "osl_systemPathRemoveSeparator: Invalid parameter"); - if (0 != pustrPath) - { - // maybe there are more than one separator at end - // so we run in a loop - while ((pustrPath->length > 1) && (FPH_CHAR_PATH_SEPARATOR == pustrPath->buffer[pustrPath->length - 1])) - { - pustrPath->length--; - pustrPath->buffer[pustrPath->length] = (sal_Unicode)'\0'; - } - - OSL_POSTCOND((0 == pustrPath->length) || (1 == pustrPath->length) || \ - (pustrPath->length > 1 && pustrPath->buffer[pustrPath->length - 1] != FPH_CHAR_PATH_SEPARATOR), \ - "osl_systemPathRemoveSeparator: Post condition failed"); - } - } - - /******************************************* - osl_systemPathEnsureSeparator - ******************************************/ - - void SAL_CALL osl_systemPathEnsureSeparator(rtl_uString** ppustrPath) - { - OSL_PRECOND((0 != ppustrPath) && (0 != *ppustrPath), "osl_systemPathEnsureSeparator: Invalid parameter"); - if ((0 != ppustrPath) && (0 != *ppustrPath)) - { - rtl::OUString path(*ppustrPath); - sal_Int32 lp = path.getLength(); - sal_Int32 i = path.lastIndexOf(FPH_CHAR_PATH_SEPARATOR); - - if ((lp > 1 && i != (lp - 1)) || ((lp < 2) && i < 0)) - { - path += FPH_PATH_SEPARATOR(); - rtl_uString_assign(ppustrPath, path.pData); - } - - OSL_POSTCOND(path.lastIndexOf(FPH_CHAR_PATH_SEPARATOR) == (path.getLength() - 1), \ - "osl_systemPathEnsureSeparator: Post condition failed"); - } - } - - /******************************************* - * osl_systemPathIsRelativePath - ******************************************/ - - sal_Bool SAL_CALL osl_systemPathIsRelativePath(const rtl_uString* pustrPath) - { - OSL_PRECOND(0 != pustrPath, "osl_systemPathIsRelativePath: Invalid parameter"); - return ((0 == pustrPath) || (0 == pustrPath->length) || (pustrPath->buffer[0] != FPH_CHAR_PATH_SEPARATOR)); - } - - /****************************************** - osl_systemPathMakeAbsolutePath - *****************************************/ - - void SAL_CALL osl_systemPathMakeAbsolutePath( - const rtl_uString* pustrBasePath, - const rtl_uString* pustrRelPath, - rtl_uString** ppustrAbsolutePath) -{ - rtl::OUString base(rtl_uString_getStr(const_cast<rtl_uString*>(pustrBasePath))); - rtl::OUString rel(const_cast<rtl_uString*>(pustrRelPath)); - - if (base.getLength() > 0) - osl_systemPathEnsureSeparator(&base.pData); - - base += rel; - - rtl_uString_acquire(base.pData); - *ppustrAbsolutePath = base.pData; -} - - - /******************************************* - osl_systemPathGetFileOrLastDirectoryPart - ******************************************/ - - void SAL_CALL osl_systemPathGetFileNameOrLastDirectoryPart( - const rtl_uString* pustrPath, - rtl_uString** ppustrFileNameOrLastDirPart) -{ - OSL_PRECOND(pustrPath && ppustrFileNameOrLastDirPart, \ - "osl_systemPathGetFileNameOrLastDirectoryPart: Invalid parameter"); - - rtl::OUString path(const_cast<rtl_uString*>(pustrPath)); - - osl_systemPathRemoveSeparator(path.pData); - - rtl::OUString last_part; - - if (path.getLength() > 1 || (1 == path.getLength() && *path.getStr() != FPH_CHAR_PATH_SEPARATOR)) - { - sal_Int32 idx_ps = path.lastIndexOf(FPH_CHAR_PATH_SEPARATOR); - idx_ps++; // always right to increment by one even if idx_ps == -1! - last_part = rtl::OUString(path.getStr() + idx_ps); - } - rtl_uString_assign(ppustrFileNameOrLastDirPart, last_part.pData); -} - - - /******************************************** - osl_systemPathIsHiddenFileOrDirectoryEntry - *********************************************/ - - sal_Bool SAL_CALL osl_systemPathIsHiddenFileOrDirectoryEntry( - const rtl_uString* pustrPath) -{ - OSL_PRECOND(0 != pustrPath, "osl_systemPathIsHiddenFileOrDirectoryEntry: Invalid parameter"); - if ((0 == pustrPath) || (0 == pustrPath->length)) - return sal_False; - - rtl::OUString fdp; - osl_systemPathGetFileNameOrLastDirectoryPart(pustrPath, &fdp.pData); - - return ((fdp.pData->length > 0) && - (fdp.pData->buffer[0] == FPH_CHAR_DOT) && - !osl_systemPathIsLocalOrParentDirectoryEntry(fdp.pData)); -} - - - /************************************************ - osl_systemPathIsLocalOrParentDirectoryEntry - ************************************************/ - -sal_Bool SAL_CALL osl_systemPathIsLocalOrParentDirectoryEntry( - const rtl_uString* pustrPath) -{ - OSL_PRECOND(pustrPath, "osl_systemPathIsLocalOrParentDirectoryEntry: Invalid parameter"); - - rtl::OUString dirent; - - osl_systemPathGetFileNameOrLastDirectoryPart(pustrPath, &dirent.pData); - - return ( - (dirent == FPH_LOCAL_DIR_ENTRY()) || - (dirent == FPH_PARENT_DIR_ENTRY()) - ); -} - -/*********************************************** - Simple iterator for a path list separated by - the specified character - **********************************************/ - -class path_list_iterator -{ -public: - - /****************************************** - constructor - - after construction get_current_item - returns the first path in list, no need - to call reset first - *****************************************/ - path_list_iterator(const rtl::OUString& path_list, sal_Unicode list_separator = FPH_CHAR_COLON) : - m_path_list(path_list), - m_end(m_path_list.getStr() + m_path_list.getLength() + 1), - m_separator(list_separator) - { - reset(); - } - - /****************************************** - reset the iterator - *****************************************/ - void reset() - { - m_path_segment_begin = m_path_segment_end = m_path_list.getStr(); - advance(); - } - - /****************************************** - move the iterator to the next position - *****************************************/ - void next() - { - OSL_PRECOND(!done(), "path_list_iterator: Already done!"); - - m_path_segment_begin = ++m_path_segment_end; - advance(); - } - - /****************************************** - check if done - *****************************************/ - bool done() const - { - return (m_path_segment_end >= m_end); - } - - /****************************************** - return the current item - *****************************************/ - rtl::OUString get_current_item() const - { - return rtl::OUString( - m_path_segment_begin, - (m_path_segment_end - m_path_segment_begin)); - } - -private: - - /****************************************** - move m_path_end to the next separator or - to the edn of the string - *****************************************/ - void advance() - { - while (!done() && *m_path_segment_end && (*m_path_segment_end != m_separator)) - ++m_path_segment_end; - - OSL_ASSERT(m_path_segment_end <= m_end); - } - -private: - rtl::OUString m_path_list; - const sal_Unicode* m_end; - const sal_Unicode m_separator; - const sal_Unicode* m_path_segment_begin; - const sal_Unicode* m_path_segment_end; - -// prevent copy and assignment -private: - /****************************************** - copy constructor - remember: do not simply copy m_path_begin - and m_path_end because they point to - the memory of other.m_path_list! - *****************************************/ - path_list_iterator(const path_list_iterator& other); - - /****************************************** - assignment operator - remember: do not simply copy m_path_begin - and m_path_end because they point to - the memory of other.m_path_list! - *****************************************/ - path_list_iterator& operator=(const path_list_iterator& other); -}; - - /************************************************ - osl_searchPath - ***********************************************/ - -sal_Bool SAL_CALL osl_searchPath( - const rtl_uString* pustrFilePath, - const rtl_uString* pustrSearchPathList, - rtl_uString** ppustrPathFound) -{ - OSL_PRECOND(pustrFilePath && pustrSearchPathList && ppustrPathFound, "osl_searchPath: Invalid parameter"); - - bool bfound = false; - rtl::OUString fp(const_cast<rtl_uString*>(pustrFilePath)); - rtl::OUString pl = rtl::OUString(const_cast<rtl_uString*>(pustrSearchPathList)); - path_list_iterator pli(pl); - - while (!pli.done()) - { - rtl::OUString p = pli.get_current_item(); - osl::systemPathEnsureSeparator(p); - p += fp; - - if (osl::access(p, F_OK) > -1) - { - bfound = true; - rtl_uString_assign(ppustrPathFound, p.pData); - break; - } - pli.next(); - } - return bfound; -} - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sal/osl/unx/file_path_helper.h b/sal/osl/unx/file_path_helper.h deleted file mode 100644 index 9ccadfd6c..000000000 --- a/sal/osl/unx/file_path_helper.h +++ /dev/null @@ -1,250 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2000, 2010 Oracle and/or its affiliates. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * <http://www.openoffice.org/license.html> - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - - #ifndef _OSL_FILE_PATH_HELPER_H_ - #define _OSL_FILE_PATH_HELPER_H_ - - - #ifndef _SAL_TYPES_H_ - #include <sal/types.h> - #endif - - #ifndef _RTL_USTRING_H_ - #include <rtl/ustring.h> - #endif - - - #ifdef __cplusplus - extern "C" - { - #endif - - - /******************************************* - osl_systemPathRemoveSeparator - Removes the last separator from the - given system path if any and if the path - is not the root path '/' - - @param ppustrPath [inout] a system path - if the path is not the root path - and the last character is a - path separator it will be cut off - ppustrPath must not be NULL and - must point to a valid rtl_uString - - @returns nothing - - ******************************************/ - - void SAL_CALL osl_systemPathRemoveSeparator( - /*inout*/ rtl_uString* pustrPath); - - /******************************************* - osl_systemPathEnsureSeparator - Adds a trailing path separator to the - given system path if not already there - and if the path is not the root path '/' - - @param pustrPath [inout] a system path - if the path is not the root path - '/' and has no trailing separator - a separator will be added - ppustrPath must not be NULL and - must point to a valid rtl_uString - - @returns nothing - - ******************************************/ - - void SAL_CALL osl_systemPathEnsureSeparator( - /*inout*/ rtl_uString** ppustrPath); - - /******************************************* - osl_systemPathIsRelativePath - Returns true if the given path is a - relative path and so starts not with '/' - - @param pustrPath [in] a system path - pustrPath must not be NULL - - @returns sal_True if the given path - doesn't start with a separator - else sal_False will be returned - - ******************************************/ - - sal_Bool SAL_CALL osl_systemPathIsRelativePath( - const rtl_uString* pustrPath); - - /****************************************** - osl_systemPathMakeAbsolutePath - Append a relative path to a base path - - @param pustrBasePath [in] a system - path that will be considered as - base path - pustrBasePath must not be NULL - - @param pustrRelPath [in] a system path - that will be considered as - relative path - pustrBasePath must not be NULL - - @param ppustrAbsolutePath [out] the - resulting path which is a - concatination of the base and - the relative path - if base path is empty the - resulting absolute path is the - relative path - if relative path is empty the - resulting absolute path is the - base path - if base and relative path are - empty the resulting absolute - path is also empty - ppustrAbsolutePath must not be - NULL and *ppustrAbsolutePath - must be 0 or point to a valid - rtl_uString - - *****************************************/ - - void SAL_CALL osl_systemPathMakeAbsolutePath( - const rtl_uString* pustrBasePath, - const rtl_uString* pustrRelPath, - rtl_uString** ppustrAbsolutePath); - - /***************************************** - osl_systemPathGetFileOrLastDirectoryPart - Returns the file or the directory part - of the given path - - @param pustrPath [in] a system path, - must not be NULL - - @param ppustrFileOrDirPart [out] on - return receives the last part - of the given directory or the - file name - if pustrPath is the root path - '/' an empty string will be - returned - if pustrPath has a trailing - '/' the last part before the - '/' will be returned else - the part after the last '/' - will be returned - - @returns nothing - - ****************************************/ - void SAL_CALL osl_systemPathGetFileNameOrLastDirectoryPart( - const rtl_uString* pustrPath, - rtl_uString** ppustrFileNameOrLastDirPart); - - - /******************************************** - osl_systemPathIsHiddenFileOrDirectoryEntry - Returns sal_True if the last part of - given system path is not '.' or '..' - alone and starts with a '.' - - @param pustrPath [in] a system path, - must not be NULL - - @returns sal_True if the last part of - the given system path starts - with '.' or sal_False the last - part is '.' or '..' alone or - doesn't start with a dot - - *********************************************/ - - sal_Bool SAL_CALL osl_systemPathIsHiddenFileOrDirectoryEntry( - const rtl_uString* pustrPath); - - - /************************************************ - osl_systemPathIsLocalOrParentDirectoryEntry - Returns sal_True if the last part of the given - system path is the local directory entry '.' - or the parent directory entry '..' - - @param pustrPath [in] a system path, - must not be NULL - - @returns sal_True if the last part of the - given system path is '.' or '..' - else sal_False - - ************************************************/ - - sal_Bool SAL_CALL osl_systemPathIsLocalOrParentDirectoryEntry( - const rtl_uString* pustrPath); - - - /************************************************ - osl_searchPath - Searches for a file name or path name in all - directories specified by a given path list. - Symbolic links in the resulting path will not be - resolved, it's up to the caller to do this. - - @param pustrFilePath [in] a file name or - directory name to search for, the name must - be provided as system path not as a file URL - - @param pustrSearchPathList [in] a ':' - separated list of paths in which to search for - the file or directory name - - @ppustrPathFound [out] on success receives the - complete path of the file or directory found - as a system path - - @returns sal_True if the specified file or - directory was found else sal_False - ***********************************************/ - - sal_Bool SAL_CALL osl_searchPath( - const rtl_uString* pustrFilePath, - const rtl_uString* pustrSearchPathList, - rtl_uString** ppustrPathFound); - - - #ifdef __cplusplus - } - #endif - - - #endif /* #ifndef _OSL_PATH_HELPER_H_ */ - - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sal/osl/unx/file_path_helper.hxx b/sal/osl/unx/file_path_helper.hxx deleted file mode 100644 index 07d501b48..000000000 --- a/sal/osl/unx/file_path_helper.hxx +++ /dev/null @@ -1,248 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2000, 2010 Oracle and/or its affiliates. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * <http://www.openoffice.org/license.html> - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -#ifndef _OSL_FILE_PATH_HELPER_HXX_ -#define _OSL_FILE_PATH_HELPER_HXX_ - - -#include "file_path_helper.h" - -#include <rtl/ustring.hxx> - - -namespace osl -{ - - /******************************************* - systemPathRemoveSeparator - Removes the last separator from the - given system path if any and if the path - is not the root path '/' - - @param ppustrPath [inout] a system path - if the path is not the root path - and the last character is a - path separator it will be cut off - ppustrPath must not be NULL and - must point to a valid rtl_uString - - @returns nothing - - ******************************************/ - - inline void systemPathRemoveSeparator(/*inout*/ rtl::OUString& Path) - { - osl_systemPathRemoveSeparator(Path.pData); - } - - /******************************************* - systemPathEnsureSeparator - Adds a trailing path separator to the - given system path if not already there - and if the path is not the root path '/' - - @param pustrPath [inout] a system path - if the path is not the root path - '/' and has no trailing separator - a separator will be added - ppustrPath must not be NULL and - must point to a valid rtl_uString - - @returns nothing - - ******************************************/ - - inline void systemPathEnsureSeparator(/*inout*/ rtl::OUString& Path) - { - osl_systemPathEnsureSeparator(&Path.pData); - } - - /******************************************* - systemPathIsRelativePath - Returns true if the given path is a - relative path and so starts not with '/' - - @param pustrPath [in] a system path - pustrPath must not be NULL - - @returns sal_True if the given path - doesn't start with a separator - else sal_False will be returned - - ******************************************/ - - inline bool systemPathIsRelativePath(const rtl::OUString& Path) - { - return osl_systemPathIsRelativePath(Path.pData); - } - - /****************************************** - systemPathMakeAbsolutePath - Append a relative path to a base path - - @param pustrBasePath [in] a system - path that will be considered as - base path - pustrBasePath must not be NULL - - @param pustrRelPath [in] a system path - that will be considered as - relative path - pustrBasePath must not be NULL - - @param ppustrAbsolutePath [out] the - resulting path which is a - concatination of the base and - the relative path - if base path is empty the - resulting absolute path is the - relative path - if relative path is empty the - resulting absolute path is the - base path - if base and relative path are - empty the resulting absolute - path is also empty - ppustrAbsolutePath must not be - NULL and *ppustrAbsolutePath - must be 0 or point to a valid - rtl_uString - - *****************************************/ - - inline void systemPathMakeAbsolutePath( - const rtl::OUString& BasePath, - const rtl::OUString& RelPath, - rtl::OUString& AbsolutePath) - { - osl_systemPathMakeAbsolutePath( - BasePath.pData, RelPath.pData, &AbsolutePath.pData); - } - - /***************************************** - systemPathGetFileOrLastDirectoryPart - Returns the file or the directory part - of the given path - - @param pustrPath [in] a system path, - must not be NULL - - @param ppustrFileOrDirPart [out] on - return receives the last part - of the given directory or the - file name - if pustrPath is the root path - '/' an empty string will be - returned - if pustrPath has a trailing - '/' the last part before the - '/' will be returned else - the part after the last '/' - will be returned - - @returns nothing - - ****************************************/ - - inline void systemPathGetFileNameOrLastDirectoryPart( - const rtl::OUString& Path, - rtl::OUString& FileNameOrLastDirPart) - { - osl_systemPathGetFileNameOrLastDirectoryPart( - Path.pData, &FileNameOrLastDirPart.pData); - } - - - /******************************************** - systemPathIsHiddenFileOrDirectoryEntry - Returns sal_True if the last part of - given system path is not '.' or '..' - alone and starts with a '.' - - @param pustrPath [in] a system path, - must not be NULL - - @returns sal_True if the last part of - the given system path starts - with '.' or sal_False the last - part is '.' or '..' alone or - doesn't start with a dot - - *********************************************/ - - inline bool systemPathIsHiddenFileOrDirectoryEntry( - const rtl::OUString& Path) - { - return osl_systemPathIsHiddenFileOrDirectoryEntry(Path.pData); - } - - - /************************************************ - systemPathIsLocalOrParentDirectoryEntry - Returns sal_True if the last part of the given - system path is the local directory entry '.' - or the parent directory entry '..' - - @param pustrPath [in] a system path, - must not be NULL - - @returns sal_True if the last part of the - given system path is '.' or '..' - else sal_False - - ************************************************/ - - inline bool systemPathIsLocalOrParentDirectoryEntry( - const rtl::OUString& Path) - { - return osl_systemPathIsLocalOrParentDirectoryEntry(Path.pData); - } - - /************************************************ - searchPath - ***********************************************/ - - inline bool searchPath( - const rtl::OUString& ustrFilePath, - const rtl::OUString& ustrSearchPathList, - rtl::OUString& ustrPathFound) - { - return osl_searchPath( - ustrFilePath.pData, - ustrSearchPathList.pData, - &ustrPathFound.pData); - } - - - } // namespace osl - - - #endif /* #ifndef _OSL_PATH_HELPER_HXX_ */ - - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sal/osl/unx/file_stat.cxx b/sal/osl/unx/file_stat.cxx deleted file mode 100644 index 95ecfc2e6..000000000 --- a/sal/osl/unx/file_stat.cxx +++ /dev/null @@ -1,495 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2000, 2010 Oracle and/or its affiliates. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * <http://www.openoffice.org/license.html> - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -// MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_sal.hxx" - -#include "osl/file.h" - -#include "system.h" -#include <sys/types.h> -#include <dirent.h> -#include <errno.h> -#include <limits.h> -#include <unistd.h> - -#include "file_impl.hxx" -#include "file_error_transl.h" -#include "file_path_helper.hxx" -#include "file_url.h" -#include "uunxapi.hxx" - -namespace /* private */ -{ - - inline void set_file_type(const struct stat& file_stat, oslFileStatus* pStat) - { - /* links to directories state also to be a directory */ - if (S_ISLNK(file_stat.st_mode)) - pStat->eType = osl_File_Type_Link; - else if (S_ISDIR(file_stat.st_mode)) - pStat->eType = osl_File_Type_Directory; - else if (S_ISREG(file_stat.st_mode)) - pStat->eType = osl_File_Type_Regular; - else if (S_ISFIFO(file_stat.st_mode)) - pStat->eType = osl_File_Type_Fifo; - else if (S_ISSOCK(file_stat.st_mode)) - pStat->eType = osl_File_Type_Socket; - else if (S_ISCHR(file_stat.st_mode) || S_ISBLK(file_stat.st_mode)) - pStat->eType = osl_File_Type_Special; - else - pStat->eType = osl_File_Type_Unknown; - - pStat->uValidFields |= osl_FileStatus_Mask_Type; - } - - inline void set_file_access_mask(const struct stat& file_stat, oslFileStatus* pStat) - { - // user permissions - if (S_IRUSR & file_stat.st_mode) - pStat->uAttributes |= osl_File_Attribute_OwnRead; - - if (S_IWUSR & file_stat.st_mode) - pStat->uAttributes |= osl_File_Attribute_OwnWrite; - - if (S_IXUSR & file_stat.st_mode) - pStat->uAttributes |= osl_File_Attribute_OwnExe; - - // group permissions - if (S_IRGRP & file_stat.st_mode) - pStat->uAttributes |= osl_File_Attribute_GrpRead; - - if (S_IWGRP & file_stat.st_mode) - pStat->uAttributes |= osl_File_Attribute_GrpWrite; - - if (S_IXGRP & file_stat.st_mode) - pStat->uAttributes |= osl_File_Attribute_GrpExe; - - // others permissions - if (S_IROTH & file_stat.st_mode) - pStat->uAttributes |= osl_File_Attribute_OthRead; - - if (S_IWOTH & file_stat.st_mode) - pStat->uAttributes |= osl_File_Attribute_OthWrite; - - if (S_IXOTH & file_stat.st_mode) - pStat->uAttributes |= osl_File_Attribute_OthExe; - - pStat->uValidFields |= osl_FileStatus_Mask_Attributes; - } - - inline void set_file_access_rights(const struct stat& file_stat, int S_IR, int S_IW, int S_IX, oslFileStatus* pStat) - { - /* we cannot really map osl_File_Attribute_ReadOnly to - the Unix access rights, it's a Windows only flag - that's why the following hack. We set osl_FileStatus_Mask_Attributes - but if there is no read access for a file we clear the flag - again to signal to the caller that there are no file attributes - to read because that's better than to give them incorrect one. - */ - pStat->uValidFields |= osl_FileStatus_Mask_Attributes; - - if ((0 == (S_IW & file_stat.st_mode)) && (S_IR & file_stat.st_mode)) - pStat->uAttributes |= osl_File_Attribute_ReadOnly; - - if (S_IX & file_stat.st_mode) - pStat->uAttributes |= osl_File_Attribute_Executable; - } - - /* a process may belong to up to NGROUPS_MAX groups, so when - checking group access rights, we have to check all belonging - groups */ - inline bool is_in_process_grouplist(const gid_t file_group) - { - // check primary process group - - if (getgid() == file_group) - return true; - - // check supplementary process groups - - gid_t grplist[NGROUPS_MAX]; - int grp_number = getgroups(NGROUPS_MAX, grplist); - - for (int i = 0; i < grp_number; i++) - { - if (grplist[i] == file_group) - return true; - } - return false; - } - - /* Currently we are determining the file access right based - on the real user ID not the effective user ID! - We don't use access(...) because access follows links which - may cause performance problems see #97133. - */ - inline void set_file_access_rights(const struct stat& file_stat, oslFileStatus* pStat) - { - if (getuid() == file_stat.st_uid) - { - set_file_access_rights(file_stat, S_IRUSR, S_IWUSR, S_IXUSR, pStat); - } - else if (is_in_process_grouplist(file_stat.st_gid)) - { - set_file_access_rights(file_stat, S_IRGRP, S_IWGRP, S_IXGRP, pStat); - } - else - { - set_file_access_rights(file_stat, S_IROTH, S_IWOTH, S_IXOTH, pStat); - } - } - - inline void set_file_hidden_status(const rtl::OUString& file_path, oslFileStatus* pStat) - { - pStat->uAttributes = osl::systemPathIsHiddenFileOrDirectoryEntry(file_path) ? osl_File_Attribute_Hidden : 0; - pStat->uValidFields |= osl_FileStatus_Mask_Attributes; - } - - /* the set_file_access_rights must be called after set_file_hidden_status(...) and - set_file_access_mask(...) because of the hack in set_file_access_rights(...) */ - inline void set_file_attributes( - const rtl::OUString& file_path, const struct stat& file_stat, const sal_uInt32 uFieldMask, oslFileStatus* pStat) - { - set_file_hidden_status(file_path, pStat); - set_file_access_mask(file_stat, pStat); - - // we set the file access rights only on demand - // because it's potentially expensive - if (uFieldMask & osl_FileStatus_Mask_Attributes) - set_file_access_rights(file_stat, pStat); - } - - inline void set_file_access_time(const struct stat& file_stat, oslFileStatus* pStat) - { - pStat->aAccessTime.Seconds = file_stat.st_atime; - pStat->aAccessTime.Nanosec = 0; - pStat->uValidFields |= osl_FileStatus_Mask_AccessTime; - } - - inline void set_file_modify_time(const struct stat& file_stat, oslFileStatus* pStat) - { - pStat->aModifyTime.Seconds = file_stat.st_mtime; - pStat->aModifyTime.Nanosec = 0; - pStat->uValidFields |= osl_FileStatus_Mask_ModifyTime; - } - - inline void set_file_size(const struct stat& file_stat, oslFileStatus* pStat) - { - if (S_ISREG(file_stat.st_mode)) - { - pStat->uFileSize = file_stat.st_size; - pStat->uValidFields |= osl_FileStatus_Mask_FileSize; - } - } - - /* we only need to call stat or lstat if one of the - following flags is set */ - inline bool is_stat_call_necessary(sal_uInt32 field_mask, oslFileType file_type = osl_File_Type_Unknown) - { - return ( - ((field_mask & osl_FileStatus_Mask_Type) && (file_type == osl_File_Type_Unknown)) || - (field_mask & osl_FileStatus_Mask_Attributes) || - (field_mask & osl_FileStatus_Mask_CreationTime) || - (field_mask & osl_FileStatus_Mask_AccessTime) || - (field_mask & osl_FileStatus_Mask_ModifyTime) || - (field_mask & osl_FileStatus_Mask_FileSize) || - (field_mask & osl_FileStatus_Mask_LinkTargetURL) || - (field_mask & osl_FileStatus_Mask_Validate)); - } - - inline oslFileError set_link_target_url(const rtl::OUString& file_path, oslFileStatus* pStat) - { - rtl::OUString link_target; - if (!osl::realpath(file_path, link_target)) - return oslTranslateFileError(OSL_FET_ERROR, errno); - - oslFileError osl_error = osl_getFileURLFromSystemPath(link_target.pData, &pStat->ustrLinkTargetURL); - if (osl_error != osl_File_E_None) - return osl_error; - - pStat->uValidFields |= osl_FileStatus_Mask_LinkTargetURL; - return osl_File_E_None; - } - - inline oslFileError setup_osl_getFileStatus( - DirectoryItem_Impl * pImpl, oslFileStatus* pStat, rtl::OUString& file_path) - { - if ((NULL == pImpl) || (NULL == pStat)) - return osl_File_E_INVAL; - - file_path = rtl::OUString(pImpl->m_ustrFilePath); - OSL_ASSERT(file_path.getLength() > 0); - if (file_path.getLength() <= 0) - return osl_File_E_INVAL; - - pStat->uValidFields = 0; - return osl_File_E_None; - } - -} // end namespace private - - -/**************************************************************************** - * osl_getFileStatus - ****************************************************************************/ - -oslFileError SAL_CALL osl_getFileStatus(oslDirectoryItem Item, oslFileStatus* pStat, sal_uInt32 uFieldMask) -{ - DirectoryItem_Impl * pImpl = static_cast< DirectoryItem_Impl* >(Item); - - rtl::OUString file_path; - oslFileError osl_error = setup_osl_getFileStatus(pImpl, pStat, file_path); - if (osl_File_E_None != osl_error) - return osl_error; - -#if defined(__GNUC__) && (__GNUC__ < 3) - struct ::stat file_stat; -#else - struct stat file_stat; -#endif - - bool bStatNeeded = is_stat_call_necessary(uFieldMask, pImpl->getFileType()); - if (bStatNeeded && (0 != osl::lstat(file_path, file_stat))) - return oslTranslateFileError(OSL_FET_ERROR, errno); - - if (bStatNeeded) - { - // we set all these attributes because it's cheap - set_file_type(file_stat, pStat); - set_file_access_time(file_stat, pStat); - set_file_modify_time(file_stat, pStat); - set_file_size(file_stat, pStat); - set_file_attributes(file_path, file_stat, uFieldMask, pStat); - - // file exists semantic of osl_FileStatus_Mask_Validate - if ((uFieldMask & osl_FileStatus_Mask_LinkTargetURL) && S_ISLNK(file_stat.st_mode)) - { - osl_error = set_link_target_url(file_path, pStat); - if (osl_error != osl_File_E_None) - return osl_error; - } - } -#ifdef _DIRENT_HAVE_D_TYPE - else if (uFieldMask & osl_FileStatus_Mask_Type) - { - pStat->eType = pImpl->getFileType(); - pStat->uValidFields |= osl_FileStatus_Mask_Type; - } -#endif /* _DIRENT_HAVE_D_TYPE */ - - if (uFieldMask & osl_FileStatus_Mask_FileURL) - { - if ((osl_error = osl_getFileURLFromSystemPath(file_path.pData, &pStat->ustrFileURL)) != osl_File_E_None) - return osl_error; - - pStat->uValidFields |= osl_FileStatus_Mask_FileURL; - } - - if (uFieldMask & osl_FileStatus_Mask_FileName) - { - osl_systemPathGetFileNameOrLastDirectoryPart(file_path.pData, &pStat->ustrFileName); - pStat->uValidFields |= osl_FileStatus_Mask_FileName; - } - return osl_File_E_None; -} - -/****************************************************************************/ -/* osl_setFileAttributes */ -/****************************************************************************/ - -static oslFileError osl_psz_setFileAttributes( const sal_Char* pszFilePath, sal_uInt64 uAttributes ) -{ - oslFileError osl_error = osl_File_E_None; - mode_t nNewMode = 0; - - OSL_ENSURE(!(osl_File_Attribute_Hidden & uAttributes), "osl_File_Attribute_Hidden doesn't work under Unix"); - - if (uAttributes & osl_File_Attribute_OwnRead) - nNewMode |= S_IRUSR; - - if (uAttributes & osl_File_Attribute_OwnWrite) - nNewMode|=S_IWUSR; - - if (uAttributes & osl_File_Attribute_OwnExe) - nNewMode|=S_IXUSR; - - if (uAttributes & osl_File_Attribute_GrpRead) - nNewMode|=S_IRGRP; - - if (uAttributes & osl_File_Attribute_GrpWrite) - nNewMode|=S_IWGRP; - - if (uAttributes & osl_File_Attribute_GrpExe) - nNewMode|=S_IXGRP; - - if (uAttributes & osl_File_Attribute_OthRead) - nNewMode|=S_IROTH; - - if (uAttributes & osl_File_Attribute_OthWrite) - nNewMode|=S_IWOTH; - - if (uAttributes & osl_File_Attribute_OthExe) - nNewMode|=S_IXOTH; - - if (chmod(pszFilePath, nNewMode) < 0) - osl_error = oslTranslateFileError(OSL_FET_ERROR, errno); - - return osl_error; -} - -oslFileError SAL_CALL osl_setFileAttributes( rtl_uString* ustrFileURL, sal_uInt64 uAttributes ) -{ - char path[PATH_MAX]; - oslFileError eRet; - - OSL_ASSERT( ustrFileURL ); - - /* convert file url to system path */ - eRet = FileURLToPath( path, PATH_MAX, ustrFileURL ); - if( eRet != osl_File_E_None ) - return eRet; - -#ifdef MACOSX - if ( macxp_resolveAlias( path, PATH_MAX ) != 0 ) - return oslTranslateFileError( OSL_FET_ERROR, errno ); -#endif/* MACOSX */ - - return osl_psz_setFileAttributes( path, uAttributes ); -} - -/****************************************************************************/ -/* osl_setFileTime */ -/****************************************************************************/ - -static oslFileError osl_psz_setFileTime ( - const sal_Char* pszFilePath, - const TimeValue* /*pCreationTime*/, - const TimeValue* pLastAccessTime, - const TimeValue* pLastWriteTime ) -{ - int nRet=0; - struct utimbuf aTimeBuffer; - struct stat aFileStat; -#ifdef DEBUG_OSL_FILE - struct tm* pTM=0; -#endif - - nRet = lstat(pszFilePath,&aFileStat); - - if ( nRet < 0 ) - { - nRet=errno; - return oslTranslateFileError(OSL_FET_ERROR, nRet); - } - -#ifdef DEBUG_OSL_FILE - fprintf(stderr,"File Times are (in localtime):\n"); - pTM=localtime(&aFileStat.st_ctime); - fprintf(stderr,"CreationTime is '%s'\n",asctime(pTM)); - pTM=localtime(&aFileStat.st_atime); - fprintf(stderr,"AccessTime is '%s'\n",asctime(pTM)); - pTM=localtime(&aFileStat.st_mtime); - fprintf(stderr,"Modification is '%s'\n",asctime(pTM)); - - fprintf(stderr,"File Times are (in UTC):\n"); - fprintf(stderr,"CreationTime is '%s'\n",ctime(&aFileStat.st_ctime)); - fprintf(stderr,"AccessTime is '%s'\n",ctime(&aTimeBuffer.actime)); - fprintf(stderr,"Modification is '%s'\n",ctime(&aTimeBuffer.modtime)); -#endif - - if ( pLastAccessTime != 0 ) - { - aTimeBuffer.actime=pLastAccessTime->Seconds; - } - else - { - aTimeBuffer.actime=aFileStat.st_atime; - } - - if ( pLastWriteTime != 0 ) - { - aTimeBuffer.modtime=pLastWriteTime->Seconds; - } - else - { - aTimeBuffer.modtime=aFileStat.st_mtime; - } - - /* mfe: Creation time not used here! */ - -#ifdef DEBUG_OSL_FILE - fprintf(stderr,"File Times are (in localtime):\n"); - pTM=localtime(&aFileStat.st_ctime); - fprintf(stderr,"CreationTime now '%s'\n",asctime(pTM)); - pTM=localtime(&aTimeBuffer.actime); - fprintf(stderr,"AccessTime now '%s'\n",asctime(pTM)); - pTM=localtime(&aTimeBuffer.modtime); - fprintf(stderr,"Modification now '%s'\n",asctime(pTM)); - - fprintf(stderr,"File Times are (in UTC):\n"); - fprintf(stderr,"CreationTime now '%s'\n",ctime(&aFileStat.st_ctime)); - fprintf(stderr,"AccessTime now '%s'\n",ctime(&aTimeBuffer.actime)); - fprintf(stderr,"Modification now '%s'\n",ctime(&aTimeBuffer.modtime)); -#endif - - nRet=utime(pszFilePath,&aTimeBuffer); - if ( nRet < 0 ) - { - nRet=errno; - return oslTranslateFileError(OSL_FET_ERROR, nRet); - } - - return osl_File_E_None; -} - -oslFileError SAL_CALL osl_setFileTime ( - rtl_uString* ustrFileURL, - const TimeValue* pCreationTime, - const TimeValue* pLastAccessTime, - const TimeValue* pLastWriteTime ) -{ - char path[PATH_MAX]; - oslFileError eRet; - - OSL_ASSERT( ustrFileURL ); - - /* convert file url to system path */ - eRet = FileURLToPath( path, PATH_MAX, ustrFileURL ); - if( eRet != osl_File_E_None ) - return eRet; - -#ifdef MACOSX - if ( macxp_resolveAlias( path, PATH_MAX ) != 0 ) - return oslTranslateFileError( OSL_FET_ERROR, errno ); -#endif/* MACOSX */ - - return osl_psz_setFileTime( path, pCreationTime, pLastAccessTime, pLastWriteTime ); -} - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sal/osl/unx/file_url.cxx b/sal/osl/unx/file_url.cxx deleted file mode 100644 index 858a7d7bb..000000000 --- a/sal/osl/unx/file_url.cxx +++ /dev/null @@ -1,933 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2000, 2010 Oracle and/or its affiliates. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * <http://www.openoffice.org/license.html> - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -// MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_sal.hxx" - -#include "file_url.h" - -#include "system.h" - -#include <limits.h> -#include <errno.h> -#include <strings.h> -#include <unistd.h> - -#include "osl/file.hxx" -#include <osl/security.hxx> -#include <osl/diagnose.h> -#include <osl/thread.h> -#include <osl/process.h> - -#include <rtl/uri.hxx> -#include <rtl/ustring.hxx> -#include <rtl/ustrbuf.h> -#include "rtl/textcvt.h" - -#include "file_error_transl.h" -#include "file_path_helper.hxx" - -#include "uunxapi.hxx" - -/*************************************************** - - General note - - This file contains the part that handles File URLs. - - File URLs as scheme specific notion of URIs - (RFC2396) may be handled platform independend, but - will not in osl which is considered wrong. - Future version of osl should handle File URLs this - way. In rtl/uri there is already an URI parser etc. - so this code should be consolidated. - - **************************************************/ -/************************************************************************ - * ToDo - * - * Fix osl_getCanonicalName - * - ***********************************************************************/ - - -/*************************************************** - * namespace directives - **************************************************/ - -using namespace osl; - -/*************************************************** - * constants - **************************************************/ - -const sal_Unicode UNICHAR_SLASH = ((sal_Unicode)'/'); -const sal_Unicode UNICHAR_COLON = ((sal_Unicode)':'); -const sal_Unicode UNICHAR_DOT = ((sal_Unicode)'.'); - -/****************************************************************************** - * - * Exported Module Functions - * - *****************************************************************************/ - -/* a slightly modified version of Pchar in rtl/source/uri.c */ -const sal_Bool uriCharClass[128] = -{ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* Pchar but without encoding slashes */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* !"#$%&'()*+,-./ */ - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, /* 0123456789:;<=>? */ - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* @ABCDEFGHIJKLMNO */ - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, /* PQRSTUVWXYZ[\]^_ */ - 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* `abcdefghijklmno */ - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0 /* pqrstuvwxyz{|}~ */ -}; - - -/* check for top wrong usage strings */ -/* -static sal_Bool findWrongUsage( const sal_Unicode *path, sal_Int32 len ) -{ - rtl_uString *pTmp = NULL; - sal_Bool bRet; - - rtl_uString_newFromStr_WithLength( &pTmp, path, len ); - - rtl_ustr_toAsciiLowerCase_WithLength( pTmp->buffer, pTmp->length ); - - bRet = ( 0 == rtl_ustr_ascii_shortenedCompare_WithLength( pTmp->buffer, pTmp->length, "ftp://", 6 ) ) || - ( 0 == rtl_ustr_ascii_shortenedCompare_WithLength( pTmp->buffer, pTmp->length, "http://", 7 ) ) || - ( 0 == rtl_ustr_ascii_shortenedCompare_WithLength( pTmp->buffer, pTmp->length, "vnd.sun.star", 12 ) ) || - ( 0 == rtl_ustr_ascii_shortenedCompare_WithLength( pTmp->buffer, pTmp->length, "private:", 8 ) ) || - ( 0 == rtl_ustr_ascii_shortenedCompare_WithLength( pTmp->buffer, pTmp->length, "slot:", 5) ); - - rtl_uString_release( pTmp ); - return bRet; -} -*/ - -/****************************************************************************/ -/* osl_getCanonicalName */ -/****************************************************************************/ - -oslFileError SAL_CALL osl_getCanonicalName( rtl_uString* ustrFileURL, rtl_uString** pustrValidURL ) -{ - OSL_FAIL("osl_getCanonicalName not implemented"); - - rtl_uString_newFromString(pustrValidURL, ustrFileURL); - return osl_File_E_None; -} - -/****************************************************************************/ -/* osl_getSystemPathFromFileURL */ -/****************************************************************************/ - -namespace { - -oslFileError getSystemPathFromFileUrl( - rtl::OUString const & url, rtl::OUString * path, bool homeAbbreviation) -{ - OSL_ASSERT(path != 0 && path->getLength() == 0); - - sal_Unicode const * p = url.getStr(); - sal_Unicode const * end = p + url.getLength(); - - /* a valid file url may not start with '/' */ - if ((p == end) || (*p == UNICHAR_SLASH)) - return osl_File_E_INVAL; - - for (sal_Unicode const * p1 = p; p1 != end; ++p1) { - if (*p1 == '?' || *p1 == '#' || - (*p1 == '%' && end - p1 >= 3 && p1[1] == '2' && - (p1[2] == 'F' || p1[2] == 'f'))) - { - return osl_File_E_INVAL; - } - } - sal_Unicode const * p1 = p; - while (p1 != end && *p1 != ':' && *p1 != '/') { - ++p1; - } - if (p1 != end && *p1 == ':') { - if (rtl_ustr_ascii_compareIgnoreAsciiCase_WithLengths( - p, p1 - p, RTL_CONSTASCII_STRINGPARAM("file")) != - 0) - { - return osl_File_E_INVAL; - } - p = p1 + 1; - } - if (end - p >= 2 && p[0] == '/' && p[1] == '/') { - p += 2; - sal_Int32 i = rtl_ustr_indexOfChar_WithLength(p, end - p, '/'); - p1 = i < 0 ? end : p + i; - if (p1 != p && - (rtl_ustr_ascii_compareIgnoreAsciiCase_WithLengths( - p, p1 - p, RTL_CONSTASCII_STRINGPARAM("localhost")) != - 0) && - rtl_ustr_ascii_compare_WithLength(p, p1 - p, "127.0.0.1") != 0) - { - return osl_File_E_INVAL; - } - p = p1; - if (p == end) { - *path = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("/")); - return osl_File_E_None; - } - } - if (homeAbbreviation && end - p >= 2 && p[0] == '/' && p[1] == '~') { - p += 2; - sal_Int32 i = rtl_ustr_indexOfChar_WithLength(p, end - p, '/'); - p1 = i < 0 ? end : p + i; - if (p1 == p) { - rtl::OUString home; - if (!osl::Security().getHomeDir(home)) { - return osl_File_E_INVAL; - } - oslFileError e = getSystemPathFromFileUrl(home, path, false); - if (e != osl_File_E_None) { - return e; - } - } else { - return osl_File_E_INVAL; //TODO - } - p = p1; - } - rtl::OUString d( - rtl::Uri::decode( - rtl::OUString(p, end - p), rtl_UriDecodeWithCharset, - RTL_TEXTENCODING_UTF8)); - if (d.indexOf(0) >=0) { - return osl_File_E_INVAL; - } - *path += d; - return osl_File_E_None; -} -} - -oslFileError osl_getSystemPathFromFileURL( - rtl_uString * pustrFileURL, rtl_uString ** ppustrSystemPath) -{ - rtl::OUString p; - oslFileError e = getSystemPathFromFileUrl( - rtl::OUString(pustrFileURL), &p, true); - if (e == osl_File_E_None) { - rtl_uString_assign(ppustrSystemPath, p.pData); - } - return e; -} - -/****************************************************************************/ -/* osl_getFileURLFromSystemPath */ -/****************************************************************************/ - -oslFileError SAL_CALL osl_getFileURLFromSystemPath( rtl_uString *ustrSystemPath, rtl_uString **pustrFileURL ) -{ - static const sal_Unicode pDoubleSlash[2] = { '/', '/' }; - - rtl_uString *pTmp = NULL; - sal_Int32 nIndex; - - if( 0 == ustrSystemPath->length ) - return osl_File_E_INVAL; - - /* temporary hack: if already file url, return ustrSystemPath */ - - if( 0 == rtl_ustr_ascii_shortenedCompare_WithLength( ustrSystemPath->buffer, ustrSystemPath->length,"file:", 5 ) ) - { - /* - if( 0 == rtl_ustr_ascii_shortenedCompare_WithLength( ustrSystemPath->buffer, ustrSystemPath->length,"file://", 7 ) ) - { - OSL_FAIL( "osl_getFileURLFromSystemPath: input is already file URL" ); - rtl_uString_assign( pustrFileURL, ustrSystemPath ); - } - else - { - rtl_uString *pTmp2 = NULL; - - OSL_FAIL( "osl_getFileURLFromSystemPath: input is wrong file URL" ); - rtl_uString_newFromStr_WithLength( pustrFileURL, ustrSystemPath->buffer + 5, ustrSystemPath->length - 5 ); - rtl_uString_newFromAscii( &pTmp2, "file://" ); - rtl_uString_newConcat( pustrFileURL, *pustrFileURL, pTmp2 ); - rtl_uString_release( pTmp2 ); - } - return osl_File_E_None; - */ - return osl_File_E_INVAL; - } - - - /* check if system path starts with ~ or ~user and replace it with the appropriate home dir */ - if( (sal_Unicode) '~' == ustrSystemPath->buffer[0] ) - { - /* check if another user is specified */ - if( ( 1 == ustrSystemPath->length ) || ( (sal_Unicode)'/' == ustrSystemPath->buffer[1] ) ) - { - /* osl_getHomeDir returns file URL */ - osl_getHomeDir( osl_getCurrentSecurity(), &pTmp ); - - /* remove "file://" prefix */ - rtl_uString_newFromStr_WithLength( &pTmp, pTmp->buffer + 7, pTmp->length - 7 ); - - /* replace '~' in original string */ - rtl_uString_newReplaceStrAt( &pTmp, ustrSystemPath, 0, 1, pTmp ); - } - - else - { - /* FIXME: replace ~user with users home directory */ - return osl_File_E_INVAL; - } - } - - /* check if initial string contains double instances of '/' */ - nIndex = rtl_ustr_indexOfStr_WithLength( ustrSystemPath->buffer, ustrSystemPath->length, pDoubleSlash, 2 ); - if( -1 != nIndex ) - { - sal_Int32 nSrcIndex; - sal_Int32 nDeleted = 0; - - /* if pTmp is not already allocated, copy ustrSystemPath for modification */ - if( NULL == pTmp ) - rtl_uString_newFromString( &pTmp, ustrSystemPath ); - - /* adapt index to pTmp */ - nIndex += pTmp->length - ustrSystemPath->length; - - /* remove all occurrences of '//' */ - for( nSrcIndex = nIndex + 1; nSrcIndex < pTmp->length; nSrcIndex++ ) - { - if( ((sal_Unicode) '/' == pTmp->buffer[nSrcIndex]) && ((sal_Unicode) '/' == pTmp->buffer[nIndex]) ) - nDeleted++; - else - pTmp->buffer[++nIndex] = pTmp->buffer[nSrcIndex]; - } - - /* adjust length member */ - pTmp->length -= nDeleted; - } - - if( NULL == pTmp ) - rtl_uString_assign( &pTmp, ustrSystemPath ); - - /* temporary check for top 5 wrong usage strings (which are valid but unlikly filenames) */ - /* - OSL_ASSERT( !findWrongUsage( pTmp->buffer, pTmp->length ) ); - */ - - /* file URLs must be URI encoded */ - rtl_uriEncode( pTmp, uriCharClass, rtl_UriEncodeIgnoreEscapes, RTL_TEXTENCODING_UTF8, pustrFileURL ); - - rtl_uString_release( pTmp ); - - /* absolute urls should start with 'file://' */ - if( (sal_Unicode)'/' == (*pustrFileURL)->buffer[0] ) - { - rtl_uString *pProtocol = NULL; - - rtl_uString_newFromAscii( &pProtocol, "file://" ); - rtl_uString_newConcat( pustrFileURL, pProtocol, *pustrFileURL ); - rtl_uString_release( pProtocol ); - } - - return osl_File_E_None; -} - -/**************************************************************************** - * osl_getSystemPathFromFileURL_Ex - helper function - * clients may specify if they want to accept relative - * URLs or not - ****************************************************************************/ - -oslFileError osl_getSystemPathFromFileURL_Ex( - rtl_uString *ustrFileURL, rtl_uString **pustrSystemPath, sal_Bool bAllowRelative) -{ - rtl_uString* temp = 0; - oslFileError osl_error = osl_getSystemPathFromFileURL(ustrFileURL, &temp); - - if (osl_File_E_None == osl_error) - { - if (bAllowRelative || (UNICHAR_SLASH == temp->buffer[0])) - { - *pustrSystemPath = temp; - } - else - { - rtl_uString_release(temp); - osl_error = osl_File_E_INVAL; - } - } - - return osl_error; -} - -namespace /* private */ -{ - - /****************************************************** - * Helper function, return a pinter to the final '\0' - * of a string - ******************************************************/ - - sal_Unicode* ustrtoend(sal_Unicode* pStr) - { - return (pStr + rtl_ustr_getLength(pStr)); - } - - /********************************************* - - ********************************************/ - - sal_Unicode* ustrchrcat(const sal_Unicode chr, sal_Unicode* d) - { - sal_Unicode* p = ustrtoend(d); - *p++ = chr; - *p = 0; - return d; - } - - /****************************************************** - * - ******************************************************/ - - bool _islastchr(sal_Unicode* pStr, sal_Unicode Chr) - { - sal_Unicode* p = ustrtoend(pStr); - if (p > pStr) - p--; - return (*p == Chr); - } - - /****************************************************** - * Remove the last part of a path, a path that has - * only a '/' or no '/' at all will be returned - * unmodified - ******************************************************/ - - sal_Unicode* _rmlastpathtoken(sal_Unicode* aPath) - { - /* we always may skip -2 because we - may at least stand on a '/' but - either there is no other character - before this '/' or it's another - character than the '/' - */ - sal_Unicode* p = ustrtoend(aPath) - 2; - - // move back to the next path separator - // or to the start of the string - while ((p > aPath) && (*p != UNICHAR_SLASH)) - p--; - - if (p >= aPath) - { - if (UNICHAR_SLASH == *p) - { - p++; - *p = '\0'; - } - else - { - *p = '\0'; - } - } - - return aPath; - } - - /****************************************************** - * - ******************************************************/ - - oslFileError _osl_resolvepath( - /*inout*/ sal_Unicode* path, - /*inout*/ bool* failed) - { - oslFileError ferr = osl_File_E_None; - - if (!*failed) - { - char unresolved_path[PATH_MAX]; - if (!UnicodeToText(unresolved_path, sizeof(unresolved_path), path, rtl_ustr_getLength(path))) - return oslTranslateFileError(OSL_FET_ERROR, ENAMETOOLONG); - - char resolved_path[PATH_MAX]; - if (realpath(unresolved_path, resolved_path)) - { - if (!TextToUnicode(resolved_path, strlen(resolved_path), path, PATH_MAX)) - return oslTranslateFileError(OSL_FET_ERROR, ENAMETOOLONG); - - } - else - { - if (EACCES == errno || ENOTDIR == errno || ENOENT == errno) - *failed = true; - else - ferr = oslTranslateFileError(OSL_FET_ERROR, errno); - } - } - - return ferr; - } - - /****************************************************** - * Works even with non existing paths. The resulting - * path must not exceed PATH_MAX else - * osl_File_E_NAMETOOLONG is the result - ******************************************************/ - - oslFileError osl_getAbsoluteFileURL_impl_(const rtl::OUString& unresolved_path, rtl::OUString& resolved_path) - { - // the given unresolved path must not exceed PATH_MAX - if (unresolved_path.getLength() >= (PATH_MAX - 2)) - return oslTranslateFileError(OSL_FET_ERROR, ENAMETOOLONG); - - sal_Unicode path_resolved_so_far[PATH_MAX]; - const sal_Unicode* punresolved = unresolved_path.getStr(); - sal_Unicode* presolvedsf = path_resolved_so_far; - - // reserve space for leading '/' and trailing '\0' - // do not exceed this limit - sal_Unicode* sentinel = path_resolved_so_far + PATH_MAX - 2; - - // if realpath fails with error ENOTDIR, EACCES or ENOENT - // we will not call it again, because _osl_realpath should also - // work with non existing directories etc. - bool realpath_failed = false; - oslFileError ferr; - - path_resolved_so_far[0] = '\0'; - - while (*punresolved != '\0') - { - // ignore '/.' , skip one part back when '/..' - - if ((UNICHAR_DOT == *punresolved) && (UNICHAR_SLASH == *presolvedsf)) - { - if ('\0' == *(punresolved + 1)) - { - punresolved++; - continue; - } - else if (UNICHAR_SLASH == *(punresolved + 1)) - { - punresolved += 2; - continue; - } - else if ((UNICHAR_DOT == *(punresolved + 1)) && ('\0' == *(punresolved + 2) || (UNICHAR_SLASH == *(punresolved + 2)))) - { - _rmlastpathtoken(path_resolved_so_far); - - presolvedsf = ustrtoend(path_resolved_so_far) - 1; - - if (UNICHAR_SLASH == *(punresolved + 2)) - punresolved += 3; - else - punresolved += 2; - - continue; - } - else // a file or directory name may start with '.' - { - if ((presolvedsf = ustrtoend(path_resolved_so_far)) > sentinel) - return oslTranslateFileError(OSL_FET_ERROR, ENAMETOOLONG); - - ustrchrcat(*punresolved++, path_resolved_so_far); - - if ('\0' == *punresolved && !realpath_failed) - { - ferr = _osl_resolvepath( - path_resolved_so_far, - &realpath_failed); - - if (osl_File_E_None != ferr) - return ferr; - } - } - } - else if (UNICHAR_SLASH == *punresolved) - { - if ((presolvedsf = ustrtoend(path_resolved_so_far)) > sentinel) - return oslTranslateFileError(OSL_FET_ERROR, ENAMETOOLONG); - - ustrchrcat(*punresolved++, path_resolved_so_far); - - if (!realpath_failed) - { - ferr = _osl_resolvepath( - path_resolved_so_far, - &realpath_failed); - - if (osl_File_E_None != ferr) - return ferr; - - if (!_islastchr(path_resolved_so_far, UNICHAR_SLASH)) - { - if ((presolvedsf = ustrtoend(path_resolved_so_far)) > sentinel) - return oslTranslateFileError(OSL_FET_ERROR, ENAMETOOLONG); - - ustrchrcat(UNICHAR_SLASH, path_resolved_so_far); - } - } - } - else // any other character - { - if ((presolvedsf = ustrtoend(path_resolved_so_far)) > sentinel) - return oslTranslateFileError(OSL_FET_ERROR, ENAMETOOLONG); - - ustrchrcat(*punresolved++, path_resolved_so_far); - - if ('\0' == *punresolved && !realpath_failed) - { - ferr = _osl_resolvepath( - path_resolved_so_far, - &realpath_failed); - - if (osl_File_E_None != ferr) - return ferr; - } - } - } - - sal_Int32 len = rtl_ustr_getLength(path_resolved_so_far); - - OSL_ASSERT(len < PATH_MAX); - - resolved_path = rtl::OUString(path_resolved_so_far, len); - - return osl_File_E_None; - } - -} // end namespace private - - -/****************************************************** - * osl_getAbsoluteFileURL - ******************************************************/ - -oslFileError osl_getAbsoluteFileURL(rtl_uString* ustrBaseDirURL, rtl_uString* ustrRelativeURL, rtl_uString** pustrAbsoluteURL) -{ - FileBase::RC rc; - rtl::OUString unresolved_path; - static char *allow_symlinks = getenv( "SAL_ALLOW_LINKOO_SYMLINKS" ); - - rc = FileBase::getSystemPathFromFileURL(rtl::OUString(ustrRelativeURL), unresolved_path); - - if(FileBase::E_None != rc) - return oslFileError(rc); - - if (systemPathIsRelativePath(unresolved_path)) - { - rtl::OUString base_path; - rc = (FileBase::RC) osl_getSystemPathFromFileURL_Ex(ustrBaseDirURL, &base_path.pData, sal_False); - - if (FileBase::E_None != rc) - return oslFileError(rc); - - rtl::OUString abs_path; - systemPathMakeAbsolutePath(base_path, unresolved_path, abs_path); - - unresolved_path = abs_path; - } - - rtl::OUString resolved_path; - - if (!allow_symlinks) - { - rc = (FileBase::RC) osl_getAbsoluteFileURL_impl_(unresolved_path, resolved_path); - } - else - { - // SAL_ALLOW_LINKOO_SYMLINKS environment variable: - // for linkoo to work, we need to let the symlinks to the libraries untouched - rtl::OUString base; - sal_Int32 last_slash = unresolved_path.lastIndexOf( UNICHAR_SLASH ); - - if (last_slash >= 0 && last_slash + 1 < unresolved_path.getLength()) - { - base = unresolved_path.copy(last_slash+1); - unresolved_path = unresolved_path.copy(0, last_slash); - } - - rc = (FileBase::RC) osl_getAbsoluteFileURL_impl_(unresolved_path, resolved_path); - - if (base.getLength() > 0) - { - resolved_path += rtl::OUString( UNICHAR_SLASH ); - resolved_path += base; - } - } - - if (FileBase::E_None == rc) - { - rc = (FileBase::RC) osl_getFileURLFromSystemPath(resolved_path.pData, pustrAbsoluteURL); - OSL_ASSERT(FileBase::E_None == rc); - } - - return oslFileError(rc); -} - - -namespace /* private */ -{ - - /********************************************* - No separate error code if unicode to text - conversion or getenv fails because for the - caller there is no difference why a file - could not be found in $PATH - ********************************************/ - - bool find_in_PATH(const rtl::OUString& file_path, rtl::OUString& result) - { - bool bfound = false; - rtl::OUString path(RTL_CONSTASCII_USTRINGPARAM("PATH")); - rtl::OUString env_path; - - if (osl_Process_E_None == osl_getEnvironment(path.pData, &env_path.pData)) - bfound = osl::searchPath(file_path, env_path, result); - - return bfound; - } - - /********************************************* - No separate error code if unicode to text - conversion or getcwd fails because for the - caller there is no difference why a file - could not be found in CDW - ********************************************/ - - bool find_in_CWD(const rtl::OUString& file_path, rtl::OUString& result) - { - bool bfound = false; - rtl::OUString cwd_url; - - if (osl_Process_E_None == osl_getProcessWorkingDir(&cwd_url.pData)) - { - rtl::OUString cwd; - FileBase::getSystemPathFromFileURL(cwd_url, cwd); - bfound = osl::searchPath(file_path, cwd, result); - } - return bfound; - } - - /********************************************* - - ********************************************/ - - bool find_in_searchPath(const rtl::OUString& file_path, rtl_uString* search_path, rtl::OUString& result) - { - return (search_path && osl::searchPath(file_path, rtl::OUString(search_path), result)); - } - -} // end namespace private - - -/**************************************************************************** - * osl_searchFileURL - ***************************************************************************/ - -oslFileError osl_searchFileURL(rtl_uString* ustrFilePath, rtl_uString* ustrSearchPath, rtl_uString** pustrURL) -{ - OSL_PRECOND(ustrFilePath && pustrURL, "osl_searchFileURL: invalid parameter"); - - FileBase::RC rc; - rtl::OUString file_path; - - // try to interpret search path as file url else assume it's a system path list - rc = FileBase::getSystemPathFromFileURL(rtl::OUString(ustrFilePath), file_path); - if (FileBase::E_INVAL == rc) - file_path = ustrFilePath; - else if (FileBase::E_None != rc) - return oslFileError(rc); - - bool bfound = false; - rtl::OUString result; - - if (find_in_searchPath(file_path, ustrSearchPath, result) || - find_in_PATH(file_path, result) || - find_in_CWD(file_path, result)) - { - rtl::OUString resolved; - - if (osl::realpath(result, resolved)) - { -#if OSL_DEBUG_LEVEL > 0 - oslFileError osl_error = -#endif - osl_getFileURLFromSystemPath(resolved.pData, pustrURL); - OSL_ASSERT(osl_File_E_None == osl_error); - bfound = true; - } - } - return bfound ? osl_File_E_None : osl_File_E_NOENT; -} - - -/**************************************************************************** - * FileURLToPath - ***************************************************************************/ - -oslFileError FileURLToPath(char * buffer, size_t bufLen, rtl_uString* ustrFileURL) -{ - rtl_uString* ustrSystemPath = NULL; - oslFileError osl_error = osl_getSystemPathFromFileURL(ustrFileURL, &ustrSystemPath); - - if(osl_File_E_None != osl_error) - return osl_error; - - osl_systemPathRemoveSeparator(ustrSystemPath); - - /* convert unicode path to text */ - if(!UnicodeToText( buffer, bufLen, ustrSystemPath->buffer, ustrSystemPath->length)) - osl_error = oslTranslateFileError(OSL_FET_ERROR, errno); - - rtl_uString_release(ustrSystemPath); - - return osl_error; -} - -/***************************************************************************** - * UnicodeToText - ****************************************************************************/ - -namespace /* private */ -{ - class UnicodeToTextConverter_Impl - { - rtl_UnicodeToTextConverter m_converter; - - UnicodeToTextConverter_Impl() - : m_converter (rtl_createUnicodeToTextConverter (osl_getThreadTextEncoding())) - {} - - ~UnicodeToTextConverter_Impl() - { - rtl_destroyUnicodeToTextConverter (m_converter); - } - public: - static UnicodeToTextConverter_Impl & getInstance() - { - static UnicodeToTextConverter_Impl g_theConverter; - return g_theConverter; - } - - sal_Size convert( - sal_Unicode const * pSrcBuf, sal_Size nSrcChars, sal_Char * pDstBuf, sal_Size nDstBytes, - sal_uInt32 nFlags, sal_uInt32 * pInfo, sal_Size * pSrcCvtChars) - { - OSL_ASSERT(m_converter != 0); - return rtl_convertUnicodeToText ( - m_converter, 0, pSrcBuf, nSrcChars, pDstBuf, nDstBytes, nFlags, pInfo, pSrcCvtChars); - } - }; -} // end namespace private - -int UnicodeToText( char * buffer, size_t bufLen, const sal_Unicode * uniText, sal_Int32 uniTextLen ) -{ - sal_uInt32 nInfo = 0; - sal_Size nSrcChars = 0; - - sal_Size nDestBytes = UnicodeToTextConverter_Impl::getInstance().convert ( - uniText, uniTextLen, buffer, bufLen, - OUSTRING_TO_OSTRING_CVTFLAGS | RTL_UNICODETOTEXT_FLAGS_FLUSH, &nInfo, &nSrcChars); - - if( nInfo & RTL_UNICODETOTEXT_INFO_DESTBUFFERTOSMALL ) - { - errno = EOVERFLOW; - return 0; - } - - /* ensure trailing '\0' */ - buffer[nDestBytes] = '\0'; - return nDestBytes; -} - -/***************************************************************************** - * TextToUnicode - ****************************************************************************/ - -namespace /* private */ -{ - class TextToUnicodeConverter_Impl - { - rtl_TextToUnicodeConverter m_converter; - - TextToUnicodeConverter_Impl() - : m_converter (rtl_createTextToUnicodeConverter (osl_getThreadTextEncoding())) - {} - - ~TextToUnicodeConverter_Impl() - { - rtl_destroyTextToUnicodeConverter (m_converter); - } - - public: - static TextToUnicodeConverter_Impl & getInstance() - { - static TextToUnicodeConverter_Impl g_theConverter; - return g_theConverter; - } - - sal_Size convert( - sal_Char const * pSrcBuf, sal_Size nSrcBytes, sal_Unicode * pDstBuf, sal_Size nDstChars, - sal_uInt32 nFlags, sal_uInt32 * pInfo, sal_Size * pSrcCvtBytes) - { - OSL_ASSERT(m_converter != 0); - return rtl_convertTextToUnicode ( - m_converter, 0, pSrcBuf, nSrcBytes, pDstBuf, nDstChars, nFlags, pInfo, pSrcCvtBytes); - } - }; -} // end namespace private - -int TextToUnicode( - const char* text, - size_t text_buffer_size, - sal_Unicode* unic_text, - sal_Int32 unic_text_buffer_size) -{ - sal_uInt32 nInfo = 0; - sal_Size nSrcChars = 0; - - sal_Size nDestBytes = TextToUnicodeConverter_Impl::getInstance().convert( - text, text_buffer_size, unic_text, unic_text_buffer_size, - OSTRING_TO_OUSTRING_CVTFLAGS | RTL_TEXTTOUNICODE_FLAGS_FLUSH, &nInfo, &nSrcChars); - - if (nInfo & RTL_TEXTTOUNICODE_INFO_DESTBUFFERTOSMALL) - { - errno = EOVERFLOW; - return 0; - } - - /* ensure trailing '\0' */ - unic_text[nDestBytes] = '\0'; - return nDestBytes; -} - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sal/osl/unx/file_url.h b/sal/osl/unx/file_url.h deleted file mode 100644 index 283a55c05..000000000 --- a/sal/osl/unx/file_url.h +++ /dev/null @@ -1,72 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2000, 2010 Oracle and/or its affiliates. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * <http://www.openoffice.org/license.html> - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -#ifndef INCLUDED_FILE_URL_H -#define INCLUDED_FILE_URL_H - -#include "osl/file.h" - -#ifdef __cplusplus -extern "C" -{ -#endif - -/************************************************** - * osl_getSystemPathFromFileURL_Ex - *************************************************/ - -#define FURL_ALLOW_RELATIVE sal_True -#define FURL_DENY_RELATIVE sal_False - -oslFileError osl_getSystemPathFromFileURL_Ex(rtl_uString *ustrFileURL, rtl_uString **pustrSystemPath, sal_Bool bAllowRelative); - -/************************************************** - * FileURLToPath - *************************************************/ - -oslFileError FileURLToPath(char * buffer, size_t bufLen, rtl_uString* ustrFileURL); - -/*************************************************** - * UnicodeToText - **************************************************/ - -int UnicodeToText(char * buffer, size_t bufLen, const sal_Unicode * uniText, sal_Int32 uniTextLen); - -/*************************************************** - * TextToUniCode - **************************************************/ - -int TextToUnicode(const char* text, size_t text_buffer_size, sal_Unicode* unic_text, sal_Int32 unic_text_buffer_size); - -#ifdef __cplusplus -} -#endif - -#endif /* #define INCLUDED_FILE_URL_H */ - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sal/osl/unx/file_volume.cxx b/sal/osl/unx/file_volume.cxx deleted file mode 100644 index cc3008914..000000000 --- a/sal/osl/unx/file_volume.cxx +++ /dev/null @@ -1,1188 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2000, 2010 Oracle and/or its affiliates. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * <http://www.openoffice.org/license.html> - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -#include "osl/file.h" - -#include "osl/diagnose.h" -#include "osl/thread.h" -#include "rtl/alloc.h" - -#include "file_error_transl.h" -#include "file_url.h" -#include "system.h" - -#include <errno.h> -#include <limits.h> -#include <stdio.h> -#include <string.h> -#include <unistd.h> -#include <sys/wait.h> -#include <sal/macros.h> - -#ifdef HAVE_STATFS_H -#undef HAVE_STATFS_H -#endif - -#if defined(LINUX) && defined(__FreeBSD_kernel__) -#undef LINUX -#define FREEBSD 1 -#endif - - -#if defined(SOLARIS) - -#include <sys/mnttab.h> -#include <sys/statvfs.h> -#define HAVE_STATFS_H -static const sal_Char* MOUNTTAB="/etc/mnttab"; - -#elif defined(LINUX) - -#include <mntent.h> -#include <sys/vfs.h> -#define HAVE_STATFS_H -static const sal_Char* MOUNTTAB="/etc/mtab"; - -#elif defined(NETBSD) || defined(FREEBSD) || defined(OPENBSD) || defined(DRAGONFLY) - -#include <sys/param.h> -#include <sys/ucred.h> -#include <sys/mount.h> -#define HAVE_STATFS_H - -/* No mounting table on *BSD - * This information is stored only in the kernel. */ -/* static const sal_Char* MOUNTTAB="/etc/mtab"; */ - -#elif defined(MACOSX) - -#include <sys/param.h> -#include <sys/mount.h> -#define HAVE_STATFS_H -// static const sal_Char* MOUNTTAB="/etc/mtab"; - -#endif /* HAVE_STATFS_H */ - -/************************************************************************ - * ToDo - * - * - Fix: check for corresponding struct sizes in exported functions - * - check size/use of oslVolumeDeviceHandle - * - check size/use of oslVolumeInfo - ***********************************************************************/ -/****************************************************************************** - * - * Data Type Definition - * - ******************************************************************************/ - -typedef struct _oslVolumeDeviceHandleImpl -{ - sal_Char pszMountPoint[PATH_MAX]; - sal_Char pszFilePath[PATH_MAX]; - sal_Char pszDevice[PATH_MAX]; - sal_Char ident[4]; - sal_uInt32 RefCount; -} oslVolumeDeviceHandleImpl; - -/****************************************************************************** - * - * 'removeable device' aka floppy functions - * - *****************************************************************************/ - -static oslVolumeDeviceHandle osl_isFloppyDrive(const sal_Char* pszPath); -static oslFileError osl_mountFloppy(oslVolumeDeviceHandle hFloppy); -static oslFileError osl_unmountFloppy(oslVolumeDeviceHandle hFloppy); - -#if defined(SOLARIS) -static sal_Bool osl_isFloppyMounted(sal_Char* pszPath, sal_Char* pszMountPath); -static sal_Bool osl_getFloppyMountEntry(const sal_Char* pszPath, sal_Char* pBuffer); -static sal_Bool osl_checkFloppyPath(sal_Char* pszPath, sal_Char* pszFilePath, sal_Char* pszDevicePath); -#endif /* SOLARIS */ - -#if defined(LINUX) -static sal_Bool osl_isFloppyMounted(oslVolumeDeviceHandleImpl* pDevice); -static sal_Bool osl_getFloppyMountEntry(const sal_Char* pszPath, oslVolumeDeviceHandleImpl* pItem); -#endif /* LINUX */ - -#ifdef DEBUG_OSL_FILE -static void osl_printFloppyHandle(oslVolumeDeviceHandleImpl* hFloppy); -#endif /* DEBUG_OSL_FILE */ - -/****************************************************************************** - * - * C-String Function Declarations - * - *****************************************************************************/ - -static oslFileError osl_psz_getVolumeInformation(const sal_Char* , oslVolumeInfo* pInfo, sal_uInt32 uFieldMask); - -/****************************************************************************/ -/* osl_getVolumeInformation */ -/****************************************************************************/ - -oslFileError osl_getVolumeInformation( rtl_uString* ustrDirectoryURL, oslVolumeInfo* pInfo, sal_uInt32 uFieldMask ) -{ - char path[PATH_MAX]; - oslFileError eRet; - - OSL_ASSERT( ustrDirectoryURL ); - OSL_ASSERT( pInfo ); - - /* convert directory url to system path */ - eRet = FileURLToPath( path, PATH_MAX, ustrDirectoryURL ); - if( eRet != osl_File_E_None ) - return eRet; - -#ifdef MACOSX - if ( macxp_resolveAlias( path, PATH_MAX ) != 0 ) - return oslTranslateFileError( OSL_FET_ERROR, errno ); -#endif/* MACOSX */ - - return osl_psz_getVolumeInformation( path, pInfo, uFieldMask); -} - -/****************************************************************************** - * - * C-String Versions of Exported Module Functions - * - *****************************************************************************/ - -#ifdef HAVE_STATFS_H - -#if defined(FREEBSD) || defined(MACOSX) || defined(OPENBSD) || defined(DRAGONFLY) -# define __OSL_STATFS_STRUCT struct statfs -# define __OSL_STATFS(dir, sfs) statfs((dir), (sfs)) -# define __OSL_STATFS_BLKSIZ(a) ((sal_uInt64)((a).f_bsize)) -# define __OSL_STATFS_TYPENAME(a) ((a).f_fstypename) -#if defined(OPENBSD) -# define __OSL_STATFS_ISREMOTE(a) (rtl_str_compare((a).f_fstypename, "nfs") == 0) -#else -# define __OSL_STATFS_ISREMOTE(a) (((a).f_type & MNT_LOCAL) == 0) -#endif - -/* always return true if queried for the properties of - the file system. If you think this is wrong under any - of the target platforms fix it!!!! */ -# define __OSL_STATFS_IS_CASE_SENSITIVE_FS(a) (1) -# define __OSL_STATFS_IS_CASE_PRESERVING_FS(a) (1) -#endif /* FREEBSD || MACOSX || OPENBSD */ - -#if defined(NETBSD) - -#include <sys/param.h> - -/* statvfs() replaced statfs() in 2.99.9 */ -# if __NetBSD_Version__ >= 299000900 - /* 2.0D or later */ -# define __OSL_STATFS_STRUCT struct statvfs -# define __OSL_STATFS(dir, sfs) statvfs((dir), (sfs)) -# define __OSL_STATFS_ISREMOTE(a) (((a).f_flag & ST_LOCAL) == 0) - -# else - /* version before 2.0D */ -# define __OSL_STATFS_STRUCT struct statfs -# define __OSL_STATFS(dir, sfs) statfs((dir), (sfs)) -# define __OSL_STATFS_ISREMOTE(a) (((a).f_type & MNT_LOCAL) == 0) - -# endif /* >2.0D */ - -# define __OSL_STATFS_BLKSIZ(a) ((sal_uInt64)((a).f_bsize)) -# define __OSL_STATFS_TYPENAME(a) ((a).f_fstypename) - -# define __OSL_STATFS_IS_CASE_SENSITIVE_FS(a) (strcmp((a).f_fstypename, "msdos") != 0 && strcmp((a).f_fstypename, "ntfs") != 0 && strcmp((a).f_fstypename, "smbfs") != 0) -# define __OSL_STATFS_IS_CASE_PRESERVING_FS(a) (strcmp((a).f_fstypename, "msdos") != 0) -#endif /* NETBSD */ - -#if defined(LINUX) -# define __OSL_NFS_SUPER_MAGIC 0x6969 -# define __OSL_SMB_SUPER_MAGIC 0x517B -# define __OSL_MSDOS_SUPER_MAGIC 0x4d44 -# define __OSL_NTFS_SUPER_MAGIC 0x5346544e -# define __OSL_STATFS_STRUCT struct statfs -# define __OSL_STATFS(dir, sfs) statfs((dir), (sfs)) -# define __OSL_STATFS_BLKSIZ(a) ((sal_uInt64)((a).f_bsize)) -# define __OSL_STATFS_IS_NFS(a) (__OSL_NFS_SUPER_MAGIC == (a).f_type) -# define __OSL_STATFS_IS_SMB(a) (__OSL_SMB_SUPER_MAGIC == (a).f_type) -# define __OSL_STATFS_ISREMOTE(a) (__OSL_STATFS_IS_NFS((a)) || __OSL_STATFS_IS_SMB((a))) -# define __OSL_STATFS_IS_CASE_SENSITIVE_FS(a) ((__OSL_MSDOS_SUPER_MAGIC != (a).f_type) && (__OSL_NTFS_SUPER_MAGIC != (a).f_type)) -# define __OSL_STATFS_IS_CASE_PRESERVING_FS(a) ((__OSL_MSDOS_SUPER_MAGIC != (a).f_type)) -#endif /* LINUX */ - -#if defined(SOLARIS) -# define __OSL_STATFS_STRUCT struct statvfs -# define __OSL_STATFS(dir, sfs) statvfs((dir), (sfs)) -# define __OSL_STATFS_BLKSIZ(a) ((sal_uInt64)((a).f_frsize)) -# define __OSL_STATFS_TYPENAME(a) ((a).f_basetype) -# define __OSL_STATFS_ISREMOTE(a) (rtl_str_compare((a).f_basetype, "nfs") == 0) - -/* always return true if queried for the properties of - the file system. If you think this is wrong under any - of the target platforms fix it!!!! */ -# define __OSL_STATFS_IS_CASE_SENSITIVE_FS(a) (1) -# define __OSL_STATFS_IS_CASE_PRESERVING_FS(a) (1) -#endif /* SOLARIS */ - -# define __OSL_STATFS_INIT(a) (memset(&(a), 0, sizeof(__OSL_STATFS_STRUCT))) - -#else /* no statfs available */ - -# define __OSL_STATFS_STRUCT struct dummy {int i;} -# define __OSL_STATFS_INIT(a) ((void)a) -# define __OSL_STATFS(dir, sfs) (1) -# define __OSL_STATFS_ISREMOTE(sfs) (0) -# define __OSL_STATFS_IS_CASE_SENSITIVE_FS(a) (1) -# define __OSL_STATFS_IS_CASE_PRESERVING_FS(a) (1) -#endif /* HAVE_STATFS_H */ - - -static oslFileError osl_psz_getVolumeInformation ( - const sal_Char* pszDirectory, oslVolumeInfo* pInfo, sal_uInt32 uFieldMask) -{ - __OSL_STATFS_STRUCT sfs; - - if (!pInfo) - return osl_File_E_INVAL; - - __OSL_STATFS_INIT(sfs); - - pInfo->uValidFields = 0; - pInfo->uAttributes = 0; - - if ((__OSL_STATFS(pszDirectory, &sfs)) < 0) - { - oslFileError result = oslTranslateFileError(OSL_FET_ERROR, errno); - return (result); - } - - /* FIXME: how to detect the kind of storage (fixed, cdrom, ...) */ - if (uFieldMask & osl_VolumeInfo_Mask_Attributes) - { - if (__OSL_STATFS_ISREMOTE(sfs)) - pInfo->uAttributes |= osl_Volume_Attribute_Remote; - - pInfo->uValidFields |= osl_VolumeInfo_Mask_Attributes; - } - - if (uFieldMask & osl_VolumeInfo_Mask_FileSystemCaseHandling) - { - if (__OSL_STATFS_IS_CASE_SENSITIVE_FS(sfs)) - pInfo->uAttributes |= osl_Volume_Attribute_Case_Sensitive; - - if (__OSL_STATFS_IS_CASE_PRESERVING_FS(sfs)) - pInfo->uAttributes |= osl_Volume_Attribute_Case_Is_Preserved; - - pInfo->uValidFields |= osl_VolumeInfo_Mask_Attributes; - } - - pInfo->uTotalSpace = 0; - pInfo->uFreeSpace = 0; - pInfo->uUsedSpace = 0; - -#if defined(__OSL_STATFS_BLKSIZ) - - if ((uFieldMask & osl_VolumeInfo_Mask_TotalSpace) || - (uFieldMask & osl_VolumeInfo_Mask_UsedSpace)) - { - pInfo->uTotalSpace = __OSL_STATFS_BLKSIZ(sfs); - pInfo->uTotalSpace *= (sal_uInt64)(sfs.f_blocks); - pInfo->uValidFields |= osl_VolumeInfo_Mask_TotalSpace; - } - - if ((uFieldMask & osl_VolumeInfo_Mask_FreeSpace) || - (uFieldMask & osl_VolumeInfo_Mask_UsedSpace)) - { - pInfo->uFreeSpace = __OSL_STATFS_BLKSIZ(sfs); - - if (getuid() == 0) - pInfo->uFreeSpace *= (sal_uInt64)(sfs.f_bfree); - else - pInfo->uFreeSpace *= (sal_uInt64)(sfs.f_bavail); - - pInfo->uValidFields |= osl_VolumeInfo_Mask_FreeSpace; - } - -#endif /* __OSL_STATFS_BLKSIZ */ - - if ((pInfo->uValidFields & osl_VolumeInfo_Mask_TotalSpace) && - (pInfo->uValidFields & osl_VolumeInfo_Mask_FreeSpace )) - { - pInfo->uUsedSpace = pInfo->uTotalSpace - pInfo->uFreeSpace; - pInfo->uValidFields |= osl_VolumeInfo_Mask_UsedSpace; - } - - pInfo->uMaxNameLength = 0; - if (uFieldMask & osl_VolumeInfo_Mask_MaxNameLength) - { - long nLen = pathconf(pszDirectory, _PC_NAME_MAX); - if (nLen > 0) - { - pInfo->uMaxNameLength = (sal_uInt32)nLen; - pInfo->uValidFields |= osl_VolumeInfo_Mask_MaxNameLength; - } - } - - pInfo->uMaxPathLength = 0; - if (uFieldMask & osl_VolumeInfo_Mask_MaxPathLength) - { - long nLen = pathconf (pszDirectory, _PC_PATH_MAX); - if (nLen > 0) - { - pInfo->uMaxPathLength = (sal_uInt32)nLen; - pInfo->uValidFields |= osl_VolumeInfo_Mask_MaxPathLength; - } - } - -#if defined(__OSL_STATFS_TYPENAME) - - if (uFieldMask & osl_VolumeInfo_Mask_FileSystemName) - { - rtl_string2UString( - &(pInfo->ustrFileSystemName), - __OSL_STATFS_TYPENAME(sfs), - rtl_str_getLength(__OSL_STATFS_TYPENAME(sfs)), - osl_getThreadTextEncoding(), - OUSTRING_TO_OSTRING_CVTFLAGS); - OSL_ASSERT(pInfo->ustrFileSystemName != 0); - - pInfo->uValidFields |= osl_VolumeInfo_Mask_FileSystemName; - } - -#endif /* __OSL_STATFS_TYPENAME */ - - if (uFieldMask & osl_VolumeInfo_Mask_DeviceHandle) - { - /* FIXME: check also entries in mntent for the device - and fill it with correct values */ - - *pInfo->pDeviceHandle = osl_isFloppyDrive(pszDirectory); - - if (*pInfo->pDeviceHandle) - { - pInfo->uValidFields |= osl_VolumeInfo_Mask_DeviceHandle; - pInfo->uAttributes |= osl_Volume_Attribute_Removeable; - pInfo->uValidFields |= osl_VolumeInfo_Mask_Attributes; - } - } - return osl_File_E_None; -} - -/****************************************************************************** - * - * GENERIC FLOPPY FUNCTIONS - * - *****************************************************************************/ - - -/***************************************** - * osl_unmountVolumeDevice - ****************************************/ - -oslFileError osl_unmountVolumeDevice( oslVolumeDeviceHandle Handle ) -{ - oslFileError tErr = osl_File_E_NOSYS; - - tErr = osl_unmountFloppy(Handle); - - /* Perhaps current working directory is set to mount point */ - - if ( tErr ) - { - sal_Char *pszHomeDir = getenv("HOME"); - - if ( pszHomeDir && strlen( pszHomeDir ) && 0 == chdir( pszHomeDir ) ) - { - /* try again */ - - tErr = osl_unmountFloppy(Handle); - - OSL_ENSURE( tErr, "osl_unmountVolumeDevice: CWD was set to volume mount point" ); - } - } - - return tErr; -} - -/***************************************** - * osl_automountVolumeDevice - ****************************************/ - -oslFileError osl_automountVolumeDevice( oslVolumeDeviceHandle Handle ) -{ - oslFileError tErr = osl_File_E_NOSYS; - - tErr = osl_mountFloppy(Handle); - - return tErr; -} - -/***************************************** - * osl_getVolumeDeviceMountPath - ****************************************/ -static rtl_uString* oslMakeUStrFromPsz(const sal_Char* pszStr, rtl_uString** ustrValid) -{ - rtl_string2UString( - ustrValid, - pszStr, - rtl_str_getLength( pszStr ), - osl_getThreadTextEncoding(), - OUSTRING_TO_OSTRING_CVTFLAGS ); - OSL_ASSERT(*ustrValid != 0); - - return *ustrValid; -} - -oslFileError osl_getVolumeDeviceMountPath( oslVolumeDeviceHandle Handle, rtl_uString **pstrPath ) -{ - oslVolumeDeviceHandleImpl* pItem = (oslVolumeDeviceHandleImpl*) Handle; - sal_Char Buffer[PATH_MAX]; - - Buffer[0] = '\0'; - - if ( pItem == 0 || pstrPath == 0 ) - { - return osl_File_E_INVAL; - } - - if ( pItem->ident[0] != 'O' || pItem->ident[1] != 'V' || pItem->ident[2] != 'D' || pItem->ident[3] != 'H' ) - { - return osl_File_E_INVAL; - } - -#ifdef DEBUG_OSL_FILE - fprintf(stderr,"Handle is:\n"); - osl_printFloppyHandle(pItem); -#endif - - snprintf(Buffer, sizeof(Buffer), "file://%s", pItem->pszMountPoint); - -#ifdef DEBUG_OSL_FILE - fprintf(stderr,"Mount Point is: '%s'\n",Buffer); -#endif - - oslMakeUStrFromPsz(Buffer, pstrPath); - - return osl_File_E_None; -} - -/***************************************** - * osl_acquireVolumeDeviceHandle - ****************************************/ - -oslFileError SAL_CALL osl_acquireVolumeDeviceHandle( oslVolumeDeviceHandle Handle ) -{ - oslVolumeDeviceHandleImpl* pItem =(oslVolumeDeviceHandleImpl*) Handle; - - if ( pItem == 0 ) - { - return osl_File_E_INVAL; - } - - if ( pItem->ident[0] != 'O' || pItem->ident[1] != 'V' || pItem->ident[2] != 'D' || pItem->ident[3] != 'H' ) - { - return osl_File_E_INVAL; - } - - ++pItem->RefCount; - - return osl_File_E_None; -} - -/***************************************** - * osl_releaseVolumeDeviceHandle - ****************************************/ - -oslFileError osl_releaseVolumeDeviceHandle( oslVolumeDeviceHandle Handle ) -{ - oslVolumeDeviceHandleImpl* pItem =(oslVolumeDeviceHandleImpl*) Handle; - - if ( pItem == 0 ) - { - return osl_File_E_INVAL; - } - - if ( pItem->ident[0] != 'O' || pItem->ident[1] != 'V' || pItem->ident[2] != 'D' || pItem->ident[3] != 'H' ) - { - return osl_File_E_INVAL; - } - - --pItem->RefCount; - - if ( pItem->RefCount == 0 ) - { - rtl_freeMemory(pItem); - } - - return osl_File_E_None; -} - -#if !defined(MACOSX) && !defined(AIX) - -/***************************************** - * osl_newVolumeDeviceHandleImpl - ****************************************/ - -static oslVolumeDeviceHandleImpl* osl_newVolumeDeviceHandleImpl() -{ - oslVolumeDeviceHandleImpl* pHandle; - const size_t nSizeOfHandle = sizeof(oslVolumeDeviceHandleImpl); - - pHandle = (oslVolumeDeviceHandleImpl*) rtl_allocateMemory (nSizeOfHandle); - if (pHandle != NULL) - { - pHandle->ident[0] = 'O'; - pHandle->ident[1] = 'V'; - pHandle->ident[2] = 'D'; - pHandle->ident[3] = 'H'; - pHandle->pszMountPoint[0] = '\0'; - pHandle->pszFilePath[0] = '\0'; - pHandle->pszDevice[0] = '\0'; - pHandle->RefCount = 1; - } - return pHandle; -} - -/***************************************** - * osl_freeVolumeDeviceHandleImpl - ****************************************/ - -static void osl_freeVolumeDeviceHandleImpl (oslVolumeDeviceHandleImpl* pHandle) -{ - if (pHandle != NULL) - rtl_freeMemory (pHandle); -} -#endif - -/****************************************************************************** - * - * SOLARIS FLOPPY FUNCTIONS - * - *****************************************************************************/ - -#if defined(SOLARIS) -/* compare a given devicename with the typical device names on a Solaris box */ -static sal_Bool -osl_isAFloppyDevice (const char* pDeviceName) -{ - const char* pFloppyDevice [] = { - "/dev/fd", "/dev/rfd", - "/dev/diskette", "/dev/rdiskette", - "/vol/dev/diskette", "/vol/dev/rdiskette" - }; - - int i; - for (i = 0; i < SAL_N_ELEMENTS(pFloppyDevice); i++) - { - if (strncmp(pDeviceName, pFloppyDevice[i], strlen(pFloppyDevice[i])) == 0) - return sal_True; - } - return sal_False; -} - -/* compare two directories whether the first may be a parent of the second. this - * does not realpath() resolving */ -static sal_Bool -osl_isAParentDirectory (const char* pParentDir, const char* pSubDir) -{ - return strncmp(pParentDir, pSubDir, strlen(pParentDir)) == 0; -} - -/* the name of the routine is obviously silly. But anyway create a - * oslVolumeDeviceHandle with correct mount point, device name and a resolved filepath - * only if pszPath points to file or directory on a floppy */ -static oslVolumeDeviceHandle -osl_isFloppyDrive(const sal_Char* pszPath) -{ - FILE* pMountTab; - struct mnttab aMountEnt; - oslVolumeDeviceHandleImpl* pHandle; - - if ((pHandle = osl_newVolumeDeviceHandleImpl()) == NULL) - { - return NULL; - } - if (realpath(pszPath, pHandle->pszFilePath) == NULL) - { - osl_freeVolumeDeviceHandleImpl (pHandle); - return NULL; - } - if ((pMountTab = fopen (MOUNTTAB, "r")) == NULL) - { - osl_freeVolumeDeviceHandleImpl (pHandle); - return NULL; - } - - while (getmntent(pMountTab, &aMountEnt) == 0) - { - const char *pMountPoint = aMountEnt.mnt_mountp; - const char *pDevice = aMountEnt.mnt_special; - if ( osl_isAParentDirectory (aMountEnt.mnt_mountp, pHandle->pszFilePath) - && osl_isAFloppyDevice (aMountEnt.mnt_special)) - { - /* skip the last item for it is the name of the disk */ - char * pc = strrchr( aMountEnt.mnt_special, '/' ); - - if ( NULL != pc ) - { - int len = pc - aMountEnt.mnt_special; - - strncpy( pHandle->pszDevice, aMountEnt.mnt_special, len ); - pHandle->pszDevice[len] = '\0'; - } - else - { - /* #106048 use save str functions to avoid buffer overflows */ - memset(pHandle->pszDevice, 0, sizeof(pHandle->pszDevice)); - strncpy(pHandle->pszDevice, aMountEnt.mnt_special, sizeof(pHandle->pszDevice) - 1); - } - - /* remember the mount point */ - memset(pHandle->pszMountPoint, 0, sizeof(pHandle->pszMountPoint)); - strncpy(pHandle->pszMountPoint, aMountEnt.mnt_mountp, sizeof(pHandle->pszMountPoint) - 1); - - fclose (pMountTab); - return pHandle; - } - } - - fclose (pMountTab); - osl_freeVolumeDeviceHandleImpl (pHandle); - return NULL; -} - -static oslFileError osl_mountFloppy(oslVolumeDeviceHandle hFloppy) -{ - FILE* pMountTab; - struct mnttab aMountEnt; - oslVolumeDeviceHandleImpl* pHandle = (oslVolumeDeviceHandleImpl*) hFloppy; - - int nRet=0; - sal_Char pszCmd[512] = ""; - - if ( pHandle == 0 ) - return osl_File_E_INVAL; - - /* FIXME: don't know what this is good for */ - if ( pHandle->ident[0] != 'O' || pHandle->ident[1] != 'V' || pHandle->ident[2] != 'D' || pHandle->ident[3] != 'H' ) - return osl_File_E_INVAL; - - snprintf(pszCmd, sizeof(pszCmd), "eject -q %s > /dev/null 2>&1", pHandle->pszDevice); - - nRet = system( pszCmd ); - - switch ( WEXITSTATUS(nRet) ) - { - case 0: - { - /* lookup the device in mount tab again */ - if ((pMountTab = fopen (MOUNTTAB, "r")) == NULL) - return osl_File_E_BUSY; - - while (getmntent(pMountTab, &aMountEnt) == 0) - { - const char *pMountPoint = aMountEnt.mnt_mountp; - const char *pDevice = aMountEnt.mnt_special; - if ( 0 == strncmp( pHandle->pszDevice, aMountEnt.mnt_special, strlen(pHandle->pszDevice) ) ) - { - memset(pHandle->pszMountPoint, 0, sizeof(pHandle->pszMountPoint)); - strncpy (pHandle->pszMountPoint, aMountEnt.mnt_mountp, sizeof(pHandle->pszMountPoint) - 1); - - fclose (pMountTab); - return osl_File_E_None; - } - } - - fclose (pMountTab); - return osl_File_E_BUSY; - } - //break; // break not necessary here, see return statements before - - case 1: - return osl_File_E_BUSY; - - default: - break; - } - - return osl_File_E_BUSY; -} - -static oslFileError osl_unmountFloppy(oslVolumeDeviceHandle hFloppy) -{ -// FILE* pMountTab; -// struct mnttab aMountEnt; - oslVolumeDeviceHandleImpl* pHandle = (oslVolumeDeviceHandleImpl*) hFloppy; - - int nRet=0; - sal_Char pszCmd[512] = ""; - - if ( pHandle == 0 ) - return osl_File_E_INVAL; - - /* FIXME: don't know what this is good for */ - if ( pHandle->ident[0] != 'O' || pHandle->ident[1] != 'V' || pHandle->ident[2] != 'D' || pHandle->ident[3] != 'H' ) - return osl_File_E_INVAL; - - snprintf(pszCmd, sizeof(pszCmd), "eject %s > /dev/null 2>&1", pHandle->pszDevice); - - nRet = system( pszCmd ); - - switch ( WEXITSTATUS(nRet) ) - { - case 0: - { - FILE* pMountTab; - struct mnttab aMountEnt; - - /* lookup if device is still in mount tab */ - if ((pMountTab = fopen (MOUNTTAB, "r")) == NULL) - return osl_File_E_BUSY; - - while (getmntent(pMountTab, &aMountEnt) == 0) - { - const char *pMountPoint = aMountEnt.mnt_mountp; - const char *pDevice = aMountEnt.mnt_special; - if ( 0 == strncmp( pHandle->pszDevice, aMountEnt.mnt_special, strlen(pHandle->pszDevice) ) ) - { - fclose (pMountTab); - return osl_File_E_BUSY; - } - } - - fclose (pMountTab); - pHandle->pszMountPoint[0] = 0; - return osl_File_E_None; - } - - //break; //break not necessary, see return statements before - - case 1: - return osl_File_E_NODEV; - - case 4: - pHandle->pszMountPoint[0] = 0; - return osl_File_E_None; - - default: - break; - } - - return osl_File_E_BUSY; -} - -#endif /* SOLARIS */ - -/****************************************************************************** - * - * LINUX FLOPPY FUNCTIONS - * - *****************************************************************************/ - -#if defined(LINUX) -static oslVolumeDeviceHandle -osl_isFloppyDrive (const sal_Char* pszPath) -{ - oslVolumeDeviceHandleImpl* pItem = osl_newVolumeDeviceHandleImpl(); - if (osl_getFloppyMountEntry(pszPath, pItem)) - return (oslVolumeDeviceHandle) pItem; - - osl_freeVolumeDeviceHandleImpl (pItem); - return 0; -} -#endif /* LINUX */ - -#if defined(LINUX) -static oslFileError osl_mountFloppy(oslVolumeDeviceHandle hFloppy) -{ - sal_Bool bRet = sal_False; - oslVolumeDeviceHandleImpl* pItem=0; - int nRet; - sal_Char pszCmd[PATH_MAX]; - const sal_Char* pszMountProg = "mount"; - sal_Char* pszSuDo = 0; - sal_Char* pszTmp = 0; - - pszCmd[0] = '\0'; - -#ifdef TRACE_OSL_FILE - fprintf(stderr,"In osl_mountFloppy\n"); -#endif - - pItem = (oslVolumeDeviceHandleImpl*) hFloppy; - - if ( pItem == 0 ) - { -#ifdef TRACE_OSL_FILE - fprintf(stderr,"Out osl_mountFloppy [pItem == 0]\n"); -#endif - - return osl_File_E_INVAL; - } - - if ( pItem->ident[0] != 'O' || pItem->ident[1] != 'V' || pItem->ident[2] != 'D' || pItem->ident[3] != 'H' ) - { -#ifdef TRACE_OSL_FILE - fprintf(stderr,"Out osl_mountFloppy [invalid handle]\n"); -#endif - return osl_File_E_INVAL; - } - - bRet = osl_isFloppyMounted(pItem); - if ( bRet == sal_True ) - { -#ifdef DEBUG_OSL_FILE - fprintf(stderr,"detected mounted floppy at '%s'\n",pItem->pszMountPoint); -#endif - return osl_File_E_BUSY; - } - - /* mfe: we can't use the mount(2) system call!!! */ - /* even if we are root */ - /* since mtab is not updated!!! */ - /* but we need it to be updated */ - /* some "magic" must be done */ - -/* nRet = mount(pItem->pszDevice,pItem->pszMountPoint,0,0,0); */ -/* if ( nRet != 0 ) */ -/* { */ -/* nRet=errno; */ -/* #ifdef DEBUG_OSL_FILE */ -/* perror("mount"); */ -/* #endif */ -/* } */ - - pszTmp = getenv("SAL_MOUNT_MOUNTPROG"); - if ( pszTmp != 0 ) - { - pszMountProg=pszTmp; - } - - pszTmp=getenv("SAL_MOUNT_SU_DO"); - if ( pszTmp != 0 ) - { - pszSuDo=pszTmp; - } - - if ( pszSuDo != 0 ) - { - snprintf(pszCmd, sizeof(pszCmd), "%s %s %s %s",pszSuDo,pszMountProg,pItem->pszDevice,pItem->pszMountPoint); - } - else - { - snprintf(pszCmd, sizeof(pszCmd), "%s %s",pszMountProg,pItem->pszMountPoint); - } - - -#ifdef DEBUG_OSL_FILE - fprintf(stderr,"executing '%s'\n",pszCmd); -#endif - - nRet = system(pszCmd); - -#ifdef DEBUG_OSL_FILE - fprintf(stderr,"call returned '%i'\n",nRet); - fprintf(stderr,"exit status is '%i'\n", WEXITSTATUS(nRet)); -#endif - - - switch ( WEXITSTATUS(nRet) ) - { - case 0: - nRet=0; - break; - - case 2: - nRet=EPERM; - break; - - case 4: - nRet=ENOENT; - break; - - case 8: - nRet=EINTR; - break; - - case 16: - nRet=EPERM; - break; - - case 32: - nRet=EBUSY; - break; - - case 64: - nRet=EAGAIN; - break; - - default: - nRet=EBUSY; - break; - } - - return ((0 == nRet) ? oslTranslateFileError(OSL_FET_SUCCESS, nRet) : oslTranslateFileError(OSL_FET_ERROR, nRet)); -} -#endif /* LINUX */ - - -#if defined(LINUX) -static oslFileError osl_unmountFloppy(oslVolumeDeviceHandle hFloppy) -{ - oslVolumeDeviceHandleImpl* pItem=0; - int nRet=0; - sal_Char pszCmd[PATH_MAX]; - sal_Char* pszTmp = 0; - sal_Char* pszSuDo = 0; - const sal_Char* pszUmountProg = "umount"; - - pszCmd[0] = '\0'; - -#ifdef TRACE_OSL_FILE - fprintf(stderr,"In osl_unmountFloppy\n"); -#endif - - pItem = (oslVolumeDeviceHandleImpl*) hFloppy; - - if ( pItem == 0 ) - { -#ifdef TRACE_OSL_FILE - fprintf(stderr,"Out osl_unmountFloppy [pItem==0]\n"); -#endif - return osl_File_E_INVAL; - } - - if ( pItem->ident[0] != 'O' || pItem->ident[1] != 'V' || pItem->ident[2] != 'D' || pItem->ident[3] != 'H' ) - { -#ifdef TRACE_OSL_FILE - fprintf(stderr,"Out osl_unmountFloppy [invalid handle]\n"); -#endif - return osl_File_E_INVAL; - } - - /* mfe: we can't use the umount(2) system call!!! */ - /* even if we are root */ - /* since mtab is not updated!!! */ - /* but we need it to be updated */ - /* some "magic" must be done */ - -/* nRet=umount(pItem->pszDevice); */ -/* if ( nRet != 0 ) */ -/* { */ -/* nRet = errno; */ - -/* #ifdef DEBUG_OSL_FILE */ -/* perror("mount"); */ -/* #endif */ -/* } */ - - - pszTmp = getenv("SAL_MOUNT_UMOUNTPROG"); - if ( pszTmp != 0 ) - { - pszUmountProg=pszTmp; - } - - pszTmp = getenv("SAL_MOUNT_SU_DO"); - if ( pszTmp != 0 ) - { - pszSuDo=pszTmp; - } - - if ( pszSuDo != 0 ) - { - snprintf(pszCmd, sizeof(pszCmd), "%s %s %s",pszSuDo,pszUmountProg,pItem->pszMountPoint); - } - else - { - snprintf(pszCmd, sizeof(pszCmd), "%s %s",pszUmountProg,pItem->pszMountPoint); - } - - -#ifdef DEBUG_OSL_FILE - fprintf(stderr,"executing '%s'\n",pszCmd); -#endif - - nRet = system(pszCmd); - -#ifdef DEBUG_OSL_FILE - fprintf(stderr,"call returned '%i'\n",nRet); - fprintf(stderr,"exit status is '%i'\n", WEXITSTATUS(nRet)); -#endif - - switch ( WEXITSTATUS(nRet) ) - { - case 0: - nRet=0; - break; - - default: - nRet=EBUSY; - break; - } - -#ifdef TRACE_OSL_FILE - fprintf(stderr,"Out osl_unmountFloppy [ok]\n"); -#endif - - return ((0 == nRet) ? oslTranslateFileError(OSL_FET_SUCCESS, nRet) : oslTranslateFileError(OSL_FET_ERROR, nRet)); - -/* return osl_File_E_None;*/ -} - -#endif /* LINUX */ - -#if defined(LINUX) -static sal_Bool -osl_getFloppyMountEntry(const sal_Char* pszPath, oslVolumeDeviceHandleImpl* pItem) -{ - struct mntent* pMountEnt; - FILE* pMountTab; - - pMountTab = setmntent (MOUNTTAB, "r"); - if (pMountTab == 0) - return sal_False; - - while ((pMountEnt = getmntent(pMountTab)) != 0) - { - if ( strncmp(pMountEnt->mnt_dir, pszPath, strlen(pMountEnt->mnt_dir)) == 0 - && strncmp(pMountEnt->mnt_fsname, "/dev/fd", strlen("/dev/fd")) == 0) - { - memset(pItem->pszMountPoint, 0, sizeof(pItem->pszMountPoint)); - strncpy(pItem->pszMountPoint, pMountEnt->mnt_dir, sizeof(pItem->pszMountPoint) - 1); - - memset(pItem->pszFilePath, 0, sizeof(pItem->pszFilePath)); - strncpy(pItem->pszFilePath, pMountEnt->mnt_dir, sizeof(pItem->pszFilePath) - 1); - - memset(pItem->pszDevice, 0, sizeof(pItem->pszDevice)); - strncpy(pItem->pszDevice, pMountEnt->mnt_fsname, sizeof(pItem->pszDevice) - 1); - - endmntent (pMountTab); - return sal_True; - } - } - - endmntent (pMountTab); - return sal_False; -} -#endif /* LINUX */ - -#if defined(LINUX) -static sal_Bool -osl_isFloppyMounted (oslVolumeDeviceHandleImpl* pDevice) -{ - oslVolumeDeviceHandleImpl aItem; - - if ( osl_getFloppyMountEntry (pDevice->pszMountPoint, &aItem) - && strcmp (aItem.pszMountPoint, pDevice->pszMountPoint) == 0 - && strcmp (aItem.pszDevice, pDevice->pszDevice) == 0) - { - return sal_True; - } - return sal_False; -} -#endif /* LINUX */ - -/* NetBSD floppy functions have to be added here. Until we have done that, - * we use the MACOSX definitions for nonexistent floppy. - * */ - -/****************************************************************************** - * - * Dummy floppy functions: no stinking floppies - * - *****************************************************************************/ - -#if (defined(MACOSX) || defined(IOS) || defined(ANDROID) || defined(NETBSD) || defined(FREEBSD) || \ - defined(AIX) || defined(OPENBSD) || defined(DRAGONFLY)) -static oslVolumeDeviceHandle osl_isFloppyDrive(const sal_Char* pszPath) -{ - (void)pszPath; - return NULL; -} -#endif - -#if ( defined(MACOSX) || defined(IOS) || defined(ANDROID) || defined(NETBSD) || defined(FREEBSD) || \ - defined(AIX) || defined(OPENBSD) || defined(DRAGONFLY)) -static oslFileError osl_mountFloppy(oslVolumeDeviceHandle hFloppy) -{ - (void)hFloppy; - return osl_File_E_BUSY; -} -#endif - -#if ( defined(MACOSX) || defined(IOS) || defined(ANDROID) || defined(NETBSD) || defined(FREEBSD) || \ - defined(AIX) || defined(OPENBSD) || defined(DRAGONFLY)) -static oslFileError osl_unmountFloppy(oslVolumeDeviceHandle hFloppy) -{ - (void)hFloppy; - return osl_File_E_BUSY; -} -#endif - -#if ( defined(NETBSD) || defined(IOS) || defined(FREEBSD) || defined(OPENBSD) || defined(DRAGONFLY) ) -static sal_Bool osl_getFloppyMountEntry(const sal_Char* pszPath, oslVolumeDeviceHandleImpl* pItem) -{ - return sal_False; -} -#endif /* NETBSD || FREEBSD || OPENBSD */ - -#if ( defined(NETBSD) || defined(IOS) || defined(FREEBSD) || defined(OPENBSD) || defined(DRAGONFLY) ) -static sal_Bool osl_isFloppyMounted(oslVolumeDeviceHandleImpl* pDevice) -{ - return sal_False; -} -#endif /* NETBSD || FREEBSD || OPENBSD */ - - -#ifdef DEBUG_OSL_FILE -static void osl_printFloppyHandle(oslVolumeDeviceHandleImpl* pItem) -{ - if (pItem == 0 ) - { - fprintf(stderr,"NULL Handle\n"); - return; - } - if ( pItem->ident[0] != 'O' || pItem->ident[1] != 'V' || pItem->ident[2] != 'D' || pItem->ident[3] != 'H' ) - { -#ifdef TRACE_OSL_FILE - fprintf(stderr,"Invalid Handle]\n"); -#endif - return; - } - - - fprintf(stderr,"MountPoint : '%s'\n",pItem->pszMountPoint); - fprintf(stderr,"FilePath : '%s'\n",pItem->pszFilePath); - fprintf(stderr,"Device : '%s'\n",pItem->pszDevice); - - return; -} -#endif - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sal/osl/unx/interlck.c b/sal/osl/unx/interlck.c deleted file mode 100644 index a32f67c11..000000000 --- a/sal/osl/unx/interlck.c +++ /dev/null @@ -1,196 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2000, 2010 Oracle and/or its affiliates. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * <http://www.openoffice.org/license.html> - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - - -#include "system.h" - -#include <osl/armarch.h> -#include <osl/interlck.h> -#include <osl/diagnose.h> - -#if ( defined ( SOLARIS ) || defined ( NETBSD ) ) && defined ( SPARC ) -#error please use asm/interlck_sparc.s -#elif defined ( SOLARIS) && defined ( X86 ) -#error please use asm/interlck_x86.s -#elif defined ( ARM ) && (( __GNUC__ < 4 ) || (( __GNUC__ == 4) && ( __GNUC_MINOR__ < 6 ))) && ( __ARM_ARCH__ >= 6) -// assembler implementation for gcc <4.6 on arm -// originally contributed by Eric Bachard / OOo4Kids -// replaced with the asm code generated by Linaro gcc 4.5 -// which includes memory barriers to make it SMP-safe -// #i117017# and lp#726529 -oslInterlockedCount SAL_CALL osl_incrementInterlockedCount(oslInterlockedCount* pCount) -{ - register oslInterlockedCount nCount __asm__ ("r1"); - int nResult; - - __asm__ __volatile__ ( -" dmb\n" -"1: ldrex %0, [%3]\n" -" add %0, %0, #1\n" -" strex %1, %0, [%3]\n" -" teq %1, #0\n" -" bne 1b\n" -" dmb\n" - : "=&r" (nCount), "=&r" (nResult), "=m" (*pCount) - : "r" (pCount) - : "memory"); - - return nCount; -} - -oslInterlockedCount SAL_CALL osl_decrementInterlockedCount(oslInterlockedCount* pCount) -{ - register oslInterlockedCount nCount __asm__ ("r1"); - int nResult; - - __asm__ __volatile__ ( -" dmb\n" -"0: ldrex %0, [%3]\n" -" sub %0, %0, #1\n" -" strex %1, %0, [%3]\n" -" teq %1, #0\n" -" bne 0b\n" -" dmb\n" - : "=&r" (nCount), "=&r" (nResult), "=m" (*pCount) - : "r" (pCount) - : "memory"); - - return nCount; -} -#elif defined ( GCC ) && ( defined ( X86 ) || defined ( X86_64 ) ) -/* That's possible on x86-64 too since oslInterlockedCount is a sal_Int32 */ - -extern int osl_isSingleCPU; - -/*****************************************************************************/ -/* osl_incrementInterlockedCount */ -/*****************************************************************************/ -oslInterlockedCount SAL_CALL osl_incrementInterlockedCount(oslInterlockedCount* pCount) -{ - // Fast case for old, slow, single CPU Intel machines for whom - // interlocking is a performance nightmare. - register oslInterlockedCount nCount asm("%eax"); - nCount = 1; - - if ( osl_isSingleCPU ) { - __asm__ __volatile__ ( - "xaddl %0, %1\n\t" - : "+r" (nCount), "+m" (*pCount) - : /* nothing */ - : "memory"); - return ++nCount; - } -#if ( __GNUC__ > 4 ) || (( __GNUC__ == 4) && ( __GNUC_MINOR__ >= 4 )) - else - return __sync_add_and_fetch (pCount, 1); -#else - else { - __asm__ __volatile__ ( - "lock\n\t" - "xaddl %0, %1\n\t" - : "+r" (nCount), "+m" (*pCount) - : /* nothing */ - : "memory"); - } - return ++nCount; -#endif -} - -oslInterlockedCount SAL_CALL osl_decrementInterlockedCount(oslInterlockedCount* pCount) -{ - register oslInterlockedCount nCount asm("%eax"); - nCount = -1; - - if ( osl_isSingleCPU ) { - __asm__ __volatile__ ( - "xaddl %0, %1\n\t" - : "+r" (nCount), "+m" (*pCount) - : /* nothing */ - : "memory"); - return --nCount; - } -#if ( __GNUC__ > 4 ) || (( __GNUC__ == 4) && ( __GNUC_MINOR__ >= 4 )) - else - return __sync_sub_and_fetch (pCount, 1); -#else - else { - __asm__ __volatile__ ( - "lock\n\t" - "xaddl %0, %1\n\t" - : "+r" (nCount), "+m" (*pCount) - : /* nothing */ - : "memory"); - } - return --nCount; -#endif -} -#elif ( __GNUC__ > 4 ) || (( __GNUC__ == 4) && ( __GNUC_MINOR__ >= 4 )) -oslInterlockedCount SAL_CALL osl_incrementInterlockedCount(oslInterlockedCount* pCount) -{ - return __sync_add_and_fetch(pCount, 1); -} -oslInterlockedCount SAL_CALL osl_decrementInterlockedCount(oslInterlockedCount* pCount) -{ - return __sync_sub_and_fetch(pCount, 1); -} -#else -/* use only if nothing else works, expensive due to single mutex for all reference counts */ - -static pthread_mutex_t InterLock = PTHREAD_MUTEX_INITIALIZER; - -/*****************************************************************************/ -/* osl_incrementInterlockedCount */ -/*****************************************************************************/ -oslInterlockedCount SAL_CALL osl_incrementInterlockedCount(oslInterlockedCount* pCount) -{ - oslInterlockedCount Count; - - pthread_mutex_lock(&InterLock); - Count = ++(*pCount); - pthread_mutex_unlock(&InterLock); - - return (Count); -} - -/*****************************************************************************/ -/* osl_decrementInterlockedCount */ -/*****************************************************************************/ -oslInterlockedCount SAL_CALL osl_decrementInterlockedCount(oslInterlockedCount* pCount) -{ - oslInterlockedCount Count; - - pthread_mutex_lock(&InterLock); - Count = --(*pCount); - pthread_mutex_unlock(&InterLock); - - return (Count); -} - -#endif /* default */ - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sal/osl/unx/makefile.mk b/sal/osl/unx/makefile.mk deleted file mode 100644 index 2ec11e16f..000000000 --- a/sal/osl/unx/makefile.mk +++ /dev/null @@ -1,183 +0,0 @@ -#************************************************************************* -# -# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. -# -# Copyright 2000, 2010 Oracle and/or its affiliates. -# -# OpenOffice.org - a multi-platform office productivity suite -# -# This file is part of OpenOffice.org. -# -# OpenOffice.org is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License version 3 -# only, as published by the Free Software Foundation. -# -# OpenOffice.org is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License version 3 for more details -# (a copy is included in the LICENSE file that accompanied this code). -# -# You should have received a copy of the GNU Lesser General Public License -# version 3 along with OpenOffice.org. If not, see -# <http://www.openoffice.org/license.html> -# for a copy of the LGPLv3 License. -# -#************************************************************************* - -PRJ=..$/.. - -PRJNAME=sal -.IF "$(WORK_STAMP)"=="MIX364" -TARGET=cppsal -.ELSE -TARGET=cpposl -.ENDIF -USE_LDUMP2=TRUE - -PROJECTPCH4DLL=TRUE -PROJECTPCH=cont_pch -PROJECTPCHSOURCE=cont_pch - -TARGETTYPE=CUI - -ENABLE_EXCEPTIONS=TRUE -# --- Settings ----------------------------------------------------- - -.INCLUDE : settings.mk - -CFLAGS+= $(LFS_CFLAGS) -CXXFLAGS+= $(LFS_CFLAGS) - -.IF "$(OS)" == "IOS" -CFLAGSCXX+=-D__IPHONE_OS_VERSION_MIN_REQUIRED=40300 -.ENDIF - -# --- Files -------------------------------------------------------- - -SLOFILES= \ - $(SLO)$/conditn.obj \ - $(SLO)$/diagnose.obj \ - $(SLO)$/semaphor.obj \ - $(SLO)$/socket.obj \ - $(SLO)$/interlck.obj \ - $(SLO)$/mutex.obj \ - $(SLO)$/nlsupport.obj \ - $(SLO)$/thread.obj \ - $(SLO)$/module.obj \ - $(SLO)$/process.obj \ - $(SLO)$/security.obj \ - $(SLO)$/profile.obj \ - $(SLO)$/time.obj \ - $(SLO)$/signal.obj \ - $(SLO)$/pipe.obj \ - $(SLO)$/system.obj \ - $(SLO)$/util.obj \ - $(SLO)$/tempfile.obj\ - $(SLO)$/file.obj \ - $(SLO)$/file_misc.obj\ - $(SLO)$/file_url.obj\ - $(SLO)$/file_error_transl.obj\ - $(SLO)$/file_path_helper.obj\ - $(SLO)$/file_stat.obj \ - $(SLO)$/file_volume.obj \ - $(SLO)$/uunxapi.obj\ - $(SLO)$/process_impl.obj\ - $(SLO)$/salinit.obj \ - $(SLO)$/readwrite_helper.obj - -OBJFILES= $(OBJ)$/conditn.obj \ - $(OBJ)$/diagnose.obj \ - $(OBJ)$/semaphor.obj \ - $(OBJ)$/socket.obj \ - $(OBJ)$/interlck.obj \ - $(OBJ)$/mutex.obj \ - $(OBJ)$/nlsupport.obj \ - $(OBJ)$/thread.obj \ - $(OBJ)$/module.obj \ - $(OBJ)$/process.obj \ - $(OBJ)$/security.obj \ - $(OBJ)$/profile.obj \ - $(OBJ)$/time.obj \ - $(OBJ)$/signal.obj \ - $(OBJ)$/pipe.obj \ - $(OBJ)$/system.obj \ - $(OBJ)$/util.obj \ - $(OBJ)$/tempfile.obj\ - $(OBJ)$/file.obj \ - $(OBJ)$/file_misc.obj\ - $(OBJ)$/file_url.obj\ - $(OBJ)$/file_error_transl.obj\ - $(OBJ)$/file_path_helper.obj\ - $(OBJ)$/file_stat.obj \ - $(OBJ)$/file_volume.obj \ - $(OBJ)$/uunxapi.obj\ - $(OBJ)$/process_impl.obj\ - $(OBJ)$/salinit.obj \ - $(OBJ)$/readwrite_helper.obj - - -.IF "$(OS)"=="MACOSX" || "$(OS)"=="IOS" -SLOFILES += $(SLO)$/osxlocale.obj -.ENDIF - -.IF "$(OS)"=="SOLARIS" || "$(OS)"=="FREEBSD" || "$(OS)"=="NETBSD" || \ - "$(OS)$(CPU)"=="LINUXS" || "$(OS)"=="MACOSX" || "$(OS)"=="AIX" || \ - "$(OS)"=="OPENBSD" || "$(OS)"=="DRAGONFLY" -SLOFILES += $(SLO)$/backtrace.obj -OBJFILES += $(OBJ)$/backtrace.obj -.ENDIF - -# --- Targets ------------------------------------------------------ - -.IF "$(COM)"=="C50" -APP1STDLIBS+=-lC -.ENDIF - -.IF "$(ENABLE_CRASHDUMP)" != "" || "$(PRODUCT)" == "" -CFLAGS+=-DSAL_ENABLE_CRASH_REPORT -.ENDIF - -.IF "$(OS)" == "IOS" -CFLAGS+=-DNO_DL_FUNCTIONS -DNO_CHILD_PROCESSES -.ENDIF - -.INCLUDE : target.mk - -.IF "$(OS)$(CPU)"=="SOLARISU" || "$(OS)$(CPU)"=="SOLARISS" || "$(OS)$(CPU)"=="NETBSDS" || "$(OS)$(CPU)"=="LINUXS" - -$(SLO)$/interlck.obj: $(SLO)$/interlck.o - touch $(SLO)$/interlck.obj - -$(OBJ)$/interlck.obj: $(OBJ)$/interlck.o - touch $(OBJ)$/interlck.obj - -$(SLO)$/interlck.o: $(MISC)$/interlck_sparc.s - $(ASM) $(AFLAGS) -o $@ $< - -$(OBJ)$/interlck.o: $(MISC)$/interlck_sparc.s - $(ASM) $(AFLAGS) -o $@ $< - -$(MISC)$/interlck_sparc.s: asm/interlck_sparc.s - tr -d "\015" < $< > $@ - -.ENDIF - -.IF "$(OS)$(CPU)"=="SOLARISI" - -$(SLO)$/interlck.obj: $(SLO)$/interlck.o - touch $(SLO)$/interlck.obj - -$(OBJ)$/interlck.obj: $(OBJ)$/interlck.o - touch $(OBJ)$/interlck.obj - -$(SLO)$/interlck.o: $(MISC)$/interlck_x86.s - $(ASM) $(AFLAGS) -o $@ $< - -$(OBJ)$/interlck.o: $(MISC)$/interlck_x86.s - $(ASM) $(AFLAGS) -o $@ $< - -$(MISC)$/interlck_x86.s: asm/interlck_x86.s - tr -d "\015" < $< > $@ - -.ENDIF diff --git a/sal/osl/unx/module.c b/sal/osl/unx/module.c deleted file mode 100644 index fefb31370..000000000 --- a/sal/osl/unx/module.c +++ /dev/null @@ -1,317 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2000, 2010 Oracle and/or its affiliates. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * <http://www.openoffice.org/license.html> - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -#include <sal/types.h> -#include <osl/diagnose.h> -#include <osl/module.h> -#include <osl/thread.h> -#include <osl/process.h> -#include <osl/file.h> - -#include "system.h" - -#if OSL_DEBUG_LEVEL > 1 -#include <stdio.h> -#endif - -#ifdef AIX -#include <sys/ldr.h> -#endif - -/* implemented in file.c */ -extern int UnicodeToText(char *, size_t, const sal_Unicode *, sal_Int32); - -/*****************************************************************************/ -/* osl_loadModule */ -/*****************************************************************************/ - -oslModule SAL_CALL osl_loadModule(rtl_uString *ustrModuleName, sal_Int32 nRtldMode) -{ - oslModule pModule=0; - rtl_uString* ustrTmp = NULL; - - OSL_ENSURE(ustrModuleName,"osl_loadModule : string is not valid"); - - /* ensure ustrTmp hold valid string */ - if (osl_File_E_None != osl_getSystemPathFromFileURL(ustrModuleName, &ustrTmp)) - rtl_uString_assign(&ustrTmp, ustrModuleName); - - if (ustrTmp) - { - char buffer[PATH_MAX]; - - if (UnicodeToText(buffer, PATH_MAX, ustrTmp->buffer, ustrTmp->length)) - pModule = osl_loadModuleAscii(buffer, nRtldMode); - rtl_uString_release(ustrTmp); - } - - return pModule; -} - -/*****************************************************************************/ -/* osl_loadModuleAscii */ -/*****************************************************************************/ - -oslModule SAL_CALL osl_loadModuleAscii(const sal_Char *pModuleName, sal_Int32 nRtldMode) -{ - OSL_ASSERT( - (nRtldMode & SAL_LOADMODULE_LAZY) == 0 || - (nRtldMode & SAL_LOADMODULE_NOW) == 0); /* only either LAZY or NOW */ - if (pModuleName) - { -#ifndef NO_DL_FUNCTIONS - int rtld_mode = - ((nRtldMode & SAL_LOADMODULE_NOW) ? RTLD_NOW : RTLD_LAZY) | - ((nRtldMode & SAL_LOADMODULE_GLOBAL) ? RTLD_GLOBAL : RTLD_LOCAL); - void* pLib = dlopen(pModuleName, rtld_mode); - -#if OSL_DEBUG_LEVEL > 1 - if (pLib == 0) - OSL_TRACE("Error osl_loadModule: %s\n", dlerror()); -#endif /* OSL_DEBUG_LEVEL */ - - return ((oslModule)(pLib)); - -#else /* NO_DL_FUNCTIONS */ - printf("No DL Functions\n"); -#endif /* NO_DL_FUNCTIONS */ - } - return NULL; -} - -/*****************************************************************************/ -/* osl_getModuleHandle */ -/*****************************************************************************/ - -sal_Bool SAL_CALL -osl_getModuleHandle(rtl_uString *pModuleName, oslModule *pResult) -{ - (void) pModuleName; /* avoid warning about unused parameter */ -#if !defined(NO_DL_FUNCTIONS) || defined(IOS) - *pResult = (oslModule) RTLD_DEFAULT; -#else - *pResult = NULL; -#endif - return sal_True; -} - -/*****************************************************************************/ -/* osl_unloadModule */ -/*****************************************************************************/ -void SAL_CALL osl_unloadModule(oslModule hModule) -{ - if (hModule) - { -#ifndef NO_DL_FUNCTIONS - int nRet = dlclose(hModule); - -#if OSL_DEBUG_LEVEL > 1 - if (nRet != 0) - { - fprintf(stderr, "Error osl_unloadModule: %s\n", dlerror()); - } -#else - (void) nRet; -#endif /* if OSL_DEBUG_LEVEL */ - -#endif /* ifndef NO_DL_FUNCTIONS */ - } -} - -/*****************************************************************************/ -/* osl_getSymbol */ -/*****************************************************************************/ -void* SAL_CALL -osl_getSymbol(oslModule Module, rtl_uString* pSymbolName) -{ - return (void *) osl_getFunctionSymbol(Module, pSymbolName); -} - - -/*****************************************************************************/ -/* osl_getAsciiFunctionSymbol */ -/*****************************************************************************/ -oslGenericFunction SAL_CALL -osl_getAsciiFunctionSymbol(oslModule Module, const sal_Char *pSymbol) -{ - void *fcnAddr = NULL; - -/* We do want to use dlsym on iOS */ -#if !defined(NO_DL_FUNCTIONS) || defined(IOS) - if (pSymbol) - { - fcnAddr = dlsym(Module, pSymbol); - - if (!fcnAddr) - OSL_TRACE("Error osl_getAsciiFunctionSymbol: %s\n", dlerror()); - } -#endif - - return (oslGenericFunction) fcnAddr; -} - -/*****************************************************************************/ -/* osl_getFunctionSymbol */ -/*****************************************************************************/ -oslGenericFunction SAL_CALL -osl_getFunctionSymbol(oslModule module, rtl_uString *puFunctionSymbolName) -{ - oslGenericFunction pSymbol = NULL; - - if( puFunctionSymbolName ) - { - rtl_String* pSymbolName = NULL; - - rtl_uString2String( &pSymbolName, - rtl_uString_getStr(puFunctionSymbolName), - rtl_uString_getLength(puFunctionSymbolName), - RTL_TEXTENCODING_UTF8, - OUSTRING_TO_OSTRING_CVTFLAGS ); - - if( pSymbolName != NULL ) - { - pSymbol = osl_getAsciiFunctionSymbol(module, rtl_string_getStr(pSymbolName)); - rtl_string_release(pSymbolName); - } - } - - return pSymbol; -} - -/*****************************************************************************/ -/* osl_getModuleURLFromAddress */ -/*****************************************************************************/ -sal_Bool SAL_CALL osl_getModuleURLFromAddress(void * addr, rtl_uString ** ppLibraryUrl) -{ - sal_Bool result = sal_False; -/* Bah, we do want to use dladdr here also on iOS, I think? */ -#if !defined(NO_DL_FUNCTIONS) || defined(IOS) -#if defined(AIX) - int i; - int size = 4 * 1024; - char *buf, *filename=NULL; - struct ld_info *lp; - - if ((buf = malloc(size)) == NULL) - return result; - - while((i = loadquery(L_GETINFO, buf, size)) == -1 && errno == ENOMEM) - { - size += 4 * 1024; - if ((buf = malloc(size)) == NULL) - break; - } - - lp = (struct ld_info*) buf; - while (lp) - { - unsigned long start = (unsigned long)lp->ldinfo_dataorg; - unsigned long end = start + lp->ldinfo_datasize; - if (start <= (unsigned long)addr && end > (unsigned long)addr) - { - filename = lp->ldinfo_filename; - break; - } - if (!lp->ldinfo_next) - break; - lp = (struct ld_info*) ((char *) lp + lp->ldinfo_next); - } - - if (filename) - { - rtl_uString * workDir = NULL; - osl_getProcessWorkingDir(&workDir); - if (workDir) - { -#if OSL_DEBUG_LEVEL > 1 - OSL_TRACE("module.c::osl_getModuleURLFromAddress - %s\n", filename); -#endif - rtl_string2UString(ppLibraryUrl, - filename, - strlen(filename), - osl_getThreadTextEncoding(), - OSTRING_TO_OUSTRING_CVTFLAGS); - - OSL_ASSERT(*ppLibraryUrl != NULL); - osl_getFileURLFromSystemPath(*ppLibraryUrl, ppLibraryUrl); - osl_getAbsoluteFileURL(workDir, *ppLibraryUrl, ppLibraryUrl); - - rtl_uString_release(workDir); - result = sal_True; - } - else - { - result = sal_False; - } - } - - free(buf); -#else - Dl_info dl_info; - - if ((result = dladdr(addr, &dl_info)) != 0) - { - rtl_uString * workDir = NULL; - osl_getProcessWorkingDir(&workDir); - if (workDir) - { -#if OSL_DEBUG_LEVEL > 1 - OSL_TRACE("module.c::osl_getModuleURLFromAddress - %s\n", dl_info.dli_fname); -#endif - rtl_string2UString(ppLibraryUrl, - dl_info.dli_fname, - strlen(dl_info.dli_fname), - osl_getThreadTextEncoding(), - OSTRING_TO_OUSTRING_CVTFLAGS); - - OSL_ASSERT(*ppLibraryUrl != NULL); - osl_getFileURLFromSystemPath(*ppLibraryUrl, ppLibraryUrl); - osl_getAbsoluteFileURL(workDir, *ppLibraryUrl, ppLibraryUrl); - - rtl_uString_release(workDir); - result = sal_True; - } - else - { - result = sal_False; - } - } -#endif -#endif - return result; -} - -/*****************************************************************************/ -/* osl_getModuleURLFromFunctionAddress */ -/*****************************************************************************/ -sal_Bool SAL_CALL osl_getModuleURLFromFunctionAddress(oslGenericFunction addr, rtl_uString ** ppLibraryUrl) -{ - return osl_getModuleURLFromAddress((void*)addr, ppLibraryUrl); -} - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sal/osl/unx/mutex.c b/sal/osl/unx/mutex.c deleted file mode 100644 index d4ca66d03..000000000 --- a/sal/osl/unx/mutex.c +++ /dev/null @@ -1,224 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2000, 2010 Oracle and/or its affiliates. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * <http://www.openoffice.org/license.html> - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -#include "system.h" - -#include <osl/mutex.h> -#include <osl/diagnose.h> - -#include <pthread.h> -#include <stdlib.h> - -#if defined LINUX /* bad hack */ -int pthread_mutexattr_setkind_np(pthread_mutexattr_t *, int); -#define pthread_mutexattr_settype pthread_mutexattr_setkind_np -#define PTHREAD_MUTEX_RECURSIVE PTHREAD_MUTEX_RECURSIVE_NP -#endif - -/* - Implementation notes: - oslMutex hides a pointer to the oslMutexImpl structure, which - ist needed to manage recursive locks on a mutex. - -*/ - -typedef struct _oslMutexImpl -{ - pthread_mutex_t mutex; -} oslMutexImpl; - - -/*****************************************************************************/ -/* osl_createMutex */ -/*****************************************************************************/ -oslMutex SAL_CALL osl_createMutex() -{ - oslMutexImpl* pMutex = (oslMutexImpl*) malloc(sizeof(oslMutexImpl)); - pthread_mutexattr_t aMutexAttr; - int nRet=0; - - OSL_ASSERT(pMutex); - - if ( pMutex == 0 ) - { - return 0; - } - - pthread_mutexattr_init(&aMutexAttr); - - nRet = pthread_mutexattr_settype(&aMutexAttr, PTHREAD_MUTEX_RECURSIVE); - if( nRet == 0 ) - nRet = pthread_mutex_init(&(pMutex->mutex), &aMutexAttr); - if ( nRet != 0 ) - { - OSL_TRACE("osl_createMutex : mutex init/setattr failed. Errno: %d; %s\n", - nRet, strerror(nRet)); - - free(pMutex); - pMutex = 0; - } - - pthread_mutexattr_destroy(&aMutexAttr); - - return (oslMutex) pMutex; -} - -/*****************************************************************************/ -/* osl_destroyMutex */ -/*****************************************************************************/ -void SAL_CALL osl_destroyMutex(oslMutex Mutex) -{ - oslMutexImpl* pMutex = (oslMutexImpl*) Mutex; - - OSL_ASSERT(pMutex); - - if ( pMutex != 0 ) - { - int nRet=0; - - nRet = pthread_mutex_destroy(&(pMutex->mutex)); - if ( nRet != 0 ) - { - OSL_TRACE("osl_destroyMutex : mutex destroy failed. Errno: %d; %s\n", - nRet, strerror(nRet)); - } - - free(pMutex); - } - - return; -} - -/*****************************************************************************/ -/* osl_acquireMutex */ -/*****************************************************************************/ -sal_Bool SAL_CALL osl_acquireMutex(oslMutex Mutex) -{ - oslMutexImpl* pMutex = (oslMutexImpl*) Mutex; - - OSL_ASSERT(pMutex); - - if ( pMutex != 0 ) - { - int nRet=0; - - nRet = pthread_mutex_lock(&(pMutex->mutex)); - if ( nRet != 0 ) - { - OSL_TRACE("osl_acquireMutex : mutex lock failed. Errno: %d; %s\n", - nRet, strerror(nRet)); - return sal_False; - } - return sal_True; - } - - /* not initialized */ - return sal_False; -} - -/*****************************************************************************/ -/* osl_tryToAcquireMutex */ -/*****************************************************************************/ -sal_Bool SAL_CALL osl_tryToAcquireMutex(oslMutex Mutex) -{ - oslMutexImpl* pMutex = (oslMutexImpl*) Mutex; - - OSL_ASSERT(pMutex); - - if ( pMutex ) - { - int nRet = 0; - nRet = pthread_mutex_trylock(&(pMutex->mutex)); - if ( nRet != 0 ) - return sal_False; - - return sal_True; - } - - /* not initialized */ - return sal_False; -} - -/*****************************************************************************/ -/* osl_releaseMutex */ -/*****************************************************************************/ -sal_Bool SAL_CALL osl_releaseMutex(oslMutex Mutex) -{ - oslMutexImpl* pMutex = (oslMutexImpl*) Mutex; - - OSL_ASSERT(pMutex); - - if ( pMutex ) - { - int nRet=0; - nRet = pthread_mutex_unlock(&(pMutex->mutex)); - if ( nRet != 0 ) - { - OSL_TRACE("osl_releaseMutex : mutex unlock failed. Errno: %d; %s\n", - nRet, strerror(nRet)); - return sal_False; - } - - return sal_True; - } - - /* not initialized */ - return sal_False; -} - -/*****************************************************************************/ -/* osl_getGlobalMutex */ -/*****************************************************************************/ - -static oslMutexImpl globalMutexImpl; - -static void globalMutexInitImpl(void) { - pthread_mutexattr_t attr; - if (pthread_mutexattr_init(&attr) != 0 || - pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE) || - pthread_mutex_init(&globalMutexImpl.mutex, &attr) != 0 || - pthread_mutexattr_destroy(&attr) != 0) - { - abort(); - } -} - -oslMutex * SAL_CALL osl_getGlobalMutex() -{ - /* necessary to get a "oslMutex *" */ - static oslMutex globalMutex = (oslMutex) &globalMutexImpl; - - static pthread_once_t once = PTHREAD_ONCE_INIT; - if (pthread_once(&once, &globalMutexInitImpl) != 0) { - abort(); - } - - return &globalMutex; -} - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sal/osl/unx/nlsupport.c b/sal/osl/unx/nlsupport.c deleted file mode 100644 index c02af7852..000000000 --- a/sal/osl/unx/nlsupport.c +++ /dev/null @@ -1,975 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2000, 2010 Oracle and/or its affiliates. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * <http://www.openoffice.org/license.html> - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -#include <osl/nlsupport.h> -#include <osl/diagnose.h> -#include <osl/process.h> -#include <rtl/memory.h> - -#if defined(LINUX) || defined(SOLARIS) || defined(NETBSD) || \ - defined(FREEBSD) || defined(MACOSX) || defined(IOS) || defined(OPENBSD) || \ - defined(DRAGONFLY) -#include <pthread.h> -#if !defined(MACOSX) && !defined(IOS) - #include <locale.h> - #include <langinfo.h> -#else -#include <osl/module.h> -#include <osl/thread.h> -#endif /* !MACOSX && !IOS */ -#endif /* LINUX || SOLARIS || NETBSD || MACOSX || IOS */ - -#include <string.h> - -/***************************************************************************** - typedefs - *****************************************************************************/ - - -typedef struct { - const char *key; - const rtl_TextEncoding value; -} _pair; - - -/***************************************************************************** - compare function for binary search - *****************************************************************************/ - -static int -_pair_compare (const char *key, const _pair *pair) -{ - int result = rtl_str_compareIgnoreAsciiCase( key, pair->key ); - return result; -} - -/***************************************************************************** - binary search on encoding tables - *****************************************************************************/ - -static const _pair* -_pair_search (const char *key, const _pair *base, unsigned int member ) -{ - unsigned int lower = 0; - unsigned int upper = member; - unsigned int current; - int comparison; - - /* check for validity of input */ - if ( (key == NULL) || (base == NULL) || (member == 0) ) - return NULL; - - /* binary search */ - while ( lower < upper ) - { - current = (lower + upper) / 2; - comparison = _pair_compare( key, base + current ); - if (comparison < 0) - upper = current; - else if (comparison > 0) - lower = current + 1; - else - return base + current; - } - - return NULL; -} - - -/***************************************************************************** - convert rtl_Locale to locale string - *****************************************************************************/ - -static char * _compose_locale( rtl_Locale * pLocale, char * buffer, size_t n ) -{ - /* check if a valid locale is specified */ - if( pLocale && pLocale->Language && - (pLocale->Language->length == 2 || pLocale->Language->length == 3) ) - { - size_t offset = 0; - - /* convert language code to ascii */ - { - rtl_String *pLanguage = NULL; - - rtl_uString2String( &pLanguage, - pLocale->Language->buffer, pLocale->Language->length, - RTL_TEXTENCODING_ASCII_US, OUSTRING_TO_OSTRING_CVTFLAGS ); - - if( SAL_INT_CAST(sal_uInt32, pLanguage->length) < n ) - { - strcpy( buffer, pLanguage->buffer ); - offset = pLanguage->length; - } - - rtl_string_release( pLanguage ); - } - - /* convert country code to ascii */ - if( pLocale->Country && (pLocale->Country->length == 2) ) - { - rtl_String *pCountry = NULL; - - rtl_uString2String( &pCountry, - pLocale->Country->buffer, pLocale->Country->length, - RTL_TEXTENCODING_ASCII_US, OUSTRING_TO_OSTRING_CVTFLAGS ); - - if( offset + pCountry->length + 1 < n ) - { - strcpy( buffer + offset++, "_" ); - strcpy( buffer + offset, pCountry->buffer ); - offset += pCountry->length; - } - - rtl_string_release( pCountry ); - } - - /* convert variant to ascii - check if there is enough space for the variant string */ - if( pLocale->Variant && pLocale->Variant->length && - ( SAL_INT_CAST(sal_uInt32, pLocale->Variant->length) < n - 6 ) ) - { - rtl_String *pVariant = NULL; - - rtl_uString2String( &pVariant, - pLocale->Variant->buffer, pLocale->Variant->length, - RTL_TEXTENCODING_ASCII_US, OUSTRING_TO_OSTRING_CVTFLAGS ); - - if( offset + pVariant->length + 1 < n ) - { - strcpy( buffer + offset, pVariant->buffer ); - offset += pVariant->length; - } - - rtl_string_release( pVariant ); - } - - return buffer; - } - - return NULL; -} - -/***************************************************************************** - convert locale string to rtl_Locale - *****************************************************************************/ - -static rtl_Locale * _parse_locale( const char * locale ) -{ - static sal_Unicode c_locale[2] = { (sal_Unicode) 'C', 0 }; - - /* check if locale contains a valid string */ - if( locale ) - { - size_t len = strlen( locale ); - - if( len >= 2 ) - { - rtl_uString * pLanguage = NULL; - rtl_uString * pCountry = NULL; - rtl_uString * pVariant = NULL; - - size_t offset = 2; - - rtl_Locale * ret; - - /* language is a two or three letter code */ - if( (len > 3 && '_' == locale[3]) || (len == 3 && '_' != locale[2]) ) - offset = 3; - - /* convert language code to unicode */ - rtl_string2UString( &pLanguage, locale, offset, RTL_TEXTENCODING_ASCII_US, OSTRING_TO_OUSTRING_CVTFLAGS ); - OSL_ASSERT(pLanguage != NULL); - - /* convert country code to unicode */ - if( len >= offset+3 && '_' == locale[offset] ) - { - rtl_string2UString( &pCountry, locale + offset + 1, 2, RTL_TEXTENCODING_ASCII_US, OSTRING_TO_OUSTRING_CVTFLAGS ); - OSL_ASSERT(pCountry != NULL); - offset += 3; - } - - /* convert variant code to unicode - do not rely on "." as delimiter */ - if( len > offset ) { - rtl_string2UString( &pVariant, locale + offset, len - offset, RTL_TEXTENCODING_ASCII_US, OSTRING_TO_OUSTRING_CVTFLAGS ); - OSL_ASSERT(pVariant != NULL); - } - - ret = rtl_locale_register( pLanguage->buffer, pCountry ? pCountry->buffer : c_locale + 1, pVariant ? pVariant->buffer : c_locale + 1 ); - - if (pVariant) rtl_uString_release(pVariant); - if (pCountry) rtl_uString_release(pCountry); - if (pLanguage) rtl_uString_release(pLanguage); - - return ret; - } - else - return rtl_locale_register( c_locale, c_locale + 1, c_locale + 1 ); - } - - return NULL; -} - -#if defined(LINUX) || defined(SOLARIS) || defined(NETBSD) || \ - defined(FREEBSD) || defined(OPENBSD) || defined(DRAGONFLY) - -/* - * This implementation of osl_getTextEncodingFromLocale maps - * from nl_langinfo(CODESET) to rtl_textencoding defines. - * nl_langinfo() is supported only on Linux, Solaris, - * >= NetBSD 1.6 and >= FreeBSD 4.4 - * - * This routine is SLOW because of the setlocale call, so - * grab the result and cache it. - * - * XXX this code has the usual mt problems aligned with setlocale() XXX - */ - -#ifdef LINUX -#if !defined(CODESET) -#define CODESET _NL_CTYPE_CODESET_NAME -#endif -#endif - -/* - * _nl_language_list[] is an array list of supported encodings. Because - * we are using a binary search, the list has to be in ascending order. - * We are comparing the encodings case insensitiv, so the list has - * to be completly upper- , or lowercase. - */ - -#if defined(SOLARIS) - -/* The values in the below list can be obtained with a script like - * #!/bin/sh - * for i in `locale -a`; do - * LC_ALL=$i locale -k code_set_name - * done - */ -const _pair _nl_language_list[] = { - { "5601", RTL_TEXTENCODING_EUC_KR }, /* ko_KR.EUC */ - { "646", RTL_TEXTENCODING_ISO_8859_1 }, /* fake: ASCII_US */ - { "ANSI-1251", RTL_TEXTENCODING_MS_1251 }, /* ru_RU.ANSI1251 */ - { "BIG5", RTL_TEXTENCODING_BIG5 }, /* zh_CN.BIG5 */ - { "BIG5-HKSCS", RTL_TEXTENCODING_BIG5_HKSCS }, /* zh_CN.BIG5HK */ - { "CNS11643", RTL_TEXTENCODING_EUC_TW }, /* zh_TW.EUC */ - { "EUCJP", RTL_TEXTENCODING_EUC_JP }, /* ja_JP.eucjp */ - { "GB18030", RTL_TEXTENCODING_GB_18030 }, /* zh_CN.GB18030 */ - { "GB2312", RTL_TEXTENCODING_GB_2312 }, /* zh_CN */ - { "GBK", RTL_TEXTENCODING_GBK }, /* zh_CN.GBK */ - { "ISO8859-1", RTL_TEXTENCODING_ISO_8859_1 }, - { "ISO8859-10", RTL_TEXTENCODING_ISO_8859_10 }, - { "ISO8859-13", RTL_TEXTENCODING_ISO_8859_13 }, /* lt_LT lv_LV */ - { "ISO8859-14", RTL_TEXTENCODING_ISO_8859_14 }, - { "ISO8859-15", RTL_TEXTENCODING_ISO_8859_15 }, - { "ISO8859-2", RTL_TEXTENCODING_ISO_8859_2 }, - { "ISO8859-3", RTL_TEXTENCODING_ISO_8859_3 }, - { "ISO8859-4", RTL_TEXTENCODING_ISO_8859_4 }, - { "ISO8859-5", RTL_TEXTENCODING_ISO_8859_5 }, - { "ISO8859-6", RTL_TEXTENCODING_ISO_8859_6 }, - { "ISO8859-7", RTL_TEXTENCODING_ISO_8859_7 }, - { "ISO8859-8", RTL_TEXTENCODING_ISO_8859_8 }, - { "ISO8859-9", RTL_TEXTENCODING_ISO_8859_9 }, - { "KOI8-R", RTL_TEXTENCODING_KOI8_R }, - { "KOI8-U", RTL_TEXTENCODING_KOI8_U }, - { "PCK", RTL_TEXTENCODING_MS_932 }, - { "SUN_EU_GREEK", RTL_TEXTENCODING_ISO_8859_7 }, /* 8859-7 + Euro */ - { "TIS620.2533", RTL_TEXTENCODING_MS_874 }, /* th_TH.TIS620 */ - { "UTF-8", RTL_TEXTENCODING_UTF8 } -}; - -/* XXX MS-874 is an extension to tis620, so this is not - * really equivalent */ - -#elif defined(LINUX) - -const _pair _nl_language_list[] = { - { "ANSI_X3.110-1983", RTL_TEXTENCODING_DONTKNOW }, /* ISO-IR-99 NAPLPS */ - { "ANSI_X3.4-1968", RTL_TEXTENCODING_ISO_8859_1 }, /* fake: ASCII_US */ - { "ASMO_449", RTL_TEXTENCODING_DONTKNOW }, /* ISO_9036 ARABIC7 */ - { "BALTIC", RTL_TEXTENCODING_DONTKNOW }, /* ISO-IR-179 */ - { "BIG5", RTL_TEXTENCODING_BIG5 }, /* locale: zh_TW */ - { "BIG5-HKSCS", RTL_TEXTENCODING_BIG5_HKSCS }, /* locale: zh_CN.BIG5HK */ - { "BIG5HKSCS", RTL_TEXTENCODING_BIG5_HKSCS }, /* deprecated */ - { "BS_4730", RTL_TEXTENCODING_DONTKNOW }, /* ISO-IR-4 ISO646-GB */ - { "BS_VIEWDATA", RTL_TEXTENCODING_DONTKNOW }, /* ISO-IR-47 */ - { "CP1250", RTL_TEXTENCODING_MS_1250 }, /* MS-EE */ - { "CP1251", RTL_TEXTENCODING_MS_1251 }, /* MS-CYRL */ - { "CP1252", RTL_TEXTENCODING_MS_1252 }, /* MS-ANSI */ - { "CP1253", RTL_TEXTENCODING_MS_1253 }, /* MS-GREEK */ - { "CP1254", RTL_TEXTENCODING_MS_1254 }, /* MS-TURK */ - { "CP1255", RTL_TEXTENCODING_MS_1255 }, /* MS-HEBR */ - { "CP1256", RTL_TEXTENCODING_MS_1256 }, /* MS-ARAB */ - { "CP1257", RTL_TEXTENCODING_MS_1257 }, /* WINBALTRIM */ - { "CSA_Z243.4-1985-1", RTL_TEXTENCODING_DONTKNOW }, /* ISO-IR-121 */ - { "CSA_Z243.4-1985-2", RTL_TEXTENCODING_DONTKNOW }, /* ISO-IR-122 CSA7-2 */ - { "CSA_Z243.4-1985-GR", RTL_TEXTENCODING_DONTKNOW }, /* ISO-IR-123 */ - { "CSN_369103", RTL_TEXTENCODING_DONTKNOW }, /* ISO-IR-139 */ - { "CWI", RTL_TEXTENCODING_DONTKNOW }, /* CWI-2 CP-HU */ - { "DEC-MCS", RTL_TEXTENCODING_DONTKNOW }, /* DEC */ - { "DIN_66003", RTL_TEXTENCODING_DONTKNOW }, /* ISO-IR-21 */ - { "DS_2089", RTL_TEXTENCODING_DONTKNOW }, /* DS2089 ISO646-DK */ - { "EBCDIC-AT-DE", RTL_TEXTENCODING_DONTKNOW }, - { "EBCDIC-AT-DE-A", RTL_TEXTENCODING_DONTKNOW }, - { "EBCDIC-CA-FR", RTL_TEXTENCODING_DONTKNOW }, - { "EBCDIC-DK-NO", RTL_TEXTENCODING_DONTKNOW }, - { "EBCDIC-DK-NO-A", RTL_TEXTENCODING_DONTKNOW }, - { "EBCDIC-ES", RTL_TEXTENCODING_DONTKNOW }, - { "EBCDIC-ES-A", RTL_TEXTENCODING_DONTKNOW }, - { "EBCDIC-ES-S", RTL_TEXTENCODING_DONTKNOW }, - { "EBCDIC-FI-SE", RTL_TEXTENCODING_DONTKNOW }, - { "EBCDIC-FI-SE-A", RTL_TEXTENCODING_DONTKNOW }, - { "EBCDIC-FR", RTL_TEXTENCODING_DONTKNOW }, - { "EBCDIC-IS-FRISS", RTL_TEXTENCODING_DONTKNOW }, /* FRISS */ - { "EBCDIC-IT", RTL_TEXTENCODING_DONTKNOW }, - { "EBCDIC-PT", RTL_TEXTENCODING_DONTKNOW }, - { "EBCDIC-UK", RTL_TEXTENCODING_DONTKNOW }, - { "EBCDIC-US", RTL_TEXTENCODING_DONTKNOW }, - { "ECMA-CYRILLIC", RTL_TEXTENCODING_DONTKNOW }, /* ISO-IR-111 */ - { "ES", RTL_TEXTENCODING_DONTKNOW }, /* ISO-IR-17 */ - { "ES2", RTL_TEXTENCODING_DONTKNOW }, /* ISO-IR-85 */ - { "EUC-JP", RTL_TEXTENCODING_EUC_JP }, /* locale: ja_JP.eucjp */ - { "EUC-KR", RTL_TEXTENCODING_EUC_KR }, /* locale: ko_KR.euckr */ - { "EUC-TW", RTL_TEXTENCODING_EUC_TW }, /* locale: zh_TW.euctw */ - { "GB18030", RTL_TEXTENCODING_GB_18030 }, /* locale: zh_CN.gb18030 */ - { "GB2312", RTL_TEXTENCODING_GB_2312 }, /* locale: zh_CN */ - { "GB_1988-80", RTL_TEXTENCODING_DONTKNOW }, /* ISO-IR-57 */ - { "GBK", RTL_TEXTENCODING_GBK }, /* locale: zh_CN.GBK */ - { "GOST_19768-74", RTL_TEXTENCODING_DONTKNOW }, /* ISO-IR-153 */ - { "GREEK-CCITT", RTL_TEXTENCODING_DONTKNOW }, /* ISO-IR-150 */ - { "GREEK7", RTL_TEXTENCODING_DONTKNOW }, /* ISO-IR-88 */ - { "GREEK7-OLD", RTL_TEXTENCODING_DONTKNOW }, /* ISO-IR-18 */ - { "HP-ROMAN8", RTL_TEXTENCODING_DONTKNOW }, /* ROMAN8 R8 */ - { "IBM037", RTL_TEXTENCODING_DONTKNOW }, /* EBCDIC-[US|CA|WT] */ - { "IBM038", RTL_TEXTENCODING_DONTKNOW }, /* EBCDIC-INT CP038 */ - { "IBM1004", RTL_TEXTENCODING_DONTKNOW }, /* CP1004 OS2LATIN1 */ - { "IBM1026", RTL_TEXTENCODING_DONTKNOW }, /* CP1026 1026 */ - { "IBM1047", RTL_TEXTENCODING_DONTKNOW }, /* CP1047 1047 */ - { "IBM256", RTL_TEXTENCODING_DONTKNOW }, /* EBCDIC-INT1 */ - { "IBM273", RTL_TEXTENCODING_DONTKNOW }, /* CP273 */ - { "IBM274", RTL_TEXTENCODING_DONTKNOW }, /* EBCDIC-BE CP274 */ - { "IBM275", RTL_TEXTENCODING_DONTKNOW }, /* EBCDIC-BR CP275 */ - { "IBM277", RTL_TEXTENCODING_DONTKNOW }, /* EBCDIC-CP-[DK|NO] */ - { "IBM278", RTL_TEXTENCODING_DONTKNOW }, /* EBCDIC-CP-[FISE]*/ - { "IBM280", RTL_TEXTENCODING_DONTKNOW }, /* CP280 EBCDIC-CP-IT*/ - { "IBM281", RTL_TEXTENCODING_DONTKNOW }, /* EBCDIC-JP-E CP281 */ - { "IBM284", RTL_TEXTENCODING_DONTKNOW }, /* CP284 EBCDIC-CP-ES */ - { "IBM285", RTL_TEXTENCODING_DONTKNOW }, /* CP285 EBCDIC-CP-GB */ - { "IBM290", RTL_TEXTENCODING_DONTKNOW }, /* EBCDIC-JP-KANA */ - { "IBM297", RTL_TEXTENCODING_DONTKNOW }, /* EBCDIC-CP-FR */ - { "IBM420", RTL_TEXTENCODING_DONTKNOW }, /* EBCDIC-CP-AR1 */ - { "IBM423", RTL_TEXTENCODING_DONTKNOW }, /* CP423 EBCDIC-CP-GR */ - { "IBM424", RTL_TEXTENCODING_DONTKNOW }, /* CP424 EBCDIC-CP-HE */ - { "IBM437", RTL_TEXTENCODING_IBM_437 }, /* CP437 437 */ - { "IBM500", RTL_TEXTENCODING_DONTKNOW }, /* EBCDIC-CP-[BE|CH] */ - { "IBM850", RTL_TEXTENCODING_IBM_850 }, /* CP850 850 */ - { "IBM851", RTL_TEXTENCODING_DONTKNOW }, /* CP851 851 */ - { "IBM852", RTL_TEXTENCODING_IBM_852 }, /* CP852 852 */ - { "IBM855", RTL_TEXTENCODING_IBM_855 }, /* CP855 855 */ - { "IBM857", RTL_TEXTENCODING_IBM_857 }, /* CP857 857 */ - { "IBM860", RTL_TEXTENCODING_IBM_860 }, /* CP860 860 */ - { "IBM861", RTL_TEXTENCODING_IBM_861 }, /* CP861 861 CP-IS */ - { "IBM862", RTL_TEXTENCODING_IBM_862 }, /* CP862 862 */ - { "IBM863", RTL_TEXTENCODING_IBM_863 }, /* CP863 863 */ - { "IBM864", RTL_TEXTENCODING_IBM_864 }, /* CP864 */ - { "IBM865", RTL_TEXTENCODING_IBM_865 }, /* CP865 865 */ - { "IBM866", RTL_TEXTENCODING_IBM_866 }, /* CP866 866 */ - { "IBM868", RTL_TEXTENCODING_DONTKNOW }, /* CP868 CP-AR */ - { "IBM869", RTL_TEXTENCODING_IBM_869 }, /* CP869 869 CP-GR */ - { "IBM870", RTL_TEXTENCODING_DONTKNOW }, /* EBCDIC-[ROECE|YU] */ - { "IBM871", RTL_TEXTENCODING_DONTKNOW }, /* CP871 EBCDIC-CP-IS */ - { "IBM875", RTL_TEXTENCODING_DONTKNOW }, /* CP875 EBCDIC-GREEK */ - { "IBM880", RTL_TEXTENCODING_DONTKNOW }, /* EBCDIC-CYRILLIC */ - { "IBM891", RTL_TEXTENCODING_DONTKNOW }, /* CP891 */ - { "IBM903", RTL_TEXTENCODING_DONTKNOW }, /* CP903 */ - { "IBM904", RTL_TEXTENCODING_DONTKNOW }, /* CP904 904 */ - { "IBM905", RTL_TEXTENCODING_DONTKNOW }, /* CP905 EBCDIC-CP-TR */ - { "IBM918", RTL_TEXTENCODING_DONTKNOW }, /* CP918 EBCDIC-AR2 */ - { "IEC_P27-1", RTL_TEXTENCODING_DONTKNOW }, /* ISO-IR-143 */ - { "INIS", RTL_TEXTENCODING_DONTKNOW }, /* ISO-IR-49 */ - { "INIS-8", RTL_TEXTENCODING_DONTKNOW }, /* ISO-IR-50 */ - { "INIS-CYRILLIC", RTL_TEXTENCODING_DONTKNOW }, /* ISO-IR-51 */ - { "INVARIANT", RTL_TEXTENCODING_DONTKNOW }, /* ISO-IR-170 */ - { "ISO-8859-1", RTL_TEXTENCODING_ISO_8859_1 }, /* ISO-IR-100 CP819 */ - { "ISO-8859-10", RTL_TEXTENCODING_ISO_8859_10 }, /* ISO-IR-157 LATIN6 */ - { "ISO-8859-13", RTL_TEXTENCODING_ISO_8859_13 }, /* ISO-IR-179 LATIN7 */ - { "ISO-8859-14", RTL_TEXTENCODING_ISO_8859_14 }, /* LATIN8 L8 */ - { "ISO-8859-15", RTL_TEXTENCODING_ISO_8859_15 }, - { "ISO-8859-2", RTL_TEXTENCODING_ISO_8859_2 }, /* LATIN2 L2 */ - { "ISO-8859-3", RTL_TEXTENCODING_ISO_8859_3 }, /* LATIN3 L3 */ - { "ISO-8859-4", RTL_TEXTENCODING_ISO_8859_4 }, /* LATIN4 L4 */ - { "ISO-8859-5", RTL_TEXTENCODING_ISO_8859_5 }, /* CYRILLIC */ - { "ISO-8859-6", RTL_TEXTENCODING_ISO_8859_6 }, /* ECMA-114 ARABIC */ - { "ISO-8859-7", RTL_TEXTENCODING_ISO_8859_7 }, /* ECMA-118 GREEK8 */ - { "ISO-8859-8", RTL_TEXTENCODING_ISO_8859_8 }, /* ISO_8859-8 HEBREW */ - { "ISO-8859-9", RTL_TEXTENCODING_ISO_8859_9 }, /* ISO_8859-9 LATIN5 */ - { "ISO-IR-90", RTL_TEXTENCODING_DONTKNOW }, /* ISO_6937-2:1983 */ - { "ISO_10367-BOX", RTL_TEXTENCODING_DONTKNOW }, /* ISO-IR-155 */ - { "ISO_2033-1983", RTL_TEXTENCODING_DONTKNOW }, /* ISO-IR-98 E13B */ - { "ISO_5427", RTL_TEXTENCODING_DONTKNOW }, /* ISO-IR-37 KOI-7 */ - { "ISO_5427-EXT", RTL_TEXTENCODING_DONTKNOW }, /* ISO-IR-54 */ - { "ISO_5428", RTL_TEXTENCODING_DONTKNOW }, /* ISO-IR-55 */ - { "ISO_646.BASIC", RTL_TEXTENCODING_ASCII_US }, /* REF */ - { "ISO_646.IRV", RTL_TEXTENCODING_ASCII_US }, /* ISO-IR-2 IRV */ - { "ISO_646.IRV:1983", RTL_TEXTENCODING_ISO_8859_1 }, /* fake: ASCII_US, used for "C" locale*/ - { "ISO_6937", RTL_TEXTENCODING_DONTKNOW }, /* ISO-IR-156 ISO6937*/ - { "ISO_6937-2-25", RTL_TEXTENCODING_DONTKNOW }, /* ISO-IR-152 */ - { "ISO_6937-2-ADD", RTL_TEXTENCODING_DONTKNOW }, /* ISO-IR-142 */ - { "ISO_8859-SUPP", RTL_TEXTENCODING_DONTKNOW }, /* ISO-IR-154 */ - { "IT", RTL_TEXTENCODING_DONTKNOW }, /* ISO-IR-15 */ - { "JIS_C6220-1969-JP", RTL_TEXTENCODING_DONTKNOW }, /* KATAKANA X0201-7 */ - { "JIS_C6220-1969-RO", RTL_TEXTENCODING_DONTKNOW }, /* ISO-IR-14 */ - { "JIS_C6229-1984-A", RTL_TEXTENCODING_DONTKNOW }, /* ISO-IR-91 */ - { "JIS_C6229-1984-B", RTL_TEXTENCODING_DONTKNOW }, /* ISO-IR-92 */ - { "JIS_C6229-1984-B-ADD", RTL_TEXTENCODING_DONTKNOW }, /* ISO-IR-93 */ - { "JIS_C6229-1984-HAND", RTL_TEXTENCODING_DONTKNOW }, /* ISO-IR-94 */ - { "JIS_C6229-1984-HAND-ADD", RTL_TEXTENCODING_DONTKNOW }, /* ISO-IR-95 */ - { "JIS_C6229-1984-KANA", RTL_TEXTENCODING_DONTKNOW }, /* ISO-IR-96 */ - { "JIS_X0201", RTL_TEXTENCODING_DONTKNOW }, /* X0201 */ - { "JUS_I.B1.002", RTL_TEXTENCODING_DONTKNOW }, /* ISO-IR-141 */ - { "JUS_I.B1.003-MAC", RTL_TEXTENCODING_DONTKNOW }, /* MACEDONIAN */ - { "JUS_I.B1.003-SERB", RTL_TEXTENCODING_DONTKNOW }, /* ISO-IR-146 SERBIAN */ - { "KOI-8", RTL_TEXTENCODING_DONTKNOW }, - { "KOI8-R", RTL_TEXTENCODING_KOI8_R }, - { "KOI8-U", RTL_TEXTENCODING_KOI8_U }, - { "KSC5636", RTL_TEXTENCODING_DONTKNOW }, /* ISO646-KR */ - { "LATIN-GREEK", RTL_TEXTENCODING_DONTKNOW }, /* ISO-IR-19 */ - { "LATIN-GREEK-1", RTL_TEXTENCODING_DONTKNOW }, /* ISO-IR-27 */ - { "MAC-IS", RTL_TEXTENCODING_APPLE_ROMAN }, - { "MAC-UK", RTL_TEXTENCODING_APPLE_ROMAN }, - { "MACINTOSH", RTL_TEXTENCODING_APPLE_ROMAN }, /* MAC */ - { "MSZ_7795.3", RTL_TEXTENCODING_DONTKNOW }, /* ISO-IR-86 */ - { "NATS-DANO", RTL_TEXTENCODING_DONTKNOW }, /* ISO-IR-9-1 */ - { "NATS-DANO-ADD", RTL_TEXTENCODING_DONTKNOW }, /* ISO-IR-9-2 */ - { "NATS-SEFI", RTL_TEXTENCODING_DONTKNOW }, /* ISO-IR-8-1 */ - { "NATS-SEFI-ADD", RTL_TEXTENCODING_DONTKNOW }, /* ISO-IR-8-2 */ - { "NC_NC00-10", RTL_TEXTENCODING_DONTKNOW }, /* ISO-IR-151 */ - { "NEXTSTEP", RTL_TEXTENCODING_DONTKNOW }, /* NEXT */ - { "NF_Z_62-010", RTL_TEXTENCODING_DONTKNOW }, /* ISO-IR-69 */ - { "NF_Z_62-010_(1973)", RTL_TEXTENCODING_DONTKNOW }, /* ISO-IR-25 */ - { "NS_4551-1", RTL_TEXTENCODING_DONTKNOW }, /* ISO-IR-60 */ - { "NS_4551-2", RTL_TEXTENCODING_DONTKNOW }, /* ISO-IR-61 */ - { "PT", RTL_TEXTENCODING_DONTKNOW }, /* ISO-IR-16 */ - { "PT2", RTL_TEXTENCODING_DONTKNOW }, /* ISO-IR-84 */ - { "SAMI", RTL_TEXTENCODING_DONTKNOW }, /* ISO-IR-158 */ - { "SEN_850200_B", RTL_TEXTENCODING_DONTKNOW }, /* ISO646-[FI|SE] */ - { "SEN_850200_C", RTL_TEXTENCODING_DONTKNOW }, /* ISO-IR-11 */ - { "T.101-G2", RTL_TEXTENCODING_DONTKNOW }, /* ISO-IR-128 */ - { "T.61-7BIT", RTL_TEXTENCODING_DONTKNOW }, /* ISO-IR-102 */ - { "T.61-8BIT", RTL_TEXTENCODING_DONTKNOW }, /* T.61 ISO-IR-103 */ - { "TIS-620", RTL_TEXTENCODING_MS_874 }, /* locale: th_TH */ - { "UTF-8", RTL_TEXTENCODING_UTF8 }, /* ISO-10646/UTF-8 */ - { "VIDEOTEX-SUPPL", RTL_TEXTENCODING_DONTKNOW }, /* ISO-IR-70 */ - { "WIN-SAMI-2", RTL_TEXTENCODING_DONTKNOW } /* WS2 */ -}; - -#elif defined(FREEBSD) || defined(DRAGONFLY) - -const _pair _nl_language_list[] = { - { "ASCII", RTL_TEXTENCODING_ASCII_US }, /* US-ASCII */ - { "BIG5", RTL_TEXTENCODING_BIG5 }, /* China - Traditional Chinese */ - { "CP1251", RTL_TEXTENCODING_MS_1251 }, /* MS-CYRL */ - { "CP866", RTL_TEXTENCODING_IBM_866 }, /* CP866 866 */ - { "EUCCN", RTL_TEXTENCODING_EUC_CN }, /* China - Simplified Chinese */ - { "EUCJP", RTL_TEXTENCODING_EUC_JP }, /* Japan */ - { "EUCKR", RTL_TEXTENCODING_EUC_KR }, /* Korea */ - { "ISO8859-1", RTL_TEXTENCODING_ISO_8859_1 }, /* Western */ - { "ISO8859-15", RTL_TEXTENCODING_ISO_8859_15 }, /* Western Updated (w/Euro sign) */ - { "ISO8859-2", RTL_TEXTENCODING_ISO_8859_2 }, /* Central European */ - { "ISO8859-4", RTL_TEXTENCODING_ISO_8859_4 }, /* LATIN4 L4 */ - { "ISO8859-5", RTL_TEXTENCODING_ISO_8859_5 }, /* Cyrillic */ - { "ISO8859-7", RTL_TEXTENCODING_ISO_8859_7 }, /* Greek */ - { "ISO8859-9", RTL_TEXTENCODING_ISO_8859_9 }, /* Turkish */ - { "KOI8-R", RTL_TEXTENCODING_KOI8_R }, /* KOI8-R */ - { "KOI8-U", RTL_TEXTENCODING_KOI8_U }, /* KOI8-U */ - { "SJIS", RTL_TEXTENCODING_SHIFT_JIS }, /* Japan */ - { "US-ASCII", RTL_TEXTENCODING_ASCII_US }, /* US-ASCII */ - { "UTF-8", RTL_TEXTENCODING_UTF8 } /* ISO-10646/UTF-8 */ -}; - -#elif defined(NETBSD) - -const _pair _nl_language_list[] = { - { "ASCII", RTL_TEXTENCODING_ASCII_US }, /* US-ASCII */ - { "BIG5", RTL_TEXTENCODING_BIG5 }, /* China - Traditional Chinese */ - { "Big5", RTL_TEXTENCODING_BIG5 }, /* China - Traditional Chinese */ - { "Big5-HKSCS", RTL_TEXTENCODING_BIG5_HKSCS }, /* locale: zh_CN.BIG5HK */ - { "Big5HKSCS", RTL_TEXTENCODING_BIG5_HKSCS }, /* deprecated */ - { "CP1251", RTL_TEXTENCODING_MS_1251 }, /* MS-CYRL */ - { "CP866", RTL_TEXTENCODING_IBM_866 }, /* CP866 866 */ - { "CTEXT", RTL_TEXTENCODING_ASCII_US }, /* US-ASCII */ - { "eucCN", RTL_TEXTENCODING_EUC_CN }, /* China - Simplified Chinese */ - { "eucJP", RTL_TEXTENCODING_EUC_JP }, /* Japan */ - { "eucKR", RTL_TEXTENCODING_EUC_KR }, /* Korea */ - { "eucTW", RTL_TEXTENCODING_EUC_TW }, /* China - Traditional Chinese */ - { "GB18030", RTL_TEXTENCODING_GB_18030 }, /* locale: zh_CN.gb18030 */ - { "GB2312", RTL_TEXTENCODING_GB_2312 }, /* locale: zh_CN */ - { "ISO-2022-JP", RTL_TEXTENCODING_DONTKNOW }, /* */ - { "ISO-2022-JP-2", RTL_TEXTENCODING_DONTKNOW }, /* */ - { "ISO8859-1", RTL_TEXTENCODING_ISO_8859_1 }, /* Western */ - { "ISO8859-13", RTL_TEXTENCODING_ISO_8859_13 }, /* ISO-IR-179 LATIN7 */ - { "ISO8859-15", RTL_TEXTENCODING_ISO_8859_15 }, /* Western Updated (w/Euro sign) */ - { "ISO8859-2", RTL_TEXTENCODING_ISO_8859_2 }, /* Central European */ - { "ISO8859-4", RTL_TEXTENCODING_ISO_8859_4 }, /* LATIN4 L4 */ - { "ISO8859-5", RTL_TEXTENCODING_ISO_8859_5 }, /* Cyrillic */ - { "ISO8859-7", RTL_TEXTENCODING_ISO_8859_7 }, /* Greek */ - { "ISO8859-9", RTL_TEXTENCODING_ISO_8859_9 }, /* Turkish */ - { "KOI8-R", RTL_TEXTENCODING_KOI8_R }, /* KOI8-R */ - { "KOI8-U", RTL_TEXTENCODING_KOI8_U }, /* KOI8-U */ - { "PT154", RTL_TEXTENCODING_PT154 }, /* */ - { "SJIS", RTL_TEXTENCODING_SHIFT_JIS }, /* Japan */ - { "US-ASCII", RTL_TEXTENCODING_ASCII_US }, /* US-ASCII */ - { "UTF-8", RTL_TEXTENCODING_UTF8 } /* ISO-10646/UTF-8 */ -}; - -#elif defined(OPENBSD) - -const _pair _nl_language_list[] = { - { "ASCII", RTL_TEXTENCODING_ASCII_US }, /* US-ASCII */ - { "BIG5", RTL_TEXTENCODING_BIG5 }, /* China - Traditional Chinese */ - { "CP1251", RTL_TEXTENCODING_MS_1251 }, /* MS-CYRL */ - { "CP866", RTL_TEXTENCODING_IBM_866 }, /* CP866 866 */ - { "EUCCN", RTL_TEXTENCODING_EUC_CN }, /* China - Simplified Chinese */ - { "EUCJP", RTL_TEXTENCODING_EUC_JP }, /* Japan */ - { "EUCKR", RTL_TEXTENCODING_EUC_KR }, /* Korea */ - { "ISO8859-1", RTL_TEXTENCODING_ISO_8859_1 }, /* Western */ - { "ISO8859-15", RTL_TEXTENCODING_ISO_8859_15 }, /* Western Updated (w/Euro sign) */ - { "ISO8859-2", RTL_TEXTENCODING_ISO_8859_2 }, /* Central European */ - { "ISO8859-4", RTL_TEXTENCODING_ISO_8859_4 }, /* LATIN4 L4 */ - { "ISO8859-5", RTL_TEXTENCODING_ISO_8859_5 }, /* Cyrillic */ - { "ISO8859-7", RTL_TEXTENCODING_ISO_8859_7 }, /* Greek */ - { "ISO8859-9", RTL_TEXTENCODING_ISO_8859_9 }, /* Turkish */ - { "KOI8-R", RTL_TEXTENCODING_KOI8_R }, /* KOI8-R */ - { "KOI8-U", RTL_TEXTENCODING_KOI8_U }, /* KOI8-U */ - { "SJIS", RTL_TEXTENCODING_SHIFT_JIS }, /* Japan */ - { "US-ASCII", RTL_TEXTENCODING_ASCII_US }, /* US-ASCII */ - { "UTF-8", RTL_TEXTENCODING_UTF8 } /* ISO-10646/UTF-8 */ -}; - -#endif /* ifdef SOLARIS LINUX FREEBSD NETBSD OPENBSD */ - -static pthread_mutex_t aLocalMutex = PTHREAD_MUTEX_INITIALIZER; - -/***************************************************************************** - return the text encoding corresponding to the given locale - *****************************************************************************/ - -rtl_TextEncoding osl_getTextEncodingFromLocale( rtl_Locale * pLocale ) -{ - const _pair *language=0; - - char locale_buf[64] = ""; - char codeset_buf[64]; - - char *ctype_locale = 0; - char *codeset = 0; - - /* default to process locale if pLocale == NULL */ - if( NULL == pLocale ) - osl_getProcessLocale( &pLocale ); - - /* convert rtl_Locale to locale string */ - _compose_locale( pLocale, locale_buf, 64 ); - - /* basic thread safeness */ - pthread_mutex_lock( &aLocalMutex ); - - /* remember the charset as indicated by the LC_CTYPE locale */ - ctype_locale = setlocale( LC_CTYPE, NULL ); - - /* set the desired LC_CTYPE locale */ - if( NULL == setlocale( LC_CTYPE, locale_buf ) ) - { - pthread_mutex_unlock(&aLocalMutex); - return RTL_TEXTENCODING_DONTKNOW; - } - - /* get the charset as indicated by the LC_CTYPE locale */ -#if defined(NETBSD) && !defined(CODESET) - codeset = NULL; -#else - codeset = nl_langinfo( CODESET ); -#endif - - if ( codeset != NULL ) - { - /* get codeset into mt save memory */ - strncpy( codeset_buf, codeset, sizeof(codeset_buf) ); - codeset_buf[sizeof(codeset_buf) - 1] = 0; - codeset = codeset_buf; - } - - /* restore the original value of locale */ - if ( ctype_locale != NULL ) - setlocale( LC_CTYPE, ctype_locale ); - - pthread_mutex_unlock( &aLocalMutex ); - - /* search the codeset in our language list */ - if ( codeset != NULL ) - { - const unsigned int members = sizeof(_nl_language_list) / sizeof(_pair); - language = _pair_search (codeset, _nl_language_list, members); - } - - OSL_ASSERT( language && ( RTL_TEXTENCODING_DONTKNOW != language->value ) ); - - /* a matching item in our list provides a mapping from codeset to - * rtl-codeset */ - if ( language != NULL ) - return language->value; - - return RTL_TEXTENCODING_DONTKNOW; -} - -/***************************************************************************** - return the current process locale - *****************************************************************************/ - -void _imp_getProcessLocale( rtl_Locale ** ppLocale ) -{ - char * locale; - - /* basic thread safeness */ - pthread_mutex_lock( &aLocalMutex ); - - /* set the locale defined by the env vars */ - locale = setlocale( LC_CTYPE, "" ); - - /* fallback to the current locale */ - if( NULL == locale ) - locale = setlocale( LC_CTYPE, NULL ); - - /* return the LC_CTYPE locale */ - *ppLocale = _parse_locale( locale ); - - pthread_mutex_unlock( &aLocalMutex ); -} - -/***************************************************************************** - set the current process locale - *****************************************************************************/ - -int _imp_setProcessLocale( rtl_Locale * pLocale ) -{ - char locale_buf[64] = ""; - int ret = 0; - - /* convert rtl_Locale to locale string */ - _compose_locale( pLocale, locale_buf, 64 ); - - /* basic thread safeness */ - pthread_mutex_lock( &aLocalMutex ); - - /* try to set LC_ALL locale */ - if( NULL == setlocale( LC_ALL, locale_buf ) ) - ret = -1; - - pthread_mutex_unlock( &aLocalMutex ); - return ret; -} - -#else /* ifdef LINUX || SOLARIS || MACOSX || NETBSD */ - -/* - * This implementation of osl_getTextEncodingFromLocale maps - * from the ISO language codes. - */ - -const _pair _full_locale_list[] = { - { "ja_JP.eucJP", RTL_TEXTENCODING_EUC_JP }, - { "ja_JP.EUC", RTL_TEXTENCODING_EUC_JP }, - { "ko_KR.EUC", RTL_TEXTENCODING_EUC_KR }, - { "zh_CN.EUC", RTL_TEXTENCODING_EUC_CN }, - { "zh_TW.EUC", RTL_TEXTENCODING_EUC_TW } -}; - -const _pair _locale_extension_list[] = { - { "big5", RTL_TEXTENCODING_BIG5 }, - { "big5hk", RTL_TEXTENCODING_BIG5_HKSCS }, - { "gb18030", RTL_TEXTENCODING_GB_18030 }, - { "euc", RTL_TEXTENCODING_EUC_JP }, - { "iso8859-1", RTL_TEXTENCODING_ISO_8859_1 }, - { "iso8859-10", RTL_TEXTENCODING_ISO_8859_10 }, - { "iso8859-13", RTL_TEXTENCODING_ISO_8859_13 }, - { "iso8859-14", RTL_TEXTENCODING_ISO_8859_14 }, - { "iso8859-15", RTL_TEXTENCODING_ISO_8859_15 }, - { "iso8859-2", RTL_TEXTENCODING_ISO_8859_2 }, - { "iso8859-3", RTL_TEXTENCODING_ISO_8859_3 }, - { "iso8859-4", RTL_TEXTENCODING_ISO_8859_4 }, - { "iso8859-5", RTL_TEXTENCODING_ISO_8859_5 }, - { "iso8859-6", RTL_TEXTENCODING_ISO_8859_6 }, - { "iso8859-7", RTL_TEXTENCODING_ISO_8859_7 }, - { "iso8859-8", RTL_TEXTENCODING_ISO_8859_8 }, - { "iso8859-9", RTL_TEXTENCODING_ISO_8859_9 }, - { "koi8-r", RTL_TEXTENCODING_KOI8_R }, - { "koi8-u", RTL_TEXTENCODING_KOI8_U }, - { "pck", RTL_TEXTENCODING_MS_932 }, -#if (0) - { "sun_eu_greek", RTL_TEXTENCODING_DONTKNOW }, -#endif - { "utf-16", RTL_TEXTENCODING_UNICODE }, - { "utf-7", RTL_TEXTENCODING_UTF7 }, - { "utf-8", RTL_TEXTENCODING_UTF8 } -}; - -const _pair _iso_language_list[] = { - { "af", RTL_TEXTENCODING_ISO_8859_1 }, - { "ar", RTL_TEXTENCODING_ISO_8859_6 }, - { "az", RTL_TEXTENCODING_ISO_8859_9 }, - { "be", RTL_TEXTENCODING_ISO_8859_5 }, - { "bg", RTL_TEXTENCODING_ISO_8859_5 }, - { "ca", RTL_TEXTENCODING_ISO_8859_1 }, - { "cs", RTL_TEXTENCODING_ISO_8859_2 }, - { "da", RTL_TEXTENCODING_ISO_8859_1 }, - { "de", RTL_TEXTENCODING_ISO_8859_1 }, - { "el", RTL_TEXTENCODING_ISO_8859_7 }, - { "en", RTL_TEXTENCODING_ISO_8859_1 }, - { "es", RTL_TEXTENCODING_ISO_8859_1 }, - { "et", RTL_TEXTENCODING_ISO_8859_4 }, - { "eu", RTL_TEXTENCODING_ISO_8859_1 }, - { "fa", RTL_TEXTENCODING_ISO_8859_6 }, - { "fi", RTL_TEXTENCODING_ISO_8859_1 }, - { "fo", RTL_TEXTENCODING_ISO_8859_1 }, - { "fr", RTL_TEXTENCODING_ISO_8859_1 }, - { "gr", RTL_TEXTENCODING_ISO_8859_7 }, - { "he", RTL_TEXTENCODING_ISO_8859_8 }, - { "hi", RTL_TEXTENCODING_DONTKNOW }, - { "hr", RTL_TEXTENCODING_ISO_8859_2 }, - { "hu", RTL_TEXTENCODING_ISO_8859_2 }, - { "hy", RTL_TEXTENCODING_DONTKNOW }, - { "id", RTL_TEXTENCODING_ISO_8859_1 }, - { "is", RTL_TEXTENCODING_ISO_8859_1 }, - { "it", RTL_TEXTENCODING_ISO_8859_1 }, - { "iw", RTL_TEXTENCODING_ISO_8859_8 }, - { "ja", RTL_TEXTENCODING_EUC_JP }, - { "ka", RTL_TEXTENCODING_DONTKNOW }, - { "kk", RTL_TEXTENCODING_ISO_8859_5 }, - { "ko", RTL_TEXTENCODING_EUC_KR }, - { "lt", RTL_TEXTENCODING_ISO_8859_4 }, - { "lv", RTL_TEXTENCODING_ISO_8859_4 }, - { "mk", RTL_TEXTENCODING_ISO_8859_5 }, - { "mr", RTL_TEXTENCODING_DONTKNOW }, - { "ms", RTL_TEXTENCODING_ISO_8859_1 }, - { "nl", RTL_TEXTENCODING_ISO_8859_1 }, - { "no", RTL_TEXTENCODING_ISO_8859_1 }, - { "pl", RTL_TEXTENCODING_ISO_8859_2 }, - { "pt", RTL_TEXTENCODING_ISO_8859_1 }, - { "ro", RTL_TEXTENCODING_ISO_8859_2 }, - { "ru", RTL_TEXTENCODING_ISO_8859_5 }, - { "sa", RTL_TEXTENCODING_DONTKNOW }, - { "sk", RTL_TEXTENCODING_ISO_8859_2 }, - { "sl", RTL_TEXTENCODING_ISO_8859_2 }, - { "sq", RTL_TEXTENCODING_ISO_8859_2 }, - { "sv", RTL_TEXTENCODING_ISO_8859_1 }, - { "sw", RTL_TEXTENCODING_ISO_8859_1 }, - { "ta", RTL_TEXTENCODING_DONTKNOW }, - { "th", RTL_TEXTENCODING_DONTKNOW }, - { "tr", RTL_TEXTENCODING_ISO_8859_9 }, - { "tt", RTL_TEXTENCODING_ISO_8859_5 }, - { "uk", RTL_TEXTENCODING_ISO_8859_5 }, - { "ur", RTL_TEXTENCODING_ISO_8859_6 }, - { "uz", RTL_TEXTENCODING_ISO_8859_9 }, - { "vi", RTL_TEXTENCODING_DONTKNOW }, - { "zh", RTL_TEXTENCODING_BIG5 } -}; - -/***************************************************************************** - return the text encoding corresponding to the given locale - *****************************************************************************/ - -rtl_TextEncoding osl_getTextEncodingFromLocale( rtl_Locale * pLocale ) -{ - const _pair *language = 0; - char locale_buf[64] = ""; - char *cp; - - /* default to process locale if pLocale == NULL */ - if( NULL == pLocale ) - osl_getProcessLocale( &pLocale ); - - /* convert rtl_Locale to locale string */ - if( _compose_locale( pLocale, locale_buf, 64 ) ) - { - /* check special handling list (EUC) first */ - const unsigned int members = sizeof( _full_locale_list ) / sizeof( _pair ); - language = _pair_search( locale_buf, _full_locale_list, members); - - if( NULL == language ) - { - /* - * check if there is a charset qualifier at the end of the given locale string - * e.g. de.ISO8859-15 or de.ISO8859-15@euro which strongly indicates what - * charset to use - */ - cp = strrchr( locale_buf, '.' ); - - if( NULL != cp ) - { - const unsigned int members = sizeof( _locale_extension_list ) / sizeof( _pair ); - language = _pair_search( cp + 1, _locale_extension_list, members); - } - } - - /* use iso language code to determine the charset */ - if( NULL == language ) - { - const unsigned int members = sizeof( _iso_language_list ) / sizeof( _pair ); - - /* iso lang codes have 2 charaters */ - locale_buf[2] = '\0'; - - language = _pair_search( locale_buf, _iso_language_list, members); - } - } - - /* a matching item in our list provides a mapping from codeset to - * rtl-codeset */ - if ( language != NULL ) - return language->value; - - return RTL_TEXTENCODING_DONTKNOW; -} - -#if defined(MACOSX) || defined(IOS) -#include "system.h" - -/* OS X locale discovery function */ -int (*pGetOSXLocale)( char *, sal_uInt32 ); - -/***************************************************************************** - return the current process locale - *****************************************************************************/ - -int macosx_getLocale(char *locale, sal_uInt32 bufferLen); - -void _imp_getProcessLocale( rtl_Locale ** ppLocale ) -{ - static char *locale = NULL; - - /* basic thread safeness */ -// pthread_mutex_lock( &aLocalMutex ); - - /* Only fetch the locale once and cache it */ - if ( NULL == locale ) - { - - locale = (char *)malloc( 128 ); - if ( locale ) - macosx_getLocale( locale, 128 ); - else - fprintf( stderr, "nlsupport.c: locale allocation returned NULL!\n" ); - } - - /* handle the case where OS specific method of finding locale fails */ - if ( NULL == locale ) - { - /* simulate behavior of setlocale */ - locale = getenv( "LC_ALL" ); - - if( NULL == locale ) - locale = getenv( "LC_CTYPE" ); - - if( NULL == locale ) - locale = getenv( "LANG" ); - - if( NULL == locale ) - locale = "C"; - } - - /* return the locale */ - *ppLocale = _parse_locale( locale ); - - setenv( "LC_ALL", locale, 1); - setenv("LC_CTYPE", locale, 1 ); - setenv("LANG", locale, 1 ); - -#if OSL_DEBUG_LEVEL > 1 - OSL_TRACE("_imp_getProcessLocale() returning %s as current locale.\n", locale ); -#endif - -// pthread_mutex_unlock( &aLocalMutex ); - -} -#else -/***************************************************************************** - return the current process locale - *****************************************************************************/ - -void _imp_getProcessLocale( rtl_Locale ** ppLocale ) -{ - /* simulate behavior off setlocale */ - char * locale = getenv( "LC_ALL" ); - - if( NULL == locale ) - locale = getenv( "LC_CTYPE" ); - - if( NULL == locale ) - locale = getenv( "LANG" ); - - if( NULL == locale ) - locale = "C"; - - *ppLocale = _parse_locale( locale ); -} -#endif - -/***************************************************************************** - set the current process locale - *****************************************************************************/ - -static int -_setenv (const char* name, const char* value) -{ - return setenv (name, value, 1); -} - -int _imp_setProcessLocale( rtl_Locale * pLocale ) -{ - char locale_buf[64]; - - /* convert rtl_Locale to locale string */ - if( NULL != _compose_locale( pLocale, locale_buf, 64 ) ) - { - /* only change env vars that exist already */ - if( getenv( "LC_ALL" ) ) - _setenv( "LC_ALL", locale_buf ); - - if( getenv( "LC_CTYPE" ) ) - _setenv("LC_CTYPE", locale_buf ); - - if( getenv( "LANG" ) ) - _setenv( "LANG", locale_buf ); - } - - return 0; -} - -#endif /* ifdef LINUX || SOLARIS || MACOSX || NETBSD || AIX */ - - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sal/osl/unx/osxlocale.cxx b/sal/osl/unx/osxlocale.cxx deleted file mode 100644 index 37b34b200..000000000 --- a/sal/osl/unx/osxlocale.cxx +++ /dev/null @@ -1,133 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2000, 2010 Oracle and/or its affiliates. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * <http://www.openoffice.org/license.html> - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -// MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_sal.hxx" - -#include <sal/types.h> -#include <assert.h> - -#include <premac.h> -#ifndef IOS -#include <CoreServices/CoreServices.h> -#endif -#include <CoreFoundation/CoreFoundation.h> -#include <postmac.h> - -namespace /* private */ -{ - template <typename T> - class CFGuard - { - public: - explicit CFGuard(T& rT) : rT_(rT) {} - ~CFGuard() { if (rT_) CFRelease(rT_); } - private: - T& rT_; - }; - - typedef CFGuard<CFArrayRef> CFArrayGuard; - typedef CFGuard<CFStringRef> CFStringGuard; - typedef CFGuard<CFPropertyListRef> CFPropertyListGuard; - - /** Get the current process locale from system - */ - CFStringRef getProcessLocale() - { - CFPropertyListRef pref = CFPreferencesCopyAppValue(CFSTR("AppleLocale"), kCFPreferencesCurrentApplication); - CFPropertyListGuard proplGuard(pref); - - if (pref == NULL) // return fallback value 'en_US' - return CFStringCreateWithCString(kCFAllocatorDefault, "en_US", kCFStringEncodingASCII); - - CFStringRef sref = (CFGetTypeID(pref) == CFArrayGetTypeID()) ? (CFStringRef)CFArrayGetValueAtIndex((CFArrayRef)pref, 0) : (CFStringRef)pref; - - // NOTE: this API is only available with Mac OS X >=10.3. We need to use it because - // Apple used non-ISO values on systems <10.2 like "German" for instance but didn't - // upgrade those values during upgrade to newer Mac OS X versions. See also #i54337# - return CFLocaleCreateCanonicalLocaleIdentifierFromString(kCFAllocatorDefault, sref); - } -} // namespace private - -/** Grab current locale from system. -*/ -extern "C" { -int macosx_getLocale(char *locale, sal_uInt32 bufferLen) -{ - CFStringRef sref = getProcessLocale(); - CFStringGuard sGuard(sref); - - assert(sref != NULL && "osxlocale.cxx: getProcessLocale must return a non-NULL value"); - - // split the string into substrings; the first two (if there are two) substrings - // are language and country - CFArrayRef subs = CFStringCreateArrayBySeparatingStrings(NULL, sref, CFSTR("_")); - CFArrayGuard arrGuard(subs); - - CFStringRef lang = (CFStringRef)CFArrayGetValueAtIndex(subs, 0); - CFStringGetCString(lang, locale, bufferLen, kCFStringEncodingASCII); - - // country also available? Assumption: if the array contains more than one - // value the second value is always the country! - if (CFArrayGetCount(subs) > 1) - { - strlcat(locale, "_", bufferLen - strlen(locale)); - - CFStringRef country = (CFStringRef)CFArrayGetValueAtIndex(subs, 1); - CFStringGetCString(country, locale + strlen(locale), bufferLen - strlen(locale), kCFStringEncodingASCII); - } - // Append 'UTF-8' to the locale because the Mac OS X file - // system interface is UTF-8 based and sal tries to determine - // the file system locale from the locale information - strlcat(locale, ".UTF-8", bufferLen - strlen(locale)); - - return noErr; -} -} - - - -/* - * macxp_OSXConvertCFEncodingToIANACharSetName - * - * Convert a CoreFoundation text encoding to an IANA charset name. - */ -extern "C" int macxp_OSXConvertCFEncodingToIANACharSetName( char *buffer, unsigned int bufferLen, CFStringEncoding cfEncoding ) -{ - CFStringRef sCFEncodingName; - - sCFEncodingName = CFStringConvertEncodingToIANACharSetName( cfEncoding ); - CFStringGetCString( sCFEncodingName, buffer, bufferLen, cfEncoding ); - - if ( sCFEncodingName ) - CFRelease( sCFEncodingName ); - - return( noErr ); -} - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sal/osl/unx/pipe.c b/sal/osl/unx/pipe.c deleted file mode 100644 index 75569e5cf..000000000 --- a/sal/osl/unx/pipe.c +++ /dev/null @@ -1,604 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2000, 2010 Oracle and/or its affiliates. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * <http://www.openoffice.org/license.html> - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -#include "system.h" - -#include <osl/pipe.h> -#include <osl/diagnose.h> -#include <osl/thread.h> -#include <osl/interlck.h> - -#include "sockimpl.h" - -#define PIPEDEFAULTPATH "/tmp" -#define PIPEALTERNATEPATH "/var/tmp" - -#define PIPENAMEMASK "OSL_PIPE_%s" -#define SECPIPENAMEMASK "OSL_PIPE_%s_%s" - -sal_Bool SAL_CALL osl_psz_getUserIdent(oslSecurity Security, sal_Char *pszIdent, sal_uInt32 nMax); -oslPipe SAL_CALL osl_psz_createPipe(const sal_Char *pszPipeName, oslPipeOptions Options, oslSecurity Security); - - -/*****************************************************************************/ -/* enum oslPipeError */ -/*****************************************************************************/ - -static struct -{ - int errcode; - oslPipeError error; -} PipeError[]= { - { 0, osl_Pipe_E_None }, /* no error */ - { EPROTOTYPE, osl_Pipe_E_NoProtocol }, /* Protocol wrong type for socket */ - { ENOPROTOOPT, osl_Pipe_E_NoProtocol }, /* Protocol not available */ - { EPROTONOSUPPORT, osl_Pipe_E_NoProtocol }, /* Protocol not supported */ - { ESOCKTNOSUPPORT, osl_Pipe_E_NoProtocol }, /* Socket type not supported */ - { EPFNOSUPPORT, osl_Pipe_E_NoProtocol }, /* Protocol family not supported */ - { EAFNOSUPPORT, osl_Pipe_E_NoProtocol }, /* Address family not supported by */ - /* protocol family */ - { ENETRESET, osl_Pipe_E_NetworkReset }, /* Network dropped connection because */ - /* of reset */ - { ECONNABORTED, osl_Pipe_E_ConnectionAbort }, /* Software caused connection abort */ - { ECONNRESET, osl_Pipe_E_ConnectionReset }, /* Connection reset by peer */ - { ENOBUFS, osl_Pipe_E_NoBufferSpace }, /* No buffer space available */ - { ETIMEDOUT, osl_Pipe_E_TimedOut }, /* Connection timed out */ - { ECONNREFUSED, osl_Pipe_E_ConnectionRefused }, /* Connection refused */ - { -1, osl_Pipe_E_invalidError } -}; - - -/* map */ -/* mfe: NOT USED - static int osl_NativeFromPipeError(oslPipeError errorCode) - { - int i = 0; - - while ((PipeError[i].error != osl_Pipe_E_invalidError) && - (PipeError[i].error != errorCode)) i++; - - return PipeError[i].errcode; - - } -*/ - -/* reverse map */ -static oslPipeError osl_PipeErrorFromNative(int nativeType) -{ - int i = 0; - - while ((PipeError[i].error != osl_Pipe_E_invalidError) && - (PipeError[i].errcode != nativeType)) i++; - - return PipeError[i].error; -} - - -/* macros */ -#define ERROR_TO_NATIVE(x) osl_NativeFromPipeError(x) -#define ERROR_FROM_NATIVE(y) osl_PipeErrorFromNative(y) - - -/*****************************************************************************/ -/* osl_create/destroy-PipeImpl */ -/*****************************************************************************/ - -oslPipe __osl_createPipeImpl() -{ - oslPipe pPipeImpl; - - pPipeImpl = (oslPipe)calloc(1, sizeof(struct oslPipeImpl)); - pPipeImpl->m_nRefCount =1; - pPipeImpl->m_bClosed = sal_False; -#if defined(LINUX) - pPipeImpl->m_bIsInShutdown = sal_False; - pPipeImpl->m_bIsAccepting = sal_False; -#endif - return pPipeImpl; -} - -void __osl_destroyPipeImpl(oslPipe pImpl) -{ - if (pImpl != NULL) - free(pImpl); -} - - -/*****************************************************************************/ -/* osl_createPipe */ -/*****************************************************************************/ -oslPipe SAL_CALL osl_createPipe(rtl_uString *ustrPipeName, oslPipeOptions Options, oslSecurity Security) -{ - oslPipe pPipe=0; - rtl_String* strPipeName=0; - sal_Char* pszPipeName=0; - - if ( ustrPipeName != 0 ) - { - rtl_uString2String( &strPipeName, - rtl_uString_getStr(ustrPipeName), - rtl_uString_getLength(ustrPipeName), - osl_getThreadTextEncoding(), - OUSTRING_TO_OSTRING_CVTFLAGS ); - pszPipeName = rtl_string_getStr(strPipeName); - pPipe = osl_psz_createPipe(pszPipeName, Options, Security); - - if ( strPipeName != 0 ) - { - rtl_string_release(strPipeName); - } - } - - return pPipe; - -} - -oslPipe SAL_CALL osl_psz_createPipe(const sal_Char *pszPipeName, oslPipeOptions Options, - oslSecurity Security) -{ - int Flags; - size_t len; - struct sockaddr_un addr; - - sal_Char name[PATH_MAX + 1]; - size_t nNameLength = 0; - int bNameTooLong = 0; - oslPipe pPipe; - - if (access(PIPEDEFAULTPATH, R_OK|W_OK) == 0) - { - strncpy(name, PIPEDEFAULTPATH, sizeof(name)); - } - else - { - strncpy(name, PIPEALTERNATEPATH, sizeof(name)); - } - name[sizeof(name) - 1] = '\0'; // ensure the string is NULL-terminated - nNameLength = strlen(name); - bNameTooLong = nNameLength > sizeof(name) - 2; - - if (!bNameTooLong) - { - size_t nRealLength = 0; - - strcat(name, "/"); - ++nNameLength; - - if (Security) - { - sal_Char Ident[256]; - - Ident[0] = '\0'; - - OSL_VERIFY(osl_psz_getUserIdent(Security, Ident, sizeof(Ident))); - - nRealLength = snprintf(&name[nNameLength], sizeof(name) - nNameLength, SECPIPENAMEMASK, Ident, pszPipeName); - } - else - { - nRealLength = snprintf(&name[nNameLength], sizeof(name) - nNameLength, PIPENAMEMASK, pszPipeName); - } - - bNameTooLong = nRealLength > sizeof(name) - nNameLength - 1; - } - - if (bNameTooLong) - { - OSL_TRACE("osl_createPipe: pipe name too long"); - return NULL; - } - - /* alloc memory */ - pPipe= __osl_createPipeImpl(); - - /* create socket */ - pPipe->m_Socket = socket(AF_UNIX, SOCK_STREAM, 0); - if ( pPipe->m_Socket < 0 ) - { - OSL_TRACE("osl_createPipe socket failed. Errno: %d; %s\n",errno, strerror(errno)); - __osl_destroyPipeImpl(pPipe); - return NULL; - } - -/* OSL_TRACE("osl_createPipe : new Pipe on fd %i\n",pPipe->m_Socket);*/ - - /* set close-on-exec flag */ - if ((Flags = fcntl(pPipe->m_Socket, F_GETFD, 0)) != -1) - { - Flags |= FD_CLOEXEC; - if (fcntl(pPipe->m_Socket, F_SETFD, Flags) == -1) - { - OSL_TRACE("osl_createPipe failed changing socket flags. Errno: %d; %s\n",errno,strerror(errno)); - } - } - - memset(&addr, 0, sizeof(addr)); - - OSL_TRACE("osl_createPipe : Pipe Name '%s'",name); - - addr.sun_family = AF_UNIX; - strncpy(addr.sun_path, name, sizeof(addr.sun_path)); -#if defined(FREEBSD) - len = SUN_LEN(&addr); -#else - len = sizeof(addr); -#endif - - if ( Options & osl_Pipe_CREATE ) - { - struct stat status; - - /* check if there exists an orphan filesystem entry */ - if ( ( stat(name, &status) == 0) && - ( S_ISSOCK(status.st_mode) || S_ISFIFO(status.st_mode) ) ) - { - if ( connect(pPipe->m_Socket,(struct sockaddr *)&addr,len) >= 0 ) - { - OSL_TRACE("osl_createPipe : Pipe already in use. Errno: %d; %s\n",errno,strerror(errno)); - close (pPipe->m_Socket); - __osl_destroyPipeImpl(pPipe); - return NULL; - } - - unlink(name); - } - - /* ok, fs clean */ - if ( bind(pPipe->m_Socket, (struct sockaddr *)&addr, len) < 0 ) - { - OSL_TRACE("osl_createPipe : failed to bind socket. Errno: %d; %s\n",errno,strerror(errno)); - close (pPipe->m_Socket); - __osl_destroyPipeImpl(pPipe); - return NULL; - } - - /* Only give access to all if no security handle was specified, otherwise security - depends on umask */ - - if ( !Security ) - chmod(name,S_IRWXU | S_IRWXG |S_IRWXO); - - - strncpy(pPipe->m_Name, name, sizeof(pPipe->m_Name)); - - if ( listen(pPipe->m_Socket, 5) < 0 ) - { - OSL_TRACE("osl_createPipe failed to listen. Errno: %d; %s\n",errno,strerror(errno)); - unlink(name); /* remove filesystem entry */ - close (pPipe->m_Socket); - __osl_destroyPipeImpl(pPipe); - return NULL; - } - - return (pPipe); - } - else - { /* osl_pipe_OPEN */ - if ( access(name, F_OK) != -1 ) - { - if ( connect( pPipe->m_Socket, (struct sockaddr *)&addr, len) >= 0 ) - { - return (pPipe); - } - - OSL_TRACE("osl_createPipe failed to connect. Errno: %d; %s\n",errno,strerror(errno)); - } - - close (pPipe->m_Socket); - __osl_destroyPipeImpl(pPipe); - return NULL; - } -} - -void SAL_CALL osl_acquirePipe( oslPipe pPipe ) -{ - osl_incrementInterlockedCount( &(pPipe->m_nRefCount) ); -} - -void SAL_CALL osl_releasePipe( oslPipe pPipe ) -{ - - if( 0 == pPipe ) - return; - - if( 0 == osl_decrementInterlockedCount( &(pPipe->m_nRefCount) ) ) - { - if( ! pPipe->m_bClosed ) - osl_closePipe( pPipe ); - - __osl_destroyPipeImpl( pPipe ); - } -} - -void SAL_CALL osl_closePipe( oslPipe pPipe ) -{ - int nRet; -#if defined(LINUX) - size_t len; - struct sockaddr_un addr; - int fd; -#endif - int ConnFD; - - if( ! pPipe ) - { - return; - } - - if( pPipe->m_bClosed ) - { - return; - } - - ConnFD = pPipe->m_Socket; - - /* - Thread does not return from accept on linux, so - connect to the accepting pipe - */ -#if defined(LINUX) - if ( pPipe->m_bIsAccepting ) - { - pPipe->m_bIsInShutdown = sal_True; - pPipe->m_Socket = -1; - fd = socket(AF_UNIX, SOCK_STREAM, 0); - memset(&addr, 0, sizeof(addr)); - - OSL_TRACE("osl_destroyPipe : Pipe Name '%s'",pPipe->m_Name); - - addr.sun_family = AF_UNIX; - strncpy(addr.sun_path, pPipe->m_Name, sizeof(addr.sun_path)); - len = sizeof(addr); - - nRet = connect( fd, (struct sockaddr *)&addr, len); - if ( nRet < 0 ) - { - OSL_TRACE("connect in osl_destroyPipe failed with error: %s", strerror(errno)); - } - close(fd); - } -#endif /* LINUX */ - - - nRet = shutdown(ConnFD, 2); - if ( nRet < 0 ) - { - OSL_TRACE("shutdown in destroyPipe failed : '%s'\n",strerror(errno)); - } - - nRet = close(ConnFD); - if ( nRet < 0 ) - { - OSL_TRACE("close in destroyPipe failed : '%s'\n",strerror(errno)); - } - /* remove filesystem entry */ - if ( strlen(pPipe->m_Name) > 0 ) - { - unlink(pPipe->m_Name); - } - pPipe->m_bClosed = sal_True; - -/* OSL_TRACE("Out osl_destroyPipe"); */ -} - - -/*****************************************************************************/ -/* osl_acceptPipe */ -/*****************************************************************************/ -oslPipe SAL_CALL osl_acceptPipe(oslPipe pPipe) -{ - int s, flags; - oslPipe pAcceptedPipe; - - OSL_ASSERT(pPipe); - if ( pPipe == 0 ) - { - return NULL; - } - - OSL_ASSERT(strlen(pPipe->m_Name) > 0); - -#if defined(LINUX) - pPipe->m_bIsAccepting = sal_True; -#endif - - s = accept(pPipe->m_Socket, NULL, NULL); - -#if defined(LINUX) - pPipe->m_bIsAccepting = sal_False; -#endif - - if (s < 0) - { - OSL_TRACE("osl_acceptPipe : accept error '%s'", strerror(errno)); - return NULL; - } - -#if defined(LINUX) - if ( pPipe->m_bIsInShutdown ) - { - close(s); - return NULL; - } -#endif /* LINUX */ - else - { - /* alloc memory */ - pAcceptedPipe= __osl_createPipeImpl(); - - OSL_ASSERT(pAcceptedPipe); - if(pAcceptedPipe==NULL) - { - close(s); - return NULL; - } - - /* set close-on-exec flag */ - if (!((flags = fcntl(s, F_GETFD, 0)) < 0)) - { - flags |= FD_CLOEXEC; - if (fcntl(s, F_SETFD, flags) < 0) - { - OSL_TRACE("osl_acceptPipe: error changing socket flags. " - "Errno: %d; %s",errno,strerror(errno)); - } - } - - pAcceptedPipe->m_Socket = s; - } - - return pAcceptedPipe; -} - -/*****************************************************************************/ -/* osl_receivePipe */ -/*****************************************************************************/ -sal_Int32 SAL_CALL osl_receivePipe(oslPipe pPipe, - void* pBuffer, - sal_Int32 BytesToRead) -{ - int nRet = 0; - - OSL_ASSERT(pPipe); - - if ( pPipe == 0 ) - { - OSL_TRACE("osl_receivePipe : Invalid socket"); - errno=EINVAL; - return -1; - } - - nRet = recv(pPipe->m_Socket, - (sal_Char*)pBuffer, - BytesToRead, 0); - - if ( nRet < 0 ) - { - OSL_TRACE("osl_receivePipe failed : %i '%s'",nRet,strerror(errno)); - } - - return nRet; -} - - -/*****************************************************************************/ -/* osl_sendPipe */ -/*****************************************************************************/ -sal_Int32 SAL_CALL osl_sendPipe(oslPipe pPipe, - const void* pBuffer, - sal_Int32 BytesToSend) -{ - int nRet=0; - - OSL_ASSERT(pPipe); - - if ( pPipe == 0 ) - { - OSL_TRACE("osl_sendPipe : Invalid socket"); - errno=EINVAL; - return -1; - } - - nRet = send(pPipe->m_Socket, - (sal_Char*)pBuffer, - BytesToSend, 0); - - - if ( nRet <= 0 ) - { - OSL_TRACE("osl_sendPipe failed : %i '%s'",nRet,strerror(errno)); - } - - return nRet; -} - - -/*****************************************************************************/ -/* osl_getLastPipeError */ -/*****************************************************************************/ -oslPipeError SAL_CALL osl_getLastPipeError(oslPipe pPipe) -{ - (void) pPipe; /* unused */ - return ERROR_FROM_NATIVE(errno); -} - - -sal_Int32 SAL_CALL osl_writePipe( oslPipe pPipe, const void *pBuffer , sal_Int32 n ) -{ - /* loop until all desired bytes were send or an error occurred */ - sal_Int32 BytesSend= 0; - sal_Int32 BytesToSend= n; - - OSL_ASSERT(pPipe); - while (BytesToSend > 0) - { - sal_Int32 RetVal; - - RetVal= osl_sendPipe(pPipe, pBuffer, BytesToSend); - - /* error occurred? */ - if(RetVal <= 0) - { - break; - } - - BytesToSend -= RetVal; - BytesSend += RetVal; - pBuffer= (sal_Char*)pBuffer + RetVal; - } - - return BytesSend; -} - -sal_Int32 SAL_CALL osl_readPipe( oslPipe pPipe, void *pBuffer , sal_Int32 n ) -{ - /* loop until all desired bytes were read or an error occurred */ - sal_Int32 BytesRead= 0; - sal_Int32 BytesToRead= n; - - OSL_ASSERT( pPipe ); - while (BytesToRead > 0) - { - sal_Int32 RetVal; - RetVal= osl_receivePipe(pPipe, pBuffer, BytesToRead); - - /* error occurred? */ - if(RetVal <= 0) - { - break; - } - - BytesToRead -= RetVal; - BytesRead += RetVal; - pBuffer= (sal_Char*)pBuffer + RetVal; - } - return BytesRead; -} - - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sal/osl/unx/process.c b/sal/osl/unx/process.c deleted file mode 100644 index 307cee5a5..000000000 --- a/sal/osl/unx/process.c +++ /dev/null @@ -1,1528 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2000, 2010 Oracle and/or its affiliates. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * <http://www.openoffice.org/license.html> - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - - -/* - * ToDo: - * - cleanup of process status things - * - cleanup of process spawning - * - cleanup of resource transfer - */ - -#if defined(SOLARIS) - // The procfs may only be used without LFS in 32bits. -# ifdef _FILE_OFFSET_BITS -# undef _FILE_OFFSET_BITS -# endif -#endif - - -#if defined(FREEBSD) || defined(NETBSD) || defined(DRAGONFLY) -#include <machine/param.h> -#endif - -#include "system.h" -#if defined(SOLARIS) -# include <sys/procfs.h> -#endif -#include <osl/diagnose.h> -#include <osl/mutex.h> - -#ifndef _OSL_CONDITN_H_ -#include <osl/conditn.h> -#endif -#include <osl/thread.h> -#include <osl/file.h> -#include <osl/signal.h> -#include <rtl/alloc.h> - -#include <grp.h> - -#include "procimpl.h" -#include "readwrite_helper.h" -#include "sockimpl.h" -#include "secimpl.h" - - -#define MAX_ARGS 255 -#define MAX_ENVS 255 - -#if defined(MACOSX) || defined(IOS) || defined(IORESOURCE_TRANSFER_BSD) || defined(AIX) -#define CONTROLLEN (sizeof(struct cmsghdr) + sizeof(int)) -#endif - -/* implemented in file.c */ -extern oslFileError FileURLToPath( char *, size_t, rtl_uString* ); -extern oslFileHandle osl_createFileHandleFromFD( int fd ); - -/****************************************************************************** - * - * Data Type Definition - * - ******************************************************************************/ - -typedef struct { - int m_hPipe; - int m_hConn; - sal_Char m_Name[PATH_MAX + 1]; -} Pipe; - -typedef struct { - const sal_Char* m_pszArgs[MAX_ARGS + 1]; - oslProcessOption m_options; - const sal_Char* m_pszDir; - sal_Char* m_pszEnv[MAX_ENVS + 1]; - uid_t m_uid; - gid_t m_gid; - sal_Char* m_name; - oslCondition m_started; - oslProcessImpl* m_pProcImpl; - oslFileHandle *m_pInputWrite; - oslFileHandle *m_pOutputRead; - oslFileHandle *m_pErrorRead; -} ProcessData; - -typedef struct _oslPipeImpl { - int m_Socket; - sal_Char m_Name[PATH_MAX + 1]; -} oslPipeImpl; - - -/****************************************************************************** - * - * Function Declarations - * - *****************************************************************************/ - -oslProcessError SAL_CALL osl_psz_executeProcess(sal_Char *pszImageName, - sal_Char *pszArguments[], - oslProcessOption Options, - oslSecurity Security, - sal_Char *pszDirectory, - sal_Char *pszEnvironments[], - oslProcess *pProcess, - oslFileHandle *pInputWrite, - oslFileHandle *pOutputRead, - oslFileHandle *pErrorRead ); - - -oslProcessError SAL_CALL osl_searchPath_impl( - const sal_Char* pszName, - const sal_Char* pszPath, - sal_Char Separator, - sal_Char *pszBuffer, - sal_uInt32 Max); - - -sal_Bool osl_getFullPath(const sal_Char* pszFilename, sal_Char* pszPath, sal_uInt32 MaxLen); - -static oslProcessImpl* ChildList; -static oslMutex ChildListMutex; - -/****************************************************************************** - Deprecated - Old and buggy implementation of osl_searchPath used only by - osl_psz_executeProcess. - A new implemenation is in file_path_helper.cxx - *****************************************************************************/ - -oslProcessError SAL_CALL osl_searchPath_impl(const sal_Char* pszName, const sal_Char* pszPath, - sal_Char Separator, sal_Char *pszBuffer, sal_uInt32 Max) -{ - sal_Char path[PATH_MAX + 1]; - sal_Char *pchr; - - path[0] = '\0'; - - OSL_ASSERT(pszName != NULL); - - if ( pszName == 0 ) - { - return osl_Process_E_NotFound; - } - - if (pszPath == NULL) - pszPath = "PATH"; - - if (Separator == '\0') - Separator = ':'; - - - if ( (pchr = getenv(pszPath)) != 0 ) - { - sal_Char *pstr; - - while (*pchr != '\0') - { - pstr = path; - - while ((*pchr != '\0') && (*pchr != Separator)) - *pstr++ = *pchr++; - - if ((pstr > path) && ((*(pstr - 1) != '/'))) - *pstr++ = '/'; - - *pstr = '\0'; - - strcat(path, pszName); - - if (access(path, 0) == 0) - { - char szRealPathBuf[PATH_MAX] = ""; - - if( NULL == realpath(path, szRealPathBuf) || (strlen(szRealPathBuf) >= (sal_uInt32)Max)) - return osl_Process_E_Unknown; - - strcpy(pszBuffer, path); - - return osl_Process_E_None; - } - - if (*pchr == Separator) - pchr++; - } - } - - return osl_Process_E_NotFound; -} - -/****************************************************************************** - * - * New io resource transfer functions - * - *****************************************************************************/ - - -/********************************************** - sendFdPipe - *********************************************/ - -static sal_Bool sendFdPipe(int PipeFD, int SocketFD) -{ - sal_Bool bRet = sal_False; - - struct iovec iov[1]; - struct msghdr msg; - char buf[2]; /* send_fd()/recv_fd() 2-byte protocol */ - int nSend; - int RetCode=0; - -#if defined(IOCHANNEL_TRANSFER_BSD) - - OSL_TRACE("IOCHANNEL_TRANSFER_BSD send"); -/* OSL_TRACE("sending fd %i\n",SocketFD); */ - - iov[0].iov_base = buf; - iov[0].iov_len = sizeof(buf); - msg.msg_iov = iov; - msg.msg_iovlen = 1; - msg.msg_name = NULL; - msg.msg_namelen = 0; - - msg.msg_accrights = (caddr_t) &SocketFD; /* addr of descriptor */ - msg.msg_accrightslen = sizeof(int); /* pass 1 descriptor */ - buf[1] = 0; /* zero status means OK */ - buf[0] = 0; /* null byte flag to recv_fd() */ - -#else - - struct cmsghdr* cmptr = (struct cmsghdr*)malloc(CONTROLLEN); - - OSL_TRACE("!!!!!! IOCHANNEL_TRANSFER_BSD_RENO send"); -/* OSL_TRACE("sending fd %i\n",SocketFD); */ - - iov[0].iov_base = buf; - iov[0].iov_len = sizeof(buf); - msg.msg_iov = iov; - msg.msg_iovlen = 1; - msg.msg_name = NULL; - msg.msg_namelen = 0; - msg.msg_control = (caddr_t) cmptr; - msg.msg_controllen = CONTROLLEN; - - cmptr->cmsg_level = SOL_SOCKET; - cmptr->cmsg_type = SCM_RIGHTS; - cmptr->cmsg_len = CONTROLLEN; - memcpy(CMSG_DATA(cmptr), &SocketFD, sizeof(int)); - -#endif - - if ( ( nSend = sendmsg(PipeFD, &msg, 0) ) > 0 ) - { - bRet = sal_True; - OSL_TRACE("sendFdPipe : send '%i' bytes\n",nSend); - - } - else - { - OSL_TRACE("sendFdPipe : sending failed (%s)",strerror(errno)); - } - - bRet = safeRead(PipeFD, &RetCode, sizeof(RetCode)); - - if ( bRet && RetCode == 1 ) - { - OSL_TRACE("sendFdPipe : resource was received\n"); - } - else - { - OSL_TRACE("sendFdPipe : resource wasn't received (error %s)\n", strerror(errno)); - } - -#if defined(IOCHANNEL_TRANSFER_BSD_RENO) - free(cmptr); -#endif - - return bRet; -} - -/********************************************** - receiveFdPipe - *********************************************/ - -static oslSocket receiveFdPipe(int PipeFD) -{ - oslSocket pSocket = 0; - struct msghdr msghdr; - struct iovec iov[1]; - char buffer[2]; - sal_Int32 nRead; - int newfd=-1; - int nRetCode=0; -/* char *ptr; */ - -#if defined(IOCHANNEL_TRANSFER_BSD) - - OSL_TRACE("IOCHANNEL_TRANSFER_BSD receive\n"); - - iov[0].iov_base = buffer; - iov[0].iov_len = sizeof(buffer); - msghdr.msg_name = NULL; - msghdr.msg_namelen = 0; - msghdr.msg_iov = iov; - msghdr.msg_iovlen = 1; - msghdr.msg_accrights = (caddr_t) &newfd; /* addr of descriptor */ - msghdr.msg_accrightslen = sizeof(int); /* receive 1 descriptor */ - -#else - struct cmsghdr* cmptr = (struct cmsghdr*)malloc(CONTROLLEN); - - OSL_TRACE(" !!!! IOCHANNEL_TRANSFER_BSD_RENO receive"); - - iov[0].iov_base = buffer; - iov[0].iov_len = sizeof(buffer); - msghdr.msg_name = NULL; - msghdr.msg_namelen = 0; - msghdr.msg_iov = iov; - msghdr.msg_iovlen = 1; - - msghdr.msg_control = (caddr_t) cmptr; - msghdr.msg_controllen = CONTROLLEN; - -#endif - - -#if defined(IOCHANNEL_TRANSFER_BSD) - - if ( ( nRead = recvmsg(PipeFD, &msghdr, 0) ) > 0 ) - { - OSL_TRACE("receiveFdPipe : received '%i' bytes\n",nRead); - } -#else - - if ( ( ( nRead = recvmsg(PipeFD, &msghdr, 0) ) > 0 ) && - ( msghdr.msg_controllen == CONTROLLEN ) ) - { - OSL_TRACE("receiveFdPipe : received '%i' bytes\n",nRead); - memcpy(&newfd, CMSG_DATA(cmptr), sizeof(int)); - } -#endif - else - { - OSL_TRACE("receiveFdPipe : receiving failed (%s)",strerror(errno)); - } - - if ( newfd >= 0 ) - { - pSocket = __osl_createSocketImpl(newfd); - nRetCode=1; - OSL_TRACE("received fd %i\n",newfd); - } - - OSL_TRACE("receiveFdPipe : writing back %i",nRetCode); - if ( !safeWrite(PipeFD, &nRetCode, sizeof(nRetCode)) ) - OSL_TRACE("write failed (%s)", strerror(errno)); - - if ( nRead < 0 ) - { - OSL_TRACE("write failed (%s)", strerror(errno)); - } - else if ( nRead != sizeof(nRetCode) ) - { - // TODO: Handle this case. - OSL_TRACE("partial write: wrote %d out of %d)", nRead, sizeof(nRetCode)); - } - -#if defined(IOCHANNEL_TRANSFER_BSD_RENO) - free(cmptr); -#endif - - return pSocket; -} - -/********************************************** - osl_sendResourcePipe - *********************************************/ - -sal_Bool osl_sendResourcePipe(oslPipe pPipe, oslSocket pSocket) -{ - sal_Bool bRet = sal_False; - - if ( pSocket == 0 || pPipe == 0 ) - { - return sal_False; - } - - bRet = sendFdPipe(pPipe->m_Socket,pSocket->m_Socket); - - return bRet; -} - -/********************************************** - osl_receiveResourcePipe - *********************************************/ - -oslSocket osl_receiveResourcePipe(oslPipe pPipe) -{ - oslSocket pSocket=0; - - if ( pPipe == 0 ) - { - return 0; - } - - pSocket = receiveFdPipe(pPipe->m_Socket); - - return (oslSocket) pSocket; -} - - - -/****************************************************************************** - * - * Functions for starting a process - * - *****************************************************************************/ - -static void ChildStatusProc(void *pData) -{ - pid_t pid = -1; - int status = 0; - int channel[2]; - ProcessData data; - ProcessData *pdata; - int stdOutput[2] = { -1, -1 }, stdInput[2] = { -1, -1 }, stdError[2] = { -1, -1 }; - - pdata = (ProcessData *)pData; - - /* make a copy of our data, because forking will only copy - our local stack of the thread, so the process data will not be accessible - in our child process */ - memcpy(&data, pData, sizeof(data)); - -#ifdef NO_CHILD_PROCESSES -#define fork() (errno = EINVAL, -1) -#endif - if (socketpair(AF_UNIX, SOCK_STREAM, 0, channel) == -1) - status = errno; - - fcntl(channel[0], F_SETFD, FD_CLOEXEC); - fcntl(channel[1], F_SETFD, FD_CLOEXEC); - - /* Create redirected IO pipes */ - if ( status == 0 && data.m_pInputWrite ) - if (pipe( stdInput ) == -1) - status = errno; - - if ( status == 0 && data.m_pOutputRead ) - if (pipe( stdOutput ) == -1) - status = errno; - - if ( status == 0 && data.m_pErrorRead ) - if (pipe( stdError ) == -1) - status = errno; - - if ( (status == 0) && ((pid = fork()) == 0) ) - { - /* Child */ - int chstatus = 0; - - if (channel[0] != -1) close(channel[0]); - - if ((data.m_uid != (uid_t)-1) && ((data.m_uid != getuid()) || (data.m_gid != getgid()))) - { - OSL_ASSERT(geteuid() == 0); /* must be root */ - - if (! INIT_GROUPS(data.m_name, data.m_gid) || (setuid(data.m_uid) != 0)) - OSL_TRACE("Failed to change uid and guid, errno=%d (%s)\n", errno, strerror(errno)); -#if defined(LINUX) || defined (FREEBSD) || defined(NETBSD) || defined(OPENBSD) || defined(DRAGONFLY) - unsetenv("HOME"); -#else - putenv("HOME="); -#endif - } - - if (data.m_pszDir) - chstatus = chdir(data.m_pszDir); - - if (chstatus == 0 && ((data.m_uid == (uid_t)-1) || ((data.m_uid == getuid()) && (data.m_gid == getgid())))) - { - int i; - for (i = 0; data.m_pszEnv[i] != NULL; i++) - { - if (strchr(data.m_pszEnv[i], '=') == NULL) - { - unsetenv(data.m_pszEnv[i]); /*TODO: check error return*/ - } - else - { - putenv(data.m_pszEnv[i]); /*TODO: check error return*/ - } - } - - OSL_TRACE("ChildStatusProc : starting '%s'",data.m_pszArgs[0]); - - /* Connect std IO to pipe ends */ - - /* Write end of stdInput not used in child process */ - if (stdInput[1] != -1) close( stdInput[1] ); - - /* Read end of stdOutput not used in child process */ - if (stdOutput[0] != -1) close( stdOutput[0] ); - - /* Read end of stdError not used in child process */ - if (stdError[0] != -1) close( stdError[0] ); - - /* Redirect pipe ends to std IO */ - - if ( stdInput[0] != STDIN_FILENO ) - { - dup2( stdInput[0], STDIN_FILENO ); - if (stdInput[0] != -1) close( stdInput[0] ); - } - - if ( stdOutput[1] != STDOUT_FILENO ) - { - dup2( stdOutput[1], STDOUT_FILENO ); - if (stdOutput[1] != -1) close( stdOutput[1] ); - } - - if ( stdError[1] != STDERR_FILENO ) - { - dup2( stdError[1], STDERR_FILENO ); - if (stdError[1] != -1) close( stdError[1] ); - } - - // No need to check the return value of execv. If we return from - // it, an error has occurred. - execv(data.m_pszArgs[0], (sal_Char **)data.m_pszArgs); - } - - OSL_TRACE("Failed to exec, errno=%d (%s)\n", errno, strerror(errno)); - - OSL_TRACE("ChildStatusProc : starting '%s' failed",data.m_pszArgs[0]); - - /* if we reach here, something went wrong */ - if ( !safeWrite(channel[1], &errno, sizeof(errno)) ) - OSL_TRACE("sendFdPipe : sending failed (%s)",strerror(errno)); - - if ( channel[1] != -1 ) - close(channel[1]); - - _exit(255); - } - else - { /* Parent */ - int i = -1; - if (channel[1] != -1) close(channel[1]); - - /* Close unused pipe ends */ - if (stdInput[0] != -1) close( stdInput[0] ); - if (stdOutput[1] != -1) close( stdOutput[1] ); - if (stdError[1] != -1) close( stdError[1] ); - - if (pid > 0) - { - while (((i = read(channel[0], &status, sizeof(status))) < 0)) - { - if (errno != EINTR) - break; - } - } - - if (channel[0] != -1) close(channel[0]); - - if ((pid > 0) && (i == 0)) - { - pid_t child_pid; - osl_acquireMutex(ChildListMutex); - - pdata->m_pProcImpl->m_pid = pid; - pdata->m_pProcImpl->m_pnext = ChildList; - ChildList = pdata->m_pProcImpl; - - /* Store used pipe ends in data structure */ - - if ( pdata->m_pInputWrite ) - *(pdata->m_pInputWrite) = osl_createFileHandleFromFD( stdInput[1] ); - - if ( pdata->m_pOutputRead ) - *(pdata->m_pOutputRead) = osl_createFileHandleFromFD( stdOutput[0] ); - - if ( pdata->m_pErrorRead ) - *(pdata->m_pErrorRead) = osl_createFileHandleFromFD( stdError[0] ); - - osl_releaseMutex(ChildListMutex); - - osl_setCondition(pdata->m_started); - - do - { - child_pid = waitpid(pid, &status, 0); - } while ( 0 > child_pid && EINTR == errno ); - - if ( child_pid < 0) - { - OSL_TRACE("Failed to wait for child process, errno=%d (%s)\n", errno, strerror(errno)); - - /* - We got an other error than EINTR. Anyway we have to wake up the - waiting thread under any circumstances */ - - child_pid = pid; - } - - - if ( child_pid > 0 ) - { - oslProcessImpl* pChild; - - osl_acquireMutex(ChildListMutex); - - pChild = ChildList; - - /* check if it is one of our child processes */ - while (pChild != NULL) - { - if (pChild->m_pid == child_pid) - { - if (WIFEXITED(status)) - pChild->m_status = WEXITSTATUS(status); - else - pChild->m_status = -1; - - osl_setCondition(pChild->m_terminated); - } - - pChild = pChild->m_pnext; - } - - osl_releaseMutex(ChildListMutex); - } - } - else - { - OSL_TRACE("ChildStatusProc : starting '%s' failed",data.m_pszArgs[0]); - OSL_TRACE("Failed to launch child process, child reports errno=%d (%s)\n", status, strerror(status)); - - /* Close pipe ends */ - if ( pdata->m_pInputWrite ) - *pdata->m_pInputWrite = NULL; - - if ( pdata->m_pOutputRead ) - *pdata->m_pOutputRead = NULL; - - if ( pdata->m_pErrorRead ) - *pdata->m_pErrorRead = NULL; - - if (stdInput[1] != -1) close( stdInput[1] ); - if (stdOutput[0] != -1) close( stdOutput[0] ); - if (stdError[0] != -1) close( stdError[0] ); - - //if pid > 0 then a process was created, even if it later failed - //e.g. bash searching for a command to execute, and we still - //need to clean it up to avoid "defunct" processes - if (pid > 0) - { - pid_t child_pid; - do - { - child_pid = waitpid(pid, &status, 0); - } while ( 0 > child_pid && EINTR == errno ); - } - - /* notify (and unblock) parent thread */ - osl_setCondition(pdata->m_started); - } - } -} - -/********************************************** - osl_executeProcess_WithRedirectedIO - *********************************************/ - -oslProcessError SAL_CALL osl_executeProcess_WithRedirectedIO( - rtl_uString *ustrImageName, - rtl_uString *ustrArguments[], - sal_uInt32 nArguments, - oslProcessOption Options, - oslSecurity Security, - rtl_uString *ustrWorkDir, - rtl_uString *ustrEnvironment[], - sal_uInt32 nEnvironmentVars, - oslProcess *pProcess, - oslFileHandle *pInputWrite, - oslFileHandle *pOutputRead, - oslFileHandle *pErrorRead - ) -{ - - oslProcessError Error; - sal_Char* pszWorkDir=0; - sal_Char** pArguments=0; - sal_Char** pEnvironment=0; - unsigned int idx; - - char szImagePath[PATH_MAX] = ""; - char szWorkDir[PATH_MAX] = ""; - - if ( ustrImageName && ustrImageName->length ) - { - FileURLToPath( szImagePath, PATH_MAX, ustrImageName ); - } - - if ( ustrWorkDir != 0 && ustrWorkDir->length ) - { - FileURLToPath( szWorkDir, PATH_MAX, ustrWorkDir ); - pszWorkDir = szWorkDir; - } - - if ( pArguments == 0 && nArguments > 0 ) - { - pArguments = (sal_Char**) malloc( ( nArguments + 2 ) * sizeof(sal_Char*) ); - } - - - for ( idx = 0 ; idx < nArguments ; ++idx ) - { - rtl_String* strArg =0; - - - rtl_uString2String( &strArg, - rtl_uString_getStr(ustrArguments[idx]), - rtl_uString_getLength(ustrArguments[idx]), - osl_getThreadTextEncoding(), - OUSTRING_TO_OSTRING_CVTFLAGS ); - - pArguments[idx]=strdup(rtl_string_getStr(strArg)); - rtl_string_release(strArg); - pArguments[idx+1]=0; - } - - for ( idx = 0 ; idx < nEnvironmentVars ; ++idx ) - { - rtl_String* strEnv=0; - - if ( pEnvironment == 0 ) - { - pEnvironment = (sal_Char**) malloc( ( nEnvironmentVars + 2 ) * sizeof(sal_Char*) ); - } - - rtl_uString2String( &strEnv, - rtl_uString_getStr(ustrEnvironment[idx]), - rtl_uString_getLength(ustrEnvironment[idx]), - osl_getThreadTextEncoding(), - OUSTRING_TO_OSTRING_CVTFLAGS ); - - pEnvironment[idx]=strdup(rtl_string_getStr(strEnv)); - rtl_string_release(strEnv); - pEnvironment[idx+1]=0; - } - - - Error = osl_psz_executeProcess(szImagePath, - pArguments, - Options, - Security, - pszWorkDir, - pEnvironment, - pProcess, - pInputWrite, - pOutputRead, - pErrorRead - ); - - if ( pArguments != 0 ) - { - for ( idx = 0 ; idx < nArguments ; ++idx ) - { - if ( pArguments[idx] != 0 ) - { - free(pArguments[idx]); - } - } - free(pArguments); - } - - if ( pEnvironment != 0 ) - { - for ( idx = 0 ; idx < nEnvironmentVars ; ++idx ) - { - if ( pEnvironment[idx] != 0 ) - { - free(pEnvironment[idx]); - } - } - free(pEnvironment); - } - - return Error; -} - -/********************************************** - osl_executeProcess - *********************************************/ - -oslProcessError SAL_CALL osl_executeProcess( - rtl_uString *ustrImageName, - rtl_uString *ustrArguments[], - sal_uInt32 nArguments, - oslProcessOption Options, - oslSecurity Security, - rtl_uString *ustrWorkDir, - rtl_uString *ustrEnvironment[], - sal_uInt32 nEnvironmentVars, - oslProcess *pProcess - ) -{ - return osl_executeProcess_WithRedirectedIO( - ustrImageName, - ustrArguments, - nArguments, - Options, - Security, - ustrWorkDir, - ustrEnvironment, - nEnvironmentVars, - pProcess, - NULL, - NULL, - NULL - ); -} - -/********************************************** - osl_psz_executeProcess - *********************************************/ - -oslProcessError SAL_CALL osl_psz_executeProcess(sal_Char *pszImageName, - sal_Char *pszArguments[], - oslProcessOption Options, - oslSecurity Security, - sal_Char *pszDirectory, - sal_Char *pszEnvironments[], - oslProcess *pProcess, - oslFileHandle *pInputWrite, - oslFileHandle *pOutputRead, - oslFileHandle *pErrorRead - ) -{ - int i; - sal_Char path[PATH_MAX + 1]; - ProcessData Data; - oslThread hThread; - - path[0] = '\0'; - - memset(&Data,0,sizeof(ProcessData)); - Data.m_pInputWrite = pInputWrite; - Data.m_pOutputRead = pOutputRead; - Data.m_pErrorRead = pErrorRead; - - if (pszImageName == NULL) - pszImageName = pszArguments[0]; - - OSL_ASSERT(pszImageName != NULL); - - if ( pszImageName == 0 ) - { - return osl_Process_E_NotFound; - } - - if ((Options & osl_Process_SEARCHPATH) && - (osl_searchPath_impl(pszImageName, NULL, '\0', path, sizeof(path)) == osl_Process_E_None)) - pszImageName = path; - - Data.m_pszArgs[0] = strdup(pszImageName); - Data.m_pszArgs[1] = 0; - - if ( pszArguments != 0 ) - { - for (i = 0; ((i + 2) < MAX_ARGS) && (pszArguments[i] != NULL); i++) - Data.m_pszArgs[i+1] = strdup(pszArguments[i]); - Data.m_pszArgs[i+2] = NULL; - } - - Data.m_options = Options; - Data.m_pszDir = (pszDirectory != NULL) ? strdup(pszDirectory) : NULL; - - if (pszEnvironments != NULL) - { - for (i = 0; ((i + 1) < MAX_ENVS) && (pszEnvironments[i] != NULL); i++) - Data.m_pszEnv[i] = strdup(pszEnvironments[i]); - Data.m_pszEnv[i+1] = NULL; - } - else - Data.m_pszEnv[0] = NULL; - - if (Security != NULL) - { - Data.m_uid = ((oslSecurityImpl*)Security)->m_pPasswd.pw_uid; - Data.m_gid = ((oslSecurityImpl*)Security)->m_pPasswd.pw_gid; - Data.m_name = ((oslSecurityImpl*)Security)->m_pPasswd.pw_name; - } - else - Data.m_uid = (uid_t)-1; - - Data.m_pProcImpl = (oslProcessImpl*) malloc(sizeof(oslProcessImpl)); - Data.m_pProcImpl->m_pid = 0; - Data.m_pProcImpl->m_terminated = osl_createCondition(); - Data.m_pProcImpl->m_pnext = NULL; - - if (ChildListMutex == NULL) - ChildListMutex = osl_createMutex(); - - Data.m_started = osl_createCondition(); - - hThread = osl_createThread(ChildStatusProc, &Data); - - osl_waitCondition(Data.m_started, NULL); - osl_destroyCondition(Data.m_started); - - for (i = 0; Data.m_pszArgs[i] != NULL; i++) - free((void *)Data.m_pszArgs[i]); - - for (i = 0; Data.m_pszEnv[i] != NULL; i++) - free((void *)Data.m_pszEnv[i]); - - if ( Data.m_pszDir != 0 ) - { - free((void *)Data.m_pszDir); - } - - osl_destroyThread(hThread); - - if (Data.m_pProcImpl->m_pid != 0) - { - *pProcess = Data.m_pProcImpl; - - if (Options & osl_Process_WAIT) - osl_joinProcess(*pProcess); - - return osl_Process_E_None; - } - - osl_destroyCondition(Data.m_pProcImpl->m_terminated); - free(Data.m_pProcImpl); - - return osl_Process_E_Unknown; -} - - -/****************************************************************************** - * - * Functions for processes - * - *****************************************************************************/ - - -/********************************************** - osl_terminateProcess - *********************************************/ - -oslProcessError SAL_CALL osl_terminateProcess(oslProcess Process) -{ - if (Process == NULL) - return osl_Process_E_Unknown; - - if (kill(((oslProcessImpl*)Process)->m_pid, SIGKILL) != 0) - { - switch (errno) - { - case EPERM: - return osl_Process_E_NoPermission; - - case ESRCH: - return osl_Process_E_NotFound; - - default: - return osl_Process_E_Unknown; - } - } - - return osl_Process_E_None; -} - -/********************************************** - osl_getProcess - *********************************************/ - -oslProcess SAL_CALL osl_getProcess(oslProcessIdentifier Ident) -{ - oslProcessImpl *pProcImpl; - - if (kill(Ident, 0) != -1) - { - oslProcessImpl* pChild; - - if (ChildListMutex == NULL) - ChildListMutex = osl_createMutex(); - - osl_acquireMutex(ChildListMutex); - - pChild = ChildList; - - /* check if it is one of our child processes */ - while (pChild != NULL) - { - if (Ident == (sal_uInt32) pChild->m_pid) - break; - - pChild = pChild->m_pnext; - } - - pProcImpl = (oslProcessImpl*) malloc(sizeof(oslProcessImpl)); - pProcImpl->m_pid = Ident; - pProcImpl->m_terminated = osl_createCondition(); - - if (pChild != NULL) - { - /* process is a child so insert into list */ - pProcImpl->m_pnext = pChild->m_pnext; - pChild->m_pnext = pProcImpl; - - pProcImpl->m_status = pChild->m_status; - - if (osl_checkCondition(pChild->m_terminated)) - osl_setCondition(pProcImpl->m_terminated); - } - else - pProcImpl->m_pnext = NULL; - - osl_releaseMutex(ChildListMutex); - } - else - pProcImpl = NULL; - - return (pProcImpl); -} - -/********************************************** - osl_freeProcessHandle - *********************************************/ - -void SAL_CALL osl_freeProcessHandle(oslProcess Process) -{ - if (Process != NULL) - { - oslProcessImpl *pChild, *pPrev = NULL; - - OSL_ASSERT(ChildListMutex != NULL); - - if ( ChildListMutex == 0 ) - { - return; - } - - osl_acquireMutex(ChildListMutex); - - pChild = ChildList; - - /* remove process from child list */ - while (pChild != NULL) - { - if (pChild == (oslProcessImpl*)Process) - { - if (pPrev != NULL) - pPrev->m_pnext = pChild->m_pnext; - else - ChildList = pChild->m_pnext; - - break; - } - - pPrev = pChild; - pChild = pChild->m_pnext; - } - - osl_releaseMutex(ChildListMutex); - - osl_destroyCondition(((oslProcessImpl*)Process)->m_terminated); - - free(Process); - } -} - -#if defined(LINUX) -struct osl_procStat -{ - /* from 'stat' */ - pid_t pid; /* pid */ - char command[16]; /* 'argv[0]' */ /* mfe: it all right char comm[16] in kernel! */ - char state; /* state (running, stopped, ...) */ - pid_t ppid; /* parent pid */ - pid_t pgrp; /* parent group */ - int session; /* session ID */ - int tty; /* no of tty */ - pid_t tpgid; /* group of process owning the tty */ - unsigned long flags; /* flags dunno */ - unsigned long minflt; /* minor page faults */ - unsigned long cminflt; /* minor page faults with children */ - unsigned long majflt; /* major page faults */ - unsigned long cmajflt; /* major page faults with children */ - unsigned long utime; /* no of jiffies in user mode */ - unsigned long stime; /* no of jiffies in kernel mode */ - unsigned long cutime; /* no of jiffies in user mode with children */ - unsigned long cstime; /* no of jiffies in kernel mode with children */ - unsigned long priority; /* nice value + 15 (kernel scheduling prio)*/ - long nice; /* nice value */ - long timeout; /* no of jiffies of next process timeout */ - long itrealvalue; /* no jiffies before next SIGALRM */ - unsigned long starttime; /* process started this no of jiffies after boot */ - unsigned long vsize; /* virtual memory size (in bytes) */ - long rss; /* resident set size (in pages) */ - unsigned long rss_rlim; /* rss limit (in bytes) */ - unsigned long startcode; /* address above program text can run */ - unsigned long endcode; /* address below program text can run */ - unsigned long startstack; /* address of start of stack */ - unsigned long kstkesp; /* current value of 'esp' (stack pointer) */ - unsigned long kstkeip; /* current value of 'eip' (instruction pointer) */ - /* mfe: Linux > 2.1.7x have more signals (88) */ -/*#ifdef LINUX */ - char signal[24]; /* pending signals */ - char blocked[24]; /* blocked signals */ - char sigignore[24]; /* ignored signals */ - char sigcatch[24]; /* catched signals */ -/*#else*/ -/* long long signal;*/ -/* long long blocked;*/ -/* long long sigignore;*/ -/* long long sigcatch;*/ -/*#endif */ - unsigned long wchan; /* 'channel' the process is waiting in */ - unsigned long nswap; /* ? */ - unsigned long cnswap; /* ? */ - - /* from 'status' */ - int ruid; /* real uid */ - int euid; /* effective uid */ - int suid; /* saved uid */ - int fuid; /* file access uid */ - int rgid; /* real gid */ - int egid; /* effective gid */ - int sgid; /* saved gid */ - int fgid; /* file access gid */ - unsigned long vm_size; /* like vsize but on kb */ - unsigned long vm_lock; /* locked pages in kb */ - unsigned long vm_rss; /* like rss but in kb */ - unsigned long vm_data; /* data size */ - unsigned long vm_stack; /* stack size */ - unsigned long vm_exe; /* executable size */ - unsigned long vm_lib; /* library size */ -}; - -/********************************************** - osl_getProcStat - *********************************************/ - -sal_Bool osl_getProcStat(pid_t pid, struct osl_procStat* procstat) -{ - int fd = 0; - sal_Bool bRet = sal_False; - char name[PATH_MAX + 1]; - snprintf(name, sizeof(name), "/proc/%u/stat", pid); - - if ((fd = open(name,O_RDONLY)) >=0 ) - { - char* tmp=0; - char prstatbuf[512]; - memset(prstatbuf,0,512); - bRet = safeRead(fd, prstatbuf, 511); - - close(fd); - /*printf("%s\n\n",prstatbuf);*/ - - if (!bRet) - return sal_False; - - tmp = strrchr(prstatbuf, ')'); - *tmp = '\0'; - memset(procstat->command, 0, sizeof(procstat->command)); - - sscanf(prstatbuf, "%d (%15c", &procstat->pid, procstat->command); - sscanf(tmp + 2, - "%c" - "%i %i %i %i %i" - "%lu %lu %lu %lu %lu" - "%lu %lu %lu %lu" - "%lu %li %li %li" - "%lu %lu %li %lu" - "%lu %lu %lu %lu %lu" - "%s %s %s %s" - "%lu %lu %lu", - &procstat->state, - &procstat->ppid, &procstat->pgrp, &procstat->session, &procstat->tty, &procstat->tpgid, - &procstat->flags, &procstat->minflt, &procstat->cminflt, &procstat->majflt, &procstat->cmajflt, - &procstat->utime, &procstat->stime, &procstat->cutime, &procstat->cstime, - &procstat->priority, &procstat->nice, &procstat->timeout, &procstat->itrealvalue, - &procstat->starttime, &procstat->vsize, &procstat->rss, &procstat->rss_rlim, - &procstat->startcode, &procstat->endcode, &procstat->startstack, &procstat->kstkesp, &procstat->kstkeip, - procstat->signal, procstat->blocked, procstat->sigignore, procstat->sigcatch, - &procstat->wchan, &procstat->nswap, &procstat->cnswap - ); - } - return bRet; -} - -/********************************************** - osl_getProcStatus - *********************************************/ - -sal_Bool osl_getProcStatus(pid_t pid, struct osl_procStat* procstat) -{ - int fd = 0; - char name[PATH_MAX + 1]; - snprintf(name, sizeof(name), "/proc/%u/status", pid); - - sal_Bool bRet = sal_False; - - if ((fd = open(name,O_RDONLY)) >=0 ) - { - char* tmp=0; - char prstatusbuf[512]; - memset(prstatusbuf,0,512); - bRet = safeRead(fd, prstatusbuf, 511); - - close(fd); - - /* printf("\n\n%s\n\n",prstatusbuf);*/ - - if (!bRet) - return sal_False; - - tmp = strstr(prstatusbuf,"Uid:"); - if(tmp) - { - sscanf(tmp,"Uid:\t%d\t%d\t%d\t%d", - &procstat->ruid, &procstat->euid, &procstat->suid, &procstat->fuid - ); - } - - - tmp = strstr(prstatusbuf,"Gid:"); - if(tmp) - { - sscanf(tmp,"Gid:\t%d\t%d\t%d\t%d", - &procstat->rgid, &procstat->egid, &procstat->sgid, &procstat->fgid - ); - } - - tmp = strstr(prstatusbuf,"VmSize:"); - if(tmp) - { - sscanf(tmp, - "VmSize: %lu kB\n" - "VmLck: %lu kB\n" - "VmRSS: %lu kB\n" - "VmData: %lu kB\n" - "VmStk: %lu kB\n" - "VmExe: %lu kB\n" - "VmLib: %lu kB\n", - &procstat->vm_size, &procstat->vm_lock, &procstat->vm_rss, &procstat->vm_data, - &procstat->vm_stack, &procstat->vm_exe, &procstat->vm_lib - ); - } - - tmp = strstr(prstatusbuf,"SigPnd:"); - if(tmp) - { - sscanf(tmp, "SigPnd: %s SigBlk: %s SigIgn: %s %*s %s", - procstat->signal, procstat->blocked, procstat->sigignore, procstat->sigcatch - ); - } - } - return bRet; -} - -#endif - -/********************************************** - osl_getProcessInfo - *********************************************/ - -oslProcessError SAL_CALL osl_getProcessInfo(oslProcess Process, oslProcessData Fields, oslProcessInfo* pInfo) -{ - pid_t pid; - - if (Process == NULL) - pid = getpid(); - else - pid = ((oslProcessImpl*)Process)->m_pid; - - if (! pInfo || (pInfo->Size != sizeof(oslProcessInfo))) - return osl_Process_E_Unknown; - - pInfo->Fields = 0; - - if (Fields & osl_Process_IDENTIFIER) - { - pInfo->Ident = pid; - pInfo->Fields |= osl_Process_IDENTIFIER; - } - - if (Fields & osl_Process_EXITCODE) - { - if ((Process != NULL) && - osl_checkCondition(((oslProcessImpl*)Process)->m_terminated)) - { - pInfo->Code = ((oslProcessImpl*)Process)->m_status; - pInfo->Fields |= osl_Process_EXITCODE; - } - } - - if (Fields & (osl_Process_HEAPUSAGE | osl_Process_CPUTIMES)) - { - -#if defined(SOLARIS) - - int fd; - sal_Char name[PATH_MAX + 1]; - - snprintf(name, sizeof(name), "/proc/%u", pid); - - if ((fd = open(name, O_RDONLY)) >= 0) - { - prstatus_t prstatus; - - if (ioctl(fd, PIOCSTATUS, &prstatus) >= 0) - { - if (Fields & osl_Process_CPUTIMES) - { - pInfo->UserTime.Seconds = prstatus.pr_utime.tv_sec; - pInfo->UserTime.Nanosec = prstatus.pr_utime.tv_nsec; - pInfo->SystemTime.Seconds = prstatus.pr_stime.tv_sec; - pInfo->SystemTime.Nanosec = prstatus.pr_stime.tv_nsec; - - pInfo->Fields |= osl_Process_CPUTIMES; - } - - if (Fields & osl_Process_HEAPUSAGE) - { - pInfo->HeapUsage = prstatus.pr_brksize; - - pInfo->Fields |= osl_Process_HEAPUSAGE; - } - - close(fd); - - return (pInfo->Fields == Fields) ? osl_Process_E_None : osl_Process_E_Unknown; - } - else - close(fd); - } - -#elif defined(LINUX) - - if ( (Fields & osl_Process_CPUTIMES) || (Fields & osl_Process_HEAPUSAGE) ) - { - struct osl_procStat procstat; - memset(&procstat,0,sizeof(procstat)); - - if ( (Fields & osl_Process_CPUTIMES) && osl_getProcStat(pid, &procstat) ) - { - /* - * mfe: - * We calculate only time of the process proper. - * Threads are processes, we do not consider their time here! - * (For this, cutime and cstime should be used, it seems not - * to work in 2.0.36) - */ - - long clktck; - unsigned long hz; - unsigned long userseconds; - unsigned long systemseconds; - - clktck = sysconf(_SC_CLK_TCK); - if (clktck < 0) { - return osl_Process_E_Unknown; - } - hz = (unsigned long) clktck; - - userseconds = procstat.utime/hz; - systemseconds = procstat.stime/hz; - - pInfo->UserTime.Seconds = userseconds; - pInfo->UserTime.Nanosec = procstat.utime - (userseconds * hz); - pInfo->SystemTime.Seconds = systemseconds; - pInfo->SystemTime.Nanosec = procstat.stime - (systemseconds * hz); - - pInfo->Fields |= osl_Process_CPUTIMES; - } - - if ( (Fields & osl_Process_HEAPUSAGE) && osl_getProcStatus(pid, &procstat) ) - { - /* - * mfe: - * vm_data (found in status) shows the size of the data segment - * it a rough approximation of the core heap size - */ - pInfo->HeapUsage = procstat.vm_data*1024; - - pInfo->Fields |= osl_Process_HEAPUSAGE; - } - } - - return (pInfo->Fields == Fields) ? osl_Process_E_None : osl_Process_E_Unknown; -#endif - - } - - return (pInfo->Fields == Fields) ? osl_Process_E_None : osl_Process_E_Unknown; -} - - -/*********************************************** - helper function for osl_joinProcessWithTimeout - **********************************************/ - -static int is_timeout(const struct timeval* tend) -{ - struct timeval tcurrent; - gettimeofday(&tcurrent, NULL); - return (tcurrent.tv_sec >= tend->tv_sec); -} - -/********************************************** - kill(pid, 0) is usefull for checking if a - process is still alive, but remember that - kill even returns 0 if the process is already - a zombie. - *********************************************/ - -static int is_process_dead(pid_t pid) -{ - return ((-1 == kill(pid, 0)) && (ESRCH == errno)); -} - -/********************************************** - osl_joinProcessWithTimeout - *********************************************/ - -oslProcessError SAL_CALL osl_joinProcessWithTimeout(oslProcess Process, const TimeValue* pTimeout) -{ - oslProcessImpl* pChild = ChildList; - oslProcessError osl_error = osl_Process_E_None; - - OSL_PRECOND(Process, "osl_joinProcess: Invalid parameter"); - OSL_ASSERT(ChildListMutex); - - if (NULL == Process || 0 == ChildListMutex) - return osl_Process_E_Unknown; - - osl_acquireMutex(ChildListMutex); - - /* check if process is a child of ours */ - while (pChild != NULL) - { - if (pChild == (oslProcessImpl*)Process) - break; - - pChild = pChild->m_pnext; - } - - osl_releaseMutex(ChildListMutex); - - if (pChild != NULL) - { - oslConditionResult cond_res = osl_waitCondition(pChild->m_terminated, pTimeout); - - if (osl_cond_result_timeout == cond_res) - osl_error = osl_Process_E_TimedOut; - else if (osl_cond_result_ok != cond_res) - osl_error = osl_Process_E_Unknown; - } - else /* alien process; StatusThread will not be able - to set the condition terminated */ - { - pid_t pid = ((oslProcessImpl*)Process)->m_pid; - - if (pTimeout) - { - int timeout = 0; - struct timeval tend; - - gettimeofday(&tend, NULL); - - tend.tv_sec += pTimeout->Seconds; - - while (!is_process_dead(pid) && ((timeout = is_timeout(&tend)) == 0)) - sleep(1); - - if (timeout) - osl_error = osl_Process_E_TimedOut; - } - else /* infinite */ - { - while (!is_process_dead(pid)) - sleep(1); - } - } - return osl_error; -} - -/********************************************** - osl_joinProcess - *********************************************/ - -oslProcessError SAL_CALL osl_joinProcess(oslProcess Process) -{ - return osl_joinProcessWithTimeout(Process, NULL); -} - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sal/osl/unx/process_impl.cxx b/sal/osl/unx/process_impl.cxx deleted file mode 100644 index caa19f0fe..000000000 --- a/sal/osl/unx/process_impl.cxx +++ /dev/null @@ -1,519 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2000, 2010 Oracle and/or its affiliates. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * <http://www.openoffice.org/license.html> - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -// MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_sal.hxx" - -#include "osl/process.h" - -#ifndef INCLUDED_LIMITS_H -#include <limits.h> -#define INCLUDED_LIMITS_H -#endif - -#ifndef INCLUDED_PTHREAD_H -#include <pthread.h> -#define INCLUDED_PTHREAD_H -#endif - -#ifndef INCLUDED_STDLIB_H -#include <stdlib.h> -#define INCLUDED_STDLIB_H -#endif - -#ifndef INCLUDED_STRING_H -#include <string.h> -#define INCLUDED_STRING_H -#endif -#include "osl/diagnose.h" -#include "osl/file.h" -#include "osl/module.h" -#include "osl/thread.h" -#include "rtl/ustring.hxx" -#include "rtl/strbuf.h" - -#include "file_path_helper.h" - -#include "uunxapi.h" - -/*************************************** - osl_bootstrap_getExecutableFile_Impl(). - - @internal - @see rtl_bootstrap - @see #i37371# - - **************************************/ - -extern "C" oslProcessError SAL_CALL osl_bootstrap_getExecutableFile_Impl ( - rtl_uString ** ppFileURL -) SAL_THROW_EXTERN_C(); - - -#if defined(MACOSX) -#include <mach-o/dyld.h> - -oslProcessError SAL_CALL osl_bootstrap_getExecutableFile_Impl ( - rtl_uString ** ppFileURL -) SAL_THROW_EXTERN_C() -{ - oslProcessError result = osl_Process_E_NotFound; - - char buffer[PATH_MAX]; - size_t buflen = sizeof(buffer); - -#if __GNUC__ >= 4 && defined(MACOSX) - if (_NSGetExecutablePath (buffer, (uint32_t*)&buflen) == 0) -#else - if (_NSGetExecutablePath (buffer, &buflen) == 0) -#endif - { - /* Determine absolute path. */ - char abspath[PATH_MAX]; - if (realpath (buffer, abspath) != 0) - { - /* Convert from utf8 to unicode. */ - rtl_uString * pAbsPath = 0; - rtl_string2UString ( - &(pAbsPath), - abspath, rtl_str_getLength (abspath), - RTL_TEXTENCODING_UTF8, - OSTRING_TO_OUSTRING_CVTFLAGS); - - if (pAbsPath) - { - /* Convert from path to url. */ - if (osl_getFileURLFromSystemPath (pAbsPath, ppFileURL) == osl_File_E_None) - { - /* Success. */ - result = osl_Process_E_None; - } - rtl_uString_release (pAbsPath); - } - } - } - - return (result); -} - -#elif !defined(NO_DL_FUNCTIONS) -#include <dlfcn.h> - -oslProcessError SAL_CALL osl_bootstrap_getExecutableFile_Impl ( - rtl_uString ** ppFileURL -) SAL_THROW_EXTERN_C() -{ - oslProcessError result = osl_Process_E_NotFound; - - /* Determine address of "main()" function. */ - void * addr = dlsym (RTLD_DEFAULT, "main"); - if (addr != 0) - { - /* Determine module URL. */ - if (osl_getModuleURLFromAddress (addr, ppFileURL)) - { - /* Success. */ - result = osl_Process_E_None; - } - } - - return (result); -} - -#else /* NO_DL_FUNCTIONS */ - -oslProcessError SAL_CALL osl_bootstrap_getExecutableFile_Impl ( - rtl_uString ** ppFileURL -) SAL_THROW_EXTERN_C() -{ - /* Fallback to ordinary osl_getExecutableFile(). */ - return osl_getExecutableFile (ppFileURL); -} - -#endif /* NO_DL_FUNCTIONS */ - -/*************************************** - CommandArgs_Impl. - **************************************/ -struct CommandArgs_Impl -{ - pthread_mutex_t m_mutex; - sal_uInt32 m_nCount; - rtl_uString ** m_ppArgs; -}; - -static struct CommandArgs_Impl g_command_args = -{ - PTHREAD_MUTEX_INITIALIZER, - 0, - 0 -}; - -/*************************************** - osl_getExecutableFile(). - **************************************/ -oslProcessError SAL_CALL osl_getExecutableFile (rtl_uString ** ppustrFile) -{ - oslProcessError result = osl_Process_E_NotFound; - - pthread_mutex_lock (&(g_command_args.m_mutex)); - OSL_ASSERT(g_command_args.m_nCount > 0); - if (g_command_args.m_nCount > 0) - { - /* CommandArgs set. Obtain argv[0]. */ - rtl_uString_assign (ppustrFile, g_command_args.m_ppArgs[0]); - result = osl_Process_E_None; - } - pthread_mutex_unlock (&(g_command_args.m_mutex)); - - return (result); -} - -/*************************************** - osl_getCommandArgCount(). - **************************************/ -sal_uInt32 SAL_CALL osl_getCommandArgCount (void) -{ - sal_uInt32 result = 0; - - pthread_mutex_lock (&(g_command_args.m_mutex)); - OSL_ASSERT(g_command_args.m_nCount > 0); - if (g_command_args.m_nCount > 0) - result = g_command_args.m_nCount - 1; - pthread_mutex_unlock (&(g_command_args.m_mutex)); - - return (result); -} - -/*************************************** - osl_getCommandArg(). - **************************************/ -oslProcessError SAL_CALL osl_getCommandArg (sal_uInt32 nArg, rtl_uString ** strCommandArg) -{ - oslProcessError result = osl_Process_E_NotFound; - - pthread_mutex_lock (&(g_command_args.m_mutex)); - OSL_ASSERT(g_command_args.m_nCount > 0); - if (g_command_args.m_nCount > (nArg + 1)) - { - rtl_uString_assign (strCommandArg, g_command_args.m_ppArgs[nArg + 1]); - result = osl_Process_E_None; - } - pthread_mutex_unlock (&(g_command_args.m_mutex)); - - return (result); -} - -/*************************************** - osl_setCommandArgs(). - **************************************/ -void SAL_CALL osl_setCommandArgs (int argc, char ** argv) -{ - OSL_ASSERT(argc > 0); - pthread_mutex_lock (&(g_command_args.m_mutex)); - OSL_ENSURE (g_command_args.m_nCount == 0, "osl_setCommandArgs(): CommandArgs already set."); - if (g_command_args.m_nCount == 0) - { - rtl_uString** ppArgs = (rtl_uString**)rtl_allocateZeroMemory (argc * sizeof(rtl_uString*)); - if (ppArgs != 0) - { - rtl_TextEncoding encoding = osl_getThreadTextEncoding(); - for (int i = 0; i < argc; i++) - { - rtl_string2UString ( - &(ppArgs[i]), - argv[i], rtl_str_getLength (argv[i]), encoding, - OSTRING_TO_OUSTRING_CVTFLAGS); - } - if (ppArgs[0] != 0) - { - /* see @ osl_getExecutableFile(). */ - if (rtl_ustr_indexOfChar (rtl_uString_getStr(ppArgs[0]), sal_Unicode('/')) == -1) - { - const rtl::OUString PATH (RTL_CONSTASCII_USTRINGPARAM("PATH")); - - rtl_uString * pSearchPath = 0; - osl_getEnvironment (PATH.pData, &pSearchPath); - if (pSearchPath) - { - rtl_uString * pSearchResult = 0; - osl_searchPath (ppArgs[0], pSearchPath, &pSearchResult); - if (pSearchResult) - { - rtl_uString_assign (&(ppArgs[0]), pSearchResult); - rtl_uString_release (pSearchResult); - } - rtl_uString_release (pSearchPath); - } - } - - rtl_uString * pArg0 = 0; - if (realpath_u (ppArgs[0], &pArg0)) - { - osl_getFileURLFromSystemPath (pArg0, &(ppArgs[0])); - rtl_uString_release (pArg0); - } - } - g_command_args.m_nCount = argc; - g_command_args.m_ppArgs = ppArgs; - } - } - pthread_mutex_unlock (&(g_command_args.m_mutex)); -} - -/*************************************** - osl_getEnvironment(). - **************************************/ -oslProcessError SAL_CALL osl_getEnvironment(rtl_uString* pustrEnvVar, rtl_uString** ppustrValue) -{ - oslProcessError result = osl_Process_E_NotFound; - rtl_TextEncoding encoding = osl_getThreadTextEncoding(); - rtl_String* pstr_env_var = 0; - - OSL_PRECOND(pustrEnvVar, "osl_getEnvironment(): Invalid parameter"); - OSL_PRECOND(ppustrValue, "osl_getEnvironment(): Invalid parameter"); - - rtl_uString2String( - &pstr_env_var, - rtl_uString_getStr(pustrEnvVar), rtl_uString_getLength(pustrEnvVar), encoding, - OUSTRING_TO_OSTRING_CVTFLAGS); - if (pstr_env_var != 0) - { - const char* p_env_var = getenv (rtl_string_getStr (pstr_env_var)); - if (p_env_var != 0) - { - rtl_string2UString( - ppustrValue, - p_env_var, strlen(p_env_var), encoding, - OSTRING_TO_OUSTRING_CVTFLAGS); - OSL_ASSERT(*ppustrValue != NULL); - - result = osl_Process_E_None; - } - rtl_string_release(pstr_env_var); - } - - return (result); -} - -/*************************************** - osl_setEnvironment(). - **************************************/ -oslProcessError SAL_CALL osl_setEnvironment(rtl_uString* pustrEnvVar, rtl_uString* pustrValue) -{ - oslProcessError result = osl_Process_E_Unknown; - rtl_TextEncoding encoding = osl_getThreadTextEncoding(); - rtl_String* pstr_env_var = 0; - rtl_String* pstr_val = 0; - - OSL_PRECOND(pustrEnvVar, "osl_setEnvironment(): Invalid parameter"); - OSL_PRECOND(pustrValue, "osl_setEnvironment(): Invalid parameter"); - - rtl_uString2String( - &pstr_env_var, - rtl_uString_getStr(pustrEnvVar), rtl_uString_getLength(pustrEnvVar), encoding, - OUSTRING_TO_OSTRING_CVTFLAGS); - - rtl_uString2String( - &pstr_val, - rtl_uString_getStr(pustrValue), rtl_uString_getLength(pustrValue), encoding, - OUSTRING_TO_OSTRING_CVTFLAGS); - - if (pstr_env_var != 0 && pstr_val != 0) - { -#if defined (SOLARIS) - rtl_String * pBuffer = NULL; - - sal_Int32 nCapacity = rtl_stringbuffer_newFromStringBuffer( &pBuffer, - rtl_string_getLength(pstr_env_var) + rtl_string_getLength(pstr_val) + 1, - pstr_env_var ); - rtl_stringbuffer_insert( &pBuffer, &nCapacity, pBuffer->length, "=", 1); - rtl_stringbuffer_insert( &pBuffer, &nCapacity, pBuffer->length, - rtl_string_getStr(pstr_val), rtl_string_getLength(pstr_val) ); - - rtl_string_acquire(pBuffer); // argument to putenv must leak on success - - if (putenv(rtl_string_getStr(pBuffer)) == 0) - result = osl_Process_E_None; - else - rtl_string_release(pBuffer); -#else - if (setenv(rtl_string_getStr(pstr_env_var), rtl_string_getStr(pstr_val), 1) == 0) - result = osl_Process_E_None; -#endif - } - - if (pstr_val) - rtl_string_release(pstr_val); - - if (pstr_env_var != 0) - rtl_string_release(pstr_env_var); - - return (result); -} - -/*************************************** - osl_clearEnvironment(). - **************************************/ -oslProcessError SAL_CALL osl_clearEnvironment(rtl_uString* pustrEnvVar) -{ - oslProcessError result = osl_Process_E_Unknown; - rtl_TextEncoding encoding = osl_getThreadTextEncoding(); - rtl_String* pstr_env_var = 0; - - OSL_PRECOND(pustrEnvVar, "osl_setEnvironment(): Invalid parameter"); - - rtl_uString2String( - &pstr_env_var, - rtl_uString_getStr(pustrEnvVar), rtl_uString_getLength(pustrEnvVar), encoding, - OUSTRING_TO_OSTRING_CVTFLAGS); - - if (pstr_env_var) - { -#if defined (SOLARIS) - rtl_String * pBuffer = NULL; - - sal_Int32 nCapacity = rtl_stringbuffer_newFromStringBuffer( &pBuffer, - rtl_string_getLength(pstr_env_var) + 1, pstr_env_var ); - rtl_stringbuffer_insert( &pBuffer, &nCapacity, pBuffer->length, "=", 1); - - rtl_string_acquire(pBuffer); // argument to putenv must leak on success - - if (putenv(rtl_string_getStr(pBuffer)) == 0) - result = osl_Process_E_None; - else - rtl_string_release(pBuffer); -#elif (defined(MACOSX) || defined(NETBSD) || defined(FREEBSD)) - //MacOSX baseline is 10.4, which has an old-school void return - //for unsetenv. - //See: http://developer.apple.com/mac/library/documentation/Darwin/Reference/ManPages/10.4/man3/unsetenv.3.html?useVersion=10.4 - unsetenv(rtl_string_getStr(pstr_env_var)); - result = osl_Process_E_None; -#else - if (unsetenv(rtl_string_getStr(pstr_env_var)) == 0) - result = osl_Process_E_None; -#endif - rtl_string_release(pstr_env_var); - } - - return (result); -} - - -/*************************************** - osl_getProcessWorkingDir(). - **************************************/ -oslProcessError SAL_CALL osl_getProcessWorkingDir(rtl_uString **ppustrWorkingDir) -{ - oslProcessError result = osl_Process_E_Unknown; - char buffer[PATH_MAX]; - - OSL_PRECOND(ppustrWorkingDir, "osl_getProcessWorkingDir(): Invalid parameter"); - - if (getcwd (buffer, sizeof(buffer)) != 0) - { - rtl_uString* ustrTmp = 0; - - rtl_string2UString( - &ustrTmp, - buffer, strlen(buffer), osl_getThreadTextEncoding(), - OSTRING_TO_OUSTRING_CVTFLAGS); - if (ustrTmp != 0) - { - if (osl_getFileURLFromSystemPath (ustrTmp, ppustrWorkingDir) == osl_File_E_None) - result = osl_Process_E_None; - rtl_uString_release (ustrTmp); - } - } - - return (result); -} - -/****************************************************************************** - * - * new functions to set/return the current process locale - * - *****************************************************************************/ - -struct ProcessLocale_Impl -{ - pthread_mutex_t m_mutex; - rtl_Locale * m_pLocale; -}; - -static struct ProcessLocale_Impl g_process_locale = -{ - PTHREAD_MUTEX_INITIALIZER, - 0 -}; - -extern "C" void _imp_getProcessLocale( rtl_Locale ** ); -extern "C" int _imp_setProcessLocale( rtl_Locale * ); - -/********************************************** - osl_getProcessLocale(). - *********************************************/ -oslProcessError SAL_CALL osl_getProcessLocale( rtl_Locale ** ppLocale ) -{ - oslProcessError result = osl_Process_E_Unknown; - OSL_PRECOND(ppLocale, "osl_getProcessLocale(): Invalid parameter."); - if (ppLocale) - { - pthread_mutex_lock(&(g_process_locale.m_mutex)); - - if (g_process_locale.m_pLocale == 0) - _imp_getProcessLocale (&(g_process_locale.m_pLocale)); - *ppLocale = g_process_locale.m_pLocale; - result = osl_Process_E_None; - - pthread_mutex_unlock (&(g_process_locale.m_mutex)); - } - return (result); -} - -/********************************************** - osl_setProcessLocale(). - *********************************************/ -oslProcessError SAL_CALL osl_setProcessLocale( rtl_Locale * pLocale ) -{ - oslProcessError result = osl_Process_E_Unknown; - - OSL_PRECOND(pLocale, "osl_setProcessLocale(): Invalid parameter."); - - pthread_mutex_lock(&(g_process_locale.m_mutex)); - if (_imp_setProcessLocale (pLocale) == 0) - { - g_process_locale.m_pLocale = pLocale; - result = osl_Process_E_None; - } - pthread_mutex_unlock (&(g_process_locale.m_mutex)); - - return (result); -} - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sal/osl/unx/procimpl.h b/sal/osl/unx/procimpl.h deleted file mode 100644 index 3b30116d1..000000000 --- a/sal/osl/unx/procimpl.h +++ /dev/null @@ -1,52 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2000, 2010 Oracle and/or its affiliates. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * <http://www.openoffice.org/license.html> - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -#ifndef _OSL_PROCIMPL_H_ -#define _OSL_PROCIMPL_H_ - -#include <osl/process.h> -#include <osl/conditn.h> - -#ifdef __cplusplus -extern "C" { -#endif - -typedef struct _oslProcessImpl { - pid_t m_pid; - oslCondition m_terminated; - int m_status; - struct _oslProcessImpl* m_pnext; -} oslProcessImpl; - -#ifdef __cplusplus -} -#endif - -#endif - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sal/osl/unx/profile.c b/sal/osl/unx/profile.c deleted file mode 100644 index 4a245c308..000000000 --- a/sal/osl/unx/profile.c +++ /dev/null @@ -1,2220 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2000, 2010 Oracle and/or its affiliates. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * <http://www.openoffice.org/license.html> - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - - -#include "system.h" -#include "readwrite_helper.h" - -#include <osl/diagnose.h> -#include <osl/profile.h> -#include <osl/process.h> -#include <osl/thread.h> -#include <rtl/alloc.h> -#include <osl/util.h> - -#define LINES_INI 32 -#define LINES_ADD 10 -#define SECTIONS_INI 5 -#define SECTIONS_ADD 3 -#define ENTRIES_INI 5 -#define ENTRIES_ADD 3 - - -#define STR_INI_EXTENSION "rc" -#define STR_INI_METAHOME "?~" -#define STR_INI_METASYS "?$" -#define STR_INI_METACFG "?^" -#define STR_INI_METAINS "?#" - -#define STR_INI_BOOLYES "yes" -#define STR_INI_BOOLON "on" -#define STR_INI_BOOLONE "1" -#define STR_INI_BOOLNO "no" -#define STR_INI_BOOLOFF "off" -#define STR_INI_BOOLZERO "0" - -#define FLG_USER 0x00FF -#define FLG_AUTOOPEN 0x0100 -#define FLG_MODIFIED 0x0200 - -#define SVERSION_LOCATION STR_INI_METACFG -#define SVERSION_FALLBACK STR_INI_METASYS -#define SVERSION_NAME "sversion" -#define SVERSION_SECTION "Versions" -#define SVERSION_SOFFICE "StarOffice" -#define SVERSION_PROFILE "sofficerc" -#define SVERSION_OPTION "userid:" -#define SVERSION_DIRS { "bin", "program" } -#define SVERSION_USER "user" - -#define DEFAULT_PMODE (S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH) - -#define _BUILD_STR_(n) # n -#define BUILD_STR(n) _BUILD_STR_(n) - - -/*#define DEBUG_OSL_PROFILE*/ -/*#define TRACE_OSL_PROFILE*/ - -/*****************************************************************************/ -/* Data Type Definition */ -/*****************************************************************************/ - -typedef time_t osl_TStamp; - -typedef enum _osl_TLockMode -{ - un_lock, read_lock, write_lock -} osl_TLockMode; - -typedef struct _osl_TFile -{ - int m_Handle; - sal_Char* m_pReadPtr; - sal_Char m_ReadBuf[512]; - sal_Char* m_pWriteBuf; - sal_uInt32 m_nWriteBufLen; - sal_uInt32 m_nWriteBufFree; -} osl_TFile; - -typedef struct _osl_TProfileEntry -{ - sal_uInt32 m_Line; - sal_uInt32 m_Offset; - sal_uInt32 m_Len; -} osl_TProfileEntry; - -typedef struct _osl_TProfileSection -{ - sal_uInt32 m_Line; - sal_uInt32 m_Offset; - sal_uInt32 m_Len; - sal_uInt32 m_NoEntries; - sal_uInt32 m_MaxEntries; - osl_TProfileEntry* m_Entries; -} osl_TProfileSection; - - -/* - Profile-data structure hidden behind oslProfile: -*/ -typedef struct _osl_TProfileImpl -{ - sal_uInt32 m_Flags; - osl_TFile* m_pFile; - osl_TStamp m_Stamp; - sal_Char m_FileName[PATH_MAX + 1]; - sal_uInt32 m_NoLines; - sal_uInt32 m_MaxLines; - sal_uInt32 m_NoSections; - sal_uInt32 m_MaxSections; - sal_Char** m_Lines; - osl_TProfileSection* m_Sections; - pthread_mutex_t m_AccessLock; - sal_Bool m_bIsValid; -} osl_TProfileImpl; - - -/*****************************************************************************/ -/* Static Module Function Declarations */ -/*****************************************************************************/ - -static osl_TFile* openFileImpl(const sal_Char* pszFilename, oslProfileOption ProfileFlags); -static osl_TStamp closeFileImpl(osl_TFile* pFile, oslProfileOption Flags); -static sal_Bool OslProfile_lockFile(const osl_TFile* pFile, osl_TLockMode eMode); -static sal_Bool OslProfile_rewindFile(osl_TFile* pFile, sal_Bool bTruncate); -static osl_TStamp OslProfile_getFileStamp(osl_TFile* pFile); - -static sal_Char* OslProfile_getLine(osl_TFile* pFile); -static sal_Bool OslProfile_putLine(osl_TFile* pFile, const sal_Char *pszLine); -static sal_Char* stripBlanks(sal_Char* String, sal_uInt32* pLen); -static sal_Char* addLine(osl_TProfileImpl* pProfile, const sal_Char* Line); -static sal_Char* insertLine(osl_TProfileImpl* pProfile, const sal_Char* Line, sal_uInt32 LineNo); -static void removeLine(osl_TProfileImpl* pProfile, sal_uInt32 LineNo); -static void setEntry(osl_TProfileImpl* pProfile, osl_TProfileSection* pSection, - sal_uInt32 NoEntry, sal_uInt32 Line, - sal_Char* Entry, sal_uInt32 Len); -static sal_Bool addEntry(osl_TProfileImpl* pProfile, osl_TProfileSection *pSection, - int Line, sal_Char* Entry, sal_uInt32 Len); -static void removeEntry(osl_TProfileSection *pSection, sal_uInt32 NoEntry); -static sal_Bool addSection(osl_TProfileImpl* pProfile, int Line, const sal_Char* Section, sal_uInt32 Len); -static void removeSection(osl_TProfileImpl* pProfile, osl_TProfileSection *pSection); -static osl_TProfileSection* findEntry(osl_TProfileImpl* pProfile, const sal_Char* Section, - const sal_Char* Entry, sal_uInt32 *pNoEntry); -static sal_Bool loadProfile(osl_TFile* pFile, osl_TProfileImpl* pProfile); -static sal_Bool storeProfile(osl_TProfileImpl* pProfile, sal_Bool bCleanup); -static osl_TProfileImpl* acquireProfile(oslProfile Profile, sal_Bool bWriteable); -static sal_Bool releaseProfile(osl_TProfileImpl* pProfile); - -static sal_Bool writeProfileImpl (osl_TFile* pFile); -static osl_TFile* osl_openTmpProfileImpl(osl_TProfileImpl*); -static sal_Bool osl_ProfileSwapProfileNames(osl_TProfileImpl*); -static void osl_ProfileGenerateExtension(sal_Char* pszFileName, sal_Char* pszExtension, sal_Char* pszTmpName); -static oslProfile SAL_CALL osl_psz_openProfile(const sal_Char *pszProfileName, oslProfileOption Flags); - -/* implemented in file.c */ -extern oslFileError FileURLToPath( char *, size_t, rtl_uString* ); - -/*****************************************************************************/ -/* Exported Module Functions */ -/*****************************************************************************/ -oslProfile SAL_CALL osl_openProfile(rtl_uString *ustrProfileName, oslProfileOption Options) -{ - char profilePath[PATH_MAX] = ""; - - if ( ustrProfileName != 0 && ustrProfileName->buffer[0] != 0 ) - FileURLToPath( profilePath, PATH_MAX, ustrProfileName ); - - return osl_psz_openProfile( profilePath,Options ); -} - - -static oslProfile SAL_CALL osl_psz_openProfile(const sal_Char *pszProfileName, oslProfileOption Flags) -{ - osl_TFile* pFile; - osl_TProfileImpl* pProfile; - sal_Bool bRet = sal_False; - -#ifdef TRACE_OSL_PROFILE - OSL_TRACE("In osl_openProfile\n"); -#endif - -#ifdef DEBUG_OSL_PROFILE - Flags=osl_Profile_FLUSHWRITE; - - OSL_TRACE("opening '%s'\n",pszProfileName); - if ( Flags == osl_Profile_DEFAULT ) - { - OSL_TRACE("with osl_Profile_DEFAULT\n"); - } - if ( Flags & osl_Profile_SYSTEM ) - { - OSL_TRACE("with osl_Profile_SYSTEM\n"); - } - if ( Flags & osl_Profile_READLOCK ) - { - OSL_TRACE("with osl_Profile_READLOCK\n"); - } - if ( Flags & osl_Profile_WRITELOCK ) - { - OSL_TRACE("with osl_Profile_WRITELOCK\n"); - } - if ( Flags & osl_Profile_FLUSHWRITE ) - { - OSL_TRACE("with osl_Profile_FLUSHWRITE\n"); - } -#endif - - - if ( ( pFile = openFileImpl(pszProfileName, Flags ) ) == NULL ) - { -#ifdef TRACE_OSL_PROFILE - OSL_TRACE("Out osl_openProfile [not opened]\n"); -#endif - return (NULL); - } - - - pProfile = (osl_TProfileImpl*)calloc(1, sizeof(osl_TProfileImpl)); - - if ( pProfile == 0 ) - { - closeFileImpl(pFile, Flags); - return 0; - } - - pProfile->m_Flags = Flags & FLG_USER; - - if ( Flags & ( osl_Profile_READLOCK | osl_Profile_WRITELOCK | osl_Profile_FLUSHWRITE ) ) - { - pProfile->m_pFile = pFile; - } - - pthread_mutex_init(&(pProfile->m_AccessLock),PTHREAD_MUTEXATTR_DEFAULT); - pProfile->m_bIsValid=sal_True; - - pProfile->m_Stamp = OslProfile_getFileStamp(pFile); - bRet=loadProfile(pFile, pProfile); - bRet &= realpath(pszProfileName, pProfile->m_FileName) != NULL; - OSL_ASSERT(bRet); - - if (pProfile->m_pFile == NULL) - closeFileImpl(pFile,pProfile->m_Flags); - -#ifdef TRACE_OSL_PROFILE - OSL_TRACE("Out osl_openProfile [ok]\n"); -#endif - return (pProfile); -} - -sal_Bool SAL_CALL osl_closeProfile(oslProfile Profile) -{ - osl_TProfileImpl* pProfile = (osl_TProfileImpl*)Profile; - osl_TProfileImpl* pTmpProfile; - -#ifdef TRACE_OSL_PROFILE - OSL_TRACE("In osl_closeProfile\n"); -#endif - - if ( Profile == 0 ) - { -#ifdef TRACE_OSL_PROFILE - OSL_TRACE("Out osl_closeProfile [profile==0]\n"); -#endif - return sal_False; - } - - pthread_mutex_lock(&(pProfile->m_AccessLock)); - - if ( pProfile->m_bIsValid == sal_False ) - { - OSL_ASSERT(pProfile->m_bIsValid); - pthread_mutex_unlock(&(pProfile->m_AccessLock)); -#ifdef TRACE_OSL_PROFILE - OSL_TRACE("Out osl_closeProfile [not valid]\n"); -#endif - return sal_False; - } - - pProfile->m_bIsValid=sal_False; - - if ( ! ( pProfile->m_Flags & osl_Profile_READLOCK ) && ( pProfile->m_Flags & FLG_MODIFIED ) ) - { - pTmpProfile = acquireProfile(Profile,sal_True); - - if ( pTmpProfile != 0 ) - { - sal_Bool bRet = storeProfile(pTmpProfile, sal_True); - OSL_ASSERT(bRet); - (void)bRet; - } - } - else - { - pTmpProfile = acquireProfile(Profile,sal_False); - } - - - if ( pTmpProfile == 0 ) - { - pthread_mutex_unlock(&(pProfile->m_AccessLock)); -#ifdef TRACE_OSL_PROFILE - OSL_TRACE("Out osl_closeProfile [pProfile==0]\n"); -#endif - return sal_False; - } - - pProfile = pTmpProfile; - - if (pProfile->m_pFile != NULL) - closeFileImpl(pProfile->m_pFile,pProfile->m_Flags); - - pProfile->m_pFile = NULL; - pProfile->m_FileName[0] = '\0'; - - /* release whole profile data types memory */ - if ( pProfile->m_NoLines > 0) - { - unsigned int idx=0; - if ( pProfile->m_Lines != 0 ) - { - for ( idx = 0 ; idx < pProfile->m_NoLines ; ++idx) - { - if ( pProfile->m_Lines[idx] != 0 ) - { - free(pProfile->m_Lines[idx]); - pProfile->m_Lines[idx]=0; - } - } - free(pProfile->m_Lines); - pProfile->m_Lines=0; - } - if ( pProfile->m_Sections != 0 ) - { - /*osl_TProfileSection* pSections=pProfile->m_Sections;*/ - for ( idx = 0 ; idx < pProfile->m_NoSections ; ++idx ) - { - if ( pProfile->m_Sections[idx].m_Entries != 0 ) - { - free(pProfile->m_Sections[idx].m_Entries); - pProfile->m_Sections[idx].m_Entries=0; - } - } - free(pProfile->m_Sections); - pProfile->m_Sections=0; - } - } - - pthread_mutex_unlock(&(pProfile->m_AccessLock)); - - pthread_mutex_destroy(&(pProfile->m_AccessLock)); - - free(pProfile); - -#ifdef TRACE_OSL_PROFILE - OSL_TRACE("Out osl_closeProfile [ok]\n"); -#endif - return (sal_True); -} - - -sal_Bool SAL_CALL osl_flushProfile(oslProfile Profile) -{ - osl_TProfileImpl* pProfile = (osl_TProfileImpl*) Profile; - osl_TFile* pFile; - sal_Bool bRet = sal_False; - -#ifdef TRACE_OSL_PROFILE - OSL_TRACE("In osl_flushProfile()\n"); -#endif - - if ( pProfile == 0 ) - { -#ifdef TRACE_OSL_PROFILE - OSL_TRACE("Out osl_flushProfile() [pProfile == 0]\n"); -#endif - return sal_False; - } - - pthread_mutex_lock(&(pProfile->m_AccessLock)); - - if ( pProfile->m_bIsValid == sal_False ) - { - OSL_ASSERT(pProfile->m_bIsValid); - pthread_mutex_unlock(&(pProfile->m_AccessLock)); -#ifdef TRACE_OSL_PROFILE - OSL_TRACE("Out osl_flushProfile [not valid]\n"); -#endif - return sal_False; - } - - pFile = pProfile->m_pFile; - if ( !( pFile != 0 && pFile->m_Handle >= 0 ) ) - { - pthread_mutex_unlock(&(pProfile->m_AccessLock)); -#ifdef TRACE_OSL_PROFILE - OSL_TRACE("Out osl_flushProfile() [invalid file]\n"); -#endif - return sal_False; - } - - if ( pProfile->m_Flags & FLG_MODIFIED ) - { -#ifdef DEBUG_OSL_PROFILE - OSL_TRACE("swapping to storeprofile\n"); -#endif - bRet = storeProfile(pProfile,sal_False); - OSL_ASSERT(bRet); - } - -#ifdef TRACE_OSL_PROFILE - OSL_TRACE("Out osl_flushProfile() [ok]\n"); -#endif - pthread_mutex_unlock(&(pProfile->m_AccessLock)); - return bRet; -} - -static sal_Bool writeProfileImpl(osl_TFile* pFile) -{ -#if OSL_DEBUG_LEVEL > 1 - unsigned int nLen=0; -#endif - -#ifdef TRACE_OSL_PROFILE - OSL_TRACE("In osl_writeProfileImpl()\n"); -#endif - - if ( !( pFile != 0 && pFile->m_Handle >= 0 ) || ( pFile->m_pWriteBuf == 0 ) ) - { -#ifdef TRACE_OSL_PROFILE - OSL_TRACE("Out osl_writeProfileImpl() [invalid args]\n"); -#endif - return sal_False; - } - -#if OSL_DEBUG_LEVEL > 1 - nLen=strlen(pFile->m_pWriteBuf); - OSL_ASSERT(nLen == (pFile->m_nWriteBufLen - pFile->m_nWriteBufFree)); -#endif - - if ( !safeWrite(pFile->m_Handle, pFile->m_pWriteBuf, pFile->m_nWriteBufLen - pFile->m_nWriteBufFree) ) - { - OSL_TRACE("write failed '%s'\n",strerror(errno)); - return (sal_False); - } - - free(pFile->m_pWriteBuf); - pFile->m_pWriteBuf=0; - pFile->m_nWriteBufLen=0; - pFile->m_nWriteBufFree=0; -#ifdef TRACE_OSL_PROFILE - OSL_TRACE("Out osl_writeProfileImpl() [ok]\n"); -#endif - return sal_True; -} - - -sal_Bool SAL_CALL osl_readProfileString(oslProfile Profile, - const sal_Char* pszSection, const sal_Char* pszEntry, - sal_Char* pszString, sal_uInt32 MaxLen, - const sal_Char* pszDefault) -{ - sal_uInt32 NoEntry; - sal_Char* pStr=0; - osl_TProfileSection* pSec; - osl_TProfileImpl* pProfile=0; - osl_TProfileImpl* pTmpProfile=0; - sal_Bool bRet = sal_False; - -#ifdef TRACE_OSL_PROFILE - OSL_TRACE("In osl_readProfileString\n"); -#endif - - pTmpProfile = (osl_TProfileImpl*) Profile; - - if ( pTmpProfile == 0 ) - { -#ifdef TRACE_OSL_PROFILE - OSL_TRACE("Out osl_readProfileString [pTmpProfile==0]\n"); -#endif - return sal_False; - } - - pthread_mutex_lock(&(pTmpProfile->m_AccessLock)); - - if ( pTmpProfile->m_bIsValid == sal_False ) - { - pthread_mutex_unlock(&(pTmpProfile->m_AccessLock)); -#ifdef TRACE_OSL_PROFILE - OSL_TRACE("Out osl_readProfileString [not valid]\n"); -#endif - return sal_False; - } - - pProfile = acquireProfile(Profile, sal_False); - - if ( pProfile == NULL ) - { -#ifdef TRACE_OSL_PROFILE - OSL_TRACE("Out osl_readProfileString [pProfile==0]\n"); -#endif - return (sal_False); - } - - if (! (pProfile->m_Flags & osl_Profile_SYSTEM)) - { - if (((pSec = findEntry(pProfile, pszSection, pszEntry, &NoEntry)) != NULL) && - (NoEntry < pSec->m_NoEntries) && - ((pStr = strchr(pProfile->m_Lines[pSec->m_Entries[NoEntry].m_Line], - '=')) != NULL)) - { - pStr++; - } - else - { - pStr=(sal_Char*)pszDefault; - } - - if ( pStr != 0 ) - { - pStr = stripBlanks(pStr, NULL); - MaxLen = (MaxLen - 1 < strlen(pStr)) ? (MaxLen - 1) : strlen(pStr); - pStr = stripBlanks(pStr, &MaxLen); - strncpy(pszString, pStr, MaxLen); - pszString[MaxLen] = '\0'; - } - } - else - { /* not implemented */ } - - - bRet=releaseProfile(pProfile); - OSL_ASSERT(bRet); - (void)bRet; - - if ( pStr == 0 ) - { - pthread_mutex_unlock(&(pTmpProfile->m_AccessLock)); -#ifdef TRACE_OSL_PROFILE - OSL_TRACE("Out osl_readProfileString [pStr==0]\n"); -#endif - return sal_False; - } - - pthread_mutex_unlock(&(pTmpProfile->m_AccessLock)); - -#ifdef TRACE_OSL_PROFILE - OSL_TRACE("Out osl_readProfileString [ok]\n"); -#endif - - return (sal_True); -} - - -sal_Bool SAL_CALL osl_readProfileBool(oslProfile Profile, - const sal_Char* pszSection, const sal_Char* pszEntry, - sal_Bool Default) -{ - sal_Char Line[32]; - Line[0] = '\0'; - -#ifdef TRACE_OSL_PROFILE - OSL_TRACE("In osl_readProfileBool\n"); -#endif - - if (osl_readProfileString(Profile, pszSection, pszEntry, Line, sizeof(Line), "")) - { - if ((strcasecmp(Line, STR_INI_BOOLYES) == 0) || - (strcasecmp(Line, STR_INI_BOOLON) == 0) || - (strcasecmp(Line, STR_INI_BOOLONE) == 0)) - Default = sal_True; - else - if ((strcasecmp(Line, STR_INI_BOOLNO) == 0) || - (strcasecmp(Line, STR_INI_BOOLOFF) == 0) || - (strcasecmp(Line, STR_INI_BOOLZERO) == 0)) - Default = sal_False; - } - -#ifdef TRACE_OSL_PROFILE - OSL_TRACE("Out osl_readProfileBool [ok]\n"); -#endif - - return (Default); -} - - -sal_uInt32 SAL_CALL osl_readProfileIdent(oslProfile Profile, - const sal_Char* pszSection, const sal_Char* pszEntry, - sal_uInt32 FirstId, const sal_Char* Strings[], - sal_uInt32 Default) -{ - sal_uInt32 i; - sal_Char Line[256]; - Line[0] = '\0'; - -#ifdef TRACE_OSL_PROFILE - OSL_TRACE("In osl_readProfileIdent\n"); -#endif - - if (osl_readProfileString(Profile, pszSection, pszEntry, Line, sizeof(Line), "")) - { - i = 0; - while (Strings[i] != NULL) - { - if (strcasecmp(Line, Strings[i]) == 0) - { - Default = i + FirstId; - break; - } - i++; - } - } - -#ifdef TRACE_OSL_PROFILE - OSL_TRACE("Out osl_readProfileIdent [ok]\n"); -#endif - return (Default); -} - -sal_Bool SAL_CALL osl_writeProfileString(oslProfile Profile, - const sal_Char* pszSection, const sal_Char* pszEntry, - const sal_Char* pszString) -{ - sal_uInt32 i; - sal_Bool bRet = sal_False; - sal_uInt32 NoEntry; - sal_Char* pStr; - sal_Char* Line = 0; - osl_TProfileSection* pSec; - osl_TProfileImpl* pProfile = 0; - osl_TProfileImpl* pTmpProfile = 0; - -#ifdef TRACE_OSL_PROFILE - OSL_TRACE("In osl_writeProfileString\n"); -#endif - - pTmpProfile = (osl_TProfileImpl*) Profile; - - if ( pTmpProfile == 0 ) - { -#ifdef TRACE_OSL_PROFILE - OSL_TRACE("Out osl_writeProfileString [pTmpProfile==0]\n"); -#endif - return sal_False; - } - - pthread_mutex_lock(&(pTmpProfile->m_AccessLock)); - - if ( pTmpProfile->m_bIsValid == sal_False ) - { - OSL_ASSERT(pTmpProfile->m_bIsValid); - pthread_mutex_unlock(&(pTmpProfile->m_AccessLock)); -#ifdef TRACE_OSL_PROFILE - OSL_TRACE("Out osl_writeProfileString [not valid]\n"); -#endif - return sal_False; - } - - pProfile=acquireProfile(Profile, sal_True); - - if (pProfile == NULL) - { - pthread_mutex_unlock(&(pTmpProfile->m_AccessLock)); -#ifdef TRACE_OSL_PROFILE - OSL_TRACE("Out osl_writeProfileString [pProfile==0]\n"); -#endif - return (sal_False); - } - - Line = (sal_Char*) malloc(strlen(pszEntry)+strlen(pszString)+48); - - if (! (pProfile->m_Flags & osl_Profile_SYSTEM)) - { - if ((pSec = findEntry(pProfile, pszSection, pszEntry, &NoEntry)) == NULL) - { - Line[0] = '\0'; - addLine(pProfile, Line); - - Line[0] = '['; - strcpy(&Line[1], pszSection); - Line[1 + strlen(pszSection)] = ']'; - Line[2 + strlen(pszSection)] = '\0'; - - if (((pStr = addLine(pProfile, Line)) == NULL) || - (! addSection(pProfile, pProfile->m_NoLines - 1, &pStr[1], strlen(pszSection)))) - { - bRet=releaseProfile(pProfile); - OSL_ASSERT(bRet); - - pthread_mutex_unlock(&(pTmpProfile->m_AccessLock)); - - free(Line); - -#ifdef TRACE_OSL_PROFILE - OSL_TRACE("Out osl_writeProfileString [not added]\n"); -#endif - return (sal_False); - } - - pSec = &pProfile->m_Sections[pProfile->m_NoSections - 1]; - NoEntry = pSec->m_NoEntries; - } - - Line[0] = '\0'; - strcpy(&Line[0], pszEntry); - Line[0 + strlen(pszEntry)] = '='; - strcpy(&Line[1 + strlen(pszEntry)], pszString); - - if (NoEntry >= pSec->m_NoEntries) - { - if (pSec->m_NoEntries > 0) - i = pSec->m_Entries[pSec->m_NoEntries - 1].m_Line + 1; - else - i = pSec->m_Line + 1; - - if (((pStr = insertLine(pProfile, Line, i)) == NULL) || - (! addEntry(pProfile, pSec, i, pStr, strlen(pszEntry)))) - { - bRet=releaseProfile(pProfile); - OSL_ASSERT(bRet); - - pthread_mutex_unlock(&(pTmpProfile->m_AccessLock)); - free(Line); - -#ifdef TRACE_OSL_PROFILE - OSL_TRACE("Out osl_writeProfileString [not inserted]\n"); -#endif - return (sal_False); - } - - pProfile->m_Flags |= FLG_MODIFIED; - } - else - { - i = pSec->m_Entries[NoEntry].m_Line; - free(pProfile->m_Lines[i]); - pProfile->m_Lines[i] = strdup(Line); - setEntry(pProfile, pSec, NoEntry, i, pProfile->m_Lines[i], strlen(pszEntry)); - - pProfile->m_Flags |= FLG_MODIFIED; - } - } - else { - /* not implemented */ - } - - bRet = releaseProfile(pProfile); - OSL_ASSERT(bRet); - - pthread_mutex_unlock(&(pTmpProfile->m_AccessLock)); - if ( Line!= 0 ) - { - free(Line); - } - -#ifdef TRACE_OSL_PROFILE - OSL_TRACE("Out osl_writeProfileString [ok]\n"); -#endif - - return bRet; -} - - -sal_Bool SAL_CALL osl_writeProfileBool(oslProfile Profile, - const sal_Char* pszSection, const sal_Char* pszEntry, - sal_Bool Value) -{ - sal_Bool bRet=sal_False; - -#ifdef TRACE_OSL_PROFILE - OSL_TRACE("In osl_writeProfileBool\n"); -#endif - - if (Value) - bRet=osl_writeProfileString(Profile, pszSection, pszEntry, STR_INI_BOOLONE); - else - bRet=osl_writeProfileString(Profile, pszSection, pszEntry, STR_INI_BOOLZERO); - -#ifdef TRACE_OSL_PROFILE - OSL_TRACE("Out osl_writeProfileBool [ok]\n"); -#endif - - return bRet; -} - - -sal_Bool SAL_CALL osl_writeProfileIdent(oslProfile Profile, - const sal_Char* pszSection, const sal_Char* pszEntry, - sal_uInt32 FirstId, const sal_Char* Strings[], - sal_uInt32 Value) -{ - int i, n; - sal_Bool bRet=sal_False; - -#ifdef TRACE_OSL_PROFILE - OSL_TRACE("In osl_writeProfileIdent\n"); -#endif - - for (n = 0; Strings[n] != NULL; n++); - - if ((i = Value - FirstId) >= n) - bRet=sal_False; - else - bRet = osl_writeProfileString(Profile, pszSection, pszEntry, Strings[i]); - -#ifdef TRACE_OSL_PROFILE - OSL_TRACE("Out osl_writeProfileIdent\n"); -#endif - return bRet; -} - - -sal_Bool SAL_CALL osl_removeProfileEntry(oslProfile Profile, - const sal_Char *pszSection, const sal_Char *pszEntry) -{ - sal_uInt32 NoEntry; - osl_TProfileSection* pSec; - osl_TProfileImpl* pProfile = 0; - osl_TProfileImpl* pTmpProfile = 0; - sal_Bool bRet = sal_False; - -#ifdef TRACE_OSL_PROFILE - OSL_TRACE("In osl_removeProfileEntry\n"); -#endif - - pTmpProfile = (osl_TProfileImpl*) Profile; - - if ( pTmpProfile == 0 ) - { -#ifdef TRACE_OSL_PROFILE - OSL_TRACE("Out osl_removeProfileEntry [pProfile==0]\n"); -#endif - return sal_False; - } - - pthread_mutex_lock(&(pTmpProfile->m_AccessLock)); - - if ( pTmpProfile->m_bIsValid == sal_False ) - { - OSL_ASSERT(pTmpProfile->m_bIsValid); - pthread_mutex_unlock(&(pTmpProfile->m_AccessLock)); -#ifdef TRACE_OSL_PROFILE - OSL_TRACE("Out osl_removeProfileEntry [not valid]\n"); -#endif - return sal_False; - } - - - pProfile = acquireProfile(Profile, sal_True); - - if (pProfile == NULL) - { - pthread_mutex_unlock(&(pTmpProfile->m_AccessLock)); -#ifdef TRACE_OSL_PROFILE - OSL_TRACE("Out osl_removeProfileEntry [pProfile==0]\n"); -#endif - return (sal_False); - } - - - if (! (pProfile->m_Flags & osl_Profile_SYSTEM)) - { - if (((pSec = findEntry(pProfile, pszSection, pszEntry, &NoEntry)) != NULL) && - (NoEntry < pSec->m_NoEntries)) - { - removeLine(pProfile, pSec->m_Entries[NoEntry].m_Line); - removeEntry(pSec, NoEntry); - if (pSec->m_NoEntries == 0) - { - removeLine(pProfile, pSec->m_Line); - - /* remove any empty separation line */ - if ((pSec->m_Line > 0) && (pProfile->m_Lines[pSec->m_Line - 1][0] == '\0')) - removeLine(pProfile, pSec->m_Line - 1); - - removeSection(pProfile, pSec); - } - - pProfile->m_Flags |= FLG_MODIFIED; - } - } - else - { /* not implemented */ } - - - bRet = releaseProfile(pProfile); - OSL_ASSERT(bRet); - - pthread_mutex_unlock(&(pTmpProfile->m_AccessLock)); - -#ifdef TRACE_OSL_PROFILE - OSL_TRACE("Out osl_removeProfileEntry [ok]\n"); -#endif - return bRet; -} - - -sal_uInt32 SAL_CALL osl_getProfileSectionEntries(oslProfile Profile, const sal_Char *pszSection, - sal_Char* pszBuffer, sal_uInt32 MaxLen) -{ - sal_uInt32 i, n = 0; - sal_uInt32 NoEntry; - osl_TProfileSection* pSec; - osl_TProfileImpl* pProfile = 0; - osl_TProfileImpl* pTmpProfile = 0; - sal_Bool bRet = sal_False; - -#ifdef TRACE_OSL_PROFILE - OSL_TRACE("In osl_getProfileSectionEntries\n"); -#endif - - pTmpProfile = (osl_TProfileImpl*) Profile; - - if ( pTmpProfile == 0 ) - { -#ifdef TRACE_OSL_PROFILE - OSL_TRACE("Out osl_getProfileSectionEntries [pTmpProfile==0]\n"); -#endif - return sal_False; - - } - - pthread_mutex_lock(&(pTmpProfile->m_AccessLock)); - - if ( pTmpProfile->m_bIsValid == sal_False ) - { - OSL_ASSERT(pTmpProfile->m_bIsValid); - - pthread_mutex_unlock(&(pTmpProfile->m_AccessLock)); - -#ifdef TRACE_OSL_PROFILE - OSL_TRACE("Out osl_getProfileSectionEntries [not valid]\n"); -#endif - - return sal_False; - } - - pProfile = acquireProfile(Profile, sal_False); - - if (pProfile == NULL) - { - pthread_mutex_unlock(&(pTmpProfile->m_AccessLock)); - -#ifdef TRACE_OSL_PROFILE - OSL_TRACE("Out osl_getProfileSectionEntries [pProfile=0]\n"); -#endif - - return (0); - } - - - if (! (pProfile->m_Flags & osl_Profile_SYSTEM)) - { - if ((pSec = findEntry(pProfile, pszSection, "", &NoEntry)) != NULL) - { - if (MaxLen != 0) - { - for (i = 0; i < pSec->m_NoEntries; i++) - { - if ((n + pSec->m_Entries[i].m_Len + 1) < MaxLen) - { - strncpy(&pszBuffer[n], &pProfile->m_Lines[pSec->m_Entries[i].m_Line] - [pSec->m_Entries[i].m_Offset], pSec->m_Entries[i].m_Len); - n += pSec->m_Entries[i].m_Len; - pszBuffer[n++] = '\0'; - } - else - break; - - } - - pszBuffer[n++] = '\0'; - } - else - { - for (i = 0; i < pSec->m_NoEntries; i++) - n += pSec->m_Entries[i].m_Len + 1; - - n += 1; - } - } - else - n = 0; - } - else { - /* not implemented */ - } - - bRet=releaseProfile(pProfile); - OSL_ASSERT(bRet); - (void)bRet; - - pthread_mutex_unlock(&(pTmpProfile->m_AccessLock)); - -#ifdef TRACE_OSL_PROFILE - OSL_TRACE("Out osl_getProfileSectionEntries [ok]\n"); -#endif - - return (n); -} - -sal_uInt32 SAL_CALL osl_getProfileSections(oslProfile Profile, sal_Char* pszBuffer, sal_uInt32 MaxLen) -{ - sal_uInt32 i, n = 0; - osl_TProfileSection* pSec; - osl_TProfileImpl* pProfile = 0; - osl_TProfileImpl* pTmpProfile = 0; - sal_Bool bRet = sal_False; - -#ifdef TRACE_OSL_PROFILE - OSL_TRACE("In osl_getProfileSections\n"); -#endif - - pTmpProfile = (osl_TProfileImpl*) Profile; - - if ( pTmpProfile == 0 ) - { -#ifdef TRACE_OSL_PROFILE - OSL_TRACE("Out osl_getProfileSections [pTmpProfile==0]\n"); -#endif - return sal_False; - } - - pthread_mutex_lock(&(pTmpProfile->m_AccessLock)); - - if ( pTmpProfile->m_bIsValid == sal_False ) - { - OSL_ASSERT(pTmpProfile->m_bIsValid); - pthread_mutex_unlock(&(pTmpProfile->m_AccessLock)); -#ifdef TRACE_OSL_PROFILE - OSL_TRACE("Out osl_getProfileSections [not valid]\n"); -#endif - return sal_False; - } - - pProfile = acquireProfile(Profile, sal_False); - - if (pProfile == NULL) - { - pthread_mutex_unlock(&(pTmpProfile->m_AccessLock)); - -#ifdef TRACE_OSL_PROFILE - OSL_TRACE("Out osl_getProfileSections [pProfile==0]\n"); -#endif - return (0); - } - - if (! (pProfile->m_Flags & osl_Profile_SYSTEM)) - { - if (MaxLen != 0) - { - for (i = 0; i < pProfile->m_NoSections; i++) - { - pSec = &pProfile->m_Sections[i]; - - if ((n + pSec->m_Len + 1) < MaxLen) - { - strncpy(&pszBuffer[n], &pProfile->m_Lines[pSec->m_Line][pSec->m_Offset], - pSec->m_Len); - n += pSec->m_Len; - pszBuffer[n++] = '\0'; - } - else - break; - } - - pszBuffer[n++] = '\0'; - } - else - { - for (i = 0; i < pProfile->m_NoSections; i++) - n += pProfile->m_Sections[i].m_Len + 1; - - n += 1; - } - } - else - { /* not implemented */ } - - - bRet=releaseProfile(pProfile); - OSL_ASSERT(bRet); - (void)bRet; - - pthread_mutex_unlock(&(pTmpProfile->m_AccessLock)); - -#ifdef TRACE_OSL_PROFILE - OSL_TRACE("Out osl_getProfileSections [ok]\n"); -#endif - - return (n); -} - -/*****************************************************************************/ -/* Static Module Functions */ -/*****************************************************************************/ - -static osl_TStamp OslProfile_getFileStamp(osl_TFile* pFile) -{ - struct stat status; - - if ( (pFile->m_Handle < 0) || (fstat(pFile->m_Handle, &status) < 0) ) - { - return (0); - } - - - return (status.st_mtime); -} - -static sal_Bool OslProfile_lockFile(const osl_TFile* pFile, osl_TLockMode eMode) -{ - struct flock lock; - /* boring hack, but initializers for static vars must be constant */ - static sal_Bool bIsInitialized = sal_False; - static sal_Bool bLockingDisabled; - -#ifdef TRACE_OSL_PROFILE - OSL_TRACE("In OslProfile_lockFile\n"); -#endif - - if ( !bIsInitialized ) - { - sal_Char* pEnvValue; - pEnvValue = getenv( "STAR_PROFILE_LOCKING_DISABLED" ); - - if ( pEnvValue == 0 ) - { - bLockingDisabled = sal_False; - - } - else - { - bLockingDisabled = sal_True; - } - - bIsInitialized = sal_True; - } - - if (pFile->m_Handle < 0) - { -#ifdef TRACE_OSL_PROFILE - OSL_TRACE("Out OslProfile_lockFile [invalid file handle]\n"); -#endif - return (sal_False); - } - - - if ( bLockingDisabled ) - { -#ifdef TRACE_OSL_PROFILE - OSL_TRACE("Out OslProfile_lockFile [locking disabled]\n"); -#endif - return (sal_True); - } - - - lock.l_start = 0; - lock.l_whence = SEEK_SET; - lock.l_len = 0; - - switch (eMode) - { - case un_lock: - lock.l_type = F_UNLCK; - break; - - case read_lock: - lock.l_type = F_RDLCK; - break; - - case write_lock: - lock.l_type = F_WRLCK; - break; - } - -#ifndef MACOSX // not MAC OSX - if ( fcntl(pFile->m_Handle, F_SETLKW, &lock) == -1 ) -#else - /* Mac OSX will return ENOTSUP for webdav drives so we should ignore it */ - if ( fcntl(pFile->m_Handle, F_SETLKW, &lock) == -1 && errno != ENOTSUP ) -#endif /* MACOSX */ - { - OSL_TRACE("fcntl returned -1 (%s)\n",strerror(errno)); -#ifdef TRACE_OSL_PROFILE - OSL_TRACE("Out OslProfile_lockFile [fcntl F_SETLKW]\n"); -#endif - return sal_False; - } - -#ifdef TRACE_OSL_PROFILE - OSL_TRACE("Out OslProfile_lockFile [ok]\n"); -#endif - return sal_True; -} - -static osl_TFile* openFileImpl(const sal_Char* pszFilename, oslProfileOption ProfileFlags ) -{ - int Flags; - osl_TFile* pFile = (osl_TFile*) calloc(1, sizeof(osl_TFile)); - sal_Bool bWriteable = sal_False; - - if ( ProfileFlags & ( osl_Profile_WRITELOCK | osl_Profile_FLUSHWRITE ) ) - { -#ifdef DEBUG_OSL_PROFILE - OSL_TRACE("setting bWriteable to TRUE\n"); -#endif - bWriteable=sal_True; - } - - if (! bWriteable) - { -#ifdef DEBUG_OSL_PROFILE - OSL_TRACE("opening '%s' read only\n",pszFilename); -#endif - - pFile->m_Handle = open(pszFilename, O_RDONLY); - /* mfe: argghh!!! do not check if the file could be openend */ - /* default mode expects it that way!!! */ - } - else - { -#ifdef DEBUG_OSL_PROFILE - OSL_TRACE("opening '%s' read/write\n",pszFilename); -#endif - if (((pFile->m_Handle = open(pszFilename, O_RDWR | O_CREAT | O_EXCL, DEFAULT_PMODE)) < 0) && - ((pFile->m_Handle = open(pszFilename, O_RDWR)) < 0)) - { - free(pFile); -#ifdef TRACE_OSL_PROFILE - OSL_TRACE("Out openFileImpl [open read/write]\n"); -#endif - return (NULL); - } - } - - /* set close-on-exec flag */ - if ((Flags = fcntl(pFile->m_Handle, F_GETFD, 0)) != -1) - { - Flags |= FD_CLOEXEC; - fcntl(pFile->m_Handle, F_SETFD, Flags); - } - - pFile->m_pWriteBuf=0; - pFile->m_nWriteBufFree=0; - pFile->m_nWriteBufLen=0; - - if ( ProfileFlags & (osl_Profile_WRITELOCK | osl_Profile_READLOCK ) ) - { -#ifdef DEBUG_OSL_PROFILE - OSL_TRACE("locking '%s' file\n",pszFilename); -#endif - OslProfile_lockFile(pFile, bWriteable ? write_lock : read_lock); - } - -#ifdef TRACE_OSL_PROFILE - OSL_TRACE("Out openFileImpl [ok]\n"); -#endif - return (pFile); -} - -static osl_TStamp closeFileImpl(osl_TFile* pFile, oslProfileOption Flags) -{ - osl_TStamp stamp = 0; - -#ifdef TRACE_OSL_PROFILE - OSL_TRACE("In closeFileImpl\n"); -#endif - - if ( pFile == 0 ) - { -#ifdef TRACE_OSL_PROFILE - OSL_TRACE("Out closeFileImpl [pFile == 0]\n"); -#endif - return stamp; - } - - if ( pFile->m_Handle >= 0 ) - { - stamp = OslProfile_getFileStamp(pFile); - - if ( Flags & (osl_Profile_WRITELOCK | osl_Profile_WRITELOCK ) ) - { - OslProfile_lockFile(pFile, un_lock); - } - - close(pFile->m_Handle); - pFile->m_Handle = -1; - } - - - if ( pFile->m_pWriteBuf ) - { - free(pFile->m_pWriteBuf); - } - - free(pFile); - -#ifdef TRACE_OSL_PROFILE - OSL_TRACE("Out closeFileImpl [ok]\n"); -#endif - - return(stamp); -} - -static sal_Bool OslProfile_rewindFile(osl_TFile* pFile, sal_Bool bTruncate) -{ - sal_Bool bRet = sal_True; -#ifdef TRACE_OSL_PROFILE - OSL_TRACE("In osl_OslProfile_rewindFile\n"); -#endif - - if (pFile->m_Handle >= 0) - { - pFile->m_pReadPtr = pFile->m_ReadBuf + sizeof(pFile->m_ReadBuf); - -#ifdef DEBUG_OSL_PROFILE - OSL_TRACE("rewinding\n"); -#endif - bRet = (lseek(pFile->m_Handle, SEEK_SET, 0L) == 0L); - - if (bTruncate) - { -#ifdef DEBUG_OSL_PROFILE - OSL_TRACE("truncating\n"); -#endif - bRet &= (ftruncate(pFile->m_Handle, 0L) == 0); - } - - } - -#ifdef TRACE_OSL_PROFILE - OSL_TRACE("Out osl_OslProfile_rewindFile [ok]\n"); -#endif - return bRet; -} - - -static sal_Char* OslProfile_getLine(osl_TFile* pFile) -{ - int Max, Free, Bytes, nLineBytes = 0; - sal_Char* pChr; - sal_Char* pLine = NULL; - sal_Char* pNewLine; - - if ( pFile == 0 ) - { - return 0; - } - - if (pFile->m_Handle < 0) - return NULL; - - do - { - Bytes = sizeof(pFile->m_ReadBuf) - (pFile->m_pReadPtr - pFile->m_ReadBuf); - - if (Bytes <= 1) - { - /* refill buffer */ - memcpy(pFile->m_ReadBuf, pFile->m_pReadPtr, Bytes); - pFile->m_pReadPtr = pFile->m_ReadBuf; - - Free = sizeof(pFile->m_ReadBuf) - Bytes; - - if ((Max = read(pFile->m_Handle, &pFile->m_ReadBuf[Bytes], Free)) < 0) - { - OSL_TRACE("read failed '%s'\n",strerror(errno)); - - if( pLine ) - rtl_freeMemory( pLine ); - pLine = NULL; - break; - } - - if (Max < Free) - { - if ((Max == 0) && ! pLine) - break; - - pFile->m_ReadBuf[Bytes + Max] = '\0'; - } - } - - for (pChr = pFile->m_pReadPtr; - (*pChr != '\n') && (*pChr != '\r') && (*pChr != '\0') && - (pChr < (pFile->m_ReadBuf + sizeof(pFile->m_ReadBuf) - 1)); - pChr++); - - Max = pChr - pFile->m_pReadPtr; - pNewLine = (sal_Char*) rtl_allocateMemory( nLineBytes + Max + 1 ); - if( pLine ) - { - memcpy( pNewLine, pLine, nLineBytes ); - rtl_freeMemory( pLine ); - } - memcpy(pNewLine+nLineBytes, pFile->m_pReadPtr, Max); - nLineBytes += Max; - pNewLine[ nLineBytes ] = 0; - pLine = pNewLine; - - if (pChr < (pFile->m_ReadBuf + sizeof(pFile->m_ReadBuf) - 1)) - { - if (*pChr != '\0') - { - if ((pChr[0] == '\r') && (pChr[1] == '\n')) - pChr += 2; - else - pChr += 1; - } - - if ((pChr < (pFile->m_ReadBuf + sizeof(pFile->m_ReadBuf))) && - (*pChr == '\0')) - pChr = pFile->m_ReadBuf + sizeof(pFile->m_ReadBuf); - - /* setting Max to -1 indicates terminating read loop */ - Max = -1; - } - - pFile->m_pReadPtr = pChr; - } - while (Max > 0); - - return pLine; -} - -static sal_Bool OslProfile_putLine(osl_TFile* pFile, const sal_Char *pszLine) -{ - unsigned int Len = strlen(pszLine); - -#ifdef DEBUG_OSL_PROFILE - int strLen=0; -#endif - - if ( pFile == 0 || pFile->m_Handle < 0 ) - { - return (sal_False); - } - - if ( pFile->m_pWriteBuf == 0 ) - { - pFile->m_pWriteBuf = (sal_Char*) malloc(Len+3); - pFile->m_nWriteBufLen = Len+3; - pFile->m_nWriteBufFree = Len+3; - } - else - { - if ( pFile->m_nWriteBufFree <= Len + 3 ) - { - sal_Char* pTmp; - - pTmp=(sal_Char*) realloc(pFile->m_pWriteBuf,( ( pFile->m_nWriteBufLen + Len ) * 2) ); - if ( pTmp == 0 ) - { - return sal_False; - } - pFile->m_pWriteBuf = pTmp; - pFile->m_nWriteBufFree = pFile->m_nWriteBufFree + pFile->m_nWriteBufLen + ( 2 * Len ); - pFile->m_nWriteBufLen = ( pFile->m_nWriteBufLen + Len ) * 2; - memset( (pFile->m_pWriteBuf) + ( pFile->m_nWriteBufLen - pFile->m_nWriteBufFree ), 0, pFile->m_nWriteBufFree); - } - } - - - - memcpy(pFile->m_pWriteBuf + ( pFile->m_nWriteBufLen - pFile->m_nWriteBufFree ),pszLine,Len+1); -#ifdef DEBUG_OSL_PROFILE - strLen = strlen(pFile->m_pWriteBuf); -#endif - pFile->m_pWriteBuf[pFile->m_nWriteBufLen - pFile->m_nWriteBufFree + Len]='\n'; - pFile->m_pWriteBuf[pFile->m_nWriteBufLen - pFile->m_nWriteBufFree + Len + 1]='\0'; - - pFile->m_nWriteBufFree-=Len+1; - - return sal_True; -} - -/* platform specific end */ - -static sal_Char* stripBlanks(sal_Char* String, sal_uInt32* pLen) -{ - if ( ( pLen != NULL ) && ( *pLen != 0 ) ) - { - while ((String[*pLen - 1] == ' ') || (String[*pLen - 1] == '\t')) - (*pLen)--; - - while ( (*String == ' ') || (*String == '\t') ) - { - String++; - (*pLen)--; - } - } - else - while ( (*String == ' ') || (*String == '\t') ) - String++; - - return (String); -} - -static sal_Char* addLine(osl_TProfileImpl* pProfile, const sal_Char* Line) -{ - if (pProfile->m_NoLines >= pProfile->m_MaxLines) - { - if (pProfile->m_Lines == NULL) - { - pProfile->m_MaxLines = LINES_INI; - pProfile->m_Lines = (sal_Char **)malloc(pProfile->m_MaxLines * sizeof(sal_Char *)); - memset(pProfile->m_Lines,0,pProfile->m_MaxLines * sizeof(sal_Char *)); - } - else - { - unsigned int idx=0; - unsigned int oldmax=pProfile->m_MaxLines; - - pProfile->m_MaxLines += LINES_ADD; - pProfile->m_Lines = (sal_Char **)realloc(pProfile->m_Lines, - pProfile->m_MaxLines * sizeof(sal_Char *)); - for ( idx = oldmax ; idx < pProfile->m_MaxLines ; ++idx ) - { - pProfile->m_Lines[idx]=0; - } - } - - if (pProfile->m_Lines == NULL) - { - pProfile->m_NoLines = 0; - pProfile->m_MaxLines = 0; - return (NULL); - } - - } - - if ( pProfile->m_Lines != 0 && pProfile->m_Lines[pProfile->m_NoLines] != 0 ) - { - free(pProfile->m_Lines[pProfile->m_NoLines]); - } - pProfile->m_Lines[pProfile->m_NoLines++] = strdup(Line); - - return (pProfile->m_Lines[pProfile->m_NoLines - 1]); -} - -static sal_Char* insertLine(osl_TProfileImpl* pProfile, const sal_Char* Line, sal_uInt32 LineNo) -{ - if (pProfile->m_NoLines >= pProfile->m_MaxLines) - { - if (pProfile->m_Lines == NULL) - { - pProfile->m_MaxLines = LINES_INI; - pProfile->m_Lines = (sal_Char **)malloc(pProfile->m_MaxLines * sizeof(sal_Char *)); - memset(pProfile->m_Lines,0,pProfile->m_MaxLines * sizeof(sal_Char *)); - } - else - { - pProfile->m_MaxLines += LINES_ADD; - pProfile->m_Lines = (sal_Char **)realloc(pProfile->m_Lines, - pProfile->m_MaxLines * sizeof(sal_Char *)); - - memset(&pProfile->m_Lines[pProfile->m_NoLines], - 0, - (pProfile->m_MaxLines - pProfile->m_NoLines - 1) * sizeof(sal_Char*)); - } - - if (pProfile->m_Lines == NULL) - { - pProfile->m_NoLines = 0; - pProfile->m_MaxLines = 0; - return (NULL); - } - } - - LineNo = LineNo > pProfile->m_NoLines ? pProfile->m_NoLines : LineNo; - - if (LineNo < pProfile->m_NoLines) - { - sal_uInt32 i, n; - osl_TProfileSection* pSec; - - memmove(&pProfile->m_Lines[LineNo + 1], &pProfile->m_Lines[LineNo], - (pProfile->m_NoLines - LineNo) * sizeof(sal_Char *)); - - - /* adjust line references */ - for (i = 0; i < pProfile->m_NoSections; i++) - { - pSec = &pProfile->m_Sections[i]; - - if (pSec->m_Line >= LineNo) - pSec->m_Line++; - - for (n = 0; n < pSec->m_NoEntries; n++) - if (pSec->m_Entries[n].m_Line >= LineNo) - pSec->m_Entries[n].m_Line++; - } - } - - pProfile->m_NoLines++; - - pProfile->m_Lines[LineNo] = strdup(Line); - - return (pProfile->m_Lines[LineNo]); -} - -static void removeLine(osl_TProfileImpl* pProfile, sal_uInt32 LineNo) -{ - if (LineNo < pProfile->m_NoLines) - { - free(pProfile->m_Lines[LineNo]); - pProfile->m_Lines[LineNo]=0; - if (pProfile->m_NoLines - LineNo > 1) - { - sal_uInt32 i, n; - osl_TProfileSection* pSec; - - memmove(&pProfile->m_Lines[LineNo], &pProfile->m_Lines[LineNo + 1], - (pProfile->m_NoLines - LineNo - 1) * sizeof(sal_Char *)); - - memset(&pProfile->m_Lines[pProfile->m_NoLines - 1], - 0, - (pProfile->m_MaxLines - pProfile->m_NoLines) * sizeof(sal_Char*)); - - /* adjust line references */ - for (i = 0; i < pProfile->m_NoSections; i++) - { - pSec = &pProfile->m_Sections[i]; - - if (pSec->m_Line > LineNo) - pSec->m_Line--; - - for (n = 0; n < pSec->m_NoEntries; n++) - if (pSec->m_Entries[n].m_Line > LineNo) - pSec->m_Entries[n].m_Line--; - } - } - else - { - pProfile->m_Lines[LineNo] = 0; - } - - pProfile->m_NoLines--; - } - - return; -} - -static void setEntry(osl_TProfileImpl* pProfile, osl_TProfileSection* pSection, - sal_uInt32 NoEntry, sal_uInt32 Line, - sal_Char* Entry, sal_uInt32 Len) -{ - Entry = stripBlanks(Entry, &Len); - pSection->m_Entries[NoEntry].m_Line = Line; - pSection->m_Entries[NoEntry].m_Offset = Entry - pProfile->m_Lines[Line]; - pSection->m_Entries[NoEntry].m_Len = Len; - - return; -} - -static sal_Bool addEntry(osl_TProfileImpl* pProfile, osl_TProfileSection *pSection, - int Line, sal_Char* Entry, sal_uInt32 Len) -{ - if (pSection != NULL) - { - if (pSection->m_NoEntries >= pSection->m_MaxEntries) - { - if (pSection->m_Entries == NULL) - { - pSection->m_MaxEntries = ENTRIES_INI; - pSection->m_Entries = (osl_TProfileEntry *)malloc( - pSection->m_MaxEntries * sizeof(osl_TProfileEntry)); - } - else - { - pSection->m_MaxEntries += ENTRIES_ADD; - pSection->m_Entries = (osl_TProfileEntry *)realloc(pSection->m_Entries, - pSection->m_MaxEntries * sizeof(osl_TProfileEntry)); - } - - if (pSection->m_Entries == NULL) - { - pSection->m_NoEntries = 0; - pSection->m_MaxEntries = 0; - return (sal_False); - } - } - - pSection->m_NoEntries++; - - Entry = stripBlanks(Entry, &Len); - setEntry(pProfile, pSection, pSection->m_NoEntries - 1, Line, - Entry, Len); - - return (sal_True); - } - - return (sal_False); -} - -static void removeEntry(osl_TProfileSection *pSection, sal_uInt32 NoEntry) -{ - if (NoEntry < pSection->m_NoEntries) - { - if (pSection->m_NoEntries - NoEntry > 1) - { - memmove(&pSection->m_Entries[NoEntry], - &pSection->m_Entries[NoEntry + 1], - (pSection->m_NoEntries - NoEntry - 1) * sizeof(osl_TProfileEntry)); - pSection->m_Entries[pSection->m_NoEntries - 1].m_Line=0; - pSection->m_Entries[pSection->m_NoEntries - 1].m_Offset=0; - pSection->m_Entries[pSection->m_NoEntries - 1].m_Len=0; - } - - pSection->m_NoEntries--; - } - - return; -} - -static sal_Bool addSection(osl_TProfileImpl* pProfile, int Line, const sal_Char* Section, sal_uInt32 Len) -{ - if (pProfile->m_NoSections >= pProfile->m_MaxSections) - { - if (pProfile->m_Sections == NULL) - { - pProfile->m_MaxSections = SECTIONS_INI; - pProfile->m_Sections = (osl_TProfileSection *)malloc(pProfile->m_MaxSections * sizeof(osl_TProfileSection)); - memset(pProfile->m_Sections,0,pProfile->m_MaxSections * sizeof(osl_TProfileSection)); - } - else - { - unsigned int idx=0; - unsigned int oldmax=pProfile->m_MaxSections; - - pProfile->m_MaxSections += SECTIONS_ADD; - pProfile->m_Sections = (osl_TProfileSection *)realloc(pProfile->m_Sections, - pProfile->m_MaxSections * sizeof(osl_TProfileSection)); - for ( idx = oldmax ; idx < pProfile->m_MaxSections ; ++idx ) - { - pProfile->m_Sections[idx].m_Entries=0; - } - } - - if (pProfile->m_Sections == NULL) - { - pProfile->m_NoSections = 0; - pProfile->m_MaxSections = 0; - return (sal_False); - } - } - - pProfile->m_NoSections++; - - if ( pProfile->m_Sections[(pProfile->m_NoSections) - 1].m_Entries != 0 ) - { - free(pProfile->m_Sections[(pProfile->m_NoSections) - 1].m_Entries); - } - pProfile->m_Sections[pProfile->m_NoSections - 1].m_Entries = NULL; - pProfile->m_Sections[pProfile->m_NoSections - 1].m_NoEntries = 0; - pProfile->m_Sections[pProfile->m_NoSections - 1].m_MaxEntries = 0; - - pProfile->m_Sections[pProfile->m_NoSections - 1].m_Line = Line; - pProfile->m_Sections[pProfile->m_NoSections - 1].m_Offset = Section - pProfile->m_Lines[Line]; - pProfile->m_Sections[pProfile->m_NoSections - 1].m_Len = Len; - - return (sal_True); -} - -static void removeSection(osl_TProfileImpl* pProfile, osl_TProfileSection *pSection) -{ - sal_uInt32 Section; - - if ((Section = pSection - pProfile->m_Sections) < pProfile->m_NoSections) - { - free (pSection->m_Entries); - pSection->m_Entries=0; - if (pProfile->m_NoSections - Section > 1) - { - memmove(&pProfile->m_Sections[Section], &pProfile->m_Sections[Section + 1], - (pProfile->m_NoSections - Section - 1) * sizeof(osl_TProfileSection)); - - memset(&pProfile->m_Sections[pProfile->m_NoSections - 1], - 0, - (pProfile->m_MaxSections - pProfile->m_NoSections) * sizeof(osl_TProfileSection)); - pProfile->m_Sections[pProfile->m_NoSections - 1].m_Entries = 0; - } - else - { - pSection->m_Entries = 0; - } - - pProfile->m_NoSections--; - } - - return; -} - -static osl_TProfileSection* findEntry(osl_TProfileImpl* pProfile, const sal_Char* Section, - const sal_Char* Entry, sal_uInt32 *pNoEntry) -{ -static sal_uInt32 Sect = 0; - sal_uInt32 i, n; - sal_uInt32 Len; - const sal_Char* pStr; - osl_TProfileSection* pSec=0; - - Len = strlen(Section); - - n = Sect; - - for (i = 0; i < pProfile->m_NoSections; i++) - { - n %= pProfile->m_NoSections; - pSec = &pProfile->m_Sections[n]; - if ((Len == pSec->m_Len) && - (strncasecmp(Section, &pProfile->m_Lines[pSec->m_Line][pSec->m_Offset], pSec->m_Len) - == 0)) - break; - n++; - } - - Sect = n; - - if (i < pProfile->m_NoSections) - { - Len = strlen(Entry); - - *pNoEntry = pSec->m_NoEntries; - - for (i = 0; i < pSec->m_NoEntries; i++) - { - pStr = &pProfile->m_Lines[pSec->m_Entries[i].m_Line] - [pSec->m_Entries[i].m_Offset]; - if ((Len == pSec->m_Entries[i].m_Len) && - (strncasecmp(Entry, pStr, pSec->m_Entries[i].m_Len) - == 0)) - { - *pNoEntry = i; - break; - } - } - } - else - pSec = NULL; - - return (pSec); -} - -static sal_Bool loadProfile(osl_TFile* pFile, osl_TProfileImpl* pProfile) -{ - sal_uInt32 i; - sal_Char* pStr; - sal_Char* pChar; - - sal_Char* pLine; - sal_Char* bWasAdded = NULL; - - pProfile->m_NoLines = 0; - pProfile->m_NoSections = 0; - - if ( pFile == 0 ) - { - return sal_False; - } - - if ( pProfile == 0 ) - { - return sal_False; - } - - OSL_VERIFY(OslProfile_rewindFile(pFile, sal_False)); - - while ( ( pLine=OslProfile_getLine(pFile) ) != 0 ) - { - bWasAdded = addLine( pProfile, pLine ); - rtl_freeMemory( pLine ); - OSL_ASSERT(bWasAdded); - if ( ! bWasAdded ) - return (sal_False); - } - - for (i = 0; i < pProfile->m_NoLines; i++) - { - pStr = (sal_Char *)stripBlanks(pProfile->m_Lines[i], NULL); - - if ((*pStr == '\0') || (*pStr == ';')) - continue; - - if ((*pStr != '[') || ((pChar = strrchr(pStr, ']')) == NULL) || - ((pChar - pStr) <= 2)) - { - /* insert entry */ - - if (pProfile->m_NoSections < 1) - continue; - - if ((pChar = strchr(pStr, '=')) == NULL) - pChar = pStr + strlen(pStr); - - if (! addEntry(pProfile, &pProfile->m_Sections[pProfile->m_NoSections - 1], - i, pStr, pChar - pStr)) - { - OSL_ASSERT(0); - continue; - } - - } - else - { - /* new section */ - - if (! addSection(pProfile, i, pStr + 1, pChar - pStr - 1)) - { - OSL_ASSERT(0); - continue; - } - - } - } - - return (sal_True); -} - -static sal_Bool storeProfile(osl_TProfileImpl* pProfile, sal_Bool bCleanup) -{ -#ifdef TRACE_OSL_PROFILE - OSL_TRACE("In storeProfile\n"); -#endif - - if (pProfile->m_Lines != NULL) - { - if (pProfile->m_Flags & FLG_MODIFIED) - { - sal_uInt32 i; - - osl_TFile* pTmpFile = osl_openTmpProfileImpl(pProfile); - - if ( pTmpFile == 0 ) - { - return sal_False; - } - - OSL_VERIFY(OslProfile_rewindFile(pTmpFile, sal_True)); - - for ( i = 0 ; i < pProfile->m_NoLines ; i++ ) - { - OSL_VERIFY(OslProfile_putLine(pTmpFile, pProfile->m_Lines[i])); - } - - if ( ! writeProfileImpl(pTmpFile) ) - { - if ( pTmpFile->m_pWriteBuf != 0 ) - { - free(pTmpFile->m_pWriteBuf); - } - - pTmpFile->m_pWriteBuf=0; - pTmpFile->m_nWriteBufLen=0; - pTmpFile->m_nWriteBufFree=0; - -#ifdef TRACE_OSL_PROFILE - OSL_TRACE("Out storeProfile [not flushed]\n"); -#endif - closeFileImpl(pTmpFile,pProfile->m_Flags); - - return sal_False; - } - - pProfile->m_Flags &= ~FLG_MODIFIED; - - closeFileImpl(pProfile->m_pFile,pProfile->m_Flags); - closeFileImpl(pTmpFile,pProfile->m_Flags); - - osl_ProfileSwapProfileNames(pProfile); - - pProfile->m_pFile = openFileImpl(pProfile->m_FileName,pProfile->m_Flags); - - } - - if (bCleanup) - { - while (pProfile->m_NoLines > 0) - removeLine(pProfile, pProfile->m_NoLines - 1); - - free(pProfile->m_Lines); - pProfile->m_Lines = NULL; - pProfile->m_NoLines = 0; - pProfile->m_MaxLines = 0; - - while (pProfile->m_NoSections > 0) - removeSection(pProfile, &pProfile->m_Sections[pProfile->m_NoSections - 1]); - - free(pProfile->m_Sections); - pProfile->m_Sections = NULL; - pProfile->m_NoSections = 0; - pProfile->m_MaxSections = 0; - } - } - -#ifdef TRACE_OSL_PROFILE - OSL_TRACE("Out storeProfile [ok]\n"); -#endif - return (sal_True); -} - - -static osl_TFile* osl_openTmpProfileImpl(osl_TProfileImpl* pProfile) -{ - osl_TFile* pFile=0; - sal_Char* pszExtension = "tmp"; - sal_Char pszTmpName[PATH_MAX]; - oslProfileOption PFlags=0; - - pszTmpName[0] = '\0'; - - /* generate tmp profilename */ - osl_ProfileGenerateExtension(pProfile->m_FileName,pszExtension,pszTmpName); - - if ( pszTmpName[0] == 0 ) - { - return 0; - } - - if ( ! ( pProfile->m_Flags & osl_Profile_READLOCK ) ) - { - PFlags |= osl_Profile_WRITELOCK; - } - - /* open this file */ - pFile = openFileImpl(pszTmpName,pProfile->m_Flags | PFlags); - - - /* return new pFile */ - return pFile; -} - -static sal_Bool osl_ProfileSwapProfileNames(osl_TProfileImpl* pProfile) -{ - sal_Bool bRet = sal_False; - - sal_Char pszBakFile[PATH_MAX]; - sal_Char pszTmpFile[PATH_MAX]; - sal_Char pszIniFile[PATH_MAX]; - - pszBakFile[0] = '\0'; - pszTmpFile[0] = '\0'; - pszIniFile[0] = '\0'; - - osl_ProfileGenerateExtension(pProfile->m_FileName,"bak",pszBakFile); - - strcpy(pszIniFile,pProfile->m_FileName); - - osl_ProfileGenerateExtension(pProfile->m_FileName,"tmp",pszTmpFile); - - /* unlink bak */ - unlink( pszBakFile ); - - /* rename ini bak */ - rename( pszIniFile, pszBakFile ); - - /* rename tmp ini */ - rename( pszTmpFile, pszIniFile ); - - return bRet; -} - - -static void osl_ProfileGenerateExtension(sal_Char* pszFileName, sal_Char* pszExtension, sal_Char* pszTmpName) -{ - - strcpy(pszTmpName,pszFileName); - strcat(pszTmpName,"."); - strcat(pszTmpName,pszExtension); - - return; -} - - -static osl_TProfileImpl* acquireProfile(oslProfile Profile, sal_Bool bWriteable) -{ - osl_TProfileImpl* pProfile = (osl_TProfileImpl*)Profile; - oslProfileOption PFlags=0; - - if ( bWriteable ) - { - PFlags = osl_Profile_DEFAULT | osl_Profile_WRITELOCK; - } - else - { - PFlags = osl_Profile_DEFAULT; - } - - - if (pProfile == NULL) - { -#ifdef DEBUG_OSL_PROFILE - OSL_TRACE("AUTOOPEN MODE\n"); -#endif - - if ( ( pProfile = (osl_TProfileImpl*) osl_openProfile(0, PFlags ) ) != NULL ) - { - pProfile->m_Flags |= FLG_AUTOOPEN; - } - } - else - { -#ifdef DEBUG_OSL_PROFILE - OSL_TRACE("try to acquire\n"); -#endif - - if (! (pProfile->m_Flags & osl_Profile_SYSTEM)) - { - if (! (pProfile->m_Flags & (osl_Profile_READLOCK | osl_Profile_WRITELOCK | osl_Profile_FLUSHWRITE ))) - { - osl_TStamp Stamp; - -#ifdef DEBUG_OSL_PROFILE - OSL_TRACE("Profile acquire DEFAULT MODE\n"); -#endif - if (! (pProfile->m_pFile = openFileImpl(pProfile->m_FileName, pProfile->m_Flags | PFlags ))) - return NULL; - - Stamp = OslProfile_getFileStamp(pProfile->m_pFile); - - if (memcmp(&Stamp, &(pProfile->m_Stamp), sizeof(osl_TStamp))) - { - sal_Bool bRet=sal_False; - - pProfile->m_Stamp = Stamp; - - bRet=loadProfile(pProfile->m_pFile, pProfile); - OSL_ASSERT(bRet); - (void)bRet; - } - } - else - { -#ifdef DEBUG_OSL_PROFILE - OSL_TRACE("Profile acquire READ/WRITELOCK MODE\n"); -#endif - /* A readlock file could not be written */ - if ((pProfile->m_Flags & osl_Profile_READLOCK) && bWriteable) - { - return (NULL); - } - } - } - } - - return (pProfile); -} - -static sal_Bool releaseProfile(osl_TProfileImpl* pProfile) -{ -#ifdef TRACE_OSL_PROFILE - OSL_TRACE("In releaseProfile\n"); -#endif - - if ( pProfile == 0 ) - { -#ifdef TRACE_OSL_PROFILE - OSL_TRACE("Out releaseProfile [profile==0]\n"); -#endif - return sal_False; - } - - if (pProfile->m_Flags & FLG_AUTOOPEN) - { -#ifdef TRACE_OSL_PROFILE - OSL_TRACE("Out releaseProfile [AUTOOPEN]\n"); -#endif - return (osl_closeProfile((oslProfile)pProfile)); - } - else - { -#ifdef DEBUG_OSL_PROFILE - OSL_TRACE("DEFAULT MODE\n"); -#endif - if (! (pProfile->m_Flags & (osl_Profile_READLOCK | osl_Profile_WRITELOCK | osl_Profile_FLUSHWRITE ))) - { - if (pProfile->m_Flags & FLG_MODIFIED) - { - sal_Bool bRet=storeProfile(pProfile, sal_False); - OSL_ASSERT(bRet); - (void)bRet; - } - - closeFileImpl(pProfile->m_pFile,pProfile->m_Flags); - pProfile->m_pFile = NULL; - } - } - -#ifdef TRACE_OSL_PROFILE - OSL_TRACE("Out releaseProfile [ok]\n"); -#endif - return (sal_True); -} - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sal/osl/unx/readwrite_helper.c b/sal/osl/unx/readwrite_helper.c deleted file mode 100644 index e2598953e..000000000 --- a/sal/osl/unx/readwrite_helper.c +++ /dev/null @@ -1,87 +0,0 @@ -/* - * Version: MPL 1.1 / GPLv3+ / LGPLv3+ - * - * 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 or as specified alternatively below. 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 Initial Developer of the Original Code is - * Julien Chaffraix <julien.chaffraix@gmail.com> - * Portions created by the Initial Developer are Copyright (C) 2011 the - * Initial Developer. All Rights Reserved. - * - * Major Contributor(s): - * - * For minor contributions see the git repository. - * - * Alternatively, the contents of this file may be used under the terms of - * either the GNU General Public License Version 3 or later (the "GPLv3+"), or - * the GNU Lesser General Public License Version 3 or later (the "LGPLv3+"), - * in which case the provisions of the GPLv3+ or the LGPLv3+ are applicable - * instead of those above. - */ - -#include "readwrite_helper.h" - -#include <osl/diagnose.h> -#include <system.h> - -sal_Bool safeWrite(int fd, void* data, sal_uInt32 dataSize) -{ - sal_Int32 nToWrite = dataSize; - unsigned char* dataToWrite = data; - - // Check for overflow as we convert a signed to an unsigned. - OSL_ASSERT(dataSize == (sal_uInt32)nToWrite); - while ( nToWrite ) { - sal_Int32 nWritten = write(fd, dataToWrite, nToWrite); - if ( nWritten < 0 ) { - if ( errno == EINTR ) - continue; - - return sal_False; - - } - - OSL_ASSERT(nWritten > 0); - nToWrite -= nWritten; - dataToWrite += nWritten; - } - - return sal_True; -} - -sal_Bool safeRead( int fd, void* buffer, sal_uInt32 count ) -{ - sal_Int32 nToRead = count; - unsigned char* bufferForReading = buffer; - - // Check for overflow as we convert a signed to an unsigned. - OSL_ASSERT(count == (sal_uInt32)nToRead); - while ( nToRead ) { - sal_Int32 nRead = read(fd, bufferForReading, nToRead); - if ( nRead < 0 ) { - // We were interrupted before reading, retry. - if (errno == EINTR) - continue; - - return sal_False; - } - - // If we reach the EOF, we consider this a partial transfer and thus - // an error. - if ( nRead == 0 ) - return sal_False; - - nToRead -= nRead; - bufferForReading += nRead; - } - - return sal_True; -} diff --git a/sal/osl/unx/readwrite_helper.h b/sal/osl/unx/readwrite_helper.h deleted file mode 100644 index c96c4e3bf..000000000 --- a/sal/osl/unx/readwrite_helper.h +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Version: MPL 1.1 / GPLv3+ / LGPLv3+ - * - * 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 or as specified alternatively below. 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 Initial Developer of the Original Code is - * Julien Chaffraix <julien.chaffraix@gmail.com> - * Portions created by the Initial Developer are Copyright (C) 2011 the - * Initial Developer. All Rights Reserved. - * - * Major Contributor(s): - * - * For minor contributions see the git repository. - * - * Alternatively, the contents of this file may be used under the terms of - * either the GNU General Public License Version 3 or later (the "GPLv3+"), or - * the GNU Lesser General Public License Version 3 or later (the "LGPLv3+"), - * in which case the provisions of the GPLv3+ or the LGPLv3+ are applicable - * instead of those above. - */ - -#include <sal/types.h> - -#ifdef __cplusplus -extern "C" -{ -#endif - -sal_Bool safeWrite( int fd, void* data, sal_uInt32 dataSize ); - -// This function *will* read |count| bytes from |fd|, busy looping -// if needed. Don't use it when you don't know if you can request enough -// data. It will return sal_False for any partial transfer or error. -sal_Bool safeRead( int fd, void* buffer, sal_uInt32 count ); - -#ifdef __cplusplus -} -#endif diff --git a/sal/osl/unx/salinit.cxx b/sal/osl/unx/salinit.cxx deleted file mode 100644 index 9503443fe..000000000 --- a/sal/osl/unx/salinit.cxx +++ /dev/null @@ -1,45 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2000, 2010 Oracle and/or its affiliates. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * <http://www.openoffice.org/license.html> - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -#include "precompiled_sal.hxx" -#include "sal/config.h" - -#include "osl/process.h" -#include "sal/types.h" - -extern "C" { - -void SAL_CALL sal_detail_initialize(int argc, char ** argv) { - osl_setCommandArgs(argc, argv); -} - -void SAL_CALL sal_detail_deinitialize() {} - -} - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sal/osl/unx/secimpl.h b/sal/osl/unx/secimpl.h deleted file mode 100644 index c3a2b676a..000000000 --- a/sal/osl/unx/secimpl.h +++ /dev/null @@ -1,49 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2000, 2010 Oracle and/or its affiliates. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * <http://www.openoffice.org/license.html> - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -#ifndef _OSL_SECURITYIMPL_H_ -#define _OSL_SECURITYIMPL_H_ - -#include <pwd.h> - -#ifdef __cplusplus -extern "C" { -#endif - -typedef struct _oslSecurityImpl { - struct passwd m_pPasswd; - char m_buffer[1]; /* should be a C99 flexible array member */ -} oslSecurityImpl; - -#ifdef __cplusplus -} -#endif - -#endif - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sal/osl/unx/security.c b/sal/osl/unx/security.c deleted file mode 100644 index 3a42b66d4..000000000 --- a/sal/osl/unx/security.c +++ /dev/null @@ -1,452 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2000, 2010 Oracle and/or its affiliates. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * <http://www.openoffice.org/license.html> - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -#include <stddef.h> - -/* Solaris 8 has no C99 stdint.h, and Solaris generally seems not to miss it for - SIZE_MAX: */ -#if !defined __SUNPRO_C -#include <stdint.h> -#endif - -#include "system.h" - -#include <osl/security.h> -#include <osl/diagnose.h> - -#include "osl/thread.h" -#include "osl/file.h" - -#if defined LINUX || defined SOLARIS -#include <crypt.h> -#endif - -#include "secimpl.h" - -#ifdef ANDROID -#define getpwuid_r(uid, pwd, buf, buflen, result) (*(result) = getpwuid(uid), (*(result) ? (memcpy (buf, *(result), sizeof (struct passwd)), 0) : errno)) -#endif - - -static oslSecurityError SAL_CALL -osl_psz_loginUser(const sal_Char* pszUserName, const sal_Char* pszPasswd, - oslSecurity* pSecurity); -sal_Bool SAL_CALL osl_psz_getUserIdent(oslSecurity Security, sal_Char *pszIdent, sal_uInt32 nMax); -static sal_Bool SAL_CALL osl_psz_getUserName(oslSecurity Security, sal_Char* pszName, sal_uInt32 nMax); -static sal_Bool SAL_CALL osl_psz_getHomeDir(oslSecurity Security, sal_Char* pszDirectory, sal_uInt32 nMax); -static sal_Bool SAL_CALL osl_psz_getConfigDir(oslSecurity Security, sal_Char* pszDirectory, sal_uInt32 nMax); - -static sal_Bool sysconf_SC_GETPW_R_SIZE_MAX(size_t * value) { -#if defined _SC_GETPW_R_SIZE_MAX - long m; - errno = 0; - m = sysconf(_SC_GETPW_R_SIZE_MAX); - if (m == -1) { - /* _SC_GETPW_R_SIZE_MAX has no limit; some platforms like certain - FreeBSD versions support sysconf(_SC_GETPW_R_SIZE_MAX) in a broken - way and always set EINVAL, so be resilient here: */ - return sal_False; - } else { - OSL_ASSERT(m >= 0 && (unsigned long) m < SIZE_MAX); - *value = (size_t) m; - return sal_True; - } -#else - /* some platforms like Mac OS X 1.3 do not define _SC_GETPW_R_SIZE_MAX: */ - return sal_False; -#endif -} - -static oslSecurityImpl * growSecurityImpl( - oslSecurityImpl * impl, size_t * bufSize) -{ - size_t n = 0; - oslSecurityImpl * p = NULL; - if (impl == NULL) { - if (!sysconf_SC_GETPW_R_SIZE_MAX(&n)) { - /* choose something sensible (the callers of growSecurityImpl will - detect it if the allocated buffer is too small: */ - n = 1024; - } - } else if (*bufSize <= SIZE_MAX / 2) { - n = 2 * *bufSize; - } - if (n != 0) { - if (n <= SIZE_MAX - offsetof(oslSecurityImpl, m_buffer)) { - *bufSize = n; - n += offsetof(oslSecurityImpl, m_buffer); - } else { - *bufSize = SIZE_MAX - offsetof(oslSecurityImpl, m_buffer); - n = SIZE_MAX; - } - p = realloc(impl, n); - } - if (p == NULL) { - free(impl); - } - return p; -} - -static void deleteSecurityImpl(oslSecurityImpl * impl) { - free(impl); -} - -oslSecurity SAL_CALL osl_getCurrentSecurity() -{ - size_t n = 0; - oslSecurityImpl * p = NULL; - for (;;) { - struct passwd * found; - p = growSecurityImpl(p, &n); - if (p == NULL) { - return NULL; - } - switch (getpwuid_r(getuid(), &p->m_pPasswd, p->m_buffer, n, &found)) { - case ERANGE: - break; - case 0: - if (found != NULL) { - return p; - } - /* fall through */ - default: - deleteSecurityImpl(p); - return NULL; - } - } -} - -oslSecurityError SAL_CALL osl_loginUser( - rtl_uString *ustrUserName, - rtl_uString *ustrPassword, - oslSecurity *pSecurity - ) -{ - oslSecurityError Error; - rtl_String* strUserName=0; - rtl_String* strPassword=0; - sal_Char* pszUserName=0; - sal_Char* pszPassword=0; - - if ( ustrUserName != 0 ) - { - rtl_uString2String( &strUserName, - rtl_uString_getStr(ustrUserName), - rtl_uString_getLength(ustrUserName), - RTL_TEXTENCODING_UTF8, - OUSTRING_TO_OSTRING_CVTFLAGS ); - pszUserName = rtl_string_getStr(strUserName); - } - - - if ( ustrPassword != 0 ) - { - rtl_uString2String( &strPassword, - rtl_uString_getStr(ustrPassword), - rtl_uString_getLength(ustrPassword), - RTL_TEXTENCODING_UTF8, - OUSTRING_TO_OSTRING_CVTFLAGS ); - pszPassword = rtl_string_getStr(strPassword); - } - - - Error=osl_psz_loginUser(pszUserName,pszPassword,pSecurity); - - if ( strUserName != 0 ) - { - rtl_string_release(strUserName); - } - - if ( strPassword) - { - rtl_string_release(strPassword); - } - - - return Error; -} - - -static oslSecurityError SAL_CALL -osl_psz_loginUser(const sal_Char* pszUserName, const sal_Char* pszPasswd, - oslSecurity* pSecurity) -{ - (void)pszUserName; - (void)pszPasswd; - (void)pSecurity; - - return osl_Security_E_None; -} - -oslSecurityError SAL_CALL osl_loginUserOnFileServer( - rtl_uString *strUserName, - rtl_uString *strPasswd, - rtl_uString *strFileServer, - oslSecurity *pSecurity - ) -{ - (void) strUserName; /* unused */ - (void) strPasswd; /* unused */ - (void) strFileServer; /* unused */ - (void) pSecurity; /* unused */ - return osl_Security_E_UserUnknown; -} - - -sal_Bool SAL_CALL osl_getUserIdent(oslSecurity Security, rtl_uString **ustrIdent) -{ - sal_Bool bRet=sal_False; - sal_Char pszIdent[1024]; - - pszIdent[0] = '\0'; - - bRet = osl_psz_getUserIdent(Security,pszIdent,sizeof(pszIdent)); - - rtl_string2UString( ustrIdent, pszIdent, rtl_str_getLength( pszIdent ), osl_getThreadTextEncoding(), OUSTRING_TO_OSTRING_CVTFLAGS ); - OSL_ASSERT(*ustrIdent != NULL); - - return bRet; -} - - -sal_Bool SAL_CALL osl_psz_getUserIdent(oslSecurity Security, sal_Char *pszIdent, sal_uInt32 nMax) -{ - sal_Char buffer[32]; - sal_Int32 nChr; - - oslSecurityImpl *pSecImpl = (oslSecurityImpl *)Security; - - if (pSecImpl == NULL) - return sal_False; - - nChr = snprintf(buffer, sizeof(buffer), "%u", pSecImpl->m_pPasswd.pw_uid); - if ( nChr < 0 || SAL_INT_CAST(sal_uInt32, nChr) >= sizeof(buffer) - || SAL_INT_CAST(sal_uInt32, nChr) >= nMax ) - return sal_False; /* leave *pszIdent unmodified in case of failure */ - - memcpy(pszIdent, buffer, nChr+1); - return sal_True; -} - -sal_Bool SAL_CALL osl_getUserName(oslSecurity Security, rtl_uString **ustrName) -{ - sal_Bool bRet=sal_False; - sal_Char pszName[1024]; - - pszName[0] = '\0'; - - bRet = osl_psz_getUserName(Security,pszName,sizeof(pszName)); - - rtl_string2UString( ustrName, pszName, rtl_str_getLength( pszName ), osl_getThreadTextEncoding(), OUSTRING_TO_OSTRING_CVTFLAGS ); - OSL_ASSERT(*ustrName != NULL); - - return bRet; -} - - - -static sal_Bool SAL_CALL osl_psz_getUserName(oslSecurity Security, sal_Char* pszName, sal_uInt32 nMax) -{ - oslSecurityImpl *pSecImpl = (oslSecurityImpl *)Security; - - if (pSecImpl == NULL) - return sal_False; - - strncpy(pszName, pSecImpl->m_pPasswd.pw_name, nMax); - - return sal_True; -} - -sal_Bool SAL_CALL osl_getHomeDir(oslSecurity Security, rtl_uString **pustrDirectory) -{ - sal_Bool bRet=sal_False; - sal_Char pszDirectory[PATH_MAX]; - - pszDirectory[0] = '\0'; - - bRet = osl_psz_getHomeDir(Security,pszDirectory,sizeof(pszDirectory)); - - if ( bRet == sal_True ) - { - rtl_string2UString( pustrDirectory, pszDirectory, rtl_str_getLength( pszDirectory ), osl_getThreadTextEncoding(), OUSTRING_TO_OSTRING_CVTFLAGS ); - OSL_ASSERT(*pustrDirectory != NULL); - osl_getFileURLFromSystemPath( *pustrDirectory, pustrDirectory ); - } - - return bRet; -} - - -static sal_Bool SAL_CALL osl_psz_getHomeDir(oslSecurity Security, sal_Char* pszDirectory, sal_uInt32 nMax) -{ - oslSecurityImpl *pSecImpl = (oslSecurityImpl *)Security; - - if (pSecImpl == NULL) - return sal_False; - - /* if current user, check also environment for HOME */ - if (getuid() == pSecImpl->m_pPasswd.pw_uid) - { - sal_Char *pStr = NULL; -#ifdef SOLARIS - char buffer[8192]; - - struct passwd pwd; - struct passwd *ppwd; - -#ifdef _POSIX_PTHREAD_SEMANTICS - if ( 0 != getpwuid_r(getuid(), &pwd, buffer, sizeof(buffer), &ppwd ) ) - ppwd = NULL; -#else - ppwd = getpwuid_r(getuid(), &pwd, buffer, sizeof(buffer) ); -#endif - - if ( ppwd ) - pStr = ppwd->pw_dir; -#else - pStr = getenv("HOME"); -#endif - - if ((pStr != NULL) && (strlen(pStr) > 0) && - (access(pStr, 0) == 0)) - strncpy(pszDirectory, pStr, nMax); - else - strncpy(pszDirectory, pSecImpl->m_pPasswd.pw_dir, nMax); - } - else - strncpy(pszDirectory, pSecImpl->m_pPasswd.pw_dir, nMax); - - return sal_True; -} - -sal_Bool SAL_CALL osl_getConfigDir(oslSecurity Security, rtl_uString **pustrDirectory) -{ - sal_Bool bRet = sal_False; - sal_Char pszDirectory[PATH_MAX]; - - pszDirectory[0] = '\0'; - - bRet = osl_psz_getConfigDir(Security,pszDirectory,sizeof(pszDirectory)); - - if ( bRet == sal_True ) - { - rtl_string2UString( pustrDirectory, pszDirectory, rtl_str_getLength( pszDirectory ), osl_getThreadTextEncoding(), OUSTRING_TO_OSTRING_CVTFLAGS ); - OSL_ASSERT(*pustrDirectory != NULL); - osl_getFileURLFromSystemPath( *pustrDirectory, pustrDirectory ); - } - - return bRet; -} - -#ifndef MACOSX - -#define DOT_CONFIG "/.config" - -static sal_Bool SAL_CALL osl_psz_getConfigDir(oslSecurity Security, sal_Char* pszDirectory, sal_uInt32 nMax) -{ - sal_Char *pStr = getenv("XDG_CONFIG_HOME"); - - if ((pStr == NULL) || (strlen(pStr) == 0) || - (access(pStr, 0) != 0)) - { - // a default equal to $HOME/.config should be used. - if (!osl_psz_getHomeDir(Security, pszDirectory, nMax)) - return sal_False; - size_t n = strlen(pszDirectory); - if (n + sizeof(DOT_CONFIG) < nMax) - { - strncpy(pszDirectory+n, DOT_CONFIG, sizeof(DOT_CONFIG)); - if (access(pszDirectory, 0) != 0) - { - // resort to HOME - pszDirectory[n] = '\0'; - } - } - } - else - strncpy(pszDirectory, pStr, nMax); - - return sal_True; -} - -#undef DOT_CONFIG - -#else - -/* - * FIXME: rewrite to use more flexible - * NSSearchPathForDirectoriesInDomains(NSApplicationSupportDirectory, NSUserDomainMask, YES) - * as soon as we can bumb the baseline to Tiger (for NSApplicationSupportDirectory) and have - * support for Objective-C in the build environment - */ - -#define MACOSX_CONFIG_DIR "/Library/Application Support" -static sal_Bool SAL_CALL osl_psz_getConfigDir(oslSecurity Security, sal_Char* pszDirectory, sal_uInt32 nMax) -{ - if( osl_psz_getHomeDir(Security, pszDirectory, nMax - sizeof(MACOSX_CONFIG_DIR) + 1) ) - { - strcat( pszDirectory, MACOSX_CONFIG_DIR ); - return sal_True; - } - - return sal_False; -} - -#endif - -sal_Bool SAL_CALL osl_isAdministrator(oslSecurity Security) -{ - oslSecurityImpl *pSecImpl = (oslSecurityImpl *)Security; - - if (pSecImpl == NULL) - return sal_False; - - if (pSecImpl->m_pPasswd.pw_uid != 0) - return (sal_False); - - return (sal_True); -} - -void SAL_CALL osl_freeSecurityHandle(oslSecurity Security) -{ - deleteSecurityImpl(Security); -} - - -sal_Bool SAL_CALL osl_loadUserProfile(oslSecurity Security) -{ - (void) Security; /* unused */ - return sal_False; -} - -void SAL_CALL osl_unloadUserProfile(oslSecurity Security) -{ - (void) Security; /* unused */ -} - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sal/osl/unx/semaphor.c b/sal/osl/unx/semaphor.c deleted file mode 100644 index 9763adf65..000000000 --- a/sal/osl/unx/semaphor.c +++ /dev/null @@ -1,316 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2000, 2010 Oracle and/or its affiliates. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * <http://www.openoffice.org/license.html> - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - - -#include "system.h" - -#include <osl/semaphor.h> -#include <osl/diagnose.h> - -#ifndef OSL_USE_SYS_V_SEMAPHORE - -/* This is the (default) POSIX thread-local semaphore variant */ - -/* - Implemetation notes: - The void* represented by oslSemaphore is used - as a pointer to an sem_t struct -*/ - -/*****************************************************************************/ -/* osl_createSemaphore */ -/*****************************************************************************/ - -oslSemaphore SAL_CALL osl_createSemaphore(sal_uInt32 initialCount) -{ - int ret = 0; - oslSemaphore Semaphore; - - Semaphore= malloc(sizeof(sem_t)); - - OSL_ASSERT(Semaphore); /* ptr valid? */ - - if ( Semaphore == 0 ) - { - return 0; - } - - /* unnamed semaphore, not shared between processes */ - - ret= sem_init((sem_t*)Semaphore, 0, initialCount); - - /* create failed? */ - if (ret != 0) - { - OSL_TRACE("osl_createSemaphore failed. Errno: %d; %s\n", - errno, - strerror(errno)); - - free(Semaphore); - Semaphore = NULL; - } - - return Semaphore; -} - -/*****************************************************************************/ -/* osl_destroySemaphore */ -/*****************************************************************************/ -void SAL_CALL osl_destroySemaphore(oslSemaphore Semaphore) -{ - if(Semaphore) /* ptr valid? */ - { - sem_destroy((sem_t*)Semaphore); - free(Semaphore); - } -} - -/*****************************************************************************/ -/* osl_acquireSemaphore */ -/*****************************************************************************/ -sal_Bool SAL_CALL osl_acquireSemaphore(oslSemaphore Semaphore) { - - OSL_ASSERT(Semaphore != 0); /* abort in debug mode */ - - if (Semaphore != 0) /* be tolerant in release mode */ - { - return (sem_wait((sem_t*)Semaphore) == 0); - } - - return sal_False; -} - -/*****************************************************************************/ -/* osl_tryToAcquireSemaphore */ -/*****************************************************************************/ -sal_Bool SAL_CALL osl_tryToAcquireSemaphore(oslSemaphore Semaphore) { - - OSL_ASSERT(Semaphore != 0); /* abort in debug mode */ - if (Semaphore != 0) /* be tolerant in release mode */ - { - return (sem_trywait((sem_t*)Semaphore) == 0); - } - - return sal_False; -} - -/*****************************************************************************/ -/* osl_releaseSemaphore */ -/*****************************************************************************/ -sal_Bool SAL_CALL osl_releaseSemaphore(oslSemaphore Semaphore) { - - OSL_ASSERT(Semaphore != 0); /* abort in debug mode */ - - if (Semaphore != 0) /* be tolerant in release mode */ - { - return (sem_post((sem_t*)Semaphore) == 0); - } - - return sal_False; -} - -#else /* OSL_USE_SYS_V_SEMAPHORE */ - -/*******************************************************************************/ - -/* This is the SYS V private semaphore variant */ - -/* - Implemetation notes: - The void* represented by oslSemaphore is used - as a pointer to an osl_TSemImpl struct -*/ - - -#if defined(NETBSD) -union semun { - int val; /* value for SETVAL */ - struct semid_ds *buf; /* buffer for IPC_STAT & IPC_SET */ - u_short *array; /* array for GETALL & SETALL */ -}; -#endif - -typedef struct _osl_TSemImpl -{ - int m_Id; - -} osl_TSemImpl; - -/*****************************************************************************/ -/* osl_createSemaphore */ -/*****************************************************************************/ -oslSemaphore SAL_CALL osl_createSemaphore(sal_uInt32 initialCount) -{ - union semun arg; - - oslSemaphore Semaphore; - osl_TSemImpl* pSem; - - Semaphore= malloc(sizeof(osl_TSemImpl)); - OSL_POSTCOND(Semaphore, "malloc failed\n"); /* ptr valid? */ - - pSem= (osl_TSemImpl*)Semaphore; - - - /* unnamed (private) semaphore */ - - pSem->m_Id= semget(IPC_PRIVATE, 1, 0666 | IPC_CREAT); - - - /* create failed? */ - if (pSem->m_Id < 0) - { - OSL_TRACE("osl_createSemaphore failed (semget). Errno: %d; %s\n", - errno, - strerror(errno)); - - free(Semaphore); - return 0; - } - - /* set initial count */ - - arg.val= initialCount; - - if(semctl(pSem->m_Id, 0, SETVAL, arg) < 0) - { - OSL_TRACE("osl_createSemaphore failed (semctl(SETVAL)). Errno: %d; %s\n", - errno, - strerror(errno)); - - if(semctl(pSem->m_Id, 0, IPC_RMID, arg) < 0) - { - OSL_TRACE("semctl(IPC_RMID) failed. Errno: %d; %s\n", errno, strerror(errno)); - } - - free(Semaphore); - return 0; - } - - - return Semaphore; -} - -/*****************************************************************************/ -/* osl_destroySemaphore */ -/*****************************************************************************/ -void SAL_CALL osl_destroySemaphore(oslSemaphore Semaphore) { - - if(Semaphore) /* ptr valid? */ - { - union semun arg; - - osl_TSemImpl* pSem= (osl_TSemImpl*)Semaphore; - - if(semctl(pSem->m_Id, 0, IPC_RMID, arg) < 0) - - { - OSL_TRACE("osl_destroySemaphore failed. (semctl(IPC_RMID)). Errno: %d; %s\n", - errno, - strerror(errno)); - } - - free(Semaphore); - } -} - -/*****************************************************************************/ -/* osl_acquireSemaphore */ -/*****************************************************************************/ -sal_Bool SAL_CALL osl_acquireSemaphore(oslSemaphore Semaphore) { - - /* abort in debug mode */ - OSL_PRECOND(Semaphore != 0, "Semaphore not created\n"); - - - if (Semaphore != 0) /* be tolerant in release mode */ - { - struct sembuf op; - osl_TSemImpl* pSem= (osl_TSemImpl*)Semaphore; - - op.sem_num= 0; - op.sem_op= -1; - op.sem_flg= SEM_UNDO; - - return semop(pSem->m_Id, &op, 1) >= 0; - - } - - return sal_False; -} - -/*****************************************************************************/ -/* osl_tryToAcquireSemaphore */ -/*****************************************************************************/ -sal_Bool SAL_CALL osl_tryToAcquireSemaphore(oslSemaphore Semaphore) { - - /* abort in debug mode */ - OSL_PRECOND(Semaphore != 0, "Semaphore not created\n"); - - if (Semaphore != 0) /* be tolerant in release mode */ - { - struct sembuf op; - osl_TSemImpl* pSem= (osl_TSemImpl*)Semaphore; - - op.sem_num= 0; - op.sem_op= -1; - op.sem_flg= SEM_UNDO | IPC_NOWAIT; - - return semop(pSem->m_Id, &op, 1) >= 0; - } - - return sal_False; -} - -/*****************************************************************************/ -/* osl_releaseSemaphore */ -/*****************************************************************************/ -sal_Bool SAL_CALL osl_releaseSemaphore(oslSemaphore Semaphore) -{ - - /* abort in debug mode */ - OSL_PRECOND(Semaphore != 0, "Semaphore not created\n"); - - if (Semaphore != 0) /* be tolerant in release mode */ - { - struct sembuf op; - osl_TSemImpl* pSem= (osl_TSemImpl*)Semaphore; - - op.sem_num= 0; - op.sem_op= 1; - op.sem_flg= SEM_UNDO; - - return semop(pSem->m_Id, &op, 1) >= 0; - } - - return sal_False; -} - -#endif /* OSL_USE_SYS_V_SEMAPHORE */ - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sal/osl/unx/signal.c b/sal/osl/unx/signal.c deleted file mode 100644 index 1b8a5e51d..000000000 --- a/sal/osl/unx/signal.c +++ /dev/null @@ -1,1099 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2000, 2010 Oracle and/or its affiliates. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * <http://www.openoffice.org/license.html> - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - - -/* system headers */ -#include "system.h" - -#define MAX_STACK_FRAMES 256 - -#if defined( MACOSX ) - -#if defined( INTEL ) -#include "backtrace.h" -#define INCLUDE_BACKTRACE -#define STACKTYPE "MacOsX_X86" -#endif /* INTEL */ - -#endif /* MACOSX */ - -#ifdef LINUX -#include <execinfo.h> -#include <link.h> -#define INCLUDE_BACKTRACE -#define STACKTYPE "Linux" -#endif - -#ifdef SOLARIS - -#include "backtrace.h" -#define INCLUDE_BACKTRACE - -#if defined( SPARC ) -#define STACKTYPE "Solaris_Sparc" -#elif defined( INTEL ) -#define STACKTYPE "Solaris_X86" -#else -#define STACKTYPE "Solaris_Unknown" -#endif - -#endif /* defined SOLARIS */ - -#include <osl/diagnose.h> -#include <osl/mutex.h> -#include <osl/signal.h> -#include <osl/process.h> -#include <osl/thread.h> -#include <sal/macros.h> -#include <rtl/bootstrap.h> -#include <rtl/digest.h> - -#include "file_path_helper.h" - -#define ACT_IGNORE 1 -#define ACT_EXIT 2 -#define ACT_SYSTEM 3 -#define ACT_HIDE 4 -#ifdef SAL_ENABLE_CRASH_REPORT -# define ACT_ABORT 5 -#else -# define ACT_ABORT ACT_SYSTEM -#endif - -#define MAX_PATH_LEN 2048 - -typedef struct _oslSignalHandlerImpl -{ - oslSignalHandlerFunction Handler; - void* pData; - struct _oslSignalHandlerImpl* pNext; -} oslSignalHandlerImpl; - -static struct SignalAction -{ - int Signal; - int Action; - void (*Handler)(int); -} Signals[] = -{ - { SIGHUP, ACT_IGNORE, NULL }, /* hangup */ - { SIGINT, ACT_EXIT, NULL }, /* interrupt (rubout) */ - { SIGQUIT, ACT_EXIT, NULL }, /* quit (ASCII FS) */ - { SIGILL, ACT_SYSTEM, NULL }, /* illegal instruction (not reset when caught) */ -/* changed from ACT_ABOUT to ACT_SYSTEM to try and get collector to run*/ - { SIGTRAP, ACT_ABORT, NULL }, /* trace trap (not reset when caught) */ -#if ( SIGIOT != SIGABRT ) - { SIGIOT, ACT_ABORT, NULL }, /* IOT instruction */ -#endif - { SIGABRT, ACT_ABORT, NULL }, /* used by abort, replace SIGIOT in the future */ -#ifdef SIGEMT - { SIGEMT, ACT_SYSTEM, NULL }, /* EMT instruction */ -/* changed from ACT_ABORT to ACT_SYSTEM to remove handler*/ -/* SIGEMT may also be used by the profiler - so it is probably not a good -plan to have the new handler use this signal*/ -#endif - { SIGFPE, ACT_ABORT, NULL }, /* floating point exception */ - { SIGKILL, ACT_SYSTEM, NULL }, /* kill (cannot be caught or ignored) */ - { SIGBUS, ACT_ABORT, NULL }, /* bus error */ - { SIGSEGV, ACT_ABORT, NULL }, /* segmentation violation */ -#ifdef SIGSYS - { SIGSYS, ACT_ABORT, NULL }, /* bad argument to system call */ -#endif - { SIGPIPE, ACT_HIDE, NULL }, /* write on a pipe with no one to read it */ - { SIGALRM, ACT_EXIT, NULL }, /* alarm clock */ - { SIGTERM, ACT_EXIT, NULL }, /* software termination signal from kill */ - { SIGUSR1, ACT_SYSTEM, NULL }, /* user defined signal 1 */ - { SIGUSR2, ACT_SYSTEM, NULL }, /* user defined signal 2 */ - { SIGCHLD, ACT_SYSTEM, NULL }, /* child status change */ -#ifdef SIGPWR - { SIGPWR, ACT_IGNORE, NULL }, /* power-fail restart */ -#endif - { SIGWINCH, ACT_IGNORE, NULL }, /* window size change */ - { SIGURG, ACT_EXIT, NULL }, /* urgent socket condition */ -#ifdef SIGPOLL - { SIGPOLL, ACT_EXIT, NULL }, /* pollable event occurred */ -#endif - { SIGSTOP, ACT_SYSTEM, NULL }, /* stop (cannot be caught or ignored) */ - { SIGTSTP, ACT_SYSTEM, NULL }, /* user stop requested from tty */ - { SIGCONT, ACT_SYSTEM, NULL }, /* stopped process has been continued */ - { SIGTTIN, ACT_SYSTEM, NULL }, /* background tty read attempted */ - { SIGTTOU, ACT_SYSTEM, NULL }, /* background tty write attempted */ - { SIGVTALRM, ACT_EXIT, NULL }, /* virtual timer expired */ - { SIGPROF, ACT_SYSTEM, NULL }, /* profiling timer expired */ -/*Change from ACT_EXIT to ACT_SYSTEM for SIGPROF is so that profiling signals do -not get taken by the new handler - the new handler does not pass on context -information which causes 'collect' to crash. This is a way of avoiding -what looks like a bug in the new handler*/ - { SIGXCPU, ACT_ABORT, NULL }, /* exceeded cpu limit */ - { SIGXFSZ, ACT_ABORT, NULL } /* exceeded file size limit */ -}; -const int NoSignals = sizeof(Signals) / sizeof(struct SignalAction); - -static sal_Bool bErrorReportingEnabled = sal_True; -static sal_Bool bInitSignal = sal_False; -static oslMutex SignalListMutex; -static oslSignalHandlerImpl* SignalList; -static sal_Bool bDoHardKill = sal_False; -static sal_Bool bSetSEGVHandler = sal_False; -static sal_Bool bSetWINCHHandler = sal_False; -static sal_Bool bSetILLHandler = sal_False; - -static void SignalHandlerFunction(int); - -static void getExecutableName_Impl (rtl_String ** ppstrProgName) -{ - rtl_uString * ustrProgFile = 0; - osl_getExecutableFile (&ustrProgFile); - if (ustrProgFile) - { - rtl_uString * ustrProgName = 0; - osl_systemPathGetFileNameOrLastDirectoryPart (ustrProgFile, &ustrProgName); - if (ustrProgName != 0) - { - rtl_uString2String ( - ppstrProgName, - rtl_uString_getStr (ustrProgName), rtl_uString_getLength (ustrProgName), - osl_getThreadTextEncoding(), - OUSTRING_TO_OSTRING_CVTFLAGS); - rtl_uString_release (ustrProgName); - } - rtl_uString_release (ustrProgFile); - } -} - -static sal_Bool is_soffice_Impl (void) -{ - sal_Int32 idx = -1; - rtl_String * strProgName = 0; - - getExecutableName_Impl (&strProgName); - if (strProgName) - { - idx = rtl_str_indexOfStr (rtl_string_getStr (strProgName), "soffice"); - rtl_string_release (strProgName); - } - return (idx != -1); -} - -static sal_Bool InitSignal() -{ - int i; - struct sigaction act; - struct sigaction oact; - sigset_t unset; - - if (is_soffice_Impl()) - { - sal_uInt32 argi; - sal_uInt32 argc; - rtl_uString *ustrCommandArg = 0; - - argc = osl_getCommandArgCount(); - for ( argi = 0; argi < argc; argi++ ) - { - if (osl_Process_E_None == osl_getCommandArg (argi, &ustrCommandArg)) - { - if (0 == rtl_ustr_ascii_compare (rtl_uString_getStr (ustrCommandArg), "-bean")) - { - bDoHardKill = sal_True; - break; - } - } - } - if (ustrCommandArg) - { - rtl_uString_release (ustrCommandArg); - ustrCommandArg = 0; - } - - // WORKAROUND FOR SEGV HANDLER CONFLICT - // - // the java jit needs SIGSEGV for proper work - // and we need SIGSEGV for the office crashguard - // - // TEMPORARY SOLUTION: - // the office sets the signal handler during startup - // java can than overwrite it, if needed - bSetSEGVHandler = sal_True; - - // WORKAROUND FOR WINCH HANDLER (SEE ABOVE) - bSetWINCHHandler = sal_True; - - // WORKAROUND FOR ILLEGAL INSTRUCTION HANDLER (SEE ABOVE) - bSetILLHandler = sal_True; - } - - SignalListMutex = osl_createMutex(); - - act.sa_handler = SignalHandlerFunction; - act.sa_flags = SA_RESTART; - - sigfillset(&(act.sa_mask)); - - /* Initialize the rest of the signals */ - for (i = 0; i < NoSignals; i++) - { - /* hack: stomcatd is attaching JavaVM wich dont work with an sigaction(SEGV) */ - if ((bSetSEGVHandler || Signals[i].Signal != SIGSEGV) - && (bSetWINCHHandler || Signals[i].Signal != SIGWINCH) - && (bSetILLHandler || Signals[i].Signal != SIGILL)) - { - if (Signals[i].Action != ACT_SYSTEM) - { - if (Signals[i].Action == ACT_HIDE) - { - struct sigaction ign; - - ign.sa_handler = SIG_IGN; - ign.sa_flags = 0; - sigemptyset(&ign.sa_mask); - - if (sigaction(Signals[i].Signal, &ign, &oact) == 0) - Signals[i].Handler = oact.sa_handler; - else - Signals[i].Handler = SIG_DFL; - } - else - if (sigaction(Signals[i].Signal, &act, &oact) == 0) - Signals[i].Handler = oact.sa_handler; - else - Signals[i].Handler = SIG_DFL; - } - } - } - - /* Clear signal mask inherited from parent process (on Mac OS X, upon a - crash soffice re-execs itself from within the signal handler, so the - second soffice would have the guilty signal blocked and would freeze upon - encountering a similar crash again): */ - if (sigemptyset(&unset) < 0 || - pthread_sigmask(SIG_SETMASK, &unset, NULL) < 0) - { - OSL_TRACE("sigemptyset or pthread_sigmask failed"); - } - - return sal_True; -} - -static sal_Bool DeInitSignal() -{ - int i; - struct sigaction act; - - act.sa_flags = 0; - sigemptyset(&(act.sa_mask)); - - /* Initialize the rest of the signals */ - for (i = NoSignals - 1; i >= 0; i--) - if (Signals[i].Action != ACT_SYSTEM) - { - act.sa_handler = Signals[i].Handler; - - sigaction(Signals[i].Signal, &act, NULL); - } - - osl_destroyMutex(SignalListMutex); - - return sal_False; -} - -#if defined (SAL_ENABLE_CRASH_REPORT) && defined(INCLUDE_BACKTRACE) - -/*****************************************************************************/ -/* Generate MD5 checksum */ -/*****************************************************************************/ - -static sal_uInt32 calc_md5_checksum( const char *filename, sal_uInt8 *pChecksum, sal_uInt32 nChecksumLen ) -{ - sal_uInt32 nBytesProcessed = 0; - - FILE *fp = fopen( filename, "r" ); - - if ( fp ) - { - rtlDigest digest = rtl_digest_createMD5(); - - if ( digest ) - { - size_t nBytesRead; - sal_uInt8 buffer[4096]; - rtlDigestError error = rtl_Digest_E_None; - - while ( rtl_Digest_E_None == error && - 0 != (nBytesRead = fread( buffer, 1, sizeof(buffer), fp )) ) - { - error = rtl_digest_updateMD5( digest, buffer, nBytesRead ); - nBytesProcessed += nBytesRead; - } - - if ( rtl_Digest_E_None == error ) - { - error = rtl_digest_getMD5( digest, pChecksum, nChecksumLen ); - } - - if ( rtl_Digest_E_None != error ) - nBytesProcessed = 0; - - rtl_digest_destroyMD5( digest ); - } - - fclose( fp ); - } - - return nBytesProcessed; -} - -/*****************************************************************************/ -/* Call crash reporter */ -/*****************************************************************************/ - -/* Helper function to encode and write a string to a stream */ - -static int fputs_xml( const char *string, FILE *stream ) -{ - int result = 0; - - while ( result >= 0 && *string ) - { - switch( *string ) - { - case '&': - result = fputs( "&", stream ); - break; - case '<': - result = fputs( "<", stream ); - break; - case '>': - result = fputs( ">", stream ); - break; - default: - result = fputc( *string, stream ); - break; - } - - string++; - } - - return result; -} -#endif - -/* Create intermediate files and run crash reporter */ - -#define REPORTENV_PARAM "-crashreportenv:" - -#if defined SAL_ENABLE_CRASH_REPORT && defined INCLUDE_BACKTRACE && \ - defined LINUX - -typedef struct -{ - const char *name; - ElfW(Off) offset; -} dynamic_entry; - -static int -callback(struct dl_phdr_info *info, size_t size, void *data) -{ - const ElfW(Phdr) *pDynamic = NULL; - - if (size == sizeof(struct dl_phdr_info)) - { - int i; - for (i = 0; i < info->dlpi_phnum; ++i) - { - if (info->dlpi_phdr[i].p_type == PT_DYNAMIC) - { - pDynamic = &(info->dlpi_phdr[i]); - break; - } - } - } - - if (pDynamic) - { - char buffer[100]; - int len; - char exe[PATH_MAX]; - const char *dsoname = info->dlpi_name; - - dynamic_entry* entry = (dynamic_entry*)data; - - if (strcmp(dsoname, "") == 0) - { - snprintf(buffer, sizeof(buffer), "/proc/%d/exe", getpid()); - if ((len = readlink(buffer, exe, PATH_MAX)) != -1) - { - exe[len] = '\0'; - dsoname = exe; - } - } - - if (strcmp(dsoname, entry->name) == 0) - { - entry->offset = pDynamic->p_offset; - return 1; - } - } - return 0; -} - -/* Get the location of the .dynamic section offset for the given elf file. - * i.e. same as the "Offset" value shown for DYNAMIC from readelf -l foo - * - * We want to know this value so that if the binaries have been modifed - * by prelink then we can still process the call stack on server side - * by comparing this value to that of an "un-prelinked but known to be - * otherwise equivalent" version of those binaries and adjust the call - * stack addresses by the differences between .dynamic addresses so as - * to be able to map the prelinked addresses back to the unprelinked - * addresses - * - * cmc@openoffice.org - */ -static ElfW(Off) -dynamic_section_offset(const char *name) -{ - dynamic_entry entry; - - entry.name = name; - entry.offset = 0; - - dl_iterate_phdr(callback, &entry); - - return entry.offset; -} -#endif - -static int ReportCrash( int Signal ) -{ -#ifdef SAL_ENABLE_CRASH_REPORT - static sal_Bool bCrashReporterExecuted = sal_False; - sal_Bool bAutoCrashReport = sal_False; - - sal_uInt32 argi; - sal_uInt32 argc; - rtl_uString *ustrCommandArg = NULL; - - if ( !bErrorReportingEnabled ) - return -1; - - argc = osl_getCommandArgCount(); - - for ( argi = 0; argi < argc; argi++ ) - { - if ( osl_Process_E_None == osl_getCommandArg( argi, &ustrCommandArg ) ) - { - if ( 0 == rtl_ustr_ascii_compare( rtl_uString_getStr( ustrCommandArg ), "-nocrashreport" ) ) - { - rtl_uString_release( ustrCommandArg ); - return -1; - } - else if ( 0 == rtl_ustr_ascii_compare( rtl_uString_getStr( ustrCommandArg ), "-autocrashreport" ) ) - { - bAutoCrashReport = sal_True; - } - else if ( 0 == rtl_ustr_ascii_shortenedCompare_WithLength( - rtl_uString_getStr( ustrCommandArg ), rtl_uString_getLength( ustrCommandArg ), - REPORTENV_PARAM, strlen(REPORTENV_PARAM) ) - ) - { - rtl_uString *ustrEnvironment = NULL; - rtl_String *strEnv = NULL; - - rtl_uString_newFromStr( &ustrEnvironment, rtl_uString_getStr( ustrCommandArg ) + strlen(REPORTENV_PARAM) ); - - if ( ustrEnvironment ) - { - rtl_uString2String( - &strEnv, - rtl_uString_getStr( ustrEnvironment ), rtl_uString_getLength( ustrEnvironment ), - osl_getThreadTextEncoding(), OUSTRING_TO_OSTRING_CVTFLAGS - ); - - if ( strEnv ) - { - putenv( rtl_string_getStr( strEnv ) ); - rtl_string_release( strEnv ); - } - - rtl_uString_release( ustrEnvironment ); - } - - } - - } - } - - if ( ustrCommandArg ) - rtl_uString_release( ustrCommandArg ); - - if ( !bCrashReporterExecuted ) - { - int i; - /* struct sigaction act; */ - - for (i = 0; i < NoSignals; i++) - { - if (Signals[i].Signal == Signal && Signals[i].Action == ACT_ABORT ) - { - int ret; - char szShellCmd[512] = { '\0' }; - char *pXMLTempName = NULL; - char *pStackTempName = NULL; - char *pChecksumTempName = NULL; - -#ifdef INCLUDE_BACKTRACE - char szXMLTempNameBuffer[L_tmpnam]; - char szChecksumTempNameBuffer[L_tmpnam]; - char szStackTempNameBuffer[L_tmpnam]; - - void *stackframes[MAX_STACK_FRAMES]; - int iFrame; - int nFrames = backtrace( stackframes, SAL_N_ELEMENTS(stackframes) ); - - FILE *xmlout = NULL, *stackout = NULL, *checksumout = NULL; - int fdxml, fdstk, fdchksum; - - strncpy( szXMLTempNameBuffer, P_tmpdir, sizeof(szXMLTempNameBuffer) ); - strncat( szXMLTempNameBuffer, "/crxmlXXXXXX", sizeof(szXMLTempNameBuffer) ); - - strncpy( szStackTempNameBuffer, P_tmpdir, sizeof(szStackTempNameBuffer) ); - strncat( szStackTempNameBuffer, "/crstkXXXXXX", sizeof(szStackTempNameBuffer) ); - - strncpy( szChecksumTempNameBuffer, P_tmpdir, sizeof(szChecksumTempNameBuffer) ); - strncat( szChecksumTempNameBuffer, "/crchkXXXXXX", sizeof(szChecksumTempNameBuffer) ); - - fdxml = mkstemp(szXMLTempNameBuffer); - fdstk = mkstemp(szStackTempNameBuffer); - fdchksum = mkstemp(szChecksumTempNameBuffer); - - xmlout = fdopen( fdxml , "w" ); - stackout = fdopen( fdstk , "w" ); - checksumout = fdopen( fdchksum, "w" ); - - pXMLTempName = szXMLTempNameBuffer; - pStackTempName = szStackTempNameBuffer; - pChecksumTempName = szChecksumTempNameBuffer; - - - if ( xmlout && stackout && checksumout ) - { - fprintf( xmlout, "<errormail:Stack type=\"%s\">\n", STACKTYPE ); - - fprintf( checksumout, "<errormail:Checksums type=\"MD5\">\n" ); - - for ( iFrame = 0; iFrame < nFrames; iFrame++ ) - { - Dl_info dl_info; - - fprintf( stackout, "0x%" SAL_PRIxUINTPTR ":", - SAL_INT_CAST(sal_uIntPtr, stackframes[iFrame]) ); - - fprintf( xmlout, "<errormail:StackInfo pos=\"%d\" ip=\"0x%" SAL_PRIxUINTPTR "\"", - iFrame, - SAL_INT_CAST(sal_uIntPtr, stackframes[iFrame]) - ); - - memset( &dl_info, 0, sizeof(dl_info) ); - - /* dladdr may fail */ - if ( dladdr( stackframes[iFrame], &dl_info) ) - { - const char *dli_fname = NULL; - char *dli_fdir = NULL; - char szDirectory[PATH_MAX]; - char szCanonicDirectory[PATH_MAX]; - - /* Don't expect that dladdr filled all members of dl_info */ - - dli_fname = dl_info.dli_fname ? strrchr( dl_info.dli_fname, '/' ) : NULL; - if ( dli_fname ) - { - ++dli_fname; - memcpy( szDirectory, dl_info.dli_fname, dli_fname - dl_info.dli_fname ); - szDirectory[dli_fname - dl_info.dli_fname] = 0; - - dli_fdir = realpath( szDirectory, szCanonicDirectory ) ? szCanonicDirectory : szDirectory; - - if ( *dli_fdir && dli_fdir[ strlen(dli_fdir) - 1 ] != '/' ) - strcat( dli_fdir, "/" ); - } - else - dli_fname = dl_info.dli_fname; - - /* create checksum of library on stack */ - if ( dli_fname ) - { - sal_uInt8 checksum[RTL_DIGEST_LENGTH_MD5]; - - sal_uInt32 nBytesProcessed = calc_md5_checksum( - dl_info.dli_fname, checksum, sizeof(checksum) ); - if ( nBytesProcessed ) - { - int j; - - fprintf( checksumout, "<errormail:Checksum sum=\"0x" ); - for ( j = 0; j < 16; fprintf( checksumout, "%02X", checksum[j++] ) ); - fprintf( checksumout, - "\" bytes=\"%lu\" file=\"%s\"/>\n", - SAL_INT_CAST( - unsigned long, nBytesProcessed), - dli_fname ); - } - } - - if ( dl_info.dli_fbase && dl_info.dli_fname ) - { -#ifdef LINUX - ElfW(Off) dynamic_offset = dynamic_section_offset(dl_info.dli_fname); - fprintf( stackout, " 0x%" SAL_PRI_SIZET "x:", dynamic_offset); -#endif - - fprintf( stackout, " %s + 0x%" SAL_PRI_PTRDIFFT "x", - dl_info.dli_fname, - (char*)stackframes[iFrame] - (char*)dl_info.dli_fbase - ); - - fprintf( xmlout, " rel=\"0x%" SAL_PRI_PTRDIFFT "x\"", (char *)stackframes[iFrame] - (char *)dl_info.dli_fbase ); - if ( dli_fname ) - fprintf( xmlout, " name=\"%s\"", dli_fname ); - - if ( dli_fdir ) - fprintf( xmlout, " path=\"%s\"", dli_fdir ); - -#ifdef LINUX - fprintf( xmlout, " dynamicoffset=\"0x%" SAL_PRI_SIZET "x\"", dynamic_offset ); -#endif - } - else - fprintf( stackout, " ????????" ); - - if ( dl_info.dli_sname && dl_info.dli_saddr ) - { - fputs( " (", stackout ); - fputs_xml( dl_info.dli_sname, stackout ); - fprintf( stackout, " + 0x%" SAL_PRI_PTRDIFFT "x)", - (char*)stackframes[iFrame] - (char*)dl_info.dli_saddr ); - - fputs( " ordinal=\"", xmlout ); - fputs_xml( dl_info.dli_sname, xmlout ); - fprintf( xmlout, "+0x%" SAL_PRI_PTRDIFFT "x\"", - (char *)stackframes[iFrame] - (char *)dl_info.dli_saddr ); - } - - } - else /* dladdr failed */ - { - fprintf( stackout, " ????????" ); - } - - fprintf( stackout, "\n" ); - fprintf( xmlout, "/>\n" ); - - } - - fprintf( xmlout, "</errormail:Stack>\n" ); - fprintf( checksumout, "</errormail:Checksums>\n" ); - } - else - { - pXMLTempName = NULL; - pStackTempName = NULL; - pChecksumTempName = NULL; - } - - if ( stackout ) - fclose( stackout ); - if ( xmlout ) - fclose( xmlout ); - if ( checksumout ) - fclose( checksumout ); - - if ( pXMLTempName && pChecksumTempName && pStackTempName ) -#endif /* INCLUDE_BACKTRACE */ - { - rtl_uString * crashrep_url = NULL; - rtl_uString * crashrep_path = NULL; - rtl_String * crashrep_path_system = NULL; - rtl_string2UString( - &crashrep_url, - RTL_CONSTASCII_USTRINGPARAM( - "$BRAND_BASE_DIR/program/crashrep"), - OSTRING_TO_OUSTRING_CVTFLAGS); - rtl_bootstrap_expandMacros(&crashrep_url); - osl_getSystemPathFromFileURL(crashrep_url, &crashrep_path); - rtl_uString2String( - &crashrep_path_system, - rtl_uString_getStr(crashrep_path), - rtl_uString_getLength(crashrep_path), - osl_getThreadTextEncoding(), - (RTL_UNICODETOTEXT_FLAGS_UNDEFINED_ERROR - | RTL_UNICODETOTEXT_FLAGS_INVALID_ERROR)); - rtl_uString_release(crashrep_url); - rtl_uString_release(crashrep_path); -#if defined INCLUDE_BACKTRACE && (defined LINUX || defined MACOSX) - snprintf( szShellCmd, SAL_N_ELEMENTS(szShellCmd), - "%s -p %d -s %d -xml %s -chksum %s -stack %s -noui%s", - rtl_string_getStr(crashrep_path_system), - getpid(), - Signal, - pXMLTempName, - pChecksumTempName, - pStackTempName, - bAutoCrashReport ? " -send" : "" ); -#elif defined INCLUDE_BACKTRACE && defined SOLARIS - snprintf( szShellCmd, SAL_N_ELEMENTS(szShellCmd), - "%s -p %d -s %d -xml %s -chksum %s -noui%s", - rtl_string_getStr(crashrep_path_system), - getpid(), - Signal, - pXMLTempName, - pChecksumTempName, - bAutoCrashReport ? " -send" : "" ); -#else - snprintf( szShellCmd, SAL_N_ELEMENTS(szShellCmd), - "%s -p %d -s %d -noui%s", - rtl_string_getStr(crashrep_path_system), - getpid(), Signal, bAutoCrashReport ? " -send" : "" ); -#endif - rtl_string_release(crashrep_path_system); - } - - ret = szShellCmd[0] == '\0' ? -1 : system( szShellCmd ); - - if ( pXMLTempName ) - unlink( pXMLTempName ); - - if ( pStackTempName ) - unlink( pStackTempName ); - - if ( pChecksumTempName ) - unlink( pChecksumTempName ); - - if ( -1 != ret ) - { - bCrashReporterExecuted = sal_True; - return 1; - } - else - return -1; - - } - } - - return 0; - } - - return 1; -#else /* defined SAL_ENABLE_CRASH_REPORT */ - /* the utility crash_report is not build, so do the same as when - the option -nocrashreport is used */ - (void) Signal; // avoid warnings - return -1; -#endif /* defined SAL_ENABLE_CRASH_REPORT */ -} - -static void PrintStack( int sig ) -{ -#ifdef INCLUDE_BACKTRACE - void *buffer[MAX_STACK_FRAMES]; - int size = backtrace( buffer, SAL_N_ELEMENTS(buffer) ); -#endif - - fprintf( stderr, "\n\nFatal exception: Signal %d\n", sig ); - -#if defined( MACOSX ) && !defined( INCLUDE_BACKTRACE ) - fprintf( stderr, "Please turn on Enable Crash Reporting and\nAutomatic Display of Crashlogs in the Console application\n" ); -#else -#ifdef INCLUDE_BACKTRACE - if ( size > 0 ) - { - fputs( "Stack:\n", stderr ); - backtrace_symbols_fd( buffer, size, fileno(stderr) ); - } -#endif -#endif -} - -static oslSignalAction CallSignalHandler(oslSignalInfo *pInfo) -{ - oslSignalHandlerImpl* pHandler = SignalList; - oslSignalAction Action = osl_Signal_ActCallNextHdl; - - while (pHandler != NULL) - { - if ((Action = pHandler->Handler(pHandler->pData, pInfo)) - != osl_Signal_ActCallNextHdl) - break; - - pHandler = pHandler->pNext; - } - - return Action; -} - -void CallSystemHandler(int Signal) -{ - int i; - struct sigaction act; - - for (i = 0; i < NoSignals; i++) - { - if (Signals[i].Signal == Signal) - break; - } - - if (i < NoSignals) - { - if ((Signals[i].Handler == NULL) || - (Signals[i].Handler == SIG_DFL) || - (Signals[i].Handler == SIG_IGN) || - (Signals[i].Handler == SIG_ERR)) - { - switch (Signals[i].Action) - { - case ACT_EXIT: /* terminate */ - /* prevent dumping core on exit() */ - _exit(255); - break; - - case ACT_ABORT: /* terminate witch core dump */ - ReportCrash( Signal ); - act.sa_handler = SIG_DFL; - act.sa_flags = 0; - sigemptyset(&(act.sa_mask)); - sigaction(SIGABRT, &act, NULL); - PrintStack( Signal ); - abort(); - break; - - case ACT_IGNORE: /* ignore */ - break; - - default: /* should never happen */ - OSL_ASSERT(0); - } - } - else - (*Signals[i].Handler)(Signal); - } -} - - -/*****************************************************************************/ -/* SignalHandlerFunction */ -/*****************************************************************************/ -void SignalHandlerFunction(int Signal) -{ - oslSignalInfo Info; - struct sigaction act; - - Info.UserSignal = Signal; - Info.UserData = NULL; - - switch (Signal) - { - case SIGBUS: - case SIGILL: - case SIGSEGV: - case SIGIOT: -#if ( SIGIOT != SIGABRT ) - case SIGABRT: -#endif - Info.Signal = osl_Signal_AccessViolation; - break; - - case -1: - Info.Signal = osl_Signal_IntegerDivideByZero; - break; - - case SIGFPE: - Info.Signal = osl_Signal_FloatDivideByZero; - break; - - case SIGINT: - case SIGTERM: - case SIGQUIT: - case SIGHUP: - Info.Signal = osl_Signal_Terminate; - break; - - default: - Info.Signal = osl_Signal_System; - break; - } - - ReportCrash( Signal ); - - /* Portal Demo HACK !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*/ - if (bDoHardKill && (Info.Signal == osl_Signal_AccessViolation)) - _exit(255); - /* Portal Demo HACK !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*/ - - - switch (CallSignalHandler(&Info)) - { - case osl_Signal_ActCallNextHdl: - CallSystemHandler(Signal); - break; - - case osl_Signal_ActAbortApp: - ReportCrash( Signal ); - act.sa_handler = SIG_DFL; - act.sa_flags = 0; - sigemptyset(&(act.sa_mask)); - sigaction(SIGABRT, &act, NULL); - PrintStack( Signal ); - abort(); - break; - - case osl_Signal_ActKillApp: - /* prevent dumping core on exit() */ - _exit(255); - break; - default: - break; - } -} - -/*****************************************************************************/ -/* osl_addSignalHandler */ -/*****************************************************************************/ -oslSignalHandler SAL_CALL osl_addSignalHandler(oslSignalHandlerFunction Handler, void* pData) -{ - oslSignalHandlerImpl* pHandler; - - OSL_ASSERT(Handler != NULL); - if ( Handler == 0 ) - { - return 0; - } - - if (! bInitSignal) - bInitSignal = InitSignal(); - - pHandler = (oslSignalHandlerImpl*) calloc(1, sizeof(oslSignalHandlerImpl)); - - if (pHandler != NULL) - { - pHandler->Handler = Handler; - pHandler->pData = pData; - - osl_acquireMutex(SignalListMutex); - - pHandler->pNext = SignalList; - SignalList = pHandler; - - osl_releaseMutex(SignalListMutex); - - return (pHandler); - } - - return (NULL); -} - -/*****************************************************************************/ -/* osl_removeSignalHandler */ -/*****************************************************************************/ -sal_Bool SAL_CALL osl_removeSignalHandler(oslSignalHandler Handler) -{ - oslSignalHandlerImpl *pHandler, *pPrevious = NULL; - - OSL_ASSERT(Handler != NULL); - - if (! bInitSignal) - bInitSignal = InitSignal(); - - osl_acquireMutex(SignalListMutex); - - pHandler = SignalList; - - while (pHandler != NULL) - { - if (pHandler == Handler) - { - if (pPrevious) - pPrevious->pNext = pHandler->pNext; - else - SignalList = pHandler->pNext; - - osl_releaseMutex(SignalListMutex); - - if (SignalList == NULL) - bInitSignal = DeInitSignal(); - - free(pHandler); - - return (sal_True); - } - - pPrevious = pHandler; - pHandler = pHandler->pNext; - } - - osl_releaseMutex(SignalListMutex); - - return (sal_False); -} - -/*****************************************************************************/ -/* osl_raiseSignal */ -/*****************************************************************************/ -oslSignalAction SAL_CALL osl_raiseSignal(sal_Int32 UserSignal, void* UserData) -{ - oslSignalInfo Info; - oslSignalAction Action; - - if (! bInitSignal) - bInitSignal = InitSignal(); - - osl_acquireMutex(SignalListMutex); - - Info.Signal = osl_Signal_User; - Info.UserSignal = UserSignal; - Info.UserData = UserData; - - Action = CallSignalHandler(&Info); - - osl_releaseMutex(SignalListMutex); - - return (Action); -} - -/*****************************************************************************/ -/* osl_setErrorReporting */ -/*****************************************************************************/ -sal_Bool SAL_CALL osl_setErrorReporting( sal_Bool bEnable ) -{ - sal_Bool bOld = bErrorReportingEnabled; - bErrorReportingEnabled = bEnable; - - return bOld; -} - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sal/osl/unx/socket.c b/sal/osl/unx/socket.c deleted file mode 100644 index bcf5a72f8..000000000 --- a/sal/osl/unx/socket.c +++ /dev/null @@ -1,2892 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2000, 2010 Oracle and/or its affiliates. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * <http://www.openoffice.org/license.html> - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -#include "system.h" - -#include <osl/socket.h> -#include <osl/diagnose.h> -#include <osl/mutex.h> -#include <osl/signal.h> - -#include <rtl/alloc.h> - -#include <ctype.h> -#include <sal/types.h> - -#include "sockimpl.h" - - -/* defines for poll */ -#ifdef HAVE_POLL_H -#undef HAVE_POLL_H -#endif - -#if defined(LINUX) || defined(NETBSD) || defined ( FREEBSD ) || \ - defined (MACOSX) || defined (OPENBSD) || defined(DRAGONFLY) -#include <sys/poll.h> -#define HAVE_POLL_H -#endif /* HAVE_POLL_H */ - -#if defined(SOLARIS) -#include <poll.h> -#define HAVE_POLL_H -#endif /* SOLARIS */ - -#ifndef HAVE_POLL_H -#define POLLIN 0x0001 -#define POLLOUT 0x0002 -#define POLLPRI 0x0004 -#endif /* HAVE_POLL_H */ - - -/* defines for shutdown */ -#define SD_RECEIVE 0 -#define SD_SEND 1 -#define SD_BOTH 2 - - -/* - oslSocketAddr is a pointer to a Berkeley struct sockaddr. - I refrained from using sockaddr_in because of possible further - extensions of this socket-interface (IP-NG?). - The intention was to hide all Berkeley data-structures from - direct access past the osl-interface. - - The current implementation is internet (IP) centered. All - the constructor-functions (osl_create...) take parameters - that will probably make sense only in the IP-environment - (e.g. because of using the dotted-address-format). - - If the interface will be extended to host other protocol- - families, I expect no externally visible changes in the - existing functions. You'll probably need only new - constructor-functions who take the different address - formats into consideration (maybe a long dotted address - or whatever). -*/ - -/* _Note_ that I rely on the fact that oslSocketAddr and struct sockaddr */ -/* are the same! I don't like it very much but see no other easy way to */ -/* conceal the struct sockaddr from the eyes of the user. */ - - -#define OSL_INVALID_SOCKET -1 -#define OSL_SOCKET_ERROR -1 - - -/* Buffer size for gethostbyname */ -#define MAX_HOSTBUFFER_SIZE 2048 - -/*****************************************************************************/ -/* enum oslAddrFamily */ -/*****************************************************************************/ - -/* map */ -static unsigned long FamilyMap[]= { - AF_INET, /* osl_Socket_FamilyInet */ - AF_IPX, /* osl_Socket_FamilyIpx */ - 0 /* osl_Socket_FamilyInvalid */ -}; - -/* reverse map */ -static oslAddrFamily osl_AddrFamilyFromNative(sal_uInt32 nativeType) -{ - oslAddrFamily i= (oslAddrFamily)0; - - while(i != osl_Socket_FamilyInvalid) - { - if(FamilyMap[i] == nativeType) - return i; - i = (oslAddrFamily) ( i + 1 ); - } - - return i; -} - -/* macros */ -#define FAMILY_FROM_NATIVE(y) osl_AddrFamilyFromNative(y) -#define FAMILY_TO_NATIVE(x) (short)FamilyMap[x] - -/*****************************************************************************/ -/* enum oslProtocol */ -/*****************************************************************************/ - -/* map */ -static sal_uInt32 ProtocolMap[]= { - 0, /* osl_Socket_ProtocolIp */ - NSPROTO_IPX, /* osl_Socket_ProtocolIpx */ - NSPROTO_SPX, /* osl_Socket_ProtocolSpx */ - NSPROTO_SPXII, /* osl_Socket_ProtocolSpxII */ - 0 /* osl_Socket_ProtocolInvalid */ -}; - -/* reverse map */ -/* mfe: NOT USED -static oslProtocol osl_ProtocolFromNative(sal_uInt32 nativeType) -{ - oslProtocol i= (oslProtocol)0; - - while(i != osl_Socket_ProtocolInvalid) - { - if(ProtocolMap[i] == nativeType) - return i; - i = (oslProtocol) ( i + 1); - } - - return i; -} -*/ - -/* macros */ -#define PROTOCOL_FROM_NATIVE(y) osl_ProtocolFromNative(y) -#define PROTOCOL_TO_NATIVE(x) ProtocolMap[x] - - -/*****************************************************************************/ -/* enum oslSocketType */ -/*****************************************************************************/ - -/* map */ -static sal_uInt32 TypeMap[]= { - SOCK_STREAM, /* osl_Socket_TypeStream */ - SOCK_DGRAM, /* osl_Socket_TypeDgram */ - SOCK_RAW, /* osl_Socket_TypeRaw */ - SOCK_RDM, /* osl_Socket_TypeRdm */ - SOCK_SEQPACKET, /* osl_Socket_TypeSeqPacket */ - 0 /* osl_Socket_TypeInvalid */ -}; - -/* reverse map */ -static oslSocketType osl_SocketTypeFromNative(sal_uInt32 nativeType) -{ - oslSocketType i= (oslSocketType)0; - - while(i != osl_Socket_TypeInvalid) - { - if(TypeMap[i] == nativeType) - return i; - i = (oslSocketType)(i + 1); - } - - return i; -} - -/* macros */ -#define TYPE_TO_NATIVE(x) TypeMap[x] -#define TYPE_FROM_NATIVE(y) osl_SocketTypeFromNative(y) - - -/*****************************************************************************/ -/* enum oslSocketOption */ -/*****************************************************************************/ - -/* map */ -static sal_uInt32 OptionMap[]= { - SO_DEBUG, /* osl_Socket_OptionDebug */ - SO_ACCEPTCONN, /* osl_Socket_OptionAcceptConn */ - SO_REUSEADDR, /* osl_Socket_OptionReuseAddr */ - SO_KEEPALIVE, /* osl_Socket_OptionKeepAlive */ - SO_DONTROUTE, /* osl_Socket_OptionDontRoute */ - SO_BROADCAST, /* osl_Socket_OptionBroadcast */ - SO_USELOOPBACK, /* osl_Socket_OptionUseLoopback */ - SO_LINGER, /* osl_Socket_OptionLinger */ - SO_OOBINLINE, /* osl_Socket_OptionOOBinLine */ - SO_SNDBUF, /* osl_Socket_OptionSndBuf */ - SO_RCVBUF, /* osl_Socket_OptionRcvBuf */ - SO_SNDLOWAT, /* osl_Socket_OptionSndLowat */ - SO_RCVLOWAT, /* osl_Socket_OptionRcvLowat */ - SO_SNDTIMEO, /* osl_Socket_OptionSndTimeo */ - SO_RCVTIMEO, /* osl_Socket_OptionRcvTimeo */ - SO_ERROR, /* osl_Socket_OptionError */ - SO_TYPE, /* osl_Socket_OptionType */ - TCP_NODELAY, /* osl_Socket_OptionTcpNoDelay */ - 0 /* osl_Socket_OptionInvalid */ -}; - -/* reverse map */ -/* mfe: NOT USED -static oslSocketOption osl_SocketOptionFromNative(sal_uInt32 nativeType) -{ - oslSocketOption i= (oslSocketOption)0; - - while(i != osl_Socket_OptionInvalid) - { - if(OptionMap[i] == nativeType) - return i; - i = (oslSocketOption) ( i + 1 ); - } - - return i; -} -*/ -/* macros */ -#define OPTION_TO_NATIVE(x) OptionMap[x] -#define OPTION_FROM_NATIVE(y) osl_SocketOptionFromNative(y) - - -/*****************************************************************************/ -/* enum oslSocketOptionLevel */ -/*****************************************************************************/ - -static sal_uInt32 OptionLevelMap[]= { - SOL_SOCKET, /* osl_Socket_LevelSocket */ - IPPROTO_TCP, /* osl_Socket_LevelTcp */ - 0 /* osl_Socket_LevelInvalid */ -}; - -/* reverse map */ -/* mfe: NOT USED -static oslSocketOptionLevel osl_SocketOptionLevelFromNative(sal_uInt32 nativeType) -{ - oslSocketOptionLevel i= (oslSocketOptionLevel)0; - - while(i != osl_Socket_LevelInvalid) - { - if(OptionLevelMap[i] == nativeType) - return i; - i = (oslSocketOptionLevel) ( i + 1 ); - } - - return i; -} -*/ -/* macros */ -#define OPTION_LEVEL_TO_NATIVE(x) OptionLevelMap[x] -#define OPTION_LEVEL_FROM_NATIVE(y) osl_SocketOptionLevelFromNative(y) - -/*****************************************************************************/ -/* enum oslSocketMsgFlag */ -/*****************************************************************************/ - -static sal_uInt32 SocketMsgFlagMap[]= { - 0, /* osl_Socket_MsgNormal */ - MSG_OOB, /* osl_Socket_MsgOOB */ - MSG_PEEK, /* osl_Socket_MsgPeek */ - MSG_DONTROUTE, /* osl_Socket_MsgDontRoute */ - MSG_MAXIOVLEN, /* osl_Socket_MsgMaxIOVLen */ - 0 /* osl_Socket_MsgInvalid */ -}; - -/* reverse map */ -/* mfe: NOT USED -static oslSocketMsgFlag osl_SocketMsgFlagFromNative(sal_uInt32 nativeType) -{ - oslSocketMsgFlag i= (oslSocketMsgFlag)0; - - while(i != osl_Socket_MsgInvalid) - { - if(SocketMsgFlagMap[i] == nativeType) - return i; - i = (oslSocketMsgFlag) ( i + 1 ); - } - - return i; -} -*/ - -/* macros */ -#define MSG_FLAG_TO_NATIVE(x) SocketMsgFlagMap[x] -#define MSG_FLAG_FROM_NATIVE(y) osl_SocketMsgFlagFromNative(y) - - -/*****************************************************************************/ -/* enum oslSocketDirection */ -/*****************************************************************************/ - -static sal_uInt32 SocketDirection[]= { - SD_RECEIVE, /* osl_Socket_DirRead */ - SD_SEND, /* osl_Socket_DirWrite */ - SD_BOTH, /* osl_Socket_DirReadWrite */ - 0 /* osl_Socket_DirInvalid */ -}; - -/* reverse map */ -/* mfe: NOT USED -static oslSocketDirection osl_SocketDirectionFromNative(sal_uInt32 nativeType) -{ - oslSocketDirection i= (oslSocketDirection)0; - - while(i != osl_Socket_DirInvalid) - { - if(SocketDirection[i] == nativeType) - return i; - i = (oslSocketDirection) ( i + 1 ); - } - - return i; -} -*/ - -/* macros */ -#define DIRECTION_TO_NATIVE(x) SocketDirection[x] -#define DIRECTION_FROM_NATIVE(y) osl_SocketDirectionFromNative(y) - -/*****************************************************************************/ -/* enum oslSocketError */ -/*****************************************************************************/ - -static struct -{ - int errcode; - oslSocketError error; -} SocketError[]= { - { 0, osl_Socket_E_None }, /* no error */ - { ENOTSOCK, osl_Socket_E_NotSocket }, /* Socket operation on non-socket */ - { EDESTADDRREQ, osl_Socket_E_DestAddrReq }, /* Destination address required */ - { EMSGSIZE, osl_Socket_E_MsgSize }, /* Message too long */ - { EPROTOTYPE, osl_Socket_E_Prototype }, /* Protocol wrong type for socket */ - { ENOPROTOOPT, osl_Socket_E_NoProtocol }, /* Protocol not available */ - { EPROTONOSUPPORT, osl_Socket_E_ProtocolNoSupport }, /* Protocol not supported */ - { ESOCKTNOSUPPORT, osl_Socket_E_TypeNoSupport }, /* Socket type not supported */ - { EOPNOTSUPP, osl_Socket_E_OpNotSupport }, /* Operation not supported on socket */ - { EPFNOSUPPORT, osl_Socket_E_PfNoSupport }, /* Protocol family not supported */ - { EAFNOSUPPORT, osl_Socket_E_AfNoSupport }, /* Address family not supported by */ - /* protocol family */ - { EADDRINUSE, osl_Socket_E_AddrInUse }, /* Address already in use */ - { EADDRNOTAVAIL, osl_Socket_E_AddrNotAvail }, /* Can't assign requested address */ - { ENETDOWN, osl_Socket_E_NetDown }, /* Network is down */ - { ENETUNREACH, osl_Socket_E_NetUnreachable }, /* Network is unreachable */ - { ENETRESET, osl_Socket_E_NetReset }, /* Network dropped connection because */ - /* of reset */ - { ECONNABORTED, osl_Socket_E_ConnAborted }, /* Software caused connection abort */ - { ECONNRESET, osl_Socket_E_ConnReset }, /* Connection reset by peer */ - { ENOBUFS, osl_Socket_E_NoBufferSpace }, /* No buffer space available */ - { EISCONN, osl_Socket_E_IsConnected }, /* Socket is already connected */ - { ENOTCONN, osl_Socket_E_NotConnected }, /* Socket is not connected */ - { ESHUTDOWN, osl_Socket_E_Shutdown }, /* Can't send after socket shutdown */ - { ETOOMANYREFS, osl_Socket_E_TooManyRefs }, /* Too many references: can't splice */ - { ETIMEDOUT, osl_Socket_E_TimedOut }, /* Connection timed out */ - { ECONNREFUSED, osl_Socket_E_ConnRefused }, /* Connection refused */ - { EHOSTDOWN, osl_Socket_E_HostDown }, /* Host is down */ - { EHOSTUNREACH, osl_Socket_E_HostUnreachable }, /* No route to host */ - { EWOULDBLOCK, osl_Socket_E_WouldBlock }, /* call would block on non-blocking socket */ - { EALREADY, osl_Socket_E_Already }, /* operation already in progress */ - { EINPROGRESS, osl_Socket_E_InProgress }, /* operation now in progress */ - { EAGAIN, osl_Socket_E_WouldBlock }, /* same as EWOULDBLOCK */ - { -1, osl_Socket_E_InvalidError } -}; - -/* map */ -/* mfe: NOT USED -static int osl_NativeFromSocketError(oslSocketError errorCode) -{ - int i = 0; - - while ((SocketError[i].error != osl_Socket_E_InvalidError) && - (SocketError[i].error != errorCode)) i++; - - return SocketError[i].errcode; -} -*/ - -/* reverse map */ -static oslSocketError osl_SocketErrorFromNative(int nativeType) -{ - int i = 0; - - while ((SocketError[i].error != osl_Socket_E_InvalidError) && - (SocketError[i].errcode != nativeType)) i++; - - return SocketError[i].error; -} - -/* macros */ -#define ERROR_TO_NATIVE(x) osl_NativeFromSocketError(x) -#define ERROR_FROM_NATIVE(y) osl_SocketErrorFromNative(y) - -/*****************************************************************************/ -/* local function prototypes */ -/*****************************************************************************/ - -oslSocketAddr SAL_CALL osl_psz_createInetSocketAddr ( - const sal_Char* pszDottedAddr, sal_Int32 Port); - -oslSocketAddr SAL_CALL osl_psz_createIpxSocketAddr ( - const sal_Char NetNumber[4], - const sal_Char NodeNumber[6], - sal_uInt32 SocketNumber); - -oslHostAddr SAL_CALL osl_psz_createHostAddr ( - const sal_Char *pszHostname, const oslSocketAddr Addr); - -oslHostAddr SAL_CALL osl_psz_createHostAddrByName ( - const sal_Char *pszHostname); - -const sal_Char* SAL_CALL osl_psz_getHostnameOfHostAddr ( - const oslHostAddr Addr); - -oslSocketResult SAL_CALL osl_psz_getLocalHostname ( - sal_Char *pBuffer, sal_uInt32 nBufLen); - -oslSocketAddr SAL_CALL osl_psz_resolveHostname ( - const sal_Char* pszHostname); - -sal_Int32 SAL_CALL osl_psz_getServicePort ( - const sal_Char* pszServicename, const sal_Char* pszProtocol); - -oslSocketResult SAL_CALL osl_psz_getHostnameOfSocketAddr ( - oslSocketAddr Addr, sal_Char *pBuffer, sal_uInt32 BufferSize); - -oslSocketResult SAL_CALL osl_psz_getDottedInetAddrOfSocketAddr ( - oslSocketAddr Addr, sal_Char *pBuffer, sal_uInt32 BufferSize); - -void SAL_CALL osl_psz_getLastSocketErrorDescription ( - oslSocket Socket, sal_Char* pBuffer, sal_uInt32 BufferSize); - -/*****************************************************************************/ -/* osl_create/destroy-SocketImpl */ -/*****************************************************************************/ - -#if OSL_DEBUG_LEVEL > 1 -static sal_uInt32 g_nSocketImpl = 0; -static sal_uInt32 g_nSocketAddr = 0; - -/* sorry, must be implemented otherwise */ - -#endif /* OSL_DEBUG_LEVEL */ - - -oslSocket __osl_createSocketImpl(int Socket) -{ - oslSocket pSocket; - - pSocket = (oslSocket)calloc(1, sizeof(struct oslSocketImpl)); - - pSocket->m_Socket = Socket; - pSocket->m_nLastError = 0; - pSocket->m_CloseCallback = 0; - pSocket->m_CallbackArg = 0; - pSocket->m_nRefCount = 1; - -#if defined(LINUX) - pSocket->m_bIsAccepting = sal_False; -#endif - -#if OSL_DEBUG_LEVEL > 1 - g_nSocketImpl ++; -#endif - return pSocket; -} - -void __osl_destroySocketImpl(oslSocket Socket) -{ - if ( Socket != NULL) - free((struct oslSocketImpl *) Socket); -#if OSL_DEBUG_LEVEL > 1 - g_nSocketImpl --; -#endif -} - -static oslSocketAddr __osl_createSocketAddr( ) -{ - oslSocketAddr pAddr = (oslSocketAddr) rtl_allocateZeroMemory( sizeof( struct oslSocketAddrImpl )); -#if OSL_DEBUG_LEVEL > 1 - g_nSocketAddr ++; -#endif - return pAddr; -} - -static oslSocketAddr __osl_createSocketAddrWithFamily( - oslAddrFamily family, sal_Int32 port, sal_uInt32 nAddr ) -{ - oslSocketAddr pAddr; - - OSL_ASSERT( family == osl_Socket_FamilyInet ); - - pAddr = __osl_createSocketAddr(); - switch( family ) - { - case osl_Socket_FamilyInet: - { - struct sockaddr_in* pInetAddr= (struct sockaddr_in*)&(pAddr->m_sockaddr); - - pInetAddr->sin_family = FAMILY_TO_NATIVE(osl_Socket_FamilyInet); - pInetAddr->sin_addr.s_addr = nAddr; - pInetAddr->sin_port = (sal_uInt16)(port&0xffff); - break; - } - default: - pAddr->m_sockaddr.sa_family = FAMILY_TO_NATIVE(family); - } - return pAddr; -} - -static oslSocketAddr __osl_createSocketAddrFromSystem( struct sockaddr *pSystemSockAddr ) -{ - oslSocketAddr pAddr = __osl_createSocketAddr(); - memcpy( &(pAddr->m_sockaddr), pSystemSockAddr, sizeof( struct sockaddr ) ); - return pAddr; -} - -static void __osl_destroySocketAddr( oslSocketAddr addr ) -{ -#if OSL_DEBUG_LEVEL > 1 - g_nSocketAddr --; -#endif - rtl_freeMemory( addr ); -} - -/*****************************************************************************/ -/* osl_createEmptySocketAddr */ -/*****************************************************************************/ -oslSocketAddr SAL_CALL osl_createEmptySocketAddr(oslAddrFamily Family) -{ - oslSocketAddr pAddr = 0; - - /* is it an internet-Addr? */ - if (Family == osl_Socket_FamilyInet) - { - pAddr = __osl_createSocketAddrWithFamily(Family, 0 , htonl(INADDR_ANY) ); - } - else - { - pAddr = __osl_createSocketAddrWithFamily( Family , 0 , 0 ); - } - - return pAddr; -} - -/*****************************************************************************/ -/* osl_copySocketAddr */ -/*****************************************************************************/ -oslSocketAddr SAL_CALL osl_copySocketAddr(oslSocketAddr Addr) -{ - oslSocketAddr pCopy = 0; - if (Addr) - { - pCopy = __osl_createSocketAddr(); - - if (pCopy) - memcpy(&(pCopy->m_sockaddr),&(Addr->m_sockaddr), sizeof(struct sockaddr)); - } - return pCopy; -} - -/*****************************************************************************/ -/* osl_isEqualSocketAddr */ -/*****************************************************************************/ -sal_Bool SAL_CALL osl_isEqualSocketAddr ( - oslSocketAddr Addr1, - oslSocketAddr Addr2) -{ - OSL_ASSERT(Addr1); - OSL_ASSERT(Addr2); - struct sockaddr* pAddr1= &(Addr1->m_sockaddr); - struct sockaddr* pAddr2= &(Addr2->m_sockaddr); - - OSL_ASSERT(pAddr1); - OSL_ASSERT(pAddr2); - if (pAddr1 == pAddr2) - { - return (sal_True); - } - - if (pAddr1->sa_family == pAddr2->sa_family) - { - switch (pAddr1->sa_family) - { - case AF_INET: - { - struct sockaddr_in* pInetAddr1= (struct sockaddr_in*)pAddr1; - struct sockaddr_in* pInetAddr2= (struct sockaddr_in*)pAddr2; - - if ((pInetAddr1->sin_family == pInetAddr2->sin_family) && - (pInetAddr1->sin_addr.s_addr == pInetAddr2->sin_addr.s_addr) && - (pInetAddr1->sin_port == pInetAddr2->sin_port)) - return (sal_True); - } - - default: - { - return (memcmp(pAddr1, pAddr2, sizeof(struct sockaddr)) == 0); - } - } - } - - return (sal_False); -} - -/*****************************************************************************/ -/* osl_createInetBroadcastAddr */ -/*****************************************************************************/ -oslSocketAddr SAL_CALL osl_createInetBroadcastAddr ( - rtl_uString *strDottedAddr, - sal_Int32 Port) -{ - sal_uInt32 nAddr = OSL_INADDR_NONE; - oslSocketAddr pAddr; - - if (strDottedAddr && strDottedAddr->length) - { - /* Dotted host address for limited broadcast */ - rtl_String *pDottedAddr = NULL; - - rtl_uString2String ( - &pDottedAddr, strDottedAddr->buffer, strDottedAddr->length, - RTL_TEXTENCODING_UTF8, OUSTRING_TO_OSTRING_CVTFLAGS); - - nAddr = inet_addr (pDottedAddr->buffer); - rtl_string_release (pDottedAddr); - } - - if (nAddr != OSL_INADDR_NONE) - { - /* Limited broadcast */ - nAddr = ntohl(nAddr); - if (IN_CLASSA(nAddr)) - { - nAddr &= IN_CLASSA_NET; - nAddr |= IN_CLASSA_HOST; - } - else if (IN_CLASSB(nAddr)) - { - nAddr &= IN_CLASSB_NET; - nAddr |= IN_CLASSB_HOST; - } - else if (IN_CLASSC(nAddr)) - { - nAddr &= IN_CLASSC_NET; - nAddr |= IN_CLASSC_HOST; - } - else - { - /* No broadcast in class D */ - return ((oslSocketAddr)NULL); - } - nAddr = htonl(nAddr); - } - - pAddr = __osl_createSocketAddrWithFamily( osl_Socket_FamilyInet, htons(Port), nAddr ); - return pAddr; -} - -/*****************************************************************************/ -/* osl_createInetSocketAddr */ -/*****************************************************************************/ -oslSocketAddr SAL_CALL osl_createInetSocketAddr ( - rtl_uString *ustrDottedAddr, - sal_Int32 Port) -{ - rtl_String* strDottedAddr=0; - oslSocketAddr Addr; - sal_Char* pszDottedAddr=0; - - if ( ustrDottedAddr != 0 ) - { - rtl_uString2String( &strDottedAddr, - rtl_uString_getStr(ustrDottedAddr), - rtl_uString_getLength(ustrDottedAddr), - RTL_TEXTENCODING_UTF8, - OUSTRING_TO_OSTRING_CVTFLAGS); - pszDottedAddr = rtl_string_getStr(strDottedAddr); - } - - - Addr = osl_psz_createInetSocketAddr(pszDottedAddr, Port); - - if ( strDottedAddr != 0 ) - { - rtl_string_release(strDottedAddr); - } - - return Addr; -} - -oslSocketAddr SAL_CALL osl_psz_createInetSocketAddr ( - const sal_Char* pszDottedAddr, - sal_Int32 Port) -{ - oslSocketAddr pAddr = 0; - sal_Int32 Addr = inet_addr(pszDottedAddr); - if(Addr != -1) - { - /* valid dotted addr */ - pAddr = __osl_createSocketAddrWithFamily( osl_Socket_FamilyInet, htons(Port) , Addr ); - } - return pAddr; -} - -/*****************************************************************************/ -/* osl_setAddrOfSocketAddr */ -/*****************************************************************************/ -oslSocketResult SAL_CALL osl_setAddrOfSocketAddr( oslSocketAddr pAddr, sal_Sequence *pByteSeq ) -{ - oslSocketResult res = osl_Socket_Error; - - OSL_ASSERT( pAddr ); - OSL_ASSERT( pByteSeq ); - - if( pAddr && pByteSeq ) - { - struct sockaddr_in * pSystemInetAddr; - - OSL_ASSERT( pAddr->m_sockaddr.sa_family == FAMILY_TO_NATIVE( osl_Socket_FamilyInet ) ); - OSL_ASSERT( pByteSeq->nElements == 4 ); - - pSystemInetAddr = (struct sockaddr_in * ) &(pAddr->m_sockaddr); - memcpy( &(pSystemInetAddr->sin_addr) , pByteSeq->elements , 4 ); - res = osl_Socket_Ok; - } - return res; -} - -/*****************************************************************************/ -/* osl_getAddrOfSocketAddr */ -/*****************************************************************************/ -oslSocketResult SAL_CALL osl_getAddrOfSocketAddr( oslSocketAddr pAddr, sal_Sequence **ppByteSeq ) -{ - oslSocketResult res = osl_Socket_Error; - - OSL_ASSERT( pAddr ); - OSL_ASSERT( ppByteSeq ); - - if( pAddr && ppByteSeq ) - { - struct sockaddr_in * pSystemInetAddr = (struct sockaddr_in * ) &(pAddr->m_sockaddr); - rtl_byte_sequence_constructFromArray( ppByteSeq , (sal_Int8 *) &(pSystemInetAddr->sin_addr),4); - res = osl_Socket_Ok; - } - return res; -} - - -/*****************************************************************************/ -/* _osl_getFullQualifiedDomainName */ -/*****************************************************************************/ - -/** try to figure out a full-qualified hostname, by adding the current domain - as given by the domainname program to the given hostname. - This function MUST NOT call gethostbyname since pHostName allready points - to data returned by gethostname and would be garbled: use gethostname_r - instead! - */ - -/* wrap around different interfaces to reentrant gethostbyname */ -static struct hostent* _osl_gethostbyname_r ( - const char *name, struct hostent *result, - char *buffer, int buflen, int *h_errnop) -{ -#if defined(LINUX) || defined(ANDROID) || (defined(FREEBSD) && (__FreeBSD_version >= 601103)) || defined(DRAGONFLY) - struct hostent *__result; /* will be the same as result */ - int __error; - __error = gethostbyname_r (name, result, buffer, buflen, - &__result, h_errnop); - return __error ? NULL : __result ; -#elif defined(AIX) - *h_errnop = gethostbyname_r (name, result, (struct hostent_data *)buffer); - (void)buflen; - return *h_errnop ? NULL : result ; -#else - return gethostbyname_r( name, result, buffer, buflen, h_errnop); -#endif -} - -static sal_Bool _osl_getDomainName (sal_Char *buffer, sal_Int32 bufsiz) -{ - sal_Bool result; - int p[2]; - - result = sal_False; - if (pipe (p) == 0) - { - pid_t pid; - int nStatus; - - pid = fork(); - if (pid == 0) - { - char *argv[] = - { - "/bin/domainname", - NULL - }; - - close (p[0]); - dup2 (p[1], 1); - close (p[1]); - - execv ("/bin/domainname", argv); - // arriving here means exec failed - _exit(-1); - } - else if (pid > 0) - { - sal_Int32 k = 0, n = bufsiz; - - close (p[1]); - if ((k = read (p[0], buffer, n - 1)) > 0) - { - buffer[k] = 0; - if (buffer[k - 1] == '\n') - buffer[k - 1] = 0; - result = sal_True; - } - close (p[0]); - waitpid (pid, &nStatus, 0); - } - else - { - close (p[0]); - close (p[1]); - } - } - return (result); -} - -static sal_Char* _osl_getFullQualifiedDomainName (const sal_Char *pHostName) -{ -# define DOMAINNAME_LENGTH 512 - sal_uInt32 nLengthOfHostName; - static sal_uInt32 nLengthOfDomainName = 0; - static sal_Char *pDomainName = NULL; - - sal_Char *pFullQualifiedName; - - /* get a '\0' terminated domainname */ - - /* read default domainname default from environment */ - if (nLengthOfDomainName == 0) - { - sal_Char *pEnvDomain; - - pEnvDomain = getenv ("STAR_OVERRIDE_DOMAINNAME"); - if (pEnvDomain) - { - pDomainName = strdup (pEnvDomain); - nLengthOfDomainName = strlen (pDomainName); - } - } - - if (nLengthOfDomainName == 0) - { - sal_Char pDomainNameBuffer[ DOMAINNAME_LENGTH ]; - - pDomainNameBuffer[0] = '\0'; - - if (_osl_getDomainName (pDomainNameBuffer, DOMAINNAME_LENGTH)) - { - pDomainName = strdup (pDomainNameBuffer); - nLengthOfDomainName = strlen (pDomainName); - } - } - - /* compose hostname and domainname */ - nLengthOfHostName = strlen( pHostName ); - pFullQualifiedName = (sal_Char*) malloc( (nLengthOfHostName + 1 - + nLengthOfDomainName + 1) * sizeof(sal_Char) ); - memcpy( pFullQualifiedName, pHostName, - (nLengthOfHostName + 1) * sizeof(sal_Char) ); - - if ( nLengthOfDomainName > 0 ) - { - /* fqdn = hostname + '.' + domainname + '\0' */ - pFullQualifiedName[ nLengthOfHostName ] = '.'; - memcpy( pFullQualifiedName + nLengthOfHostName + 1, pDomainName, - nLengthOfDomainName + 1 ); - } - - /* check whether full-qualified name and hostname point to the same host - * should almost always be true */ - if ( nLengthOfDomainName > 0 ) - { - struct hostent *pQualifiedHostByName; - struct hostent *pHostByName; - sal_Bool bHostsAreEqual; - - /* buffer for calls to reentrant version of gethostbyname */ - struct hostent aHostByName, aQualifiedHostByName; - sal_Char pHostBuffer[ MAX_HOSTBUFFER_SIZE ]; - sal_Char pQualifiedHostBuffer[ MAX_HOSTBUFFER_SIZE ]; - int nErrorNo; - - pHostBuffer[0] = '\0'; - pQualifiedHostBuffer[0] = '\0'; - - /* get list of addresses */ - pQualifiedHostByName = _osl_gethostbyname_r ( - pFullQualifiedName, - &aQualifiedHostByName, pQualifiedHostBuffer, - sizeof(pQualifiedHostBuffer), &nErrorNo ); - pHostByName = _osl_gethostbyname_r ( - pHostName, - &aHostByName, pHostBuffer, - sizeof(pHostBuffer), &nErrorNo ); - - /* compare addresses */ - bHostsAreEqual = sal_False; - if ( pQualifiedHostByName && pHostByName ) - { - sal_Char **p, **q; - struct in_addr in; - - /* lists are expected to be (very) short */ - for ( p = pQualifiedHostByName->h_addr_list; *p != NULL; p++ ) - { - for ( q = pHostByName->h_addr_list; *q != NULL; q++ ) - { - /* in.s_addr may be in_addr_t or uint32_t or heaven knows */ - if ( memcmp( *p, *q, sizeof(in.s_addr) ) == 0 ) - { - bHostsAreEqual = sal_True; - break; - } - } - if ( bHostsAreEqual ) - break; - } - } - - /* very strange case, but have to believe it: reduce the - * full qualified name to the unqualified host name */ - if ( !bHostsAreEqual ) - { - sal_Char *pTmp; - - OSL_TRACE("_osl_getFullQualifiedDomainName: " - "suspect FQDN: %s\n", pFullQualifiedName); - - pFullQualifiedName[ nLengthOfHostName ] = '\0'; - pTmp = (sal_Char*)realloc ( pFullQualifiedName, - (nLengthOfHostName + 1) * sizeof( sal_Char )); - if (pTmp) - pFullQualifiedName = pTmp; - } - } - - /* always return a hostname looked up as carefully as possible - * this string must be freed by the caller */ - return pFullQualifiedName; -} - -/*****************************************************************************/ -/* _osl_isFullQualifiedDomainName */ -/*****************************************************************************/ -static sal_Bool _osl_isFullQualifiedDomainName (const sal_Char *pHostName) -{ - /* a FQDN (aka 'hostname.domain.top_level_domain' ) - * is a name which contains a dot '.' in it ( would - * match as well for 'hostname.' but is good enough - * for now )*/ - return (sal_Bool)( strchr( pHostName, (int)'.' ) != NULL ); -} - -/*****************************************************************************/ -/* oslHostAddr */ -/*****************************************************************************/ -struct oslHostAddrImpl -{ - sal_Char *pHostName; - oslSocketAddr pSockAddr; -}; - -static oslHostAddr _osl_hostentToHostAddr (const struct hostent *he) -{ - oslHostAddr pAddr= NULL; - oslSocketAddr pSockAddr = 0; - - sal_Char *cn; - - if ((he == NULL) || (he->h_name == NULL) || (he->h_addr_list[0] == NULL)) - return ((oslHostAddr)NULL); - - if (_osl_isFullQualifiedDomainName(he->h_name)) - { - cn= (sal_Char *)malloc(strlen (he->h_name) + 1); - OSL_ASSERT(cn); - if (cn == NULL) - return ((oslHostAddr)NULL); - - strcpy(cn, he->h_name); - } - else - { - cn =_osl_getFullQualifiedDomainName (he->h_name); - OSL_ASSERT(cn); - if (cn == NULL) - return ((oslHostAddr)NULL); - } - - pSockAddr = __osl_createSocketAddr(); - OSL_ASSERT(pSockAddr); - if (pSockAddr == NULL) - { - free(cn); - return ((oslHostAddr)NULL); - } - - pSockAddr->m_sockaddr.sa_family= he->h_addrtype; - if (pSockAddr->m_sockaddr.sa_family == FAMILY_TO_NATIVE(osl_Socket_FamilyInet)) - { - struct sockaddr_in *sin= (struct sockaddr_in *)&(pSockAddr->m_sockaddr); - memcpy ( - &(sin->sin_addr.s_addr), - he->h_addr_list[0], - he->h_length); - } - else - { - /* unknown address family */ - /* future extensions for new families might be implemented here */ - - OSL_TRACE("_osl_hostentToHostAddr: unknown address family.\n"); - OSL_ASSERT(sal_False); - - __osl_destroySocketAddr( pSockAddr ); - free (cn); - return ((oslHostAddr)NULL); - } - - pAddr= (oslHostAddr) malloc(sizeof(struct oslHostAddrImpl)); - OSL_ASSERT(pAddr); - if (pAddr == NULL) - { - __osl_destroySocketAddr( pSockAddr ); - free (cn); - return ((oslHostAddr)NULL); - } - - pAddr->pHostName= cn; - pAddr->pSockAddr= pSockAddr; - - return pAddr; -} - -/*****************************************************************************/ -/* osl_createHostAddr */ -/*****************************************************************************/ -oslHostAddr SAL_CALL osl_createHostAddr ( - rtl_uString *ustrHostname, - const oslSocketAddr Addr) -{ - oslHostAddr HostAddr; - rtl_String* strHostname=0; - sal_Char* pszHostName=0; - - if ( ustrHostname != 0 ) - { - rtl_uString2String( &strHostname, - rtl_uString_getStr(ustrHostname), - rtl_uString_getLength(ustrHostname), - RTL_TEXTENCODING_UTF8, - OUSTRING_TO_OSTRING_CVTFLAGS ); - pszHostName = rtl_string_getStr(strHostname); - } - - HostAddr = osl_psz_createHostAddr(pszHostName,Addr); - - if ( strHostname != 0 ) - { - rtl_string_release(strHostname); - } - - return HostAddr; -} - -oslHostAddr SAL_CALL osl_psz_createHostAddr ( - const sal_Char *pszHostname, - const oslSocketAddr pAddr) -{ - oslHostAddr pHostAddr; - sal_Char *cn; - - OSL_ASSERT(pszHostname && pAddr); - if ((pszHostname == NULL) || (pAddr == NULL)) - return ((oslHostAddr)NULL); - - cn = (sal_Char *)malloc(strlen (pszHostname) + 1); - OSL_ASSERT(cn); - if (cn == NULL) - return ((oslHostAddr)NULL); - - strcpy (cn, pszHostname); - - pHostAddr= (oslHostAddr) malloc(sizeof(struct oslHostAddrImpl)); - OSL_ASSERT(pHostAddr); - if (pHostAddr == NULL) - { - free (cn); - return ((oslHostAddr)NULL); - } - - pHostAddr->pHostName= cn; - pHostAddr->pSockAddr= osl_copySocketAddr( pAddr ); - - return pHostAddr; -} - -/*****************************************************************************/ -/* osl_createHostAddrByName */ -/*****************************************************************************/ -oslHostAddr SAL_CALL osl_createHostAddrByName(rtl_uString *ustrHostname) -{ - oslHostAddr HostAddr; - rtl_String* strHostname=0; - sal_Char* pszHostName=0; - - if ( ustrHostname != 0 ) - { - rtl_uString2String( &strHostname, - rtl_uString_getStr(ustrHostname), - rtl_uString_getLength(ustrHostname), - RTL_TEXTENCODING_UTF8, - OUSTRING_TO_OSTRING_CVTFLAGS ); - pszHostName=rtl_string_getStr(strHostname); - } - - HostAddr = osl_psz_createHostAddrByName(pszHostName); - - if ( strHostname != 0 ) - { - rtl_string_release(strHostname); - } - - return HostAddr; -} - -oslHostAddr SAL_CALL osl_psz_createHostAddrByName (const sal_Char *pszHostname) -{ - struct hostent *he; - oslHostAddr addr; - - static oslMutex mutex = NULL; - - if (mutex == NULL) - mutex = osl_createMutex(); - - osl_acquireMutex(mutex); - - he = gethostbyname((sal_Char *)pszHostname); - addr = _osl_hostentToHostAddr (he); - - osl_releaseMutex(mutex); - - return addr; -} - -/*****************************************************************************/ -/* osl_createHostAddrByAddr */ -/*****************************************************************************/ -oslHostAddr SAL_CALL osl_createHostAddrByAddr (const oslSocketAddr pAddr) -{ - OSL_ASSERT(pAddr); - - if (pAddr == NULL) - return ((oslHostAddr)NULL); - - if (pAddr->m_sockaddr.sa_family == FAMILY_TO_NATIVE(osl_Socket_FamilyInet)) - { - const struct sockaddr_in *sin= (const struct sockaddr_in *)&(pAddr->m_sockaddr); - struct hostent *he; - - if (sin->sin_addr.s_addr == htonl(INADDR_ANY)) - return ((oslHostAddr)NULL); - - he= gethostbyaddr((sal_Char *)&(sin->sin_addr), - sizeof (sin->sin_addr), - sin->sin_family); - return _osl_hostentToHostAddr (he); - } - - return ((oslHostAddr)NULL); -} - -/*****************************************************************************/ -/* osl_copyHostAddr */ -/*****************************************************************************/ -oslHostAddr SAL_CALL osl_copyHostAddr (const oslHostAddr pAddr) -{ - OSL_ASSERT(pAddr); - - if (pAddr) - return osl_psz_createHostAddr (pAddr->pHostName, pAddr->pSockAddr); - else - return ((oslHostAddr)NULL); -} - -/*****************************************************************************/ -/* osl_getHostnameOfHostAddr */ -/*****************************************************************************/ -void SAL_CALL osl_getHostnameOfHostAddr ( - const oslHostAddr Addr, - rtl_uString **ustrHostname) -{ - const sal_Char* pHostname=0; - - pHostname = osl_psz_getHostnameOfHostAddr(Addr); - - rtl_uString_newFromAscii (ustrHostname, pHostname); - - return; -} - -const sal_Char* SAL_CALL osl_psz_getHostnameOfHostAddr (const oslHostAddr pAddr) -{ - OSL_ASSERT(pAddr); - - if (pAddr) - return pAddr->pHostName; - else - return NULL; -} - -/*****************************************************************************/ -/* osl_getSocketAddrOfHostAddr */ -/*****************************************************************************/ -oslSocketAddr SAL_CALL osl_getSocketAddrOfHostAddr (const oslHostAddr pAddr) -{ - OSL_ASSERT(pAddr); - - if (pAddr) - return ((oslSocketAddr)(pAddr->pSockAddr)); - else - return NULL; -} - -/*****************************************************************************/ -/* osl_destroyHostAddr */ -/*****************************************************************************/ -void SAL_CALL osl_destroyHostAddr (oslHostAddr pAddr) -{ - if (pAddr) - { - if (pAddr->pHostName) - free (pAddr->pHostName); - if (pAddr->pSockAddr) - osl_destroySocketAddr (pAddr->pSockAddr); - free (pAddr); - } -} - -/*****************************************************************************/ -/* osl_getLocalHostname */ -/*****************************************************************************/ -oslSocketResult SAL_CALL osl_getLocalHostname(rtl_uString **ustrLocalHostname) -{ - oslSocketResult Result; - sal_Char pszHostname[1024]; - - pszHostname[0] = '\0'; - - Result = osl_psz_getLocalHostname(pszHostname,sizeof(pszHostname)); - - rtl_uString_newFromAscii(ustrLocalHostname,pszHostname); - - return Result; -} - -oslSocketResult SAL_CALL osl_psz_getLocalHostname ( - sal_Char *pBuffer, sal_uInt32 nBufLen) -{ - static sal_Char LocalHostname[256] = ""; - - if (strlen(LocalHostname) == 0) - { - const sal_Char *pStr; - -#ifdef SYSV - struct utsname uts; - - if (uname(&uts) < 0) - return osl_Socket_Error; - - if ((strlen(uts.nodename) + 1) > nBufLen) - return osl_Socket_Error; - - strncpy(LocalHostname, uts.nodename, sizeof( LocalHostname )); -#else /* BSD compatible */ - - if (gethostname(LocalHostname, sizeof(LocalHostname)-1) != 0) - return osl_Socket_Error; - LocalHostname[sizeof(LocalHostname)-1] = 0; -#endif /* SYSV */ - - /* check if we have an FQDN */ - if (strchr(LocalHostname, '.') == NULL) - { - oslHostAddr Addr; - - /* no, determine it via dns */ - Addr = osl_psz_createHostAddrByName(LocalHostname); - - if ((pStr = osl_psz_getHostnameOfHostAddr(Addr)) != NULL) - { - strcpy(LocalHostname, pStr); - } - osl_destroyHostAddr(Addr); - } - } - - if (strlen(LocalHostname) > 0) - { - strncpy(pBuffer, LocalHostname, nBufLen); - pBuffer[nBufLen - 1] = '\0'; - - return osl_Socket_Ok; - } - - return osl_Socket_Error; -} - -/*****************************************************************************/ -/* osl_resolveHostname */ -/*****************************************************************************/ -oslSocketAddr SAL_CALL osl_resolveHostname(rtl_uString *ustrHostname) -{ - oslSocketAddr Addr; - rtl_String* strHostname=0; - sal_Char* pszHostName=0; - - if ( ustrHostname != 0 ) - { - rtl_uString2String( &strHostname, - rtl_uString_getStr(ustrHostname), - rtl_uString_getLength(ustrHostname), - RTL_TEXTENCODING_UTF8, - OUSTRING_TO_OSTRING_CVTFLAGS ); - pszHostName = rtl_string_getStr(strHostname); - } - - - Addr = osl_psz_resolveHostname(pszHostName); - - if ( strHostname != 0 ) - { - rtl_string_release(strHostname); - } - - - return Addr; -} - - -oslSocketAddr SAL_CALL osl_psz_resolveHostname(const sal_Char* pszHostname) -{ - struct oslHostAddrImpl *pAddr = (oslHostAddr)osl_psz_createHostAddrByName(pszHostname); - - if (pAddr) - { - oslSocketAddr SockAddr = osl_copySocketAddr(pAddr->pSockAddr); - - osl_destroyHostAddr(pAddr); - - return (SockAddr); - } - - return ((oslSocketAddr)NULL); -} - -/*****************************************************************************/ -/* osl_getServicePort */ -/*****************************************************************************/ -sal_Int32 SAL_CALL osl_getServicePort(rtl_uString *ustrServicename, rtl_uString *ustrProtocol) -{ - sal_Int32 nPort; - rtl_String* strServicename=0; - rtl_String* strProtocol=0; - sal_Char* pszServiceName=0; - sal_Char* pszProtocol=0; - - if ( ustrServicename != 0 ) - { - rtl_uString2String( &strServicename, - rtl_uString_getStr(ustrServicename), - rtl_uString_getLength(ustrServicename), - RTL_TEXTENCODING_UTF8, - OUSTRING_TO_OSTRING_CVTFLAGS ); - pszServiceName = rtl_string_getStr(strServicename); - } - - if ( ustrProtocol != 0 ) - { - rtl_uString2String( &strProtocol, - rtl_uString_getStr(ustrProtocol), - rtl_uString_getLength(ustrProtocol), - RTL_TEXTENCODING_UTF8, - OUSTRING_TO_OSTRING_CVTFLAGS ); - pszProtocol = rtl_string_getStr(strProtocol); - } - - nPort = osl_psz_getServicePort(pszServiceName,pszProtocol); - - if ( strServicename != 0 ) - { - rtl_string_release(strServicename); - } - - if ( strProtocol != 0 ) - { - rtl_string_release(strProtocol); - } - - - return nPort; -} - - -sal_Int32 SAL_CALL osl_psz_getServicePort(const sal_Char* pszServicename, - const sal_Char* pszProtocol) -{ - struct servent* ps; - - ps= getservbyname(pszServicename, pszProtocol); - - if (ps != 0) - return ntohs(ps->s_port); - - return OSL_INVALID_PORT; -} - -/*****************************************************************************/ -/* osl_destroySocketAddr */ -/*****************************************************************************/ -void SAL_CALL osl_destroySocketAddr(oslSocketAddr pAddr) -{ - __osl_destroySocketAddr( pAddr ); -} - -/*****************************************************************************/ -/* osl_getFamilyOfSocketAddr */ -/*****************************************************************************/ -oslAddrFamily SAL_CALL osl_getFamilyOfSocketAddr(oslSocketAddr pAddr) -{ - OSL_ASSERT(pAddr); - - if (pAddr) - return FAMILY_FROM_NATIVE(pAddr->m_sockaddr.sa_family); - else - return osl_Socket_FamilyInvalid; -} - -/*****************************************************************************/ -/* osl_getInetPortOfSocketAddr */ -/*****************************************************************************/ -sal_Int32 SAL_CALL osl_getInetPortOfSocketAddr(oslSocketAddr pAddr) -{ - OSL_ASSERT(pAddr); - if( pAddr ) - { - struct sockaddr_in* pSystemInetAddr= (struct sockaddr_in*)&(pAddr->m_sockaddr); - - if ( pSystemInetAddr->sin_family == FAMILY_TO_NATIVE(osl_Socket_FamilyInet)) - return ntohs(pSystemInetAddr->sin_port); - } - return OSL_INVALID_PORT; -} - -/*****************************************************************************/ -/* osl_setInetPortOfSocketAddr */ -/*****************************************************************************/ -sal_Bool SAL_CALL osl_setInetPortOfSocketAddr(oslSocketAddr pAddr, sal_Int32 Port) -{ - OSL_ASSERT(pAddr); - if( pAddr ) - { - struct sockaddr_in* pSystemInetAddr= (struct sockaddr_in*)&(pAddr->m_sockaddr); - if ( pSystemInetAddr->sin_family == FAMILY_TO_NATIVE(osl_Socket_FamilyInet)) - { - pSystemInetAddr->sin_port= htons((short)Port); - return sal_True; - } - } - - /* this is not a inet-addr => can't set port */ - return sal_False; -} - -/*****************************************************************************/ -/* osl_getHostnameOfSocketAddr */ -/*****************************************************************************/ -oslSocketResult SAL_CALL osl_getHostnameOfSocketAddr(oslSocketAddr Addr, rtl_uString **ustrHostname) -{ - oslSocketResult Result; - sal_Char pszHostname[1024]; - - pszHostname[0] = '\0'; - - Result = osl_psz_getHostnameOfSocketAddr(Addr,pszHostname,sizeof(pszHostname)); - - rtl_uString_newFromAscii(ustrHostname,pszHostname); - - return Result; -} - - -oslSocketResult SAL_CALL osl_psz_getHostnameOfSocketAddr(oslSocketAddr pAddr, - sal_Char *pBuffer, sal_uInt32 BufferSize) -{ - oslHostAddr pHostAddr= (oslHostAddr )osl_createHostAddrByAddr(pAddr); - - if (pHostAddr) - { - strncpy(pBuffer, pHostAddr->pHostName, BufferSize); - - pBuffer[BufferSize - 1] = '\0'; - - osl_destroyHostAddr(pHostAddr); - - return osl_Socket_Ok; - } - - return osl_Socket_Error; -} - -/*****************************************************************************/ -/* osl_getDottedInetAddrOfSocketAddr */ -/*****************************************************************************/ -oslSocketResult SAL_CALL osl_getDottedInetAddrOfSocketAddr(oslSocketAddr Addr, rtl_uString **ustrDottedInetAddr) -{ - oslSocketResult Result; - sal_Char pszDottedInetAddr[1024]; - - pszDottedInetAddr[0] = '\0'; - - Result = osl_psz_getDottedInetAddrOfSocketAddr(Addr,pszDottedInetAddr,sizeof(pszDottedInetAddr)); - - rtl_uString_newFromAscii(ustrDottedInetAddr,pszDottedInetAddr); - - return Result; - -} - -oslSocketResult SAL_CALL osl_psz_getDottedInetAddrOfSocketAddr(oslSocketAddr pAddr, - sal_Char *pBuffer, sal_uInt32 BufferSize) -{ - OSL_ASSERT(pAddr); - - if( pAddr ) - { - struct sockaddr_in* pSystemInetAddr = ( struct sockaddr_in * ) &(pAddr->m_sockaddr); - - if (pSystemInetAddr->sin_family == FAMILY_TO_NATIVE(osl_Socket_FamilyInet)) - { - strncpy(pBuffer, inet_ntoa(pSystemInetAddr->sin_addr), BufferSize); - pBuffer[BufferSize - 1] = '\0'; - - return osl_Socket_Ok; - } - } - - return osl_Socket_Error; -} - -/*****************************************************************************/ -/* osl_createSocket */ -/*****************************************************************************/ -oslSocket SAL_CALL osl_createSocket(oslAddrFamily Family, - oslSocketType Type, - oslProtocol Protocol) -{ - int Flags; - oslSocket pSocket; - - /* alloc memory */ - pSocket= __osl_createSocketImpl(OSL_INVALID_SOCKET); - - /* create socket */ - pSocket->m_Socket= socket(FAMILY_TO_NATIVE(Family), - TYPE_TO_NATIVE(Type), - PROTOCOL_TO_NATIVE(Protocol)); - - /* creation failed => free memory */ - if(pSocket->m_Socket == OSL_INVALID_SOCKET) - { - OSL_TRACE("osl_createSocket failed. Errno: %d; %s\n", - errno, - strerror(errno)); - - __osl_destroySocketImpl((pSocket)); - pSocket= 0; - } - else - { - /* set close-on-exec flag */ - if ((Flags = fcntl(pSocket->m_Socket, F_GETFD, 0)) != -1) - { - Flags |= FD_CLOEXEC; - if (fcntl(pSocket->m_Socket, F_SETFD, Flags) == -1) - { - pSocket->m_nLastError=errno; - OSL_TRACE("osl_createSocket failed changing socket flags. Errno: %d; %s\n", - errno, - strerror(errno)); - } - } - else - { - pSocket->m_nLastError=errno; - } - - - pSocket->m_CloseCallback = NULL; - pSocket->m_CallbackArg = NULL; - } - - return pSocket; -} - -void SAL_CALL osl_acquireSocket(oslSocket pSocket) -{ - osl_incrementInterlockedCount( &(pSocket->m_nRefCount ) ); -} - -void SAL_CALL osl_releaseSocket( oslSocket pSocket ) -{ - if( pSocket && 0 == osl_decrementInterlockedCount( &(pSocket->m_nRefCount) ) ) - { -#if defined(LINUX) - if ( pSocket->m_bIsAccepting == sal_True ) - { - OSL_FAIL("osl_destroySocket : attempt to destroy socket while accepting\n"); - return; - } -#endif /* LINUX */ - osl_closeSocket( pSocket ); - __osl_destroySocketImpl( pSocket ); - } -} - - - -/*****************************************************************************/ -/* osl_closeSocket */ -/*****************************************************************************/ -void SAL_CALL osl_closeSocket(oslSocket pSocket) -{ - int nRet; - int nFD; - - /* socket already invalid */ - if(pSocket==0) - return; - - pSocket->m_nLastError=0; - nFD = pSocket->m_Socket; - - if (nFD == OSL_INVALID_SOCKET) - return; - - pSocket->m_Socket = OSL_INVALID_SOCKET; - -#if defined(LINUX) - pSocket->m_bIsInShutdown = sal_True; - - if ( pSocket->m_bIsAccepting == sal_True ) - { - int nConnFD; - union { - struct sockaddr aSockAddr; - struct sockaddr_in aSockAddrIn; - } s; - socklen_t nSockLen = sizeof(s.aSockAddr); - - nRet = getsockname(nFD, &s.aSockAddr, &nSockLen); - if ( nRet < 0 ) - { - OSL_TRACE("getsockname call failed with error: %s", strerror(errno)); - } - - if ( s.aSockAddr.sa_family == AF_INET ) - { - if ( s.aSockAddrIn.sin_addr.s_addr == htonl(INADDR_ANY) ) - { - s.aSockAddrIn.sin_addr.s_addr = htonl(INADDR_LOOPBACK); - } - - nConnFD = socket(AF_INET, SOCK_STREAM, 0); - if ( nConnFD < 0 ) - { - OSL_TRACE("socket call failed with error: %s", strerror(errno)); - } - - nRet = connect(nConnFD, &s.aSockAddr, sizeof(s.aSockAddr)); - if ( nRet < 0 ) - { - OSL_TRACE("connect call failed with error: %s", strerror(errno)); - } - close(nConnFD); - } - pSocket->m_bIsAccepting = sal_False; - } -#endif /* LINUX */ - - /* registrierten Callback ausfuehren */ - if (pSocket->m_CloseCallback != NULL) - { - pSocket->m_CloseCallback(pSocket->m_CallbackArg); - } - - nRet=close(nFD); - if ( nRet != 0 ) - { - pSocket->m_nLastError=errno; - OSL_TRACE("closeSocket close error '%s'\n",strerror(errno)); - } - - pSocket->m_Socket = OSL_INVALID_SOCKET; -} - -/*****************************************************************************/ -/* osl_getLocalAddrOfSocket */ -/* Note that I rely on the fact that oslSocketAddr and struct sockaddr */ -/* are the same! I don't like it very much but see no other easy way to conceal */ -/* the struct sockaddr from the eyes of the user. */ -/*****************************************************************************/ -oslSocketAddr SAL_CALL osl_getLocalAddrOfSocket(oslSocket pSocket) -{ - socklen_t AddrLen; - struct sockaddr Addr; - oslSocketAddr pAddr; - - if (pSocket == NULL) /* ENOTSOCK */ - return ((oslSocketAddr)NULL); - - AddrLen= sizeof(struct sockaddr); - - if (getsockname(pSocket->m_Socket, &Addr, &AddrLen) == OSL_SOCKET_ERROR) - return ((oslSocketAddr)NULL); - - pAddr = __osl_createSocketAddrFromSystem( &Addr ); - return pAddr; -} - -/*****************************************************************************/ -/* osl_getPeerAddrOfSocket */ -/*****************************************************************************/ -oslSocketAddr SAL_CALL osl_getPeerAddrOfSocket(oslSocket pSocket) -{ - socklen_t AddrLen; - struct sockaddr Addr; - - OSL_ASSERT(pSocket); - if ( pSocket == 0 ) - { - return 0; - } - - pSocket->m_nLastError=0; - AddrLen= sizeof(struct sockaddr); - - if(getpeername(pSocket->m_Socket, &Addr, &AddrLen) == OSL_SOCKET_ERROR) - { - pSocket->m_nLastError=errno; - return 0; - } - return __osl_createSocketAddrFromSystem( &Addr ); -} - -/*****************************************************************************/ -/* osl_bindAddrToSocket */ -/*****************************************************************************/ -sal_Bool SAL_CALL osl_bindAddrToSocket(oslSocket pSocket, - oslSocketAddr pAddr) -{ - int nRet; - - OSL_ASSERT(pSocket && pAddr ); - if ( pSocket == 0 || pAddr == 0 ) - { - return sal_False; - } - - pSocket->m_nLastError=0; - - nRet = bind(pSocket->m_Socket, &(pAddr->m_sockaddr), sizeof(struct sockaddr)); - - if ( nRet == OSL_SOCKET_ERROR) - { - pSocket->m_nLastError=errno; - return sal_False; - } - - return sal_True; -} - - -/*****************************************************************************/ -/* osl_listenOnSocket */ -/*****************************************************************************/ -sal_Bool SAL_CALL osl_listenOnSocket(oslSocket pSocket, - sal_Int32 MaxPendingConnections) -{ - int nRet; - - OSL_ASSERT(pSocket); - if ( pSocket == 0 ) - { - return sal_False; - } - - pSocket->m_nLastError=0; - - nRet = listen(pSocket->m_Socket, - MaxPendingConnections == -1 ? - SOMAXCONN : - MaxPendingConnections); - if ( nRet == OSL_SOCKET_ERROR) - { - pSocket->m_nLastError=errno; - return sal_False; - } - - return sal_True; -} - - -/*****************************************************************************/ -/* osl_connectSocketTo */ -/*****************************************************************************/ -oslSocketResult SAL_CALL osl_connectSocketTo(oslSocket pSocket, - oslSocketAddr pAddr, - const TimeValue* pTimeout) -{ - fd_set WriteSet; - fd_set ExcptSet; - int ReadyHandles; - struct timeval tv; - oslSocketResult Result= osl_Socket_Ok; - - OSL_PRECOND(pSocket, "osl_connectSocketTo(): need a valid socket!\n"); - - if ( pSocket == 0 ) - { - return osl_Socket_Error; - } - - pSocket->m_nLastError=0; - - if (osl_isNonBlockingMode(pSocket)) - { - if (connect(pSocket->m_Socket, - &(pAddr->m_sockaddr), - sizeof(struct sockaddr)) != OSL_SOCKET_ERROR) - return osl_Socket_Ok; - else - if (errno == EWOULDBLOCK || errno == EINPROGRESS) - { - pSocket->m_nLastError=EINPROGRESS; - return osl_Socket_InProgress; - } - - - pSocket->m_nLastError=errno; - OSL_TRACE("can't connect : '%s'",strerror(errno)); - return osl_Socket_Error; - } - - /* set socket temporarily to non-blocking */ - OSL_VERIFY(osl_enableNonBlockingMode(pSocket, sal_True)); - - /* initiate connect */ - if(connect(pSocket->m_Socket, - &(pAddr->m_sockaddr), - sizeof(struct sockaddr)) != OSL_SOCKET_ERROR) - { - /* immediate connection */ - osl_enableNonBlockingMode(pSocket, sal_False); - - return osl_Socket_Ok; - } - else - { - /* really an error or just delayed? */ - if (errno != EINPROGRESS) - { - pSocket->m_nLastError=errno; - OSL_TRACE( - "osl_connectSocketTo(): connect failed: errno: %d (%s)\n", - errno, strerror(errno)); - - osl_enableNonBlockingMode(pSocket, sal_False); - return osl_Socket_Error; - } - } - - - /* prepare select set for socket */ - FD_ZERO(&WriteSet); - FD_ZERO(&ExcptSet); - FD_SET(pSocket->m_Socket, &WriteSet); - FD_SET(pSocket->m_Socket, &ExcptSet); - - /* prepare timeout */ - if (pTimeout) - { - /* divide milliseconds into seconds and microseconds */ - tv.tv_sec= pTimeout->Seconds; - tv.tv_usec= pTimeout->Nanosec / 1000L; - } - - /* select */ - ReadyHandles= select(pSocket->m_Socket+1, - 0, - PTR_FD_SET(WriteSet), - PTR_FD_SET(ExcptSet), - (pTimeout) ? &tv : 0); - - if (ReadyHandles > 0) /* connected */ - { - if ( FD_ISSET(pSocket->m_Socket, &WriteSet ) ) - { - int nErrorCode = 0; - socklen_t nErrorSize = sizeof( nErrorCode ); - - int nSockOpt; - - nSockOpt = getsockopt ( pSocket->m_Socket, SOL_SOCKET, SO_ERROR, - &nErrorCode, &nErrorSize ); - if ( (nSockOpt == 0) && (nErrorCode == 0)) - Result = osl_Socket_Ok; - else - Result = osl_Socket_Error; - } - else - { - Result= osl_Socket_Error; - } - } - else if (ReadyHandles < 0) /* error */ - { - if (errno == EBADF) /* most probably interrupted by close() */ - { - /* do not access pSockImpl because it is about to be or */ - /* already destroyed */ - return osl_Socket_Interrupted; - } - else - { - pSocket->m_nLastError=errno; - Result= osl_Socket_Error; - } - } - else /* timeout */ - { - pSocket->m_nLastError=errno; - Result= osl_Socket_TimedOut; - } - - osl_enableNonBlockingMode(pSocket, sal_False); - - return Result; -} - - -/*****************************************************************************/ -/* osl_acceptConnectionOnSocket */ -/*****************************************************************************/ -oslSocket SAL_CALL osl_acceptConnectionOnSocket(oslSocket pSocket, - oslSocketAddr* ppAddr) -{ - struct sockaddr Addr; - int Connection, Flags; - oslSocket pConnectionSockImpl; - - socklen_t AddrLen = sizeof(struct sockaddr); - OSL_ASSERT(pSocket); - if ( pSocket == 0 ) - { - return 0; - } - - pSocket->m_nLastError=0; -#if defined(LINUX) - pSocket->m_bIsAccepting = sal_True; -#endif /* LINUX */ - - if( ppAddr && *ppAddr ) - { - osl_destroySocketAddr( *ppAddr ); - *ppAddr = 0; - } - - /* prevent Linux EINTR behaviour */ - do - { - Connection = accept(pSocket->m_Socket, &Addr, &AddrLen); - } while (Connection == -1 && errno == EINTR); - - - /* accept failed? */ - if( Connection == OSL_SOCKET_ERROR ) - { - pSocket->m_nLastError=errno; - OSL_TRACE("osl_acceptConnectionOnSocket : accept error '%s'\n",strerror(errno)); - -#if defined(LINUX) - pSocket->m_bIsAccepting = sal_False; -#endif /* LINUX */ - return 0; - } - - OSL_ASSERT(AddrLen == sizeof(struct sockaddr)); - - -#if defined(LINUX) - if ( pSocket->m_bIsInShutdown == sal_True ) - { - close(Connection); - OSL_TRACE("osl_acceptConnectionOnSocket : close while accept\n"); - return 0; - } -#endif /* LINUX */ - - - if(ppAddr) - { - *ppAddr= __osl_createSocketAddrFromSystem(&Addr); - } - - /* alloc memory */ - pConnectionSockImpl= __osl_createSocketImpl(OSL_INVALID_SOCKET); - - /* set close-on-exec flag */ - if ((Flags = fcntl(Connection, F_GETFD, 0)) != -1) - { - Flags |= FD_CLOEXEC; - if (fcntl(Connection, F_SETFD, Flags) == -1) - { - pSocket->m_nLastError=errno; - OSL_TRACE("osl_acceptConnectionOnSocket failed changing socket flags. Errno: %d (%s)\n", - errno, - strerror(errno)); - } - - } - - pConnectionSockImpl->m_Socket = Connection; - pConnectionSockImpl->m_nLastError = 0; - pConnectionSockImpl->m_CloseCallback = NULL; - pConnectionSockImpl->m_CallbackArg = NULL; -#if defined(LINUX) - pConnectionSockImpl->m_bIsAccepting = sal_False; - - pSocket->m_bIsAccepting = sal_False; -#endif /* LINUX */ - return pConnectionSockImpl; -} - -/*****************************************************************************/ -/* osl_receiveSocket */ -/*****************************************************************************/ -sal_Int32 SAL_CALL osl_receiveSocket(oslSocket pSocket, - void* pBuffer, - sal_uInt32 BytesToRead, - oslSocketMsgFlag Flag) -{ - int nRead; - - OSL_ASSERT(pSocket); - if ( pSocket == 0 ) - { - OSL_TRACE("osl_receiveSocket : Invalid socket"); - return -1; - } - - pSocket->m_nLastError=0; - - do - { - nRead = recv(pSocket->m_Socket, - (sal_Char*)pBuffer, - BytesToRead, - MSG_FLAG_TO_NATIVE(Flag)); - } while ( nRead < 0 && errno == EINTR ); - - if ( nRead < 0 ) - { - pSocket->m_nLastError=errno; - OSL_TRACE("osl_receiveSocket failed : %i '%s'",nRead,strerror(errno)); - } - else if ( nRead == 0 ) - { - OSL_TRACE("osl_receiveSocket failed : %i '%s'",nRead,"EOL"); - } - - return nRead; -} - - -/*****************************************************************************/ -/* osl_receiveFromSocket */ -/*****************************************************************************/ -sal_Int32 SAL_CALL osl_receiveFromSocket(oslSocket pSocket, - oslSocketAddr pSenderAddr, - void* pBuffer, - sal_uInt32 BufferSize, - oslSocketMsgFlag Flag) -{ - int nRead; - struct sockaddr *pSystemSockAddr = 0; - socklen_t AddrLen = 0; - if( pSenderAddr ) - { - AddrLen = sizeof( struct sockaddr ); - pSystemSockAddr = &(pSenderAddr->m_sockaddr); - } - - OSL_ASSERT(pSocket); - if ( pSocket == 0 ) - { - OSL_TRACE("osl_receiveFromSocket : Invalid socket"); - return -1; - } - - pSocket->m_nLastError=0; - - nRead = recvfrom(pSocket->m_Socket, - (sal_Char*)pBuffer, - BufferSize, - MSG_FLAG_TO_NATIVE(Flag), - pSystemSockAddr, - &AddrLen); - - if ( nRead < 0 ) - { - pSocket->m_nLastError=errno; - OSL_TRACE("osl_receiveFromSocket failed : %i '%s'",nRead,strerror(errno)); - } - else if ( nRead == 0 ) - { - OSL_TRACE("osl_receiveSocket failed : %i '%s'",nRead,"EOL"); - } - - return nRead; -} - - -/*****************************************************************************/ -/* osl_sendSocket */ -/*****************************************************************************/ -sal_Int32 SAL_CALL osl_sendSocket(oslSocket pSocket, - const void* pBuffer, - sal_uInt32 BytesToSend, - oslSocketMsgFlag Flag) -{ - int nWritten; - - OSL_ASSERT(pSocket); - if ( pSocket == 0 ) - { - OSL_TRACE("osl_sendSocket : Invalid socket"); - return -1; - } - - pSocket->m_nLastError=0; - - do - { - nWritten = send(pSocket->m_Socket, - (sal_Char*)pBuffer, - BytesToSend, - MSG_FLAG_TO_NATIVE(Flag)); - } while ( nWritten < 0 && errno == EINTR ); - - - if ( nWritten < 0 ) - { - pSocket->m_nLastError=errno; - OSL_TRACE("osl_sendSocket failed : %i '%s'",nWritten,strerror(errno)); - } - else if ( nWritten == 0 ) - { - OSL_TRACE("osl_sendSocket failed : %i '%s'",nWritten,"EOL"); - } - - return nWritten; -} - -/*****************************************************************************/ -/* osl_sendToSocket */ -/*****************************************************************************/ -sal_Int32 SAL_CALL osl_sendToSocket(oslSocket pSocket, - oslSocketAddr ReceiverAddr, - const void* pBuffer, - sal_uInt32 BytesToSend, - oslSocketMsgFlag Flag) -{ - int nWritten; - - struct sockaddr *pSystemSockAddr = 0; - int AddrLen = 0; - if( ReceiverAddr ) - { - pSystemSockAddr = &(ReceiverAddr->m_sockaddr); - AddrLen = sizeof( struct sockaddr ); - } - - OSL_ASSERT(pSocket); - if ( pSocket == 0 ) - { - OSL_TRACE("osl_sendToSocket : Invalid socket"); - return -1; - } - - pSocket->m_nLastError=0; - - /* ReceiverAddr might be 0 when used on a connected socket. */ - /* Then sendto should behave like send. */ - - nWritten = sendto(pSocket->m_Socket, - (sal_Char*)pBuffer, - BytesToSend, - MSG_FLAG_TO_NATIVE(Flag), - pSystemSockAddr, - AddrLen); - - if ( nWritten < 0 ) - { - pSocket->m_nLastError=errno; - OSL_TRACE("osl_sendToSocket failed : %i '%s'",nWritten,strerror(errno)); - } - else if ( nWritten == 0 ) - { - OSL_TRACE("osl_sendToSocket failed : %i '%s'",nWritten,"EOL"); - } - - return nWritten; -} - -/*****************************************************************************/ -/* osl_readSocket */ -/*****************************************************************************/ -sal_Int32 SAL_CALL osl_readSocket ( - oslSocket pSocket, void *pBuffer, sal_Int32 n ) -{ - sal_uInt8 * Ptr = (sal_uInt8 *)pBuffer; - sal_uInt32 BytesRead= 0; - sal_uInt32 BytesToRead= n; - - OSL_ASSERT( pSocket); - - /* loop until all desired bytes were read or an error occurred */ - while (BytesToRead > 0) - { - sal_Int32 RetVal; - RetVal= osl_receiveSocket(pSocket, - Ptr, - BytesToRead, - osl_Socket_MsgNormal); - - /* error occurred? */ - if(RetVal <= 0) - { - break; - } - - BytesToRead -= RetVal; - BytesRead += RetVal; - Ptr += RetVal; - } - - return BytesRead; -} - -/*****************************************************************************/ -/* osl_writeSocket */ -/*****************************************************************************/ -sal_Int32 SAL_CALL osl_writeSocket( - oslSocket pSocket, const void *pBuffer, sal_Int32 n ) -{ - /* loop until all desired bytes were send or an error occurred */ - sal_uInt32 BytesSend= 0; - sal_uInt32 BytesToSend= n; - sal_uInt8 *Ptr = ( sal_uInt8 * )pBuffer; - - OSL_ASSERT( pSocket ); - - while (BytesToSend > 0) - { - sal_Int32 RetVal; - - RetVal= osl_sendSocket( pSocket,Ptr,BytesToSend,osl_Socket_MsgNormal); - - /* error occurred? */ - if(RetVal <= 0) - { - break; - } - - BytesToSend -= RetVal; - BytesSend += RetVal; - Ptr += RetVal; - - } - return BytesSend; -} - -/*****************************************************************************/ -/* __osl_socket_poll */ -/*****************************************************************************/ - -#ifdef HAVE_POLL_H /* poll() */ - -sal_Bool __osl_socket_poll ( - oslSocket pSocket, - const TimeValue* pTimeout, - short nEvent) -{ - struct pollfd fds; - int timeout; - int result; - - OSL_ASSERT(0 != pSocket); - if (0 == pSocket) - return sal_False; /* EINVAL */ - - pSocket->m_nLastError = 0; - - fds.fd = pSocket->m_Socket; - fds.events = nEvent; - fds.revents = 0; - - timeout = -1; - if (pTimeout) - { - /* Convert to [ms] */ - timeout = pTimeout->Seconds * 1000; - timeout += pTimeout->Nanosec / (1000 * 1000); - } - - result = poll (&fds, 1, timeout); - if (result < 0) - { - pSocket->m_nLastError = errno; - OSL_TRACE("__osl_socket_poll(): poll error: %d (%s)", - errno, strerror(errno)); - return sal_False; - } - if (result == 0) - { - /* Timeout */ - return sal_False; - } - - return ((fds.revents & nEvent) == nEvent); -} - -#else /* select() */ - -sal_Bool __osl_socket_poll ( - oslSocket pSocket, - const TimeValue* pTimeout, - short nEvent) -{ - fd_set fds; - struct timeval tv; - int result; - - OSL_ASSERT(0 != pSocket); - if (0 == pSocket) - return sal_False; /* EINVAL */ - - pSocket->m_nLastError = 0; - - FD_ZERO(&fds); - FD_SET(pSocket->m_Socket, &fds); - - if (pTimeout) - { - /* Convert to 'timeval' */ - tv.tv_sec = pTimeout->Seconds; - tv.tv_usec = pTimeout->Nanosec / 1000; - } - - result = select ( - pSocket->m_Socket + 1, - (nEvent == POLLIN ) ? PTR_FD_SET(fds) : NULL, - (nEvent == POLLOUT) ? PTR_FD_SET(fds) : NULL, - (nEvent == POLLPRI) ? PTR_FD_SET(fds) : NULL, - (pTimeout) ? &tv : NULL); - - if (result < 0) - { - pSocket->m_nLastError = errno; - OSL_TRACE("__osl_socket_poll(): select error: %d (%s)", - errno, strerror(errno)); - return sal_False; - } - if (result == 0) - { - /* Timeout */ - return sal_False; - } - - return (FD_ISSET(pSocket->m_Socket, &fds) ? sal_True : sal_False); -} - -#endif /* HAVE_POLL_H */ - -/*****************************************************************************/ -/* osl_isReceiveReady */ -/*****************************************************************************/ -sal_Bool SAL_CALL osl_isReceiveReady ( - oslSocket pSocket, const TimeValue* pTimeout) -{ - OSL_ASSERT(pSocket); - if (pSocket == NULL) - { - /* ENOTSOCK */ - return sal_False; - } - - return __osl_socket_poll (pSocket, pTimeout, POLLIN); -} - -/*****************************************************************************/ -/* osl_isSendReady */ -/*****************************************************************************/ -sal_Bool SAL_CALL osl_isSendReady ( - oslSocket pSocket, const TimeValue* pTimeout) -{ - OSL_ASSERT(pSocket); - if (pSocket == NULL) - { - /* ENOTSOCK */ - return sal_False; - } - - return __osl_socket_poll (pSocket, pTimeout, POLLOUT); -} - -/*****************************************************************************/ -/* osl_isExceptionPending */ -/*****************************************************************************/ -sal_Bool SAL_CALL osl_isExceptionPending ( - oslSocket pSocket, const TimeValue* pTimeout) -{ - OSL_ASSERT(pSocket); - if (pSocket == NULL) - { - /* ENOTSOCK */ - return sal_False; - } - - return __osl_socket_poll (pSocket, pTimeout, POLLPRI); -} - -/*****************************************************************************/ -/* osl_shutdownSocket */ -/*****************************************************************************/ -sal_Bool SAL_CALL osl_shutdownSocket(oslSocket pSocket, - oslSocketDirection Direction) -{ - int nRet; - - OSL_ASSERT(pSocket); - if ( pSocket == 0 ) - { - return sal_False; - } - - pSocket->m_nLastError=0; - - nRet=shutdown(pSocket->m_Socket, DIRECTION_TO_NATIVE(Direction)); - if (nRet != 0 ) - { - pSocket->m_nLastError=errno; - OSL_TRACE("shutdown error '%s'\n",strerror(errno)); - } - return (nRet==0); -} - - -/*****************************************************************************/ -/* osl_getSocketOption */ -/*****************************************************************************/ -sal_Int32 SAL_CALL osl_getSocketOption(oslSocket pSocket, - oslSocketOptionLevel Level, - oslSocketOption Option, - void* pBuffer, - sal_uInt32 BufferLen) -{ - socklen_t nOptLen = (socklen_t) BufferLen; - - OSL_ASSERT(pSocket); - if ( pSocket == 0 ) - { - return -1; - } - - pSocket->m_nLastError=0; - - if(getsockopt(pSocket->m_Socket, - OPTION_LEVEL_TO_NATIVE(Level), - OPTION_TO_NATIVE(Option), - (sal_Char*)pBuffer, - &nOptLen) == -1) - { - pSocket->m_nLastError=errno; - return -1; - } - - return BufferLen; -} - -/*****************************************************************************/ -/* osl_setSocketOption */ -/*****************************************************************************/ -sal_Bool SAL_CALL osl_setSocketOption(oslSocket pSocket, - oslSocketOptionLevel Level, - oslSocketOption Option, - void* pBuffer, - sal_uInt32 BufferLen) -{ - int nRet; - - OSL_ASSERT(pSocket); - if ( pSocket == 0 ) - { - return sal_False; - } - - pSocket->m_nLastError=0; - - nRet = setsockopt(pSocket->m_Socket, - OPTION_LEVEL_TO_NATIVE(Level), - OPTION_TO_NATIVE(Option), - (sal_Char*)pBuffer, - BufferLen); - - if ( nRet < 0 ) - { - pSocket->m_nLastError=errno; - return sal_False; - } - - return sal_True; -} - -/*****************************************************************************/ -/* osl_enableNonBlockingMode */ -/*****************************************************************************/ -sal_Bool SAL_CALL osl_enableNonBlockingMode(oslSocket pSocket, - sal_Bool On) -{ - int flags; - int nRet; - - OSL_ASSERT(pSocket); - if ( pSocket == 0 ) - { - return sal_False; - } - - pSocket->m_nLastError=0; - - flags = fcntl(pSocket->m_Socket, F_GETFL, 0); - - if (On) - flags |= O_NONBLOCK; - else - flags &= ~(O_NONBLOCK); - - nRet = fcntl(pSocket->m_Socket, F_SETFL, flags); - - if ( nRet < 0 ) - { - pSocket->m_nLastError=errno; - return sal_False; - } - - return sal_True; -} - -/*****************************************************************************/ -/* osl_isNonBlockingMode */ -/*****************************************************************************/ -sal_Bool SAL_CALL osl_isNonBlockingMode(oslSocket pSocket) -{ - int flags; - - OSL_ASSERT(pSocket); - if ( pSocket == 0 ) - { - return sal_False; - } - - pSocket->m_nLastError=0; - - flags = fcntl(pSocket->m_Socket, F_GETFL, 0); - - if (flags == -1 || !(flags & O_NONBLOCK)) - return sal_False; - else - return sal_True; -} - -/*****************************************************************************/ -/* osl_getSocketType */ -/*****************************************************************************/ -oslSocketType SAL_CALL osl_getSocketType(oslSocket pSocket) -{ - int Type=0; - socklen_t TypeSize= sizeof(Type); - - OSL_ASSERT(pSocket); - if ( pSocket == 0 ) - { - return osl_Socket_TypeInvalid; - } - - pSocket->m_nLastError=0; - - if(getsockopt(pSocket->m_Socket, - OPTION_LEVEL_TO_NATIVE(osl_Socket_LevelSocket), - OPTION_TO_NATIVE(osl_Socket_OptionType), - (sal_Char*)&Type, - &TypeSize) == -1) - { - /* error */ - pSocket->m_nLastError=errno; - return osl_Socket_TypeInvalid; - } - - return TYPE_FROM_NATIVE(Type); - -} - -/*****************************************************************************/ -/* osl_getLastSocketErrorDescription */ -/*****************************************************************************/ -void SAL_CALL osl_getLastSocketErrorDescription(oslSocket Socket, rtl_uString **ustrError) -{ - sal_Char pszError[1024]; - - pszError[0] = '\0'; - - osl_psz_getLastSocketErrorDescription(Socket,pszError,sizeof(pszError)); - - rtl_uString_newFromAscii(ustrError,pszError); - - return; -} - - -void SAL_CALL osl_psz_getLastSocketErrorDescription(oslSocket pSocket, sal_Char* pBuffer, sal_uInt32 BufferSize) -{ - /* make shure pBuffer will be a zero-terminated string even when strncpy has to cut */ - pBuffer[BufferSize-1]= '\0'; - - if ( pSocket == 0 ) - { - strncpy(pBuffer, strerror(EINVAL), BufferSize-1); - return; - } - - strncpy(pBuffer, strerror(pSocket->m_nLastError), BufferSize-1); - return; -} - -/*****************************************************************************/ -/* osl_getLastSocketError */ -/*****************************************************************************/ -oslSocketError SAL_CALL osl_getLastSocketError(oslSocket pSocket) -{ - if ( pSocket == 0 ) - { - return ERROR_FROM_NATIVE(EINVAL); - } - - return ERROR_FROM_NATIVE(pSocket->m_nLastError); -} - -/*****************************************************************************/ -/* SocketSet */ -/*****************************************************************************/ -typedef struct _TSocketSetImpl -{ - int m_MaxHandle; /* for select(), the largest descriptor in the set */ - fd_set m_Set; /* the set of descriptors */ - -} TSocketSetImpl; - -/*****************************************************************************/ -/* osl_createSocketSet */ -/*****************************************************************************/ -oslSocketSet SAL_CALL osl_createSocketSet() -{ - TSocketSetImpl* pSet; - - pSet= (TSocketSetImpl*)malloc(sizeof(TSocketSetImpl)); - - OSL_ASSERT(pSet); - - if(pSet) - { - pSet->m_MaxHandle= 0; - FD_ZERO(&pSet->m_Set); - } - - return (oslSocketSet)pSet; -} - -/*****************************************************************************/ -/* osl_destroySocketSet */ -/*****************************************************************************/ -void SAL_CALL osl_destroySocketSet(oslSocketSet Set) -{ - if(Set) - free(Set); -} - -/*****************************************************************************/ -/* osl_clearSocketSet */ -/*****************************************************************************/ -void SAL_CALL osl_clearSocketSet(oslSocketSet Set) -{ - TSocketSetImpl* pSet; - OSL_ASSERT(Set); - if ( Set == 0 ) - { - return; - } - - pSet= (TSocketSetImpl*)Set; - pSet->m_MaxHandle= 0; - - FD_ZERO(&pSet->m_Set); -} - -/*****************************************************************************/ -/* osl_addToSocketSet */ -/*****************************************************************************/ -void SAL_CALL osl_addToSocketSet(oslSocketSet Set, oslSocket pSocket) -{ - TSocketSetImpl* pSet; - - OSL_ASSERT(Set); - OSL_ASSERT(pSocket); - - if ( Set == 0 || pSocket == 0) - { - return; - } - - pSet= (TSocketSetImpl*)Set; - - /* correct max handle */ - if(pSocket->m_Socket > pSet->m_MaxHandle) - pSet->m_MaxHandle= pSocket->m_Socket; - FD_SET(pSocket->m_Socket, &pSet->m_Set); - -} - -/*****************************************************************************/ -/* osl_removeFromSocketSet */ -/*****************************************************************************/ -void SAL_CALL osl_removeFromSocketSet(oslSocketSet Set, oslSocket pSocket) -{ - TSocketSetImpl* pSet; - - OSL_ASSERT(Set); - OSL_ASSERT(pSocket); - - if ( Set == 0 || pSocket == 0) - { - return; - } - - pSet= (TSocketSetImpl*)Set; - - /* correct max handle */ - if(pSocket->m_Socket == pSet->m_MaxHandle) - { - /* not optimal, since the next used descriptor might be */ - /* much smaller than m_Socket-1, but it will do */ - pSet->m_MaxHandle--; - if(pSet->m_MaxHandle < 0) - { - pSet->m_MaxHandle= 0; /* avoid underflow */ - } - } - - FD_CLR(pSocket->m_Socket, &pSet->m_Set); -} - -/*****************************************************************************/ -/* osl_isInSocketSet */ -/*****************************************************************************/ -sal_Bool SAL_CALL osl_isInSocketSet(oslSocketSet Set, oslSocket pSocket) -{ - TSocketSetImpl* pSet; - - OSL_ASSERT(Set); - OSL_ASSERT(pSocket); - if ( Set == 0 || pSocket == 0 ) - { - return sal_False; - } - - pSet= (TSocketSetImpl*)Set; - - return (FD_ISSET(pSocket->m_Socket, &pSet->m_Set) != 0); -} - -/*****************************************************************************/ -/* osl_demultiplexSocketEvents */ -/*****************************************************************************/ -sal_Int32 SAL_CALL osl_demultiplexSocketEvents(oslSocketSet IncomingSet, - oslSocketSet OutgoingSet, - oslSocketSet OutOfBandSet, - const TimeValue* pTimeout) -{ - int MaxHandle= 0; - struct timeval tv; - TSocketSetImpl* pInSet; - TSocketSetImpl* pOutSet; - TSocketSetImpl* pOOBSet; - - if (pTimeout) - { - /* non-blocking call */ - tv.tv_sec = pTimeout->Seconds; - tv.tv_usec = pTimeout->Nanosec / 1000L; - } - - /* map opaque data to impl-types */ - pInSet= (TSocketSetImpl*)IncomingSet; - pOutSet= (TSocketSetImpl*)OutgoingSet; - pOOBSet= (TSocketSetImpl*)OutOfBandSet; - - /* get max handle from all sets */ - if (pInSet) - MaxHandle= pInSet->m_MaxHandle; - - if (pOutSet && (pOutSet->m_MaxHandle > MaxHandle)) - MaxHandle= pOutSet->m_MaxHandle; - - if (pOOBSet && (pOOBSet->m_MaxHandle > MaxHandle)) - MaxHandle= pOOBSet->m_MaxHandle; - - return select(MaxHandle+1, - pInSet ? PTR_FD_SET(pInSet->m_Set) : 0, - pOutSet ? PTR_FD_SET(pOutSet->m_Set) : 0, - pOOBSet ? PTR_FD_SET(pOOBSet->m_Set) : 0, - pTimeout ? &tv : 0); -} - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sal/osl/unx/sockimpl.h b/sal/osl/unx/sockimpl.h deleted file mode 100644 index c4b5eebd9..000000000 --- a/sal/osl/unx/sockimpl.h +++ /dev/null @@ -1,80 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2000, 2010 Oracle and/or its affiliates. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * <http://www.openoffice.org/license.html> - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -#ifndef _OSL_SOCKETIMPL_H_ -#define _OSL_SOCKETIMPL_H_ - -#include <osl/pipe.h> -#include <osl/socket.h> -#include <osl/interlck.h> - -#ifdef __cplusplus -extern "C" { -#endif - -typedef void* (*oslCloseCallback) (void*); - -struct oslSocketImpl { - int m_Socket; - int m_nLastError; - oslCloseCallback m_CloseCallback; - void* m_CallbackArg; - oslInterlockedCount m_nRefCount; -#if defined(LINUX) - sal_Bool m_bIsAccepting; - sal_Bool m_bIsInShutdown; -#endif -}; - -struct oslSocketAddrImpl -{ - sal_Int32 m_nRefCount; - struct sockaddr m_sockaddr; -}; - -struct oslPipeImpl { - int m_Socket; - sal_Char m_Name[PATH_MAX + 1]; - oslInterlockedCount m_nRefCount; - sal_Bool m_bClosed; -#if defined(LINUX) - sal_Bool m_bIsAccepting; - sal_Bool m_bIsInShutdown; -#endif -}; - -oslSocket __osl_createSocketImpl(int Socket); -void __osl_destroySocketImpl(oslSocket pImpl); - -#ifdef __cplusplus -} -#endif - -#endif - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sal/osl/unx/system.c b/sal/osl/unx/system.c deleted file mode 100644 index da9af6a7c..000000000 --- a/sal/osl/unx/system.c +++ /dev/null @@ -1,349 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2000, 2010 Oracle and/or its affiliates. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * <http://www.openoffice.org/license.html> - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -#include "system.h" - -#ifdef NO_PTHREAD_RTL - -static pthread_mutex_t getrtl_mutex = PTHREAD_MUTEX_INITIALIZER; - -/* struct passwd differs on some platforms */ -#if !defined(FREEBSD) || (__FreeBSD_version < 601103) - -extern int h_errno; - -struct hostent *gethostbyname_r(const char *name, struct hostent *result, - char *buffer, int buflen, int *h_errnop) -{ - /* buffer layout: name\0 - * array_of_pointer_to_aliases - * NULL - * alias1\0...aliasn\0 - * array_of_pointer_to_addresses - * NULL - * addr1addr2addr3...addrn - */ - struct hostent* res; - - pthread_mutex_lock(&getrtl_mutex); - - if ( (res = gethostbyname(name)) ) - { - int nname, naliases, naddr_list, naliasesdata, n; - char **p, **parray, *data; - - /* Check buffer size before copying, we want to leave the - * buffers unmodified in case something goes wrong. - * - * Is this required? - */ - - nname= strlen(res->h_name)+1; - - naliases = naddr_list = naliasesdata = 0; - - for ( p = res->h_aliases; *p != NULL; p++) { - naliases++; - naliasesdata += strlen(*p)+1; - } - - for ( p = res->h_addr_list; *p != NULL; p++) - naddr_list++; - - if ( nname - + (naliases+1)*sizeof(char*) + naliasesdata - + (naddr_list+1)*sizeof(char*) + naddr_list*res->h_length - <= buflen ) - { - memcpy(result, res, sizeof(struct hostent)); - - strcpy(buffer, res->h_name); - result->h_name = buffer; - buffer += nname; - - parray = (char**)buffer; - result->h_aliases = parray; - data = buffer + (naliases+1)*sizeof(char*); - for ( p = res->h_aliases; *p != NULL; p++) { - n = strlen(*p)+1; - *parray++ = data; - memcpy(data, *p, n); - data += n; - } - *parray = NULL; - buffer = data; - parray = (char**)buffer; - result->h_addr_list = parray; - data = buffer + (naddr_list+1)*sizeof(char*); - for ( p = res->h_addr_list; *p != NULL; p++) { - *parray++ = data; - memcpy(data, *p, res->h_length); - data += res->h_length; - } - *parray = NULL; - - res = result; - } - else - { - errno = ERANGE; - res = NULL; - } - } - else - { - *h_errnop = h_errno; - } - - pthread_mutex_unlock(&getrtl_mutex); - - return res; -} -#endif /* !defined(FREEBSD) || (__FreeBSD_version < 601103) */ - -#if defined(MACOSX) -/* - * Add support for resolving Mac native alias files (not the same as unix alias files) - * returns 0 on success. - */ -int macxp_resolveAlias(char *path, int buflen) -{ - FSRef aFSRef; - OSStatus nErr; - Boolean bFolder; - Boolean bAliased; - char *unprocessedPath = path; - - if ( *unprocessedPath == '/' ) - unprocessedPath++; - - int nRet = 0; - while ( !nRet && unprocessedPath && *unprocessedPath ) - { - unprocessedPath = strchr( unprocessedPath, '/' ); - if ( unprocessedPath ) - *unprocessedPath = '\0'; - - nErr = noErr; - bFolder = FALSE; - bAliased = FALSE; - if ( FSPathMakeRef( (const UInt8 *)path, &aFSRef, 0 ) == noErr ) - { - nErr = FSResolveAliasFileWithMountFlags( &aFSRef, TRUE, &bFolder, &bAliased, kResolveAliasFileNoUI ); - if ( nErr == nsvErr ) - { - errno = ENOENT; - nRet = -1; - } - else if ( nErr == noErr && bAliased ) - { - char tmpPath[ PATH_MAX ]; - if ( FSRefMakePath( &aFSRef, (UInt8 *)tmpPath, PATH_MAX ) == noErr ) - { - int nLen = strlen( tmpPath ) + ( unprocessedPath ? strlen( unprocessedPath + 1 ) + 1 : 0 ); - if ( nLen < buflen && nLen < PATH_MAX ) - { - if ( unprocessedPath ) - { - int nTmpPathLen = strlen( tmpPath ); - strcat( tmpPath, "/" ); - strcat( tmpPath, unprocessedPath + 1 ); - strcpy( path, tmpPath); - unprocessedPath = path + nTmpPathLen; - } - else if ( !unprocessedPath ) - { - strcpy( path, tmpPath); - } - } - else - { - errno = ENAMETOOLONG; - nRet = -1; - } - } - } - } - - if ( unprocessedPath ) - *unprocessedPath++ = '/'; - } - - return nRet; -} - -#endif /* defined MACOSX */ - -#endif /* NO_PTHREAD_RTL */ - -#if (defined (LINUX) && (GLIBC >= 2)) -/* The linux kernel thread implemention, always return the pid of the - thread subprocess and not of the main process. So we save the main - pid at startup -*/ - -// Directly from libc.so.6, obviously missing from some unistd.h: -extern __pid_t __getpid(void); - -static pid_t pid = -1; - -static void savePid(void) __attribute__((constructor)); - -static void savePid(void) -{ - if (pid == -1) - pid = __getpid(); -} - -pid_t getpid(void) -{ - if (pid == -1) - savePid(); - - return (pid); -} -#endif /* (defined (LINUX) && (GLIBC >= 2)) */ - -#ifdef NO_PTHREAD_SEMAPHORES -int sem_init(sem_t* sem, int pshared, unsigned int value) -{ - (void)pshared; - pthread_mutex_init(&sem->mutex, PTHREAD_MUTEXATTR_DEFAULT); - pthread_cond_init(&sem->increased, PTHREAD_CONDATTR_DEFAULT); - - sem->value = (int)value; - return 0; -} - -int sem_destroy(sem_t* sem) -{ - pthread_mutex_destroy(&sem->mutex); - pthread_cond_destroy(&sem->increased); - sem->value = 0; - return 0; -} - -int sem_wait(sem_t* sem) -{ - pthread_mutex_lock(&sem->mutex); - - while (sem->value <= 0) - { - pthread_cond_wait(&sem->increased, &sem->mutex); - } - - sem->value--; - pthread_mutex_unlock(&sem->mutex); - - return 0; -} - -int sem_trywait(sem_t* sem) -{ - int result = 0; - - pthread_mutex_lock(&sem->mutex); - - if (sem->value > 0) - { - sem->value--; - } - else - { - errno = EAGAIN; - result = -1; - } - - pthread_mutex_unlock(&sem->mutex); - - return result; -} - -int sem_post(sem_t* sem) -{ - pthread_mutex_lock(&sem->mutex); - - sem->value++; - - pthread_mutex_unlock(&sem->mutex); - - pthread_cond_signal(&sem->increased); - - return 0; -} -#endif - -#if defined(FREEBSD) -char *fcvt(double value, int ndigit, int *decpt, int *sign) -{ - static char ret[256]; - char buf[256],zahl[256],format[256]="%"; - char *v1,*v2; - - if (value==0.0) value=1e-30; - - if (value<0.0) *sign=1; else *sign=0; - - if (value<1.0) - { - *decpt=(int)log10(value); - value*=pow(10.0,1-*decpt); - ndigit+=*decpt-1; - if (ndigit<0) ndigit=0; - } - else - { - *decpt=(int)log10(value)+1; - } - - sprintf(zahl,"%d",ndigit); - strcat(format,zahl); - strcat(format,"."); - strcat(format,zahl); - strcat(format,"f"); - - sprintf(buf,format,value); - - if (ndigit!=0) - { - v1=strtok(buf,"."); - v2=strtok(NULL,"."); - strcpy(ret,v1); - strcat(ret,v2); - } - else - { - strcpy(ret,buf); - } - - return(ret); -} - -#endif - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sal/osl/unx/system.h b/sal/osl/unx/system.h deleted file mode 100644 index cc4d583ac..000000000 --- a/sal/osl/unx/system.h +++ /dev/null @@ -1,546 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2000, 2010 Oracle and/or its affiliates. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * <http://www.openoffice.org/license.html> - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -#ifndef __OSL_SYSTEM_H__ -#define __OSL_SYSTEM_H__ - -#include <stdio.h> -#include <stdlib.h> -#include <limits.h> -#include <string.h> -#include <errno.h> -#include <stdarg.h> - -#include <unistd.h> -#include <fcntl.h> -#include <dirent.h> -#include <signal.h> -#include <utime.h> - -#include <pwd.h> - -#include <netdb.h> - -#include <sys/stat.h> -#include <sys/wait.h> - -#include <sys/types.h> - -/* Make sockets of type AF_UNIX use underlying FS rights */ -#ifdef SOLARIS -# define _XOPEN_SOURCE 500 -# include <sys/socket.h> -# undef _XOPEN_SOURCE -#else -# include <sys/socket.h> -#endif - -#include <netinet/in.h> -#include <arpa/inet.h> - -#ifdef SYSV -# include <sys/utsname.h> -#endif - -#ifdef LINUX -# ifndef __USE_GNU -# define __USE_GNU -# endif - -#if GLIBC >= 2 -# include <shadow.h> -# include <pthread.h> -# include <sys/file.h> -# include <sys/ioctl.h> -# include <sys/uio.h> -# include <sys/un.h> -# include <netinet/tcp.h> -# include <dlfcn.h> -# include <endian.h> -# include <sys/time.h> -# include <semaphore.h> -# if __BYTE_ORDER == __LITTLE_ENDIAN -# define _LITTLE_ENDIAN -# elif __BYTE_ORDER == __BIG_ENDIAN -# ifndef _BIG_ENDIAN -# define _BIG_ENDIAN -# endif -# elif __BYTE_ORDER == __PDP_ENDIAN -# define _PDP_ENDIAN -# endif -# define IORESOURCE_TRANSFER_BSD -# define IOCHANNEL_TRANSFER_BSD_RENO -# define pthread_testcancel() -# define NO_PTHREAD_PRIORITY -# define PTHREAD_SIGACTION pthread_sigaction -#else -# include <shadow.h> -# include <asm/sigcontext.h> -# include <pthread.h> -# include <sys/file.h> -# include <sys/ioctl.h> -# include <linux/net.h> -# include <sys/un.h> -# include <netinet/tcp.h> -# include <linux/elfcore.h> -# include <dlfcn.h> -# include <endian.h> -# if __BYTE_ORDER == __LITTLE_ENDIAN -# ifndef _LITTLE_ENDIAN -# define _LITTLE_ENDIAN -# endif -# elif __BYTE_ORDER == __BIG_ENDIAN -# ifndef _BIG_ENDIAN -# define _BIG_ENDIAN -# endif -# elif __BYTE_ORDER == __PDP_ENDIAN -# define _PDP_ENDIAN -# endif -# define IORESOURCE_TRANSFER_BSD -# define IOCHANNEL_TRANSFER_BSD_RENO -# define pthread_testcancel() -# define NO_PTHREAD_RTL -# define NO_PTHREAD_PRIORITY -# define PTHREAD_SIGACTION pthread_sigaction -#endif - -# ifndef ETIME -# define ETIME ETIMEDOUT -# endif - -#endif - -#ifdef ANDROID -# include <pthread.h> -# include <sys/file.h> -# include <sys/ioctl.h> -# include <sys/uio.h> -# include <sys/un.h> -# include <netinet/tcp.h> -# include <dlfcn.h> -# include <endian.h> -# include <sys/time.h> -# include <semaphore.h> -# define IORESOURCE_TRANSFER_BSD -# define IOCHANNEL_TRANSFER_BSD_RENO -# define pthread_testcancel() -# define NO_PTHREAD_PRIORITY -#endif - -#ifdef NETBSD -# include <sys/param.h> -# ifndef ETIME -# define ETIME ETIMEDOUT -# endif -# define _POSIX_THREAD_SYSCALL_SOFT 1 -# include <pthread.h> -# include <netdb.h> -# include <sys/sem.h> -# include <sys/exec.h> -# include <sys/filio.h> -# include <sys/ioctl.h> -# include <sys/time.h> -# include <sys/un.h> -# include <netinet/tcp.h> -# include <dlfcn.h> -# include <machine/endian.h> -# if BYTE_ORDER == LITTLE_ENDIAN -# define _LITTLE_ENDIAN_OO -# elif BYTE_ORDER == BIG_ENDIAN -# define _BIG_ENDIAN_OO -# elif BYTE_ORDER == PDP_ENDIAN -# define _PDP_ENDIAN_OO -# endif -# define IORESOURCE_TRANSFER_BSD -# define IOCHANNEL_TRANSFER_BSD_RENO -# define pthread_testcancel() -# define NO_PTHREAD_PRIORITY -# define NO_PTHREAD_SEMAPHORES -# define NO_PTHREAD_RTL -# define PTHREAD_SIGACTION pthread_sigaction -#endif - -#ifdef FREEBSD -# define ETIME ETIMEDOUT -# include <pthread.h> -# include <sys/sem.h> -# include <semaphore.h> -# include <dlfcn.h> -# include <sys/filio.h> -# include <sys/ioctl.h> -# include <sys/param.h> -# include <sys/time.h> -# include <sys/uio.h> -# include <sys/exec.h> -# include <vm/vm.h> -# include <vm/vm_param.h> -# include <vm/pmap.h> -# include <vm/swap_pager.h> -# include <sys/un.h> -# include <netinet/tcp.h> -# define IORESOURCE_TRANSFER_BSD -# include <machine/endian.h> -#if __FreeBSD_version < 500000 -# if BYTE_ORDER == LITTLE_ENDIAN -# define _LITTLE_ENDIAN -# elif BYTE_ORDER == BIG_ENDIAN -# define _BIG_ENDIAN -# elif BYTE_ORDER == PDP_ENDIAN -# define _PDP_ENDIAN -# endif -#endif -# define NO_PTHREAD_RTL -#endif - -#ifdef OPENBSD -# define ETIME ETIMEDOUT -# define _POSIX_THREAD_SYSCALL_SOFT 1 -# include <pthread.h> -# include <sys/sem.h> -# include <semaphore.h> -# include <dlfcn.h> -# include <sys/filio.h> -# include <sys/ioctl.h> -# include <sys/param.h> -# include <sys/time.h> -# include <sys/uio.h> -# include <sys/exec.h> -# include <sys/un.h> -# include <netinet/tcp.h> -# define IORESOURCE_TRANSFER_BSD -# include <machine/endian.h> -# define PTR_SIZE_T(s) ((size_t *)&(s)) -# define IORESOURCE_TRANSFER_BSD -# define IOCHANNEL_TRANSFER_BSD_RENO -# define pthread_testcancel() -# define NO_PTHREAD_PRIORITY -# define NO_PTHREAD_RTL -# define PTHREAD_SIGACTION pthread_sigaction -#endif - -#ifdef DRAGONFLY -# define ETIME ETIMEDOUT -# include <pthread.h> -# include <sys/sem.h> -# include <semaphore.h> -# include <dlfcn.h> -# include <sys/filio.h> -# include <sys/ioctl.h> -# include <sys/param.h> -# include <sys/time.h> -# include <sys/uio.h> -# include <sys/exec.h> -# include <sys/un.h> -# include <netinet/tcp.h> -# include <machine/endian.h> -# define IORESOURCE_TRANSFER_BSD -# define IOCHANNEL_TRANSFER_BSD_RENO -#endif - -#ifdef AIX -# define AF_IPX -1 -# include <strings.h> -# include <pthread.h> -# include <dlfcn.h> -# include <sys/time.h> -# include <sys/un.h> -# include <netinet/tcp.h> -# include <sys/machine.h> -# if BYTE_ORDER == LITTLE_ENDIAN -# ifndef _LITTLE_ENDIAN -# define _LITTLE_ENDIAN -# endif -# elif BYTE_ORDER == BIG_ENDIAN -# ifndef _BIG_ENDIAN -# define _BIG_ENDIAN -# endif -# elif BYTE_ORDER == PDP_ENDIAN -# define _PDP_ENDIAN -# endif -# define SLEEP_TIMESPEC(timespec) nsleep(×pec, 0) -# define LIBPATH "LIBPATH" -# define NO_PTHREAD_SEMAPHORES -#endif - -#ifdef SOLARIS -# include <shadow.h> -# include <sys/un.h> -# include <stropts.h> -# include <pthread.h> -# include <semaphore.h> -# include <netinet/tcp.h> -# include <sys/filio.h> -# include <dlfcn.h> -# include <sys/isa_defs.h> -# define IORESOURCE_TRANSFER_SYSV -# define IOCHANNEL_TRANSFER_BSD -# define LIBPATH "LD_LIBRARY_PATH" -#endif - -#ifdef MACOSX -#define __OPENTRANSPORTPROVIDERS__ // these are already defined -#define TimeValue CFTimeValue // Do not conflict with TimeValue in sal/inc/osl/time.h -#include <Carbon/Carbon.h> -#undef TimeValue -# ifndef ETIME -# define ETIME ETIMEDOUT -# endif -# include <dlfcn.h> -# include <pthread.h> -# include <sys/file.h> -# include <sys/ioctl.h> -# include <sys/uio.h> -# include <sys/un.h> -# include <netinet/tcp.h> -# include <machine/endian.h> -# include <sys/time.h> -# include <sys/semaphore.h> -/* fixme are premac and postmac still needed here? */ -# include <premac.h> -# include <mach-o/dyld.h> -# include <postmac.h> -# if BYTE_ORDER == LITTLE_ENDIAN -# ifndef _LITTLE_ENDIAN -# define _LITTLE_ENDIAN -# endif -# elif BYTE_ORDER == BIG_ENDIAN -# ifndef _BIG_ENDIAN -# define _BIG_ENDIAN -# endif -# elif BYTE_ORDER == PDP_ENDIAN -# ifndef _PDP_ENDIAN -# define _PDP_ENDIAN -# endif -# endif -# define IOCHANNEL_TRANSFER_BSD_RENO -# define NO_PTHREAD_RTL -/* for NSGetArgc/Argv/Environ */ -# include <crt_externs.h> -#ifdef __cplusplus -extern "C" { -#endif -int macxp_resolveAlias(char *path, int buflen); -#ifdef __cplusplus -} -#endif -#endif - -#ifdef IOS -# ifndef ETIME -# define ETIME ETIMEDOUT -# endif -# include <dlfcn.h> -# include <pthread.h> -# include <sys/file.h> -# include <sys/ioctl.h> -# include <sys/uio.h> -# include <sys/un.h> -# include <netinet/tcp.h> -# include <machine/endian.h> -# include <sys/time.h> -# include <sys/semaphore.h> -# if BYTE_ORDER == LITTLE_ENDIAN -# ifndef _LITTLE_ENDIAN -# define _LITTLE_ENDIAN -# endif -# elif BYTE_ORDER == BIG_ENDIAN -# ifndef _BIG_ENDIAN -# define _BIG_ENDIAN -# endif -# elif BYTE_ORDER == PDP_ENDIAN -# ifndef _PDP_ENDIAN -# define _PDP_ENDIAN -# endif -# endif -# define IOCHANNEL_TRANSFER_BSD_RENO -# define NO_PTHREAD_RTL -#endif - -#if !defined(_WIN32) && \ - !defined(LINUX) && !defined(NETBSD) && !defined(FREEBSD) && \ - !defined(AIX) && \ - !defined(SOLARIS) && !defined(MACOSX) && \ - !defined(OPENBSD) && !defined(DRAGONFLY) && \ - !defined(IOS) && !defined(ANDROID) -# error "Target platform not specified!" -#endif - -#if defined(NETBSD) -#if defined _LITTLE_ENDIAN_OO -# define _OSL_BIGENDIAN -#elif defined _BIG_ENDIAN_OO -# define _OSL_LITENDIAN -#else -# error undetermined endianess -#endif -#else -#if defined _LITTLE_ENDIAN -# define _OSL_BIGENDIAN -#elif defined _BIG_ENDIAN -# define _OSL_LITENDIAN -#else -# error undetermined endianess -#endif -#endif - -#ifndef PTR_FD_SET -# define PTR_FD_SET(s) (&(s)) -#endif - -#ifndef NORMALIZE_TIMESPEC -# define NORMALIZE_TIMESPEC(timespec) \ - timespec . tv_sec += timespec . tv_nsec / 1000000000; \ - timespec . tv_nsec %= 1000000000; -#endif - -#ifndef SET_TIMESPEC -# define SET_TIMESPEC(timespec, sec, nsec) \ - timespec . tv_sec = (sec); \ - timespec . tv_nsec = (nsec); \ - NORMALIZE_TIMESPEC(timespec); -#endif - -#ifndef SLEEP_TIMESPEC -# define SLEEP_TIMESPEC(timespec) nanosleep(×pec, 0) -#endif - -#ifndef INIT_GROUPS -# define INIT_GROUPS(name, gid) ((setgid((gid)) == 0) && (initgroups((name), (gid)) == 0)) -#endif - -#ifndef PTHREAD_VALUE -# define PTHREAD_VALUE(t) (t) -#endif -#ifndef PTHREAD_NONE -# if (__GNUC__ < 4) && !defined(MACOSX) -extern pthread_t _pthread_none_; -# endif -# define PTHREAD_NONE _pthread_none_ -# ifndef PTHREAD_NONE_INIT -# define PTHREAD_NONE_INIT ((pthread_t)-1) -# endif -#endif - -#ifndef PTHREAD_ATTR_DEFAULT -# define PTHREAD_ATTR_DEFAULT NULL -#endif -#ifndef PTHREAD_MUTEXATTR_DEFAULT -# define PTHREAD_MUTEXATTR_DEFAULT NULL -#endif -#ifndef PTHREAD_CONDATTR_DEFAULT -# define PTHREAD_CONDATTR_DEFAULT NULL -#endif - -#ifndef PTHREAD_SIGACTION -# define PTHREAD_SIGACTION sigaction -#endif - -#ifndef STAT_PARENT -# define STAT_PARENT lstat -#endif - -/* socket options which might not be defined on all unx flavors */ -#ifndef SO_ACCEPTCONN -# define SO_ACCEPTCONN 0 -#endif -#ifndef SO_SNDLOWAT -# define SO_SNDLOWAT 0 -#endif -#ifndef SO_RCVLOWAT -# define SO_RCVLOWAT 0 -#endif -#ifndef SO_SNDTIMEO -# define SO_SNDTIMEO 0 -#endif -#ifndef SO_RCVTIMEO -# define SO_RCVTIMEO 0 -#endif -#ifndef SO_USELOOPBACK -# define SO_USELOOPBACK 0 -#endif -#ifndef MSG_MAXIOVLEN -# define MSG_MAXIOVLEN 0 -#endif - -/* BEGIN HACK */ -/* dummy define and declarations for IPX should be replaced by */ -/* original ipx headers when these are available for this platform */ - -#ifndef SA_FAMILY_DECL -# define SA_FAMILY_DECL short sa_family -#endif - -typedef struct sockaddr_ipx { - SA_FAMILY_DECL; - char sa_netnum[4]; - char sa_nodenum[6]; - unsigned short sa_socket; -} SOCKADDR_IPX; - -#define NSPROTO_IPX 1000 -#define NSPROTO_SPX 1256 -#define NSPROTO_SPXII 1257 - -/* END HACK */ - -#ifdef NO_PTHREAD_SEMAPHORES - -typedef struct -{ - pthread_mutex_t mutex; - pthread_cond_t increased; - int value; -} sem_t; -extern int sem_init(sem_t* sem, int pshared, unsigned int value); -extern int sem_destroy(sem_t* sem); -extern int sem_wait(sem_t* sem); -extern int sem_trywait(sem_t* sem); -extern int sem_post(sem_t* sem); - -#endif - -#ifdef NO_PTHREAD_RTL -#if !defined FREEBSD || (__FreeBSD_version < 500112) -#if !defined NETBSD -struct passwd *getpwent_r(struct passwd *pwd, char *buffer, int buflen); -#endif -extern struct spwd *getspnam_r(const char *name, struct spwd *result, - char *buffer, int buflen); - -struct tm *localtime_r(const time_t *timep, struct tm *buffer); -struct tm *gmtime_r(const time_t *timep, struct tm *buffer); -#endif /* !defined FREEBSD || (__FreeBSD_version < 500112) */ -#if !defined(FREEBSD) || (__FreeBSD_version < 601103) -struct hostent *gethostbyname_r(const char *name, struct hostent *result, - char *buffer, int buflen, int *h_errnop); -#endif /* !defined(FREEBSD) || (__FreeBSD_version < 601103) */ -#endif - -#endif /* __OSL_SYSTEM_H__ */ - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sal/osl/unx/tempfile.c b/sal/osl/unx/tempfile.c deleted file mode 100644 index 64ce56b3d..000000000 --- a/sal/osl/unx/tempfile.c +++ /dev/null @@ -1,358 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2000, 2010 Oracle and/or its affiliates. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * <http://www.openoffice.org/license.html> - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -/*****************************************************************/ -/* Includes */ -/*****************************************************************/ - -#include <stdio.h> -#if defined(NETBSD) -#include <paths.h> -#endif -#include <stdlib.h> -#include <sys/types.h> -#include <sys/stat.h> -#include <sys/time.h> -#include "system.h" -#include <osl/file.h> -#include <osl/thread.h> -#include <rtl/ustrbuf.h> -#include <osl/diagnose.h> -#include <sal/macros.h> - -#ifndef _FILE_URL_H_ -#include "file_url.h" -#endif - -oslFileError SAL_CALL osl_getTempDirURL( rtl_uString** pustrTempDir ) -{ - oslFileError error; - /* described in environ(7) */ - const char *pValue = getenv( "TMPDIR" ); - - if ( !pValue ) - pValue = getenv( "TEMP" ); - - if ( !pValue ) - pValue = getenv( "TMP" ); - - if ( !pValue ) - pValue = "/tmp"; - - rtl_uString *ustrTempPath = NULL; - - rtl_string2UString( &ustrTempPath, pValue, strlen( pValue ), osl_getThreadTextEncoding(), OSTRING_TO_OUSTRING_CVTFLAGS ); - OSL_ASSERT(ustrTempPath != NULL); - error = osl_getFileURLFromSystemPath( ustrTempPath, pustrTempDir ); - rtl_uString_release( ustrTempPath ); - - return error; -} - -/****************************************************************** - * Generates a random unique file name. We're using the scheme - * from the standard c-lib function mkstemp to generate a more - * or less random unique file name - * - * @param rand_name - * receives the random name - ******************************************************************/ - -static const char LETTERS[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890"; -static const int COUNT_OF_LETTERS = SAL_N_ELEMENTS(LETTERS) - 1; - -#define RAND_NAME_LENGTH 6 - -static void osl_gen_random_name_impl_(rtl_uString** rand_name) -{ - static uint64_t value; - - char buffer[RAND_NAME_LENGTH]; - struct timeval tv; - uint64_t v; - int i; - - gettimeofday(&tv, NULL); - - value += ((uint64_t)tv.tv_usec << 16) ^ tv.tv_sec ^ getpid(); - - v = value; - - for (i = 0; i < RAND_NAME_LENGTH; i++) - { - buffer[i] = LETTERS[v % COUNT_OF_LETTERS]; - v /= COUNT_OF_LETTERS; - } - - rtl_string2UString( - rand_name, - buffer, - RAND_NAME_LENGTH, - RTL_TEXTENCODING_ASCII_US, - OSTRING_TO_OUSTRING_CVTFLAGS); - OSL_ASSERT(*rand_name != NULL); -} - -/***************************************************************** - * Helper function - * Either use the directory provided or the result of - * osl_getTempDirUrl and return it as system path and file url - ****************************************************************/ - -static oslFileError osl_setup_base_directory_impl_( - rtl_uString* pustrDirectoryURL, - rtl_uString** ppustr_base_dir) -{ - rtl_uString* dir_url = 0; - rtl_uString* dir = 0; - oslFileError error = osl_File_E_None; - - if (pustrDirectoryURL) - rtl_uString_assign(&dir_url, pustrDirectoryURL); - else - error = osl_getTempDirURL(&dir_url); - - if (osl_File_E_None == error) - { - error = osl_getSystemPathFromFileURL_Ex(dir_url, &dir, FURL_DENY_RELATIVE); - rtl_uString_release(dir_url); - } - - if (osl_File_E_None == error) - { - rtl_uString_assign(ppustr_base_dir, dir); - rtl_uString_release(dir); - } - - return error; -} - -/***************************************************************** - * osl_setup_createTempFile_impl - * validate input parameter, setup variables - ****************************************************************/ - - static oslFileError osl_setup_createTempFile_impl_( - rtl_uString* pustrDirectoryURL, - oslFileHandle* pHandle, - rtl_uString** ppustrTempFileURL, - rtl_uString** ppustr_base_dir, - sal_Bool* b_delete_on_close) - { - oslFileError osl_error; - - OSL_PRECOND(((0 != pHandle) || (0 != ppustrTempFileURL)), "Invalid parameter!"); - - if ((0 == pHandle) && (0 == ppustrTempFileURL)) - { - osl_error = osl_File_E_INVAL; - } - else - { - osl_error = osl_setup_base_directory_impl_( - pustrDirectoryURL, ppustr_base_dir); - - *b_delete_on_close = (0 == ppustrTempFileURL); - } - - return osl_error; - } - -/***************************************************************** - * Create a unique file in the specified directory and return - * it's name - ****************************************************************/ - -static oslFileError osl_create_temp_file_impl_( - const rtl_uString* pustr_base_directory, - oslFileHandle* file_handle, - rtl_uString** ppustr_temp_file_name) -{ - rtl_uString* rand_name = 0; - sal_uInt32 len_base_dir = 0; - rtl_uString* tmp_file_path = 0; - rtl_uString* tmp_file_url = 0; - sal_Int32 capacity = 0; - oslFileError osl_error = osl_File_E_None; - sal_Int32 offset_file_name; - const sal_Unicode* puchr; - - OSL_PRECOND(pustr_base_directory, "Invalid Parameter"); - OSL_PRECOND(file_handle, "Invalid Parameter"); - OSL_PRECOND(ppustr_temp_file_name, "Invalid Parameter"); - - len_base_dir = rtl_uString_getLength(pustr_base_directory); - - rtl_uStringbuffer_newFromStr_WithLength( - &tmp_file_path, - rtl_uString_getStr((rtl_uString*)pustr_base_directory), - len_base_dir); - - rtl_uStringbuffer_ensureCapacity( - &tmp_file_path, - &capacity, - (len_base_dir + 1 + RAND_NAME_LENGTH)); - - offset_file_name = len_base_dir; - - puchr = rtl_uString_getStr(tmp_file_path); - - /* ensure that the last character is a '/' */ - - if ((sal_Unicode)'/' != puchr[len_base_dir - 1]) - { - rtl_uStringbuffer_insert_ascii( - &tmp_file_path, - &capacity, - len_base_dir, - "/", - 1); - - offset_file_name++; - } - - while(1) /* try until success */ - { - osl_gen_random_name_impl_(&rand_name); - - rtl_uStringbuffer_insert( - &tmp_file_path, - &capacity, - offset_file_name, - rtl_uString_getStr(rand_name), - rtl_uString_getLength(rand_name)); - - osl_error = osl_getFileURLFromSystemPath( - tmp_file_path, &tmp_file_url); - - if (osl_File_E_None == osl_error) - { - /* RW permission for the user only! */ - mode_t old_mode = umask(077); - - osl_error = osl_openFile( - tmp_file_url, - file_handle, - osl_File_OpenFlag_Read | - osl_File_OpenFlag_Write | - osl_File_OpenFlag_Create); - - umask(old_mode); - } - - /* in case of error osl_File_E_EXIST we simply try again else we give up */ - - if ((osl_File_E_None == osl_error) || (osl_error != osl_File_E_EXIST)) - { - if (rand_name) - rtl_uString_release(rand_name); - - if (tmp_file_url) - rtl_uString_release(tmp_file_url); - - break; - } - } /* while(1) */ - - if (osl_File_E_None == osl_error) - rtl_uString_assign(ppustr_temp_file_name, tmp_file_path); - - if (tmp_file_path) - rtl_uString_release(tmp_file_path); - - return osl_error; -} - -/***************************************************************** - * osl_createTempFile - *****************************************************************/ - -oslFileError SAL_CALL osl_createTempFile( - rtl_uString* pustrDirectoryURL, - oslFileHandle* pHandle, - rtl_uString** ppustrTempFileURL) -{ - rtl_uString* base_directory = 0; - rtl_uString* temp_file_name = 0; - oslFileHandle temp_file_handle; - sal_Bool b_delete_on_close; - oslFileError osl_error; - - osl_error = osl_setup_createTempFile_impl_( - pustrDirectoryURL, - pHandle, - ppustrTempFileURL, - &base_directory, - &b_delete_on_close); - - if (osl_File_E_None != osl_error) - return osl_error; - - osl_error = osl_create_temp_file_impl_( - base_directory, &temp_file_handle, &temp_file_name); - - if (osl_File_E_None == osl_error) - { - rtl_uString* temp_file_url = 0; - - /* assuming this works */ - osl_getFileURLFromSystemPath(temp_file_name, &temp_file_url); - - if (b_delete_on_close) - { - osl_error = osl_removeFile(temp_file_url); - - if (osl_File_E_None == osl_error) - *pHandle = temp_file_handle; - else - osl_closeFile(temp_file_handle); - } - else - { - if (pHandle) - *pHandle = temp_file_handle; - else - osl_closeFile(temp_file_handle); - - rtl_uString_assign(ppustrTempFileURL, temp_file_url); - } - - if (temp_file_url) - rtl_uString_release(temp_file_url); - - if (temp_file_name) - rtl_uString_release(temp_file_name); - } - - if (base_directory) - rtl_uString_release(base_directory); - - return osl_error; -} - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sal/osl/unx/thread.c b/sal/osl/unx/thread.c deleted file mode 100644 index b11edb0e2..000000000 --- a/sal/osl/unx/thread.c +++ /dev/null @@ -1,1115 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2000, 2010 Oracle and/or its affiliates. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * <http://www.openoffice.org/license.html> - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -#include "system.h" -#include <string.h> -#if defined(OPENBSD) -#include <sched.h> -#endif -#include <osl/diagnose.h> -#include <osl/thread.h> -#include <osl/nlsupport.h> -#include <rtl/textenc.h> -#include <rtl/alloc.h> -#include <sal/macros.h> - -#if defined LINUX -#include <sys/prctl.h> -#ifndef PR_SET_NAME -#define PR_SET_NAME 15 -#endif -#endif - -/**************************************************************************** - * @@@ TODO @@@ - * - * (1) 'osl_thread_priority_init_Impl()' - * - insane assumption that initializing caller is main thread - * - use _POSIX_THREAD_PRIORITY_SCHEDULING, not NO_PTHREAD_PRIORITY (?) - * - POSIX doesn't require defined prio's for SCHED_OTHER (!) - * - use SCHED_RR instead of SCHED_OTHER for defined behaviour (?) - * (2) 'oslThreadIdentifier' and '{insert|remove|lookup}ThreadId()' - * - cannot reliably be applied to 'alien' threads; - * - memory leak for 'alien' thread 'HashEntry's; - * - use 'PTHREAD_VALUE(pthread_t)' as identifier instead (?) - * - if yes, change 'oslThreadIdentifier' to 'intptr_t' or similar - * (3) 'oslSigAlarmHandler()' (#71232#) - * - [Under Solaris we get SIGALRM in e.g. pthread_join which terminates - * the process. So we initialize our signal handling module and do - * register a SIGALRM Handler which catches and ignores it] - * - should this still happen, 'signal.c' needs to be fixed instead. - * - ****************************************************************************/ - -/*****************************************************************************/ -/* Internal data structures and functions */ -/*****************************************************************************/ - -#define THREADIMPL_FLAGS_TERMINATE 0x00001 -#define THREADIMPL_FLAGS_STARTUP 0x00002 -#define THREADIMPL_FLAGS_SUSPENDED 0x00004 -#define THREADIMPL_FLAGS_ACTIVE 0x00008 -#define THREADIMPL_FLAGS_ATTACHED 0x00010 -#define THREADIMPL_FLAGS_DESTROYED 0x00020 - -typedef struct osl_thread_impl_st -{ - pthread_t m_hThread; - sal_uInt16 m_Ident; /* @@@ see TODO @@@ */ - short m_Flags; - oslWorkerFunction m_WorkerFunction; - void* m_pData; - pthread_mutex_t m_Lock; - pthread_cond_t m_Cond; -} Thread_Impl; - -struct osl_thread_priority_st -{ - int m_Highest; - int m_Above_Normal; - int m_Normal; - int m_Below_Normal; - int m_Lowest; -}; - -#define OSL_THREAD_PRIORITY_INITIALIZER { 127, 96, 64, 32, 0 } -static void osl_thread_priority_init_Impl (void); - -struct osl_thread_textencoding_st -{ - pthread_key_t m_key; /* key to store thread local text encoding */ - rtl_TextEncoding m_default; /* the default text encoding */ -}; - -#define OSL_THREAD_TEXTENCODING_INITIALIZER { 0, RTL_TEXTENCODING_DONTKNOW } -static void osl_thread_textencoding_init_Impl (void); - -struct osl_thread_global_st -{ - pthread_once_t m_once; - struct osl_thread_priority_st m_priority; - struct osl_thread_textencoding_st m_textencoding; -}; - -static struct osl_thread_global_st g_thread = -{ - PTHREAD_ONCE_INIT, - OSL_THREAD_PRIORITY_INITIALIZER, - OSL_THREAD_TEXTENCODING_INITIALIZER -}; - -static void osl_thread_init_Impl (void); - -static Thread_Impl* osl_thread_construct_Impl (void); -static void osl_thread_destruct_Impl (Thread_Impl ** ppImpl); - -static void* osl_thread_start_Impl (void * pData); -static void osl_thread_cleanup_Impl (void * pData); - -static oslThread osl_thread_create_Impl ( - oslWorkerFunction pWorker, void * pThreadData, short nFlags); - -static void osl_thread_join_cleanup_Impl (void * opaque); -static void osl_thread_wait_cleanup_Impl (void * opaque); - -/* @@@ see TODO @@@ */ -static sal_uInt16 insertThreadId (pthread_t hThread); -static sal_uInt16 lookupThreadId (pthread_t hThread); -static void removeThreadId (pthread_t hThread); - -/*****************************************************************************/ -/* osl_thread_init_Impl */ -/*****************************************************************************/ -static void osl_thread_init_Impl (void) -{ - osl_thread_priority_init_Impl(); - osl_thread_textencoding_init_Impl(); -} - -/*****************************************************************************/ -/* osl_thread_join_cleanup_Impl */ -/*****************************************************************************/ -static void osl_thread_join_cleanup_Impl (void * opaque) -{ - pthread_t hThread = (pthread_t)(opaque); - pthread_detach (hThread); -} - -/*****************************************************************************/ -/* osl_thread_wait_cleanup_Impl */ -/*****************************************************************************/ -static void osl_thread_wait_cleanup_Impl (void * opaque) -{ - pthread_mutex_t * pMutex = (pthread_mutex_t*)(opaque); - pthread_mutex_unlock (pMutex); -} - -/*****************************************************************************/ -/* osl_thread_construct_Impl */ -/*****************************************************************************/ -Thread_Impl* osl_thread_construct_Impl (void) -{ - Thread_Impl* pImpl = malloc (sizeof(Thread_Impl)); - if (pImpl) - { - memset (pImpl, 0, sizeof(Thread_Impl)); - - pthread_mutex_init (&(pImpl->m_Lock), PTHREAD_MUTEXATTR_DEFAULT); - pthread_cond_init (&(pImpl->m_Cond), PTHREAD_CONDATTR_DEFAULT); - } - return (pImpl); -} - -/*****************************************************************************/ -/* osl_thread_destruct_Impl */ -/*****************************************************************************/ -static void osl_thread_destruct_Impl (Thread_Impl ** ppImpl) -{ - OSL_ASSERT(ppImpl); - if (*ppImpl) - { - pthread_cond_destroy (&((*ppImpl)->m_Cond)); - pthread_mutex_destroy (&((*ppImpl)->m_Lock)); - - free (*ppImpl); - (*ppImpl) = 0; - } -} - -/*****************************************************************************/ -/* osl_thread_cleanup_Impl */ -/*****************************************************************************/ -static void osl_thread_cleanup_Impl (void* pData) -{ - pthread_t thread; - int attached; - int destroyed; - Thread_Impl* pImpl= (Thread_Impl*)pData; - - pthread_mutex_lock (&(pImpl->m_Lock)); - - thread = pImpl->m_hThread; - attached = (pImpl->m_Flags & THREADIMPL_FLAGS_ATTACHED) != 0; - destroyed = (pImpl->m_Flags & THREADIMPL_FLAGS_DESTROYED) != 0; - pImpl->m_Flags &= ~(THREADIMPL_FLAGS_ACTIVE | THREADIMPL_FLAGS_ATTACHED); - - pthread_mutex_unlock (&(pImpl->m_Lock)); - - /* release oslThreadIdentifier @@@ see TODO @@@ */ - removeThreadId (thread); - - if (attached) - { - pthread_detach (thread); - } - - if (destroyed) - { - osl_thread_destruct_Impl (&pImpl); - } -} - -/*****************************************************************************/ -/* osl_thread_start_Impl */ -/*****************************************************************************/ -static void* osl_thread_start_Impl (void* pData) -{ - int terminate; - Thread_Impl* pImpl= (Thread_Impl*)pData; - - OSL_ASSERT(pImpl); - - pthread_mutex_lock (&(pImpl->m_Lock)); - - /* install cleanup handler */ - pthread_cleanup_push (osl_thread_cleanup_Impl, pData); - - /* request oslThreadIdentifier @@@ see TODO @@@ */ - pImpl->m_Ident = insertThreadId (pImpl->m_hThread); - - /* signal change from STARTUP to ACTIVE state */ - pImpl->m_Flags &= ~THREADIMPL_FLAGS_STARTUP; - pImpl->m_Flags |= THREADIMPL_FLAGS_ACTIVE; - pthread_cond_signal (&(pImpl->m_Cond)); - - /* Check if thread is started in SUSPENDED state */ - while (pImpl->m_Flags & THREADIMPL_FLAGS_SUSPENDED) - { - /* wait until SUSPENDED flag is cleared */ - pthread_cleanup_push (osl_thread_wait_cleanup_Impl, &(pImpl->m_Lock)); - pthread_cond_wait (&(pImpl->m_Cond), &(pImpl->m_Lock)); - pthread_cleanup_pop (0); - } - - /* check for SUSPENDED to TERMINATE state change */ - terminate = ((pImpl->m_Flags & THREADIMPL_FLAGS_TERMINATE) > 0); - - pthread_mutex_unlock (&(pImpl->m_Lock)); - - if (!terminate) - { - /* call worker function */ - pImpl->m_WorkerFunction(pImpl->m_pData); - } - - /* call cleanup handler and leave */ - pthread_cleanup_pop (1); - return (0); -} - -/*****************************************************************************/ -/* osl_thread_create_Impl */ -/*****************************************************************************/ -static oslThread osl_thread_create_Impl ( - oslWorkerFunction pWorker, - void* pThreadData, - short nFlags) -{ - Thread_Impl* pImpl; -#if defined(OPENBSD) - pthread_attr_t attr; -#endif - int nRet=0; - - pImpl = osl_thread_construct_Impl(); - if (!pImpl) - return (0); /* ENOMEM */ - - pImpl->m_WorkerFunction = pWorker; - pImpl->m_pData = pThreadData; - pImpl->m_Flags = nFlags | THREADIMPL_FLAGS_STARTUP; - - pthread_mutex_lock (&(pImpl->m_Lock)); - -#if defined(OPENBSD) - if (pthread_attr_init(&attr) != 0) - return (0); - - if (pthread_attr_setstacksize(&attr, 262144) != 0) { - pthread_attr_destroy(&attr); - return (0); - } -#endif - - if ((nRet = pthread_create ( - &(pImpl->m_hThread), -#if defined(OPENBSD) - &attr, -#else - PTHREAD_ATTR_DEFAULT, -#endif - osl_thread_start_Impl, - (void*)(pImpl))) != 0) - { - OSL_TRACE("osl_thread_create_Impl(): errno: %d, %s\n", - nRet, strerror(nRet)); - - pthread_mutex_unlock (&(pImpl->m_Lock)); - osl_thread_destruct_Impl (&pImpl); - - return (0); - } - -#if defined(OPENBSD) - pthread_attr_destroy(&attr); -#endif - - /* wait for change from STARTUP to ACTIVE state */ - while (pImpl->m_Flags & THREADIMPL_FLAGS_STARTUP) - { - /* wait until STARTUP flag is cleared */ - pthread_cleanup_push (osl_thread_wait_cleanup_Impl, &(pImpl->m_Lock)); - pthread_cond_wait (&(pImpl->m_Cond), &(pImpl->m_Lock)); - pthread_cleanup_pop (0); - } - - pthread_mutex_unlock (&(pImpl->m_Lock)); - - return ((oslThread)(pImpl)); -} - -/*****************************************************************************/ -/* osl_createThread */ -/*****************************************************************************/ -oslThread osl_createThread ( - oslWorkerFunction pWorker, - void * pThreadData) -{ - return osl_thread_create_Impl ( - pWorker, - pThreadData, - THREADIMPL_FLAGS_ATTACHED); -} - -/*****************************************************************************/ -/* osl_createSuspendedThread */ -/*****************************************************************************/ -oslThread osl_createSuspendedThread ( - oslWorkerFunction pWorker, - void * pThreadData) -{ - return osl_thread_create_Impl ( - pWorker, - pThreadData, - THREADIMPL_FLAGS_ATTACHED | - THREADIMPL_FLAGS_SUSPENDED ); -} - -/*****************************************************************************/ -/* osl_destroyThread */ -/*****************************************************************************/ -void SAL_CALL osl_destroyThread(oslThread Thread) -{ - if (Thread != NULL) { - Thread_Impl * impl = (Thread_Impl *) Thread; - int active; - pthread_mutex_lock(&impl->m_Lock); - active = (impl->m_Flags & THREADIMPL_FLAGS_ACTIVE) != 0; - impl->m_Flags |= THREADIMPL_FLAGS_DESTROYED; - pthread_mutex_unlock(&impl->m_Lock); - if (!active) { - osl_thread_destruct_Impl(&impl); - } - } -} - -/*****************************************************************************/ -/* osl_resumeThread */ -/*****************************************************************************/ -void SAL_CALL osl_resumeThread(oslThread Thread) -{ - Thread_Impl* pImpl= (Thread_Impl*)Thread; - - OSL_ASSERT(pImpl); - if (!pImpl) - return; /* EINVAL */ - - pthread_mutex_lock (&(pImpl->m_Lock)); - - if (pImpl->m_Flags & THREADIMPL_FLAGS_SUSPENDED) - { - /* clear SUSPENDED flag */ - pImpl->m_Flags &= ~THREADIMPL_FLAGS_SUSPENDED; - pthread_cond_signal (&(pImpl->m_Cond)); - } - - pthread_mutex_unlock (&(pImpl->m_Lock)); -} - -/*****************************************************************************/ -/* osl_suspendThread */ -/*****************************************************************************/ -void SAL_CALL osl_suspendThread(oslThread Thread) -{ - Thread_Impl* pImpl= (Thread_Impl*)Thread; - - OSL_ASSERT(pImpl); - if (!pImpl) - return; /* EINVAL */ - - pthread_mutex_lock (&(pImpl->m_Lock)); - - pImpl->m_Flags |= THREADIMPL_FLAGS_SUSPENDED; - - if (pthread_equal (pthread_self(), pImpl->m_hThread)) - { - /* self suspend */ - while (pImpl->m_Flags & THREADIMPL_FLAGS_SUSPENDED) - { - /* wait until SUSPENDED flag is cleared */ - pthread_cleanup_push (osl_thread_wait_cleanup_Impl, &(pImpl->m_Lock)); - pthread_cond_wait (&(pImpl->m_Cond), &(pImpl->m_Lock)); - pthread_cleanup_pop (0); - } - } - - pthread_mutex_unlock (&(pImpl->m_Lock)); -} - -/*****************************************************************************/ -/* osl_isThreadRunning */ -/*****************************************************************************/ -sal_Bool SAL_CALL osl_isThreadRunning(const oslThread Thread) -{ - sal_Bool active; - Thread_Impl* pImpl= (Thread_Impl*)Thread; - - if (!pImpl) - return sal_False; - - pthread_mutex_lock (&(pImpl->m_Lock)); - active = ((pImpl->m_Flags & THREADIMPL_FLAGS_ACTIVE) > 0); - pthread_mutex_unlock (&(pImpl->m_Lock)); - - return (active); -} - -/*****************************************************************************/ -/* osl_joinWithThread */ -/*****************************************************************************/ -void SAL_CALL osl_joinWithThread(oslThread Thread) -{ - pthread_t thread; - int attached; - Thread_Impl* pImpl= (Thread_Impl*)Thread; - - if (!pImpl) - return; - - pthread_mutex_lock (&(pImpl->m_Lock)); - - if (pthread_equal (pthread_self(), pImpl->m_hThread)) - { - /* self join */ - pthread_mutex_unlock (&(pImpl->m_Lock)); - return; /* EDEADLK */ - } - - thread = pImpl->m_hThread; - attached = ((pImpl->m_Flags & THREADIMPL_FLAGS_ATTACHED) > 0); - pImpl->m_Flags &= ~THREADIMPL_FLAGS_ATTACHED; - - pthread_mutex_unlock (&(pImpl->m_Lock)); - - if (attached) - { - /* install cleanup handler to ensure consistent flags and state */ - pthread_cleanup_push ( - osl_thread_join_cleanup_Impl, (void*)thread); - - /* join */ - pthread_join (thread, NULL); - - /* remove cleanup handler */ - pthread_cleanup_pop (0); - } -} - -/*****************************************************************************/ -/* osl_terminateThread */ -/*****************************************************************************/ -void SAL_CALL osl_terminateThread(oslThread Thread) -{ - Thread_Impl* pImpl= (Thread_Impl*)Thread; - - OSL_ASSERT(pImpl); - if (!pImpl) - return; /* EINVAL */ - - pthread_mutex_lock (&(pImpl->m_Lock)); - - if (pImpl->m_Flags & THREADIMPL_FLAGS_SUSPENDED) - { - /* clear SUSPENDED flag */ - pImpl->m_Flags &= ~THREADIMPL_FLAGS_SUSPENDED; - pthread_cond_signal (&(pImpl->m_Cond)); - } - - pImpl->m_Flags |= THREADIMPL_FLAGS_TERMINATE; - - pthread_mutex_unlock (&(pImpl->m_Lock)); -} - -/*****************************************************************************/ -/* osl_scheduleThread */ -/*****************************************************************************/ -sal_Bool SAL_CALL osl_scheduleThread(oslThread Thread) -{ - int terminate; - Thread_Impl* pImpl= (Thread_Impl*)Thread; - - OSL_ASSERT(pImpl); - if (!pImpl) - return sal_False; /* EINVAL */ - - OSL_ASSERT(pthread_equal (pthread_self(), pImpl->m_hThread)); - if (!(pthread_equal (pthread_self(), pImpl->m_hThread))) - return sal_False; /* EINVAL */ - - pthread_testcancel(); - pthread_mutex_lock (&(pImpl->m_Lock)); - - while (pImpl->m_Flags & THREADIMPL_FLAGS_SUSPENDED) - { - /* wait until SUSPENDED flag is cleared */ - pthread_cleanup_push (osl_thread_wait_cleanup_Impl, &(pImpl->m_Lock)); - pthread_cond_wait (&(pImpl->m_Cond), &(pImpl->m_Lock)); - pthread_cleanup_pop (0); - } - - terminate = ((pImpl->m_Flags & THREADIMPL_FLAGS_TERMINATE) > 0); - - pthread_mutex_unlock(&(pImpl->m_Lock)); - pthread_testcancel(); - - return (terminate == 0); -} - -/*****************************************************************************/ -/* osl_waitThread */ -/*****************************************************************************/ -void SAL_CALL osl_waitThread(const TimeValue* pDelay) -{ - if (pDelay) - { - struct timespec delay; - - SET_TIMESPEC(delay, pDelay->Seconds, pDelay->Nanosec); - - SLEEP_TIMESPEC(delay); - } -} - -/*****************************************************************************/ -/* osl_yieldThread */ -/* - Note that POSIX scheduling _really_ requires threads to call this - functions, since a thread only reschedules to other thread, when - it blocks (sleep, blocking I/O) OR calls sched_yield(). -*/ -/*****************************************************************************/ -void SAL_CALL osl_yieldThread() -{ - sched_yield(); -} - -void SAL_CALL osl_setThreadName(char const * name) { -#if defined LINUX - if (prctl(PR_SET_NAME, (unsigned long) name, 0, 0, 0) != 0) { - OSL_TRACE( - "%s prctl(PR_SET_NAME) failed with errno %d", OSL_LOG_PREFIX, - errno); - } -#else - (void) name; -#endif -} - -/*****************************************************************************/ -/* osl_getThreadIdentifier @@@ see TODO @@@ */ -/*****************************************************************************/ - -#define HASHID(x) ((unsigned int)PTHREAD_VALUE(x) % HashSize) - -typedef struct _HashEntry -{ - pthread_t Handle; - sal_uInt16 Ident; - struct _HashEntry *Next; -} HashEntry; - -static HashEntry* HashTable[31]; -static int HashSize = SAL_N_ELEMENTS(HashTable); - -static pthread_mutex_t HashLock = PTHREAD_MUTEX_INITIALIZER; - -static sal_uInt16 LastIdent = 0; - -static sal_uInt16 lookupThreadId (pthread_t hThread) -{ - HashEntry *pEntry; - - pthread_mutex_lock(&HashLock); - - pEntry = HashTable[HASHID(hThread)]; - while (pEntry != NULL) - { - if (pthread_equal(pEntry->Handle, hThread)) - { - pthread_mutex_unlock(&HashLock); - return (pEntry->Ident); - } - pEntry = pEntry->Next; - } - - pthread_mutex_unlock(&HashLock); - - return (0); -} - -static sal_uInt16 insertThreadId (pthread_t hThread) -{ - HashEntry *pEntry, *pInsert = NULL; - - pthread_mutex_lock(&HashLock); - - pEntry = HashTable[HASHID(hThread)]; - - while (pEntry != NULL) - { - if (pthread_equal(pEntry->Handle, hThread)) - break; - - pInsert = pEntry; - pEntry = pEntry->Next; - } - - if (pEntry == NULL) - { - pEntry = (HashEntry*) calloc(sizeof(HashEntry), 1); - - pEntry->Handle = hThread; - - ++ LastIdent; - - if ( LastIdent == 0 ) - LastIdent = 1; - - pEntry->Ident = LastIdent; - - if (pInsert) - pInsert->Next = pEntry; - else - HashTable[HASHID(hThread)] = pEntry; - } - - pthread_mutex_unlock(&HashLock); - - return (pEntry->Ident); -} - -static void removeThreadId (pthread_t hThread) -{ - HashEntry *pEntry, *pRemove = NULL; - - pthread_mutex_lock(&HashLock); - - pEntry = HashTable[HASHID(hThread)]; - while (pEntry != NULL) - { - if (pthread_equal(pEntry->Handle, hThread)) - break; - - pRemove = pEntry; - pEntry = pEntry->Next; - } - - if (pEntry != NULL) - { - if (pRemove) - pRemove->Next = pEntry->Next; - else - HashTable[HASHID(hThread)] = pEntry->Next; - - free(pEntry); - } - - pthread_mutex_unlock(&HashLock); -} - -oslThreadIdentifier SAL_CALL osl_getThreadIdentifier(oslThread Thread) -{ - Thread_Impl* pImpl= (Thread_Impl*)Thread; - sal_uInt16 Ident; - - if (pImpl) - Ident = pImpl->m_Ident; - else - { - /* current thread */ - pthread_t current = pthread_self(); - - Ident = lookupThreadId (current); - if (Ident == 0) - /* @@@ see TODO: alien pthread_self() @@@ */ - Ident = insertThreadId (current); - } - - return ((oslThreadIdentifier)(Ident)); -} - -/***************************************************************************** - @@@ see TODO @@@ - osl_thread_priority_init_Impl - - set the base-priority of the main-thread to - oslThreadPriorityNormal (64) since 0 (lowest) is - the system default. This behaviour collides with - our enum-priority definition (highest..normal..lowest). - A normaluser will expect the main-thread of an app. - to have the "normal" priority. - -*****************************************************************************/ -static void osl_thread_priority_init_Impl (void) -{ -#ifndef NO_PTHREAD_PRIORITY - struct sched_param param; - int policy=0; - int nRet=0; - -/* @@@ see TODO: calling thread may not be main thread @@@ */ - - if ((nRet = pthread_getschedparam(pthread_self(), &policy, ¶m)) != 0) - { - OSL_TRACE("failed to get priority of thread [%s]\n",strerror(nRet)); - return; - } - -#if defined (SOLARIS) - if ( policy >= _SCHED_NEXT) - { - /* mfe: pthread_getschedparam on Solaris has a possible Bug */ - /* one gets 959917873 as the policy */ - /* so set the policy to a default one */ - policy=SCHED_OTHER; - } -#endif /* SOLARIS */ - - if ((nRet = sched_get_priority_min(policy) ) != -1) - { - OSL_TRACE("Min Prioriy for policy '%i' == '%i'\n",policy,nRet); - g_thread.m_priority.m_Lowest=nRet; - } -#if OSL_DEBUG_LEVEL > 1 - else - { - fprintf(stderr,"failed to get min sched param [%s]\n",strerror(errno)); - } -#endif /* OSL_DEBUG_LEVEL */ - - if ((nRet = sched_get_priority_max(policy) ) != -1) - { - OSL_TRACE("Max Prioriy for policy '%i' == '%i'\n",policy,nRet); - g_thread.m_priority.m_Highest=nRet; - } -#if OSL_DEBUG_LEVEL > 1 - else - { - fprintf(stderr,"failed to get max sched param [%s]\n",strerror(errno)); - } -#endif /* OSL_DEBUG_LEVEL */ - - g_thread.m_priority.m_Normal = - (g_thread.m_priority.m_Lowest + g_thread.m_priority.m_Highest) / 2; - g_thread.m_priority.m_Below_Normal = - (g_thread.m_priority.m_Lowest + g_thread.m_priority.m_Normal) / 2; - g_thread.m_priority.m_Above_Normal = - (g_thread.m_priority.m_Normal + g_thread.m_priority.m_Highest) / 2; - -/* @@@ set prio of calling (not main) thread (?) @@@ */ - - param.sched_priority= g_thread.m_priority.m_Normal; - - if ((nRet = pthread_setschedparam(pthread_self(), policy, ¶m)) != 0) - { - OSL_TRACE("failed to change base priority of thread [%s]\n",strerror(nRet)); - OSL_TRACE("Thread ID '%i', Policy '%i', Priority '%i'\n",pthread_self(),policy,param.sched_priority); - } - -#endif /* NO_PTHREAD_PRIORITY */ -} - -/*****************************************************************************/ -/* osl_setThreadPriority */ -/* - Impl-Notes: contrary to solaris-docu, which claims - valid priority-levels from 0 .. INT_MAX, only the - range 0..127 is accepted. (0 lowest, 127 highest) -*/ -/*****************************************************************************/ -void SAL_CALL osl_setThreadPriority ( - oslThread Thread, - oslThreadPriority Priority) -{ -#ifndef NO_PTHREAD_PRIORITY - - struct sched_param Param; - int policy; - int nRet; - -#endif /* NO_PTHREAD_PRIORITY */ - - Thread_Impl* pImpl= (Thread_Impl*)Thread; - - OSL_ASSERT(pImpl); - if (!pImpl) - return; /* EINVAL */ - -#ifdef NO_PTHREAD_PRIORITY - (void) Priority; /* unused */ -#else /* NO_PTHREAD_PRIORITY */ - - if (pthread_getschedparam(pImpl->m_hThread, &policy, &Param) != 0) - return; /* ESRCH */ - -#if defined (SOLARIS) - if ( policy >= _SCHED_NEXT) - { - /* mfe: pthread_getschedparam on Solaris has a possible Bug */ - /* one gets 959917873 as the policy */ - /* so set the policy to a default one */ - policy=SCHED_OTHER; - } -#endif /* SOLARIS */ - - pthread_once (&(g_thread.m_once), osl_thread_init_Impl); - - switch(Priority) - { - case osl_Thread_PriorityHighest: - Param.sched_priority= g_thread.m_priority.m_Highest; - break; - - case osl_Thread_PriorityAboveNormal: - Param.sched_priority= g_thread.m_priority.m_Above_Normal; - break; - - case osl_Thread_PriorityNormal: - Param.sched_priority= g_thread.m_priority.m_Normal; - break; - - case osl_Thread_PriorityBelowNormal: - Param.sched_priority= g_thread.m_priority.m_Below_Normal; - break; - - case osl_Thread_PriorityLowest: - Param.sched_priority= g_thread.m_priority.m_Lowest; - break; - - case osl_Thread_PriorityUnknown: - OSL_ASSERT(sal_False); /* only fools try this...*/ - - /* let release-version behave friendly */ - return; - - default: - /* enum expanded, but forgotten here...*/ - OSL_ENSURE(sal_False,"osl_setThreadPriority : unknown priority\n"); - - /* let release-version behave friendly */ - return; - } - - if ((nRet = pthread_setschedparam(pImpl->m_hThread, policy, &Param)) != 0) - { - OSL_TRACE("failed to change thread priority [%s]\n",strerror(nRet)); - } - -#endif /* NO_PTHREAD_PRIORITY */ -} - -/*****************************************************************************/ -/* osl_getThreadPriority */ -/*****************************************************************************/ -oslThreadPriority SAL_CALL osl_getThreadPriority(const oslThread Thread) -{ -#ifndef NO_PTHREAD_PRIORITY - - struct sched_param Param; - int Policy; - -#endif /* NO_PTHREAD_PRIORITY */ - - oslThreadPriority Priority = osl_Thread_PriorityNormal; - Thread_Impl* pImpl= (Thread_Impl*)Thread; - - OSL_ASSERT(pImpl); - if (!pImpl) - return osl_Thread_PriorityUnknown; /* EINVAL */ - -#ifndef NO_PTHREAD_PRIORITY - - if (pthread_getschedparam(pImpl->m_hThread, &Policy, &Param) != 0) - return osl_Thread_PriorityUnknown; /* ESRCH */ - - pthread_once (&(g_thread.m_once), osl_thread_init_Impl); - - /* map pthread priority to enum */ - if (Param.sched_priority==g_thread.m_priority.m_Highest) - { - /* 127 - highest */ - Priority= osl_Thread_PriorityHighest; - } - else if (Param.sched_priority > g_thread.m_priority.m_Normal) - { - /* 65..126 - above normal */ - Priority= osl_Thread_PriorityAboveNormal; - } - else if (Param.sched_priority == g_thread.m_priority.m_Normal) - { - /* normal */ - Priority= osl_Thread_PriorityNormal; - } - else if (Param.sched_priority > g_thread.m_priority.m_Lowest) - { - /* 63..1 -below normal */ - Priority= osl_Thread_PriorityBelowNormal; - } - else if (Param.sched_priority == g_thread.m_priority.m_Lowest) - { - /* 0 - lowest */ - Priority= osl_Thread_PriorityLowest; - } - else - { - /* unknown */ - Priority= osl_Thread_PriorityUnknown; - } - -#endif /* NO_PTHREAD_PRIORITY */ - - return Priority; -} - -typedef struct _wrapper_pthread_key -{ - pthread_key_t m_key; - oslThreadKeyCallbackFunction pfnCallback; -} wrapper_pthread_key; - -/*****************************************************************************/ -/* osl_createThreadKey */ -/*****************************************************************************/ -oslThreadKey SAL_CALL osl_createThreadKey( oslThreadKeyCallbackFunction pCallback ) -{ - wrapper_pthread_key *pKey = (wrapper_pthread_key*)rtl_allocateMemory(sizeof(wrapper_pthread_key)); - - if (pKey) - { - pKey->pfnCallback = pCallback; - - if (pthread_key_create(&(pKey->m_key), pKey->pfnCallback) != 0) - { - rtl_freeMemory(pKey); - pKey = 0; - } - } - - return ((oslThreadKey)pKey); -} - -/*****************************************************************************/ -/* osl_destroyThreadKey */ -/*****************************************************************************/ -void SAL_CALL osl_destroyThreadKey(oslThreadKey Key) -{ - wrapper_pthread_key *pKey = (wrapper_pthread_key*)Key; - if (pKey) - { - pthread_key_delete(pKey->m_key); - rtl_freeMemory(pKey); - } -} - -/*****************************************************************************/ -/* osl_getThreadKeyData */ -/*****************************************************************************/ -void* SAL_CALL osl_getThreadKeyData(oslThreadKey Key) -{ - wrapper_pthread_key *pKey = (wrapper_pthread_key*)Key; - return pKey ? pthread_getspecific(pKey->m_key) : NULL; -} - -/*****************************************************************************/ -/* osl_setThreadKeyData */ -/*****************************************************************************/ -sal_Bool SAL_CALL osl_setThreadKeyData(oslThreadKey Key, void *pData) -{ - sal_Bool bRet; - void *pOldData = NULL; - wrapper_pthread_key *pKey = (wrapper_pthread_key*)Key; - if (!pKey) - return sal_False; - - if (pKey->pfnCallback) - pOldData = pthread_getspecific(pKey->m_key); - - bRet = (pthread_setspecific(pKey->m_key, pData) == 0); - - if (bRet && pKey->pfnCallback && pOldData) - pKey->pfnCallback(pOldData); - - return bRet; -} - -/*****************************************************************************/ -/* Thread Local Text Encoding */ -/*****************************************************************************/ -static void osl_thread_textencoding_init_Impl (void) -{ - rtl_TextEncoding defaultEncoding; - const char * pszEncoding; - - /* create thread specific data key */ - pthread_key_create (&(g_thread.m_textencoding.m_key), NULL); - - /* determine default text encoding */ - pszEncoding = getenv ("SOLAR_USER_RTL_TEXTENCODING"); - if (pszEncoding) - defaultEncoding = atoi(pszEncoding); - else - defaultEncoding = osl_getTextEncodingFromLocale(NULL); - - OSL_ASSERT(defaultEncoding != RTL_TEXTENCODING_DONTKNOW); - - /* - Tools string functions call abort() on an unknown encoding so ASCII - is a meaningfull fallback regardless wether the assertion makes sense. - */ - - if ( RTL_TEXTENCODING_DONTKNOW == defaultEncoding ) - defaultEncoding = RTL_TEXTENCODING_ASCII_US; - - g_thread.m_textencoding.m_default = defaultEncoding; -} - -/*****************************************************************************/ -/* osl_getThreadTextEncoding */ -/*****************************************************************************/ -rtl_TextEncoding SAL_CALL osl_getThreadTextEncoding() -{ - rtl_TextEncoding threadEncoding; - - pthread_once (&(g_thread.m_once), osl_thread_init_Impl); - - /* check for thread specific encoding, use default if not set */ - threadEncoding = SAL_INT_CAST( - rtl_TextEncoding, - (sal_uIntPtr) pthread_getspecific(g_thread.m_textencoding.m_key)); - if (0 == threadEncoding) - threadEncoding = g_thread.m_textencoding.m_default; - - return threadEncoding; -} - -/*****************************************************************************/ -/* osl_setThreadTextEncoding */ -/*****************************************************************************/ -rtl_TextEncoding osl_setThreadTextEncoding(rtl_TextEncoding Encoding) -{ - rtl_TextEncoding oldThreadEncoding = osl_getThreadTextEncoding(); - - /* save encoding in thread local storage */ - pthread_setspecific ( - g_thread.m_textencoding.m_key, - (void*) SAL_INT_CAST(sal_uIntPtr, Encoding)); - - return oldThreadEncoding; -} - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sal/osl/unx/time.c b/sal/osl/unx/time.c deleted file mode 100644 index 59f09d8d9..000000000 --- a/sal/osl/unx/time.c +++ /dev/null @@ -1,273 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2000, 2010 Oracle and/or its affiliates. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * <http://www.openoffice.org/license.html> - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - - -#include "system.h" - -#include <osl/diagnose.h> -#include <osl/time.h> - -/* FIXME: detection should be done in configure script */ -#if defined(MACOSX) || defined(FREEBSD) || defined(NETBSD) || \ - defined(LINUX) || defined(OPENBSD) || defined(DRAGONFLY) -#define STRUCT_TM_HAS_GMTOFF 1 - -#elif defined(SOLARIS) -#define HAS_ALTZONE 1 -#endif - -/*-------------------------------------------------- - * osl_getSystemTime - *-------------------------------------------------*/ - -sal_Bool SAL_CALL osl_getSystemTime(TimeValue* TimeValue) -{ - struct timeval tp; - - /* FIXME: use higher resolution */ - gettimeofday(&tp, NULL); - - TimeValue->Seconds = tp.tv_sec; - TimeValue->Nanosec = tp.tv_usec * 1000; - - return (sal_True); -} - - -/*-------------------------------------------------- - * osl_getDateTimeFromTimeValue - *-------------------------------------------------*/ - -sal_Bool SAL_CALL osl_getDateTimeFromTimeValue( TimeValue* pTimeVal, oslDateTime* pDateTime ) -{ - struct tm *pSystemTime; - struct tm tmBuf; - time_t atime; - - atime = (time_t)pTimeVal->Seconds; - - /* Convert time from type time_t to struct tm */ - pSystemTime = gmtime_r( &atime, &tmBuf ); - - - /* Convert struct tm to struct oslDateTime */ - if ( pSystemTime != NULL ) - { - pDateTime->NanoSeconds = pTimeVal->Nanosec; - pDateTime->Seconds = pSystemTime->tm_sec; - pDateTime->Minutes = pSystemTime->tm_min; - pDateTime->Hours = pSystemTime->tm_hour; - pDateTime->Day = pSystemTime->tm_mday; - pDateTime->DayOfWeek = pSystemTime->tm_wday; - pDateTime->Month = pSystemTime->tm_mon + 1; - pDateTime->Year = pSystemTime->tm_year + 1900; - - return sal_True; - } - - return sal_False; -} - -/*-------------------------------------------------- - * osl_getTimeValueFromDateTime - *--------------------------------------------------*/ - -sal_Bool SAL_CALL osl_getTimeValueFromDateTime( oslDateTime* pDateTime, TimeValue* pTimeVal ) -{ - struct tm aTime; - time_t nSeconds; - - /* Convert struct oslDateTime to struct tm */ - aTime.tm_sec = pDateTime->Seconds; - aTime.tm_min = pDateTime->Minutes; - aTime.tm_hour = pDateTime->Hours; - aTime.tm_mday = pDateTime->Day; - aTime.tm_wday = pDateTime->DayOfWeek; - - if ( pDateTime->Month > 0 ) - aTime.tm_mon = pDateTime->Month - 1; - else - return sal_False; - - if ( pDateTime->Year >= 1900 ) - aTime.tm_year = pDateTime->Year - 1900; - else - return sal_False; - - aTime.tm_isdst = -1; - aTime.tm_wday = 0; - aTime.tm_yday = 0; - - /* Convert time to calendar value */ - nSeconds = mktime( &aTime ); - - /* - * mktime expects the struct tm to be in local timezone, so we have to adjust - * the returned value to be timezone neutral. - */ - - if ( nSeconds != (time_t) -1 ) - { - time_t bias; - - /* timezone corrections */ - tzset(); - -#if defined(STRUCT_TM_HAS_GMTOFF) - /* members of struct tm are corrected by mktime */ - bias = 0 - aTime.tm_gmtoff; - -#elif defined(HAS_ALTZONE) - /* check if daylight saving time is in effect */ - bias = aTime.tm_isdst > 0 ? altzone : timezone; -#else - /* exspect daylight saving time to be one hour */ - bias = aTime.tm_isdst > 0 ? timezone - 3600 : timezone; -#endif - - pTimeVal->Seconds = nSeconds; - pTimeVal->Nanosec = pDateTime->NanoSeconds; - - if ( nSeconds > bias ) - pTimeVal->Seconds -= bias; - - return sal_True; - } - - return sal_False; -} - - -/*-------------------------------------------------- - * osl_getLocalTimeFromSystemTime - *--------------------------------------------------*/ - -sal_Bool SAL_CALL osl_getLocalTimeFromSystemTime( TimeValue* pSystemTimeVal, TimeValue* pLocalTimeVal ) -{ - struct tm *pLocalTime; - struct tm tmBuf; - time_t bias; - time_t atime; - - atime = (time_t) pSystemTimeVal->Seconds; - pLocalTime = localtime_r( &atime, &tmBuf ); - -#if defined(STRUCT_TM_HAS_GMTOFF) - /* members of struct tm are corrected by mktime */ - bias = 0 - pLocalTime->tm_gmtoff; - -#elif defined(HAS_ALTZONE) - /* check if daylight saving time is in effect */ - bias = pLocalTime->tm_isdst > 0 ? altzone : timezone; -#else - /* exspect daylight saving time to be one hour */ - bias = pLocalTime->tm_isdst > 0 ? timezone - 3600 : timezone; -#endif - - if ( (sal_Int64) pSystemTimeVal->Seconds > bias ) - { - pLocalTimeVal->Seconds = pSystemTimeVal->Seconds - bias; - pLocalTimeVal->Nanosec = pSystemTimeVal->Nanosec; - - return sal_True; - } - - return sal_False; -} - -/*-------------------------------------------------- - * osl_getSystemTimeFromLocalTime - *--------------------------------------------------*/ - -sal_Bool SAL_CALL osl_getSystemTimeFromLocalTime( TimeValue* pLocalTimeVal, TimeValue* pSystemTimeVal ) -{ - struct tm *pLocalTime; - struct tm tmBuf; - time_t bias; - time_t atime; - - atime = (time_t) pLocalTimeVal->Seconds; - - /* Convert atime, which is a local time, to it's GMT equivalent. Then, get - * the timezone offset for the local time for the GMT equivalent time. Note - * that we cannot directly use local time to determine the timezone offset - * because GMT is the only reliable time that we can determine timezone - * offset from. - */ - - atime = mktime( gmtime_r( &atime, &tmBuf ) ); - pLocalTime = localtime_r( &atime, &tmBuf ); - -#if defined(STRUCT_TM_HAS_GMTOFF) - /* members of struct tm are corrected by mktime */ - bias = 0 - pLocalTime->tm_gmtoff; - -#elif defined(HAS_ALTZONE) - /* check if daylight saving time is in effect */ - bias = pLocalTime->tm_isdst > 0 ? altzone : timezone; -#else - /* exspect daylight saving time to be one hour */ - bias = pLocalTime->tm_isdst > 0 ? timezone - 3600 : timezone; -#endif - - if ( (sal_Int64) pLocalTimeVal->Seconds + bias > 0 ) - { - pSystemTimeVal->Seconds = pLocalTimeVal->Seconds + bias; - pSystemTimeVal->Nanosec = pLocalTimeVal->Nanosec; - - return sal_True; - } - - return sal_False; -} - - - -static struct timeval startTime; -static sal_Bool bGlobalTimer = sal_False; - -sal_uInt32 SAL_CALL osl_getGlobalTimer() -{ - struct timeval currentTime; - sal_uInt32 nSeconds; - - // FIXME: not thread safe !! - if ( bGlobalTimer == sal_False ) - { - gettimeofday( &startTime, NULL ); - bGlobalTimer=sal_True; - } - - gettimeofday( ¤tTime, NULL ); - - nSeconds = (sal_uInt32)( currentTime.tv_sec - startTime.tv_sec ); - - return ( nSeconds * 1000 ) + (long) (( currentTime.tv_usec - startTime.tv_usec) / 1000 ); -} - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sal/osl/unx/util.c b/sal/osl/unx/util.c deleted file mode 100644 index fe68c480d..000000000 --- a/sal/osl/unx/util.c +++ /dev/null @@ -1,349 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2000, 2010 Oracle and/or its affiliates. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * <http://www.openoffice.org/license.html> - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - - -#include <unistd.h> -#include <errno.h> -#include <stdio.h> -#include <string.h> -#include <sys/ioctl.h> -#include <sys/socket.h> -#include <net/if.h> - -#ifdef SOLARIS -#include <sys/sockio.h> -#endif - -#include "osl/util.h" -#include "osl/diagnose.h" - - -/*****************************************************************************/ -/* Static Module Functions */ -/*****************************************************************************/ - -static int osl_getHWAddr(const char *ifname, char* hard_addr); -static int osl_checkAddr(const char* addr); - - -/*****************************************************************************/ -/* osl_getEthernetAddress */ -/*****************************************************************************/ - -sal_Bool SAL_CALL osl_getEthernetAddress( sal_uInt8 * pAddr ) -{ -#ifdef SOLARIS - /** algorithm doesn't work on solaris */ - return sal_False; -#else - char buff[1024]; - char hard_addr[64]; - struct ifconf ifc; - struct ifreq *ifr; - int i; - int so; - - if ( pAddr == 0 ) - { - return sal_False; - } - - - /* - * All we need is ... a network file descriptor. - * Normally, this is a very socket. - */ - - so = socket(AF_INET, SOCK_DGRAM, 0); - - - /* - * The first thing we have to do, get the interface configuration. - * It is a list of attached/configured interfaces - */ - - ifc.ifc_len = sizeof(buff); - ifc.ifc_buf = buff; - if ( ioctl(so, SIOCGIFCONF, &ifc) < 0 ) - { - OSL_TRACE( "SIOCGIFCONF: %s\n", strerror(errno) ); - close(so); - return sal_False; - } - - close(so); - - /* - * For each of the interfaces in the interface list, - * try to get the hardware address - */ - - ifr = ifc.ifc_req; - for ( i = ifc.ifc_len / sizeof(struct ifreq) ; --i >= 0 ; ifr++ ) - { - int nRet=0; - nRet = osl_getHWAddr(ifr->ifr_name,hard_addr); - if ( nRet > 0 ) - { - memcpy( pAddr , hard_addr, 6 ); - return sal_True; - } - } - - return sal_False; -#endif -} - - -/*****************************************************************************/ -/* osl_getHWAddr */ -/*****************************************************************************/ - -static int osl_getHWAddr(const char *ifname, char* hard_addr) -{ - int ret=0; - struct ifreq ifr; - int so = socket(AF_INET, SOCK_DGRAM, 0); - - strcpy(ifr.ifr_name, ifname); - - /* - * First, get the Interface-FLAGS - */ - - ret=ioctl(so, SIOCGIFFLAGS, &ifr) ; - - if ( ret < 0 ) - { - OSL_TRACE( "SIOCGIFFLAGS: %s\n", strerror(errno) ); - close(so); - return ret; - } - - - /* - * If it is the loopback device, do not consider it any further - */ - - if (ifr.ifr_flags & IFF_LOOPBACK) - { - OSL_TRACE( "SIOCGIFFLAGS : is LOOPBACK : %s\n", strerror(errno) ); - close(so); - return 0; - } - - - /* - * And now, the real thing: the get address - */ - -#if defined(SIOCGIFHWADDR) && !defined(SOLARIS) - ret=ioctl(so, SIOCGIFHWADDR, &ifr); -#else - ret=ioctl(so, SIOCGIFADDR, &ifr); -#endif - - if (ret < 0) { - OSL_TRACE( "SIOCGIFADDR: %s\n", strerror(errno) ); - memset(hard_addr, 0, 32); - close(so); - return ret; - } - - close(so); - -#if defined(SIOCGIFHWADDR) && !defined(SOLARIS) - memcpy(hard_addr,ifr.ifr_hwaddr.sa_data,8); -#else - memcpy(hard_addr,ifr.ifr_ifru.ifru_addr.sa_data,8); -#endif - - - /* - * Check, if no real, i.e. 00:00:00:00:00:00, address was retrieved. - * The Linux dummy device has this kind of behaviour - */ - - ret=osl_checkAddr(hard_addr); - - if (ret < 0) { - OSL_TRACE( "SIOCGIFADDR got '00:00:00:00:00:00'\n" ); - return ret; - } - - return 1; -} - - -/*****************************************************************************/ -/* osl_checkAddr */ -/*****************************************************************************/ - -static int osl_checkAddr(const char* addr) -{ - if (addr[0]==0 && addr[1]==0 && - addr[2]==0 && addr[3]==0 && - addr[4]==0 && addr[5]==0) - { - return -1; - } - return 0; -} - - -#if defined (SPARC) - -#if defined (SOLARIS) && !defined(__sparcv8plus) && !defined(__sparcv9) -#include <sys/types.h> -#include <sys/processor.h> - -/*****************************************************************************/ -/* osl_InitSparcV9 */ -/*****************************************************************************/ - -void osl_InterlockedCountSetV9(sal_Bool bV9); - -/* - * osl_InitSparcV9() should be executed as early as possible. We place it in the - * .init section of sal - */ -#if defined ( __SUNPRO_C ) || defined ( __SUNPRO_CC ) -void osl_InitSparcV9(void); -#pragma init (osl_InitSparcV9) -#elif defined ( __GNUC__ ) -void osl_InitSparcV9(void) __attribute__((constructor)); -#endif - -void osl_InitSparcV9(void) -{ - /* processor_info() identifies SPARCV8 (ie sun4c machines) simply as "sparc" - * and SPARCV9 (ie ultra sparcs, sun4u) as "sparcv9". Since we know that we - * run at least on a SPARCV8 architecture or better, any processor type != "sparc" - * and != "i386" is considered to be SPARCV9 or better - * - * This way we are certain that this will still work if someone names SPARCV10 - * "foobar" - */ - processor_info_t aInfo; - int rc; - - rc = processor_info(0, &aInfo); - - if ( rc != -1 ) { - if ( !strcmp( "sparc", aInfo.pi_processor_type ) /* SPARCV8 */ - || !strcmp( "i386", aInfo.pi_processor_type ) ) /* can't happen, but ... */ - return; - /* we are reasonably certain to be on sparcv9/sparcv8plus or better */ - osl_InterlockedCountSetV9(sal_True); - } -} - -#endif /* SOLARIS */ - -#if defined(NETBSD) && defined(GCC) && !defined(__sparcv9) && !defined(__sparc_v9__) - -#include <sys/param.h> -#include <sys/sysctl.h> -void osl_InitSparcV9(void) __attribute__((constructor)); -void osl_InterlockedCountSetV9(sal_Bool bV9); - -/* Determine which processor we are running on (sparc v8 or v9) - * The approach is very similar to Solaris. - */ - -void osl_InitSparcV9(void) -{ - int mib[2]={CTL_HW,HW_MACHINE}; - char processorname[256]; - size_t len=256; - - /* get the machine name */ - sysctl(mib, 2, processorname, &len, NULL, 0); - if (!strncmp("sparc64",processorname, len)) { - osl_InterlockedCountSetV9(sal_True); - } -} - -#endif /* NETBSD */ - -#endif /* SPARC */ - -#if defined ( LINUX ) && defined ( SPARC ) -#include <sys/utsname.h> -void osl_InitSparcV9(void) __attribute__((constructor)); -void osl_InterlockedCountSetV9(sal_Bool bV9); -/* Determine which processor we are running on (sparc v8 or v9) - * The approach is very similar to Solaris. - */ -void osl_InitSparcV9(void) -{ - struct utsname name; - int rc; - rc = uname(&name); - if ( rc != -1 ) { - if ( !strcmp( "sparc", name.machine )) - return; - osl_InterlockedCountSetV9(sal_True); - } -} -#endif - -#if ( defined(__GNUC__) && (defined(X86) || defined(X86_64)) )\ - || ( defined(SOLARIS) && defined (__SUNPRO_C) && defined(__i386) ) - -/* Safe default */ -int osl_isSingleCPU = 0; - -/* Determine if we are on a multiprocessor/multicore/HT x86/x64 system - * - * The lock prefix for atomic operations in osl_[inc|de]crementInterlockedCount() - * comes with a cost and is especially expensive on pre HT x86 single processor - * systems, where it isn't needed at all. - * - * This should be run as early as possible, thus it's placed in the init section - */ -#if defined(_SC_NPROCESSORS_CONF) /* i.e. MACOSX for Intel doesn't have this */ -#if defined(__GNUC__) -void osl_interlockedCountCheckForSingleCPU(void) __attribute__((constructor)); -#elif defined(__SUNPRO_C) -void osl_interlockedCountCheckForSingleCPU(void); -#pragma init (osl_interlockedCountCheckForSingleCPU) -#endif - -void osl_interlockedCountCheckForSingleCPU(void) -{ - /* In case sysconfig fails be on the safe side, - * consider it a multiprocessor/multicore/HT system */ - if ( sysconf(_SC_NPROCESSORS_CONF) == 1 ) { - osl_isSingleCPU = 1; - } -} -#endif /* defined(_SC_NPROCESSORS_CONF) */ -#endif - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sal/osl/unx/uunxapi.cxx b/sal/osl/unx/uunxapi.cxx deleted file mode 100644 index 572f7a9ec..000000000 --- a/sal/osl/unx/uunxapi.cxx +++ /dev/null @@ -1,133 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2000, 2010 Oracle and/or its affiliates. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * <http://www.openoffice.org/license.html> - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -// MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_sal.hxx" - - #ifndef _OSL_UUNXAPI_H_ - #include "uunxapi.h" - #endif - - #ifndef __OSL_SYSTEM_H__ - #include "system.h" - #endif - - #ifndef _LIMITS_H - #include <limits.h> - #endif - - #ifndef _RTL_USTRING_HXX_ - #include <rtl/ustring.hxx> - #endif - - #ifndef _OSL_THREAD_H_ - #include <osl/thread.h> - #endif - - //########################### - inline rtl::OString OUStringToOString(const rtl_uString* s) - { - return rtl::OUStringToOString( - rtl::OUString(const_cast<rtl_uString*>(s)), - osl_getThreadTextEncoding()); - } - - //########################### -#ifdef MACOSX -/* - * Helper function for resolving Mac native alias files (not the same as unix alias files) - * and to return the resolved alias as rtl::OString - */ - inline rtl::OString macxp_resolveAliasAndConvert(const rtl_uString* s) - { - rtl::OString p = OUStringToOString(s); - sal_Char path[PATH_MAX]; - if (p.getLength() < PATH_MAX) - { - strcpy(path, p.getStr()); - macxp_resolveAlias(path, PATH_MAX); - p = rtl::OString(path); - } - return p; - } -#endif /* MACOSX */ - - //########################### - //access_u - int access_u(const rtl_uString* pustrPath, int mode) - { -#ifndef MACOSX // not MACOSX - return access(OUStringToOString(pustrPath).getStr(), mode); -#else - return access(macxp_resolveAliasAndConvert(pustrPath).getStr(), mode); -#endif - } - - //######################### - //realpath_u - sal_Bool realpath_u(const rtl_uString* pustrFileName, rtl_uString** ppustrResolvedName) - { -#ifndef MACOSX // not MACOSX - rtl::OString fn = OUStringToOString(pustrFileName); -#else - rtl::OString fn = macxp_resolveAliasAndConvert(pustrFileName); -#endif - char rp[PATH_MAX]; - bool bRet = realpath(fn.getStr(), rp); - - if (bRet) - { - rtl::OUString resolved = rtl::OStringToOUString( - rtl::OString(static_cast<sal_Char*>(rp)), - osl_getThreadTextEncoding()); - - rtl_uString_assign(ppustrResolvedName, resolved.pData); - } - return bRet; - } - - //######################### - //lstat_u - int lstat_u(const rtl_uString* pustrPath, struct stat* buf) - { -#ifndef MACOSX // not MACOSX - return lstat(OUStringToOString(pustrPath).getStr(), buf); -#else - return lstat(macxp_resolveAliasAndConvert(pustrPath).getStr(), buf); -#endif - } - - //######################### - // @see mkdir - int mkdir_u(const rtl_uString* path, mode_t mode) - { - return mkdir(OUStringToOString(path).getStr(), mode); - } - - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sal/osl/unx/uunxapi.h b/sal/osl/unx/uunxapi.h deleted file mode 100644 index 1082a3e7a..000000000 --- a/sal/osl/unx/uunxapi.h +++ /dev/null @@ -1,89 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2000, 2010 Oracle and/or its affiliates. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * <http://www.openoffice.org/license.html> - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - - #ifndef _OSL_UUNXAPI_H_ - #define _OSL_UUNXAPI_H_ - - #ifndef _UNISTD_H - #include <unistd.h> - #endif - - #ifndef _STDLIB_H - #include <stdlib.h> - #endif - - #ifndef _TYPES_H - #include <sys/types.h> - #endif - - #ifndef _STAT_H - #include <sys/stat.h> - #endif - - #ifndef _RTL_USTRING_H_ - #include <rtl/ustring.h> - #endif - - - #ifdef __cplusplus - extern "C" - { - #endif - - /* @see access */ - int access_u(const rtl_uString* pustrPath, int mode); - - /*********************************** - @descr - The return value differs from the - realpath function - - @returns sal_True on success else - sal_False - - @see realpath - **********************************/ - sal_Bool realpath_u( - const rtl_uString* pustrFileName, - rtl_uString** ppustrResolvedName); - - /* @see lstat */ - int lstat_u(const rtl_uString* pustrPath, struct stat* buf); - - /* @see mkdir */ - int mkdir_u(const rtl_uString* path, mode_t mode); - - #ifdef __cplusplus - } - #endif - - - #endif /* _OSL_UUNXAPI_H_ */ - - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sal/osl/unx/uunxapi.hxx b/sal/osl/unx/uunxapi.hxx deleted file mode 100644 index 5886d11e8..000000000 --- a/sal/osl/unx/uunxapi.hxx +++ /dev/null @@ -1,101 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2000, 2010 Oracle and/or its affiliates. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * <http://www.openoffice.org/license.html> - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - - #ifndef _OSL_UUNXAPI_HXX_ - #define _OSL_UUNXAPI_HXX_ - - #ifndef _OSL_UUNXAPI_H_ - #include "uunxapi.h" - #endif - - #ifndef _RTL_USTRING_HXX_ - #include <rtl/ustring.hxx> - #endif - - namespace osl - { - - /*********************************** - osl::access - - @see access - **********************************/ - - inline int access(const rtl::OUString& ustrPath, int mode) - { - return access_u(ustrPath.pData, mode); - } - - /*********************************** - osl::realpath - - @descr - The return value differs from the - realpath function - - @returns sal_True on success else - sal_False - - @see realpath - **********************************/ - - inline sal_Bool realpath( - const rtl::OUString& ustrFileName, - rtl::OUString& ustrResolvedName) - { - return realpath_u(ustrFileName.pData, &ustrResolvedName.pData); - } - - - /*********************************** - osl::lstat - - @see lstat - **********************************/ - - inline int lstat(const rtl::OUString& ustrPath, struct stat& buf) - { - return lstat_u(ustrPath.pData, &buf); - } - - /*********************************** - osl::mkdir - @see mkdir - **********************************/ - inline int mkdir(const rtl::OUString& aPath, mode_t aMode) - { - return mkdir_u(aPath.pData, aMode); - } - - } // end namespace osl - - - #endif /* _OSL_UUNXAPI_HXX_ */ - - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |