1251875Speter/* Licensed to the Apache Software Foundation (ASF) under one or more 2251875Speter * contributor license agreements. See the NOTICE file distributed with 3251875Speter * this work for additional information regarding copyright ownership. 4251875Speter * The ASF licenses this file to You under the Apache License, Version 2.0 5251875Speter * (the "License"); you may not use this file except in compliance with 6251875Speter * the License. You may obtain a copy of the License at 7251875Speter * 8251875Speter * http://www.apache.org/licenses/LICENSE-2.0 9251875Speter * 10251875Speter * Unless required by applicable law or agreed to in writing, software 11251875Speter * distributed under the License is distributed on an "AS IS" BASIS, 12251875Speter * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13251875Speter * See the License for the specific language governing permissions and 14251875Speter * limitations under the License. 15251875Speter */ 16251875Speter 17251875Speter/* This header file is where you should put ANY platform specific information. 18251875Speter * This should be the only header file that programs need to include that 19251875Speter * actually has platform dependent code which refers to the . 20251875Speter */ 21251875Speter#ifndef APR_PORTABLE_H 22251875Speter#define APR_PORTABLE_H 23251875Speter/** 24251875Speter * @file apr_portable.h 25251875Speter * @brief APR Portability Routines 26251875Speter */ 27251875Speter 28251875Speter#include "apr.h" 29251875Speter#include "apr_pools.h" 30251875Speter#include "apr_thread_proc.h" 31251875Speter#include "apr_file_io.h" 32251875Speter#include "apr_network_io.h" 33251875Speter#include "apr_errno.h" 34251875Speter#include "apr_global_mutex.h" 35251875Speter#include "apr_proc_mutex.h" 36251875Speter#include "apr_time.h" 37251875Speter#include "apr_dso.h" 38251875Speter#include "apr_shm.h" 39251875Speter 40251875Speter#if APR_HAVE_DIRENT_H 41251875Speter#include <dirent.h> 42251875Speter#endif 43251875Speter#if APR_HAVE_FCNTL_H 44251875Speter#include <fcntl.h> 45251875Speter#endif 46251875Speter#if APR_HAVE_PTHREAD_H 47251875Speter#include <pthread.h> 48251875Speter#endif 49251875Speter 50251875Speter#ifdef __cplusplus 51251875Speterextern "C" { 52251875Speter#endif /* __cplusplus */ 53251875Speter 54251875Speter/** 55251875Speter * @defgroup apr_portabile Portability Routines 56251875Speter * @ingroup APR 57251875Speter * @{ 58251875Speter */ 59251875Speter 60251875Speter#ifdef WIN32 61251875Speter/* The primitives for Windows types */ 62251875Spetertypedef HANDLE apr_os_file_t; 63251875Spetertypedef HANDLE apr_os_dir_t; 64251875Spetertypedef SOCKET apr_os_sock_t; 65251875Spetertypedef HANDLE apr_os_proc_mutex_t; 66251875Spetertypedef HANDLE apr_os_thread_t; 67251875Spetertypedef HANDLE apr_os_proc_t; 68251875Spetertypedef DWORD apr_os_threadkey_t; 69251875Spetertypedef FILETIME apr_os_imp_time_t; 70251875Spetertypedef SYSTEMTIME apr_os_exp_time_t; 71251875Spetertypedef HANDLE apr_os_dso_handle_t; 72251875Spetertypedef HANDLE apr_os_shm_t; 73251875Speter 74251875Speter#elif defined(OS2) 75251875Spetertypedef HFILE apr_os_file_t; 76251875Spetertypedef HDIR apr_os_dir_t; 77251875Spetertypedef int apr_os_sock_t; 78251875Spetertypedef HMTX apr_os_proc_mutex_t; 79251875Spetertypedef TID apr_os_thread_t; 80251875Spetertypedef PID apr_os_proc_t; 81251875Spetertypedef PULONG apr_os_threadkey_t; 82251875Spetertypedef struct timeval apr_os_imp_time_t; 83251875Spetertypedef struct tm apr_os_exp_time_t; 84251875Spetertypedef HMODULE apr_os_dso_handle_t; 85251875Spetertypedef void* apr_os_shm_t; 86251875Speter 87251875Speter#elif defined(__BEOS__) 88251875Speter#include <kernel/OS.h> 89251875Speter#include <kernel/image.h> 90251875Speter 91251875Speterstruct apr_os_proc_mutex_t { 92251875Speter sem_id sem; 93251875Speter int32 ben; 94251875Speter}; 95251875Speter 96251875Spetertypedef int apr_os_file_t; 97251875Spetertypedef DIR apr_os_dir_t; 98251875Spetertypedef int apr_os_sock_t; 99251875Spetertypedef struct apr_os_proc_mutex_t apr_os_proc_mutex_t; 100251875Spetertypedef thread_id apr_os_thread_t; 101251875Spetertypedef thread_id apr_os_proc_t; 102251875Spetertypedef int apr_os_threadkey_t; 103251875Spetertypedef struct timeval apr_os_imp_time_t; 104251875Spetertypedef struct tm apr_os_exp_time_t; 105251875Spetertypedef image_id apr_os_dso_handle_t; 106251875Spetertypedef void* apr_os_shm_t; 107251875Speter 108251875Speter#elif defined(NETWARE) 109251875Spetertypedef int apr_os_file_t; 110251875Spetertypedef DIR apr_os_dir_t; 111251875Spetertypedef int apr_os_sock_t; 112251875Spetertypedef NXMutex_t apr_os_proc_mutex_t; 113251875Spetertypedef NXThreadId_t apr_os_thread_t; 114251875Spetertypedef long apr_os_proc_t; 115251875Spetertypedef NXKey_t apr_os_threadkey_t; 116251875Spetertypedef struct timeval apr_os_imp_time_t; 117251875Spetertypedef struct tm apr_os_exp_time_t; 118251875Spetertypedef void * apr_os_dso_handle_t; 119251875Spetertypedef void* apr_os_shm_t; 120251875Speter 121251875Speter#else 122251875Speter/* Any other OS should go above this one. This is the lowest common 123251875Speter * denominator typedefs for all UNIX-like systems. :) 124251875Speter */ 125251875Speter 126251875Speter/** Basic OS process mutex structure. */ 127251875Speterstruct apr_os_proc_mutex_t { 128251875Speter#if APR_HAS_SYSVSEM_SERIALIZE || APR_HAS_FCNTL_SERIALIZE || APR_HAS_FLOCK_SERIALIZE 129251875Speter /** Value used for SYS V Semaphore, FCNTL and FLOCK serialization */ 130251875Speter int crossproc; 131251875Speter#endif 132251875Speter#if APR_HAS_PROC_PTHREAD_SERIALIZE 133251875Speter /** Value used for PTHREAD serialization */ 134251875Speter pthread_mutex_t *pthread_interproc; 135251875Speter#endif 136251875Speter#if APR_HAS_THREADS 137251875Speter /* If no threads, no need for thread locks */ 138251875Speter#if APR_USE_PTHREAD_SERIALIZE 139251875Speter /** This value is currently unused within APR and Apache */ 140251875Speter pthread_mutex_t *intraproc; 141251875Speter#endif 142251875Speter#endif 143251875Speter}; 144251875Speter 145251875Spetertypedef int apr_os_file_t; /**< native file */ 146251875Spetertypedef DIR apr_os_dir_t; /**< native dir */ 147251875Spetertypedef int apr_os_sock_t; /**< native dir */ 148251875Spetertypedef struct apr_os_proc_mutex_t apr_os_proc_mutex_t; /**< native process 149251875Speter * mutex 150251875Speter */ 151251875Speter#if APR_HAS_THREADS && APR_HAVE_PTHREAD_H 152251875Spetertypedef pthread_t apr_os_thread_t; /**< native thread */ 153251875Spetertypedef pthread_key_t apr_os_threadkey_t; /**< native thread address 154251875Speter * space */ 155251875Speter#endif 156251875Spetertypedef pid_t apr_os_proc_t; /**< native pid */ 157251875Spetertypedef struct timeval apr_os_imp_time_t; /**< native timeval */ 158251875Spetertypedef struct tm apr_os_exp_time_t; /**< native tm */ 159251875Speter/** @var apr_os_dso_handle_t 160251875Speter * native dso types 161251875Speter */ 162251875Speter#if defined(HPUX) || defined(HPUX10) || defined(HPUX11) 163251875Speter#include <dl.h> 164251875Spetertypedef shl_t apr_os_dso_handle_t; 165251875Speter#elif defined(DARWIN) 166251875Speter#include <mach-o/dyld.h> 167251875Spetertypedef NSModule apr_os_dso_handle_t; 168251875Speter#else 169251875Spetertypedef void * apr_os_dso_handle_t; 170251875Speter#endif 171251875Spetertypedef void* apr_os_shm_t; /**< native SHM */ 172251875Speter 173251875Speter#endif 174251875Speter 175251875Speter/** 176251875Speter * @typedef apr_os_sock_info_t 177251875Speter * @brief alias for local OS socket 178251875Speter */ 179251875Speter/** 180251875Speter * everything APR needs to know about an active socket to construct 181251875Speter * an APR socket from it; currently, this is platform-independent 182251875Speter */ 183251875Speterstruct apr_os_sock_info_t { 184251875Speter apr_os_sock_t *os_sock; /**< always required */ 185251875Speter struct sockaddr *local; /**< NULL if not yet bound */ 186251875Speter struct sockaddr *remote; /**< NULL if not connected */ 187251875Speter int family; /**< always required (APR_INET, APR_INET6, etc.) */ 188251875Speter int type; /**< always required (SOCK_STREAM, SOCK_DGRAM, etc.) */ 189251875Speter int protocol; /**< 0 or actual protocol (APR_PROTO_SCTP, APR_PROTO_TCP, etc.) */ 190251875Speter}; 191251875Speter 192251875Spetertypedef struct apr_os_sock_info_t apr_os_sock_info_t; 193251875Speter 194251875Speter#if APR_PROC_MUTEX_IS_GLOBAL || defined(DOXYGEN) 195251875Speter/** Opaque global mutex type */ 196251875Speter#define apr_os_global_mutex_t apr_os_proc_mutex_t 197251875Speter/** @return apr_os_global_mutex */ 198251875Speter#define apr_os_global_mutex_get apr_os_proc_mutex_get 199251875Speter#else 200251875Speter /** Thread and process mutex for those platforms where process mutexes 201251875Speter * are not held in threads. 202251875Speter */ 203251875Speter struct apr_os_global_mutex_t { 204251875Speter apr_pool_t *pool; 205251875Speter apr_proc_mutex_t *proc_mutex; 206251875Speter#if APR_HAS_THREADS 207251875Speter apr_thread_mutex_t *thread_mutex; 208251875Speter#endif /* APR_HAS_THREADS */ 209251875Speter }; 210251875Speter typedef struct apr_os_global_mutex_t apr_os_global_mutex_t; 211251875Speter 212251875SpeterAPR_DECLARE(apr_status_t) apr_os_global_mutex_get(apr_os_global_mutex_t *ospmutex, 213251875Speter apr_global_mutex_t *pmutex); 214251875Speter#endif 215251875Speter 216251875Speter 217251875Speter/** 218251875Speter * convert the file from apr type to os specific type. 219251875Speter * @param thefile The os specific file we are converting to 220251875Speter * @param file The apr file to convert. 221251875Speter * @remark On Unix, it is only possible to get a file descriptor from 222251875Speter * an apr file type. 223251875Speter */ 224251875SpeterAPR_DECLARE(apr_status_t) apr_os_file_get(apr_os_file_t *thefile, 225251875Speter apr_file_t *file); 226251875Speter 227251875Speter/** 228251875Speter * convert the dir from apr type to os specific type. 229251875Speter * @param thedir The os specific dir we are converting to 230251875Speter * @param dir The apr dir to convert. 231251875Speter */ 232251875SpeterAPR_DECLARE(apr_status_t) apr_os_dir_get(apr_os_dir_t **thedir, 233251875Speter apr_dir_t *dir); 234251875Speter 235251875Speter/** 236251875Speter * Convert the socket from an apr type to an OS specific socket 237251875Speter * @param thesock The socket to convert. 238251875Speter * @param sock The os specific equivalent of the apr socket.. 239251875Speter */ 240251875SpeterAPR_DECLARE(apr_status_t) apr_os_sock_get(apr_os_sock_t *thesock, 241251875Speter apr_socket_t *sock); 242251875Speter 243251875Speter/** 244251875Speter * Convert the proc mutex from os specific type to apr type 245251875Speter * @param ospmutex The os specific proc mutex we are converting to. 246251875Speter * @param pmutex The apr proc mutex to convert. 247251875Speter */ 248251875SpeterAPR_DECLARE(apr_status_t) apr_os_proc_mutex_get(apr_os_proc_mutex_t *ospmutex, 249251875Speter apr_proc_mutex_t *pmutex); 250251875Speter 251251875Speter/** 252251875Speter * Get the exploded time in the platforms native format. 253251875Speter * @param ostime the native time format 254251875Speter * @param aprtime the time to convert 255251875Speter */ 256251875SpeterAPR_DECLARE(apr_status_t) apr_os_exp_time_get(apr_os_exp_time_t **ostime, 257251875Speter apr_time_exp_t *aprtime); 258251875Speter 259251875Speter/** 260251875Speter * Get the imploded time in the platforms native format. 261251875Speter * @param ostime the native time format 262251875Speter * @param aprtime the time to convert 263251875Speter */ 264251875SpeterAPR_DECLARE(apr_status_t) apr_os_imp_time_get(apr_os_imp_time_t **ostime, 265251875Speter apr_time_t *aprtime); 266251875Speter 267251875Speter/** 268251875Speter * convert the shm from apr type to os specific type. 269251875Speter * @param osshm The os specific shm representation 270251875Speter * @param shm The apr shm to convert. 271251875Speter */ 272251875SpeterAPR_DECLARE(apr_status_t) apr_os_shm_get(apr_os_shm_t *osshm, 273251875Speter apr_shm_t *shm); 274251875Speter 275251875Speter#if APR_HAS_THREADS || defined(DOXYGEN) 276251875Speter/** 277251875Speter * @defgroup apr_os_thread Thread portability Routines 278251875Speter * @{ 279251875Speter */ 280251875Speter/** 281251875Speter * convert the thread to os specific type from apr type. 282251875Speter * @param thethd The apr thread to convert 283251875Speter * @param thd The os specific thread we are converting to 284251875Speter */ 285251875SpeterAPR_DECLARE(apr_status_t) apr_os_thread_get(apr_os_thread_t **thethd, 286251875Speter apr_thread_t *thd); 287251875Speter 288251875Speter/** 289251875Speter * convert the thread private memory key to os specific type from an apr type. 290251875Speter * @param thekey The apr handle we are converting from. 291251875Speter * @param key The os specific handle we are converting to. 292251875Speter */ 293251875SpeterAPR_DECLARE(apr_status_t) apr_os_threadkey_get(apr_os_threadkey_t *thekey, 294251875Speter apr_threadkey_t *key); 295251875Speter 296251875Speter/** 297251875Speter * convert the thread from os specific type to apr type. 298251875Speter * @param thd The apr thread we are converting to. 299251875Speter * @param thethd The os specific thread to convert 300251875Speter * @param cont The pool to use if it is needed. 301251875Speter */ 302251875SpeterAPR_DECLARE(apr_status_t) apr_os_thread_put(apr_thread_t **thd, 303251875Speter apr_os_thread_t *thethd, 304251875Speter apr_pool_t *cont); 305251875Speter 306251875Speter/** 307251875Speter * convert the thread private memory key from os specific type to apr type. 308251875Speter * @param key The apr handle we are converting to. 309251875Speter * @param thekey The os specific handle to convert 310251875Speter * @param cont The pool to use if it is needed. 311251875Speter */ 312251875SpeterAPR_DECLARE(apr_status_t) apr_os_threadkey_put(apr_threadkey_t **key, 313251875Speter apr_os_threadkey_t *thekey, 314251875Speter apr_pool_t *cont); 315251875Speter/** 316251875Speter * Get the thread ID 317251875Speter */ 318251875SpeterAPR_DECLARE(apr_os_thread_t) apr_os_thread_current(void); 319251875Speter 320251875Speter/** 321251875Speter * Compare two thread id's 322251875Speter * @param tid1 1st Thread ID to compare 323251875Speter * @param tid2 2nd Thread ID to compare 324251875Speter * @return non-zero if the two threads are equal, zero otherwise 325251875Speter */ 326251875SpeterAPR_DECLARE(int) apr_os_thread_equal(apr_os_thread_t tid1, 327251875Speter apr_os_thread_t tid2); 328251875Speter 329251875Speter/** @} */ 330251875Speter#endif /* APR_HAS_THREADS */ 331251875Speter 332251875Speter/** 333251875Speter * convert the file from os specific type to apr type. 334251875Speter * @param file The apr file we are converting to. 335251875Speter * @param thefile The os specific file to convert 336251875Speter * @param flags The flags that were used to open this file. 337251875Speter * @param cont The pool to use if it is needed. 338251875Speter * @remark On Unix, it is only possible to put a file descriptor into 339251875Speter * an apr file type. 340251875Speter */ 341251875SpeterAPR_DECLARE(apr_status_t) apr_os_file_put(apr_file_t **file, 342251875Speter apr_os_file_t *thefile, 343251875Speter apr_int32_t flags, apr_pool_t *cont); 344251875Speter 345251875Speter/** 346251875Speter * convert the file from os specific type to apr type. 347251875Speter * @param file The apr file we are converting to. 348251875Speter * @param thefile The os specific pipe to convert 349251875Speter * @param cont The pool to use if it is needed. 350251875Speter * @remark On Unix, it is only possible to put a file descriptor into 351251875Speter * an apr file type. 352251875Speter */ 353251875SpeterAPR_DECLARE(apr_status_t) apr_os_pipe_put(apr_file_t **file, 354251875Speter apr_os_file_t *thefile, 355251875Speter apr_pool_t *cont); 356251875Speter 357251875Speter/** 358251875Speter * convert the file from os specific type to apr type. 359251875Speter * @param file The apr file we are converting to. 360251875Speter * @param thefile The os specific pipe to convert 361251875Speter * @param register_cleanup A cleanup will be registered on the apr_file_t 362251875Speter * to issue apr_file_close(). 363251875Speter * @param cont The pool to use if it is needed. 364251875Speter * @remark On Unix, it is only possible to put a file descriptor into 365251875Speter * an apr file type. 366251875Speter */ 367251875SpeterAPR_DECLARE(apr_status_t) apr_os_pipe_put_ex(apr_file_t **file, 368251875Speter apr_os_file_t *thefile, 369251875Speter int register_cleanup, 370251875Speter apr_pool_t *cont); 371251875Speter 372251875Speter/** 373251875Speter * convert the dir from os specific type to apr type. 374251875Speter * @param dir The apr dir we are converting to. 375251875Speter * @param thedir The os specific dir to convert 376251875Speter * @param cont The pool to use when creating to apr directory. 377251875Speter */ 378251875SpeterAPR_DECLARE(apr_status_t) apr_os_dir_put(apr_dir_t **dir, 379251875Speter apr_os_dir_t *thedir, 380251875Speter apr_pool_t *cont); 381251875Speter 382251875Speter/** 383251875Speter * Convert a socket from the os specific type to the apr type 384251875Speter * @param sock The pool to use. 385251875Speter * @param thesock The socket to convert to. 386251875Speter * @param cont The socket we are converting to an apr type. 387251875Speter * @remark If it is a true socket, it is best to call apr_os_sock_make() 388251875Speter * and provide APR with more information about the socket. 389251875Speter */ 390251875SpeterAPR_DECLARE(apr_status_t) apr_os_sock_put(apr_socket_t **sock, 391251875Speter apr_os_sock_t *thesock, 392251875Speter apr_pool_t *cont); 393251875Speter 394251875Speter/** 395251875Speter * Create a socket from an existing descriptor and local and remote 396251875Speter * socket addresses. 397251875Speter * @param apr_sock The new socket that has been set up 398251875Speter * @param os_sock_info The os representation of the socket handle and 399251875Speter * other characteristics of the socket 400251875Speter * @param cont The pool to use 401251875Speter * @remark If you only know the descriptor/handle or if it isn't really 402251875Speter * a true socket, use apr_os_sock_put() instead. 403251875Speter */ 404251875SpeterAPR_DECLARE(apr_status_t) apr_os_sock_make(apr_socket_t **apr_sock, 405251875Speter apr_os_sock_info_t *os_sock_info, 406251875Speter apr_pool_t *cont); 407251875Speter 408251875Speter/** 409251875Speter * Convert the proc mutex from os specific type to apr type 410251875Speter * @param pmutex The apr proc mutex we are converting to. 411251875Speter * @param ospmutex The os specific proc mutex to convert. 412251875Speter * @param cont The pool to use if it is needed. 413251875Speter */ 414251875SpeterAPR_DECLARE(apr_status_t) apr_os_proc_mutex_put(apr_proc_mutex_t **pmutex, 415251875Speter apr_os_proc_mutex_t *ospmutex, 416251875Speter apr_pool_t *cont); 417251875Speter 418251875Speter/** 419251875Speter * Put the imploded time in the APR format. 420251875Speter * @param aprtime the APR time format 421251875Speter * @param ostime the time to convert 422251875Speter * @param cont the pool to use if necessary 423251875Speter */ 424251875SpeterAPR_DECLARE(apr_status_t) apr_os_imp_time_put(apr_time_t *aprtime, 425251875Speter apr_os_imp_time_t **ostime, 426251875Speter apr_pool_t *cont); 427251875Speter 428251875Speter/** 429251875Speter * Put the exploded time in the APR format. 430251875Speter * @param aprtime the APR time format 431251875Speter * @param ostime the time to convert 432251875Speter * @param cont the pool to use if necessary 433251875Speter */ 434251875SpeterAPR_DECLARE(apr_status_t) apr_os_exp_time_put(apr_time_exp_t *aprtime, 435251875Speter apr_os_exp_time_t **ostime, 436251875Speter apr_pool_t *cont); 437251875Speter 438251875Speter/** 439251875Speter * convert the shared memory from os specific type to apr type. 440251875Speter * @param shm The apr shm representation of osshm 441251875Speter * @param osshm The os specific shm identity 442251875Speter * @param cont The pool to use if it is needed. 443251875Speter * @remark On fork()ed architectures, this is typically nothing more than 444251875Speter * the memory block mapped. On non-fork architectures, this is typically 445251875Speter * some internal handle to pass the mapping from process to process. 446251875Speter */ 447251875SpeterAPR_DECLARE(apr_status_t) apr_os_shm_put(apr_shm_t **shm, 448251875Speter apr_os_shm_t *osshm, 449251875Speter apr_pool_t *cont); 450251875Speter 451251875Speter 452251875Speter#if APR_HAS_DSO || defined(DOXYGEN) 453251875Speter/** 454251875Speter * @defgroup apr_os_dso DSO (Dynamic Loading) Portability Routines 455251875Speter * @{ 456251875Speter */ 457251875Speter/** 458251875Speter * convert the dso handle from os specific to apr 459251875Speter * @param dso The apr handle we are converting to 460251875Speter * @param thedso the os specific handle to convert 461251875Speter * @param pool the pool to use if it is needed 462251875Speter */ 463251875SpeterAPR_DECLARE(apr_status_t) apr_os_dso_handle_put(apr_dso_handle_t **dso, 464251875Speter apr_os_dso_handle_t thedso, 465251875Speter apr_pool_t *pool); 466251875Speter 467251875Speter/** 468251875Speter * convert the apr dso handle into an os specific one 469251875Speter * @param aprdso The apr dso handle to convert 470251875Speter * @param dso The os specific dso to return 471251875Speter */ 472251875SpeterAPR_DECLARE(apr_status_t) apr_os_dso_handle_get(apr_os_dso_handle_t *dso, 473251875Speter apr_dso_handle_t *aprdso); 474251875Speter 475251875Speter/** @} */ 476251875Speter#endif /* APR_HAS_DSO */ 477251875Speter 478251875Speter 479251875Speter#if APR_HAS_OS_UUID 480251875Speter/** 481251875Speter * Private: apr-util's apr_uuid module when supported by the platform 482251875Speter */ 483251875SpeterAPR_DECLARE(apr_status_t) apr_os_uuid_get(unsigned char *uuid_data); 484251875Speter#endif 485251875Speter 486251875Speter 487251875Speter/** 488251875Speter * Get the name of the system default character set. 489251875Speter * @param pool the pool to allocate the name from, if needed 490251875Speter */ 491251875SpeterAPR_DECLARE(const char*) apr_os_default_encoding(apr_pool_t *pool); 492251875Speter 493251875Speter 494251875Speter/** 495251875Speter * Get the name of the current locale character set. 496251875Speter * @param pool the pool to allocate the name from, if needed 497251875Speter * @remark Defers to apr_os_default_encoding if the current locale's 498251875Speter * data can't be retrieved on this system. 499251875Speter */ 500251875SpeterAPR_DECLARE(const char*) apr_os_locale_encoding(apr_pool_t *pool); 501251875Speter 502251875Speter/** @} */ 503251875Speter 504251875Speter#ifdef __cplusplus 505251875Speter} 506251875Speter#endif 507251875Speter 508251875Speter#endif /* ! APR_PORTABLE_H */ 509