00001
00002
00003
00004
00005 #include "ace/config-all.h"
00006 #include "ace/Object_Manager_Base.h"
00007 #include "ace/OS_NS_string.h"
00008 #include "ace/Global_Macros.h"
00009 #include "ace/os_include/os_errno.h"
00010 #include "ace/os_include/os_search.h"
00011
00012 #if defined(ACE_WCHAR_IN_STD_NAMESPACE)
00013 # define ACE_WCHAR_STD_NAMESPACE std
00014 #else
00015 # define ACE_WCHAR_STD_NAMESPACE ACE_STD_NAMESPACE
00016 #endif
00017
00018 ACE_BEGIN_VERSIONED_NAMESPACE_DECL
00019
00020
00021
00022 ACE_INLINE void
00023 ACE_OS::_exit (int status)
00024 {
00025 ACE_OS_TRACE ("ACE_OS::_exit");
00026 #if defined (ACE_VXWORKS)
00027 ::exit (status);
00028 #elif !defined (ACE_HAS_WINCE)
00029 ::_exit (status);
00030 #else
00031 ::TerminateProcess (::GetCurrentProcess (),
00032 status);
00033 #endif
00034 }
00035
00036 ACE_INLINE void
00037 ACE_OS::abort (void)
00038 {
00039 #if !defined (ACE_HAS_WINCE)
00040 ::abort ();
00041 #else
00042
00043 exit (1);
00044 #endif
00045 }
00046
00047 ACE_INLINE int
00048 ACE_OS::atexit (ACE_EXIT_HOOK func)
00049 {
00050 return ACE_OS_Object_Manager::instance ()->at_exit (func);
00051 }
00052
00053 ACE_INLINE int
00054 ACE_OS::atoi (const char *s)
00055 {
00056 ACE_OSCALL_RETURN (::atoi (s), int, -1);
00057 }
00058
00059 #if defined (ACE_HAS_WCHAR)
00060 ACE_INLINE int
00061 ACE_OS::atoi (const wchar_t *s)
00062 {
00063 #if defined (ACE_WIN32)
00064 ACE_OSCALL_RETURN (::_wtoi (s), int, -1);
00065 #else
00066 return ACE_OS::atoi (ACE_Wide_To_Ascii(s).char_rep());
00067 #endif
00068 }
00069 #endif
00070
00071 #if defined (atop)
00072 # undef atop
00073 #endif
00074
00075 ACE_INLINE void *
00076 ACE_OS::atop (const char *s)
00077 {
00078 ACE_TRACE ("ACE_OS::atop");
00079
00080
00081
00082
00083 #if defined (ACE_WIN64)
00084 __int64 ip = ::_atoi64 (s);
00085 #else
00086 int ip = ::atoi (s);
00087 #endif
00088 void *p = reinterpret_cast<void *> (ip);
00089 return p;
00090 }
00091
00092 #if defined (ACE_HAS_WCHAR)
00093 ACE_INLINE void *
00094 ACE_OS::atop (const wchar_t *s)
00095 {
00096 # if defined (ACE_WIN64)
00097 __int64 ip = ::_wtoi64 (s);
00098 # else
00099 int ip = ACE_OS::atoi (s);
00100 # endif
00101 void *p = reinterpret_cast<void *> (ip);
00102 return p;
00103 }
00104 #endif
00105
00106 ACE_INLINE void *
00107 ACE_OS::bsearch (const void *key,
00108 const void *base,
00109 size_t nel,
00110 size_t size,
00111 ACE_COMPARE_FUNC compar)
00112 {
00113 #if !defined (ACE_LACKS_BSEARCH)
00114 return ::bsearch (key, base, nel, size, compar);
00115 #else
00116 ACE_UNUSED_ARG (key);
00117 ACE_UNUSED_ARG (base);
00118 ACE_UNUSED_ARG (nel);
00119 ACE_UNUSED_ARG (size);
00120 ACE_UNUSED_ARG (compar);
00121 ACE_NOTSUP_RETURN (0);
00122 #endif
00123 }
00124
00125 ACE_INLINE char *
00126 ACE_OS::getenv (const char *symbol)
00127 {
00128 ACE_OS_TRACE ("ACE_OS::getenv");
00129 #if defined (ACE_LACKS_ENV)
00130 ACE_UNUSED_ARG (symbol);
00131 ACE_NOTSUP_RETURN (0);
00132 #else
00133 ACE_OSCALL_RETURN (::getenv (symbol), char *, 0);
00134 #endif
00135 }
00136
00137 #if defined (ACE_HAS_WCHAR) && defined (ACE_WIN32)
00138 ACE_INLINE wchar_t *
00139 ACE_OS::getenv (const wchar_t *symbol)
00140 {
00141 #if defined (ACE_LACKS_ENV)
00142 ACE_UNUSED_ARG (symbol);
00143 ACE_NOTSUP_RETURN (0);
00144 #else
00145 ACE_OSCALL_RETURN (::_wgetenv (symbol), wchar_t *, 0);
00146 #endif
00147 }
00148 #endif
00149
00150 ACE_INLINE char *
00151 ACE_OS::itoa (int value, char *string, int radix)
00152 {
00153 #if !defined (ACE_HAS_ITOA)
00154 return ACE_OS::itoa_emulation (value, string, radix);
00155 #elif defined (ACE_ITOA_EQUIVALENT)
00156 return ACE_ITOA_EQUIVALENT (value, string, radix);
00157 #else
00158 return ::itoa (value, string, radix);
00159 #endif
00160 }
00161
00162 #if defined (ACE_HAS_WCHAR)
00163 ACE_INLINE wchar_t *
00164 ACE_OS::itoa (int value, wchar_t *string, int radix)
00165 {
00166 #if defined (ACE_LACKS_ITOW)
00167 return ACE_OS::itow_emulation (value, string, radix);
00168 #else
00169 return ::_itow (value, string, radix);
00170 #endif
00171 }
00172 #endif
00173
00174 ACE_INLINE ACE_HANDLE
00175 ACE_OS::mkstemp (char *s)
00176 {
00177 #if !defined (ACE_LACKS_MKSTEMP)
00178 return ::mkstemp (s);
00179 #else
00180 return ACE_OS::mkstemp_emulation (ACE_TEXT_CHAR_TO_TCHAR (s));
00181 #endif
00182 }
00183
00184 #if defined (ACE_HAS_WCHAR)
00185 ACE_INLINE ACE_HANDLE
00186 ACE_OS::mkstemp (wchar_t *s)
00187 {
00188 # if !defined (ACE_LACKS_MKSTEMP)
00189 return ::mkstemp (ACE_TEXT_WCHAR_TO_TCHAR (ACE_TEXT_ALWAYS_CHAR (s)));
00190 # else
00191 return ACE_OS::mkstemp_emulation (ACE_TEXT_WCHAR_TO_TCHAR (s));
00192 # endif
00193 }
00194 #endif
00195
00196 #if !defined (ACE_LACKS_MKTEMP)
00197 ACE_INLINE char *
00198 ACE_OS::mktemp (char *s)
00199 {
00200 # if defined (ACE_WIN32)
00201 return ::_mktemp (s);
00202 # else
00203 return ::mktemp (s);
00204 # endif
00205 }
00206
00207 # if defined (ACE_HAS_WCHAR)
00208 ACE_INLINE wchar_t *
00209 ACE_OS::mktemp (wchar_t *s)
00210 {
00211 # if defined (ACE_WIN32)
00212 return ::_wmktemp (s);
00213 # else
00214
00215
00216
00217 ACE_Wide_To_Ascii narrow_s (s);
00218 if (::mktemp (narrow_s.char_rep ()) == 0)
00219 return 0;
00220 ACE_Ascii_To_Wide wide_s (narrow_s.char_rep ());
00221 ACE_OS::strcpy (s, wide_s.wchar_rep ());
00222 return s;
00223 # endif
00224 }
00225 # endif
00226
00227 #endif
00228
00229 #if defined(INTEGRITY)
00230 extern "C" {
00231 int putenv(char *string);
00232 }
00233 #endif
00234
00235 ACE_INLINE int
00236 ACE_OS::putenv (const char *string)
00237 {
00238 ACE_OS_TRACE ("ACE_OS::putenv");
00239 #if defined (ACE_HAS_WINCE)
00240
00241 ACE_UNUSED_ARG (string);
00242 ACE_NOTSUP_RETURN (-1);
00243 #elif defined (ACE_LACKS_PUTENV) && defined (ACE_HAS_SETENV)
00244 int result = 0;
00245 char* sp = ACE_OS::strchr (const_cast <char *> (string), '=');
00246 if (sp)
00247 {
00248 char* stmp = ACE_OS::strdup (string);
00249 if (stmp)
00250 {
00251 stmp[sp - string] = '\0';
00252 ACE_OSCALL (::setenv(stmp, sp+sizeof(char), 1), int, -1, result);
00253 ACE_OS::free (stmp);
00254 }
00255 else
00256 {
00257 errno = ENOMEM;
00258 result = -1;
00259 }
00260 }
00261 else
00262 {
00263 ACE_OSCALL (::setenv(string, "", 1), int, -1, result);
00264 }
00265 return result;
00266 #elif defined (ACE_LACKS_ENV) || defined (ACE_LACKS_PUTENV)
00267 ACE_UNUSED_ARG (string);
00268 ACE_NOTSUP_RETURN (0);
00269 #else
00270 ACE_OSCALL_RETURN (ACE_STD_NAMESPACE::putenv (const_cast <char *> (string)), int, -1);
00271 #endif
00272 }
00273
00274 #if defined (ACE_HAS_WCHAR) && defined (ACE_WIN32)
00275 ACE_INLINE int
00276 ACE_OS::putenv (const wchar_t *string)
00277 {
00278 ACE_OS_TRACE ("ACE_OS::putenv");
00279 #if defined (ACE_HAS_WINCE)
00280
00281 ACE_UNUSED_ARG (string);
00282 ACE_NOTSUP_RETURN (-1);
00283 #else
00284 ACE_OSCALL_RETURN (::_wputenv (string), int, -1);
00285 #endif
00286 }
00287 #endif
00288
00289 ACE_INLINE void
00290 ACE_OS::qsort (void *base,
00291 size_t nel,
00292 size_t width,
00293 ACE_COMPARE_FUNC compar)
00294 {
00295 #if !defined (ACE_LACKS_QSORT)
00296 ::qsort (base, nel, width, compar);
00297 #else
00298 ACE_UNUSED_ARG (base);
00299 ACE_UNUSED_ARG (nel);
00300 ACE_UNUSED_ARG (width);
00301 ACE_UNUSED_ARG (compar);
00302 #endif
00303 }
00304
00305 ACE_INLINE int
00306 ACE_OS::rand (void)
00307 {
00308 ACE_OS_TRACE ("ACE_OS::rand");
00309 ACE_OSCALL_RETURN (::rand (), int, -1);
00310 }
00311
00312 #if !defined (ACE_WIN32)
00313
00314 ACE_INLINE int
00315 ACE_OS::rand_r (ACE_RANDR_TYPE &seed)
00316 {
00317 ACE_OS_TRACE ("ACE_OS::rand_r");
00318 # if defined (ACE_HAS_REENTRANT_FUNCTIONS) && \
00319 !defined (ACE_LACKS_RAND_REENTRANT_FUNCTIONS)
00320 # if defined (DIGITAL_UNIX)
00321 ACE_OSCALL_RETURN (::_Prand_r (&seed), int, -1);
00322 # elif defined (ACE_HAS_BROKEN_RANDR)
00323 ACE_OSCALL_RETURN (::rand_r (seed), int, -1);
00324 # else
00325 ACE_OSCALL_RETURN (::rand_r (&seed), int, -1);
00326 # endif
00327 # else
00328 ACE_UNUSED_ARG (seed);
00329 ACE_OSCALL_RETURN (::rand (), int, -1);
00330 # endif
00331 }
00332
00333 #else
00334
00335 ACE_INLINE int
00336 ACE_OS::rand_r (ACE_RANDR_TYPE& seed)
00337 {
00338 ACE_OS_TRACE ("ACE_OS::rand_r");
00339
00340 long new_seed = (long)(seed);
00341 if (new_seed == 0)
00342 new_seed = 0x12345987;
00343 long temp = new_seed / 127773;
00344 new_seed = 16807 * (new_seed - temp * 127773) - 2836 * temp;
00345 if (new_seed < 0)
00346 new_seed += 2147483647;
00347 (seed) = (unsigned int)new_seed;
00348 return (int)(new_seed & RAND_MAX);
00349 }
00350
00351 #endif
00352
00353 #if !defined (ACE_HAS_WINCE)
00354 # if !defined (ACE_LACKS_REALPATH)
00355 ACE_INLINE char *
00356 ACE_OS::realpath (const char *file_name,
00357 char *resolved_name)
00358 {
00359 # if defined (ACE_WIN32)
00360 return ::_fullpath (resolved_name, file_name, PATH_MAX);
00361 # else
00362 return ::realpath (file_name, resolved_name);
00363 # endif
00364 }
00365 # endif
00366
00367 # if defined (ACE_HAS_WCHAR)
00368 ACE_INLINE wchar_t *
00369 ACE_OS::realpath (const wchar_t *file_name,
00370 wchar_t *resolved_name)
00371 {
00372 # if defined (ACE_WIN32)
00373 return ::_wfullpath (resolved_name, file_name, PATH_MAX);
00374 # else
00375 ACE_Wide_To_Ascii n_file_name (file_name);
00376 char n_resolved[PATH_MAX];
00377 if (0 != ACE_OS::realpath (n_file_name.char_rep (), n_resolved))
00378 {
00379 ACE_Ascii_To_Wide w_resolved (n_resolved);
00380 ACE_OS::strcpy (resolved_name, w_resolved.wchar_rep ());
00381 return resolved_name;
00382 }
00383 return 0;
00384 # endif
00385 }
00386 # endif
00387 #endif
00388
00389 ACE_INLINE ACE_EXIT_HOOK
00390 ACE_OS::set_exit_hook (ACE_EXIT_HOOK exit_hook)
00391 {
00392 ACE_EXIT_HOOK old_hook = exit_hook_;
00393 exit_hook_ = exit_hook;
00394 return old_hook;
00395 }
00396
00397 ACE_INLINE void
00398 ACE_OS::srand (u_int seed)
00399 {
00400 ACE_OS_TRACE ("ACE_OS::srand");
00401 ::srand (seed);
00402 }
00403
00404
00405
00406
00407
00408
00409 ACE_INLINE ACE_TCHAR *
00410 ACE_OS::strenvdup (const ACE_TCHAR *str)
00411 {
00412 #if defined (ACE_HAS_WINCE)
00413
00414 return ACE_OS::strdup (str);
00415 #elif defined (ACE_LACKS_ENV)
00416 ACE_UNUSED_ARG (str);
00417 ACE_NOTSUP_RETURN (0);
00418 #else
00419 if (str[0] == ACE_LIB_TEXT ('$'))
00420 {
00421 # if defined (ACE_WIN32)
00422
00423 ACE_TCHAR *temp = 0;
00424 if ((temp = ACE_OS::getenv (&str[1])) != 0)
00425 return ACE_OS::strdup (temp);
00426 # else
00427
00428 char *temp = 0;
00429 if ((temp = ACE_OS::getenv (ACE_TEXT_ALWAYS_CHAR (&str[1]))) != 0)
00430 return ACE_OS::strdup (ACE_TEXT_CHAR_TO_TCHAR (temp));
00431 # endif
00432 return ACE_OS::strdup (str);
00433 }
00434 else
00435 return ACE_OS::strdup (str);
00436 #endif
00437 }
00438
00439 #if !defined (ACE_LACKS_STRTOD)
00440 ACE_INLINE double
00441 ACE_OS::strtod (const char *s, char **endptr)
00442 {
00443 return ::strtod (s, endptr);
00444 }
00445 #endif
00446
00447 #if defined (ACE_HAS_WCHAR) && !defined (ACE_LACKS_WCSTOD)
00448 ACE_INLINE double
00449 ACE_OS::strtod (const wchar_t *s, wchar_t **endptr)
00450 {
00451 return ACE_WCHAR_STD_NAMESPACE::wcstod (s, endptr);
00452 }
00453 #endif
00454
00455 ACE_INLINE long
00456 ACE_OS::strtol (const char *s, char **ptr, int base)
00457 {
00458 #if defined (ACE_LACKS_STRTOL)
00459 return ACE_OS::strtol_emulation (s, ptr, base);
00460 #else
00461 return ::strtol (s, ptr, base);
00462 #endif
00463 }
00464
00465 #if defined (ACE_HAS_WCHAR) && !defined (ACE_LACKS_WCSTOL)
00466 ACE_INLINE long
00467 ACE_OS::strtol (const wchar_t *s, wchar_t **ptr, int base)
00468 {
00469 return ACE_WCHAR_STD_NAMESPACE::wcstol (s, ptr, base);
00470 }
00471 #endif
00472
00473 ACE_INLINE unsigned long
00474 ACE_OS::strtoul (const char *s, char **ptr, int base)
00475 {
00476 #if defined (ACE_LACKS_STRTOUL)
00477 return ACE_OS::strtoul_emulation (s, ptr, base);
00478 #else
00479 return ::strtoul (s, ptr, base);
00480 #endif
00481 }
00482
00483 #if defined (ACE_HAS_WCHAR) && !defined (ACE_LACKS_WCSTOUL)
00484 ACE_INLINE unsigned long
00485 ACE_OS::strtoul (const wchar_t *s, wchar_t **ptr, int base)
00486 {
00487 return ACE_WCHAR_STD_NAMESPACE::wcstoul (s, ptr, base);
00488 }
00489 #endif
00490
00491 ACE_INLINE int
00492 ACE_OS::system (const ACE_TCHAR *s)
00493 {
00494
00495 #if defined (ACE_LACKS_SYSTEM)
00496 ACE_UNUSED_ARG (s);
00497 ACE_NOTSUP_RETURN (-1);
00498 #elif defined (ACE_WIN32) && defined (ACE_USES_WCHAR)
00499 ACE_OSCALL_RETURN (::_wsystem (s), int, -1);
00500 #elif defined(ACE_TANDEM_T1248_PTHREADS)
00501 ACE_OSCALL_RETURN (::spt_system (s), int, -1);
00502 #else
00503 ACE_OSCALL_RETURN (::system (ACE_TEXT_ALWAYS_CHAR (s)), int, -1);
00504 #endif
00505 }
00506
00507 ACE_END_VERSIONED_NAMESPACE_DECL