OS_NS_stdio.inl

Go to the documentation of this file.
00001 // -*- C++ -*-
00002 //
00003 // $Id: OS_NS_stdio.inl 81509 2008-04-28 22:00:49Z shuston $
00004 
00005 #include "ace/OS_NS_unistd.h"
00006 #include "ace/OS_NS_stdlib.h"
00007 #include "ace/OS_NS_fcntl.h"
00008 #include "ace/OS_NS_errno.h"
00009 #include "ace/OS_NS_string.h"
00010 #include "ace/OS_NS_pwd.h"
00011 #include "ace/OS_NS_macros.h"
00012 #include "ace/OS_NS_sys_stat.h"
00013 #include "ace/OS_Memory.h"
00014 
00015 #if defined (ACE_HAS_TRIO)
00016 #  include <trio.h>
00017 #endif /* ACE_HAS_TRIO */
00018 
00019 /*****************************************************************************/
00020 
00021 ACE_BEGIN_VERSIONED_NAMESPACE_DECL
00022 
00023 #if defined (ACE_WIN32)
00024 ACE_INLINE void
00025 ACE_OS::flock_adjust_params (ACE_OS::ace_flock_t *lock,
00026                              short whence,
00027                              ACE_OFF_T &start,
00028                              ACE_OFF_T &len)
00029 {
00030   switch (whence)
00031     {
00032     case SEEK_SET:
00033       break;
00034     case SEEK_CUR:
00035       {
00036         LARGE_INTEGER offset;
00037 # if !defined (ACE_LACKS_WIN32_SETFILEPOINTEREX)
00038         LARGE_INTEGER distance;
00039         distance.QuadPart = 0;
00040         if (!::SetFilePointerEx (lock->handle_,
00041                                  distance,
00042                                  &offset,
00043                                  FILE_CURRENT))
00044           {
00045             ACE_OS::set_errno_to_last_error ();
00046             return;
00047           }
00048 # else
00049         offset.LowPart = ::SetFilePointer (lock->handle_,
00050                                            0,
00051                                            &offset.HighPart,
00052                                            FILE_CURRENT);
00053         if (offset.LowPart == INVALID_SET_FILE_POINTER &&
00054             ::GetLastError() != NO_ERROR)
00055           {
00056             ACE_OS::set_errno_to_last_error ();
00057             return;
00058           }
00059 # endif /* ACE_LACKS_WIN32_SETFILEPOINTEREX */
00060 
00061 # if defined (_FILE_OFFSET_BITS) && _FILE_OFFSET_BITS == 64
00062         start += offset.QuadPart;
00063 # else
00064         start += offset.LowPart;
00065 # endif /* _FILE_OFFSET_BITS == 64 */
00066       }
00067       break;
00068     case SEEK_END:
00069       {
00070         ACE_OFF_T const size = ACE_OS::filesize (lock->handle_);
00071         if (size == -1)
00072           return;
00073 
00074         start += size;
00075       }
00076       break;
00077     }
00078   lock->overlapped_.Offset = ACE_LOW_PART (start);
00079   lock->overlapped_.OffsetHigh = ACE_HIGH_PART (start);
00080   if (len == 0)
00081     {
00082       ACE_OFF_T const tlen = ACE_OS::filesize (lock->handle_);
00083       if (tlen != -1)
00084         len = tlen - start;
00085     }
00086 }
00087 #endif /* ACE_WIN32 */
00088 
00089 ACE_INLINE int
00090 ACE_OS::flock_init (ACE_OS::ace_flock_t *lock,
00091                     int flags,
00092                     const ACE_TCHAR *name,
00093                     mode_t perms)
00094 {
00095   ACE_OS_TRACE ("ACE_OS::flock_init");
00096 #if defined (ACE_WIN32)
00097   // Once initialized, these values are never changed.
00098   lock->overlapped_.Internal = 0;
00099   lock->overlapped_.InternalHigh = 0;
00100   lock->overlapped_.OffsetHigh = 0;
00101   lock->overlapped_.hEvent = 0;
00102 #endif /* ACE_WIN32 */
00103   lock->handle_ = ACE_INVALID_HANDLE;
00104   lock->lockname_ = 0;
00105 
00106   if (name != 0)
00107     {
00108       ACE_OSCALL (ACE_OS::open (name, flags, perms),
00109                   ACE_HANDLE,
00110                   ACE_INVALID_HANDLE,
00111                   lock->handle_);
00112       if (lock->handle_ != ACE_INVALID_HANDLE)
00113         lock->lockname_ = ACE_OS::strdup (name);
00114       return lock->handle_ == ACE_INVALID_HANDLE ? -1 : 0;
00115     }
00116   else
00117     return 0;
00118 }
00119 
00120 ACE_INLINE int
00121 ACE_OS::flock_unlock (ACE_OS::ace_flock_t *lock,
00122                       short whence,
00123                       ACE_OFF_T start,
00124                       ACE_OFF_T len)
00125 {
00126   ACE_OS_TRACE ("ACE_OS::flock_unlock");
00127 #if defined (ACE_LACKS_FILELOCKS)
00128   ACE_UNUSED_ARG (lock);
00129   ACE_UNUSED_ARG (whence);
00130   ACE_UNUSED_ARG (start);
00131   ACE_UNUSED_ARG (len);
00132   ACE_NOTSUP_RETURN (-1);
00133 #elif defined (ACE_WIN32)
00134   ACE_OS::flock_adjust_params (lock, whence, start, len);
00135   DWORD low_len = ACE_LOW_PART (len);
00136   DWORD high_len = ACE_HIGH_PART (len);
00137   ACE_WIN32CALL_RETURN (
00138     ACE_ADAPT_RETVAL (::UnlockFile (lock->handle_,
00139                                     lock->overlapped_.Offset,
00140                                     lock->overlapped_.OffsetHigh,
00141                                     low_len,
00142                                     high_len),
00143                       ace_result_), int, -1);
00144 #else
00145   lock->lock_.l_whence = whence;
00146   lock->lock_.l_start = start;
00147   lock->lock_.l_len = len;
00148   lock->lock_.l_type = F_UNLCK;   // Unlock file.
00149 
00150   // release lock
00151   ACE_OSCALL_RETURN (ACE_OS::fcntl (lock->handle_, F_SETLK,
00152                                     reinterpret_cast<long> (&lock->lock_)),
00153                      int, -1);
00154 #endif /* ACE_WIN32 */
00155 }
00156 
00157 ACE_INLINE int
00158 ACE_OS::flock_destroy (ACE_OS::ace_flock_t *lock,
00159                        int unlink_file)
00160 {
00161   ACE_OS_TRACE ("ACE_OS::flock_destroy");
00162   if (lock->handle_ != ACE_INVALID_HANDLE)
00163     {
00164       ACE_OS::flock_unlock (lock);
00165       // Close the handle.
00166       ACE_OS::close (lock->handle_);
00167       lock->handle_ = ACE_INVALID_HANDLE;
00168       if (lock->lockname_ != 0)
00169         {
00170           if (unlink_file)
00171             ACE_OS::unlink (lock->lockname_);
00172           ACE_OS::free (
00173             static_cast<void *> (const_cast<ACE_TCHAR *> (lock->lockname_)));
00174         }
00175       lock->lockname_ = 0;
00176     }
00177   return 0;
00178 }
00179 
00180 ACE_INLINE int
00181 ACE_OS::flock_rdlock (ACE_OS::ace_flock_t *lock,
00182                       short whence,
00183                       ACE_OFF_T start,
00184                       ACE_OFF_T len)
00185 {
00186   ACE_OS_TRACE ("ACE_OS::flock_rdlock");
00187 #if defined (ACE_LACKS_FILELOCKS)
00188   ACE_UNUSED_ARG (lock);
00189   ACE_UNUSED_ARG (whence);
00190   ACE_UNUSED_ARG (start);
00191   ACE_UNUSED_ARG (len);
00192   ACE_NOTSUP_RETURN (-1);
00193 #elif defined (ACE_WIN32)
00194   ACE_OS::flock_adjust_params (lock, whence, start, len);
00195   DWORD low_len = ACE_LOW_PART (len);
00196   DWORD high_len = ACE_HIGH_PART (len);
00197   ACE_WIN32CALL_RETURN (ACE_ADAPT_RETVAL (::LockFileEx (lock->handle_,
00198                                                         0,
00199                                                         0,
00200                                                         low_len,
00201                                                         high_len,
00202                                                         &lock->overlapped_),
00203                                           ace_result_), int, -1);
00204 #else
00205   lock->lock_.l_whence = whence;
00206   lock->lock_.l_start = start;
00207   lock->lock_.l_len = len;
00208   lock->lock_.l_type = F_RDLCK;         // set read lock
00209   // block, if no access
00210   ACE_OSCALL_RETURN (ACE_OS::fcntl (lock->handle_, F_SETLKW,
00211                                     reinterpret_cast<long> (&lock->lock_)),
00212                      int, -1);
00213 #endif /* ACE_WIN32 */
00214 }
00215 
00216 ACE_INLINE int
00217 ACE_OS::flock_tryrdlock (ACE_OS::ace_flock_t *lock,
00218                          short whence,
00219                          ACE_OFF_T start,
00220                          ACE_OFF_T len)
00221 {
00222   ACE_OS_TRACE ("ACE_OS::ace_flock_tryrdlock");
00223 #if defined (ACE_LACKS_FILELOCKS)
00224   ACE_UNUSED_ARG (lock);
00225   ACE_UNUSED_ARG (whence);
00226   ACE_UNUSED_ARG (start);
00227   ACE_UNUSED_ARG (len);
00228   ACE_NOTSUP_RETURN (-1);
00229 #elif defined (ACE_WIN32)
00230   ACE_OS::flock_adjust_params (lock, whence, start, len);
00231   DWORD low_len = ACE_LOW_PART (len);
00232   DWORD high_len = ACE_HIGH_PART (len);
00233   ACE_WIN32CALL_RETURN (
00234     ACE_ADAPT_RETVAL (::LockFileEx (lock->handle_,
00235                                     LOCKFILE_FAIL_IMMEDIATELY,
00236                                     0,
00237                                     low_len,
00238                                     high_len,
00239                                     &lock->overlapped_),
00240                       ace_result_), int, -1);
00241 #else
00242   lock->lock_.l_whence = whence;
00243   lock->lock_.l_start = start;
00244   lock->lock_.l_len = len;
00245   lock->lock_.l_type = F_RDLCK;         // set read lock
00246 
00247   int result = 0;
00248   // Does not block, if no access, returns -1 and set errno = EBUSY;
00249   ACE_OSCALL (ACE_OS::fcntl (lock->handle_, F_SETLK,
00250                              reinterpret_cast<long> (&lock->lock_)),
00251               int, -1, result);
00252 
00253   if (result == -1 && (errno == EACCES || errno == EAGAIN))
00254     errno = EBUSY;
00255 
00256   return result;
00257 #endif /* ACE_WIN32 */
00258 }
00259 
00260 ACE_INLINE int
00261 ACE_OS::flock_trywrlock (ACE_OS::ace_flock_t *lock,
00262                          short whence,
00263                          ACE_OFF_T start,
00264                          ACE_OFF_T len)
00265 {
00266   ACE_OS_TRACE ("ACE_OS::ace_flock_trywrlock");
00267 #if defined (ACE_LACKS_FILELOCKS)
00268   ACE_UNUSED_ARG (lock);
00269   ACE_UNUSED_ARG (whence);
00270   ACE_UNUSED_ARG (start);
00271   ACE_UNUSED_ARG (len);
00272   ACE_NOTSUP_RETURN (-1);
00273 #elif defined (ACE_WIN32)
00274   ACE_OS::flock_adjust_params (lock, whence, start, len);
00275   DWORD low_len = ACE_LOW_PART (len);
00276   DWORD high_len = ACE_HIGH_PART (len);
00277   ACE_WIN32CALL_RETURN (
00278     ACE_ADAPT_RETVAL (::LockFileEx (lock->handle_,
00279                                     LOCKFILE_FAIL_IMMEDIATELY | LOCKFILE_EXCLUSIVE_LOCK,
00280                                     0,
00281                                     low_len,
00282                                     high_len,
00283                                     &lock->overlapped_),
00284                       ace_result_), int, -1);
00285 #else
00286   lock->lock_.l_whence = whence;
00287   lock->lock_.l_start = start;
00288   lock->lock_.l_len = len;
00289   lock->lock_.l_type = F_WRLCK;         // set write lock
00290 
00291   int result = 0;
00292   // Does not block, if no access, returns -1 and set errno = EBUSY;
00293   ACE_OSCALL (ACE_OS::fcntl (lock->handle_,
00294                              F_SETLK,
00295                              reinterpret_cast<long> (&lock->lock_)),
00296               int, -1, result);
00297 
00298   if (result == -1 && (errno == EACCES || errno == EAGAIN))
00299     errno = EBUSY;
00300 
00301   return result;
00302 #endif /* ACE_WIN32 */
00303 }
00304 
00305 ACE_INLINE int
00306 ACE_OS::flock_wrlock (ACE_OS::ace_flock_t *lock,
00307                       short whence,
00308                       ACE_OFF_T start,
00309                       ACE_OFF_T len)
00310 {
00311   ACE_OS_TRACE ("ACE_OS::flock_wrlock");
00312 #if defined (ACE_LACKS_FILELOCKS)
00313   ACE_UNUSED_ARG (lock);
00314   ACE_UNUSED_ARG (whence);
00315   ACE_UNUSED_ARG (start);
00316   ACE_UNUSED_ARG (len);
00317   ACE_NOTSUP_RETURN (-1);
00318 #elif defined (ACE_WIN32)
00319   ACE_OS::flock_adjust_params (lock, whence, start, len);
00320   DWORD low_len = ACE_LOW_PART (len);
00321   DWORD high_len = ACE_HIGH_PART (len);
00322   ACE_WIN32CALL_RETURN (
00323     ACE_ADAPT_RETVAL (::LockFileEx (lock->handle_,
00324                                     LOCKFILE_EXCLUSIVE_LOCK,
00325                                     0,
00326                                     low_len,
00327                                     high_len,
00328                                     &lock->overlapped_),
00329                       ace_result_), int, -1);
00330 #else
00331   lock->lock_.l_whence = whence;
00332   lock->lock_.l_start = start;
00333   lock->lock_.l_len = len;
00334   lock->lock_.l_type = F_WRLCK;         // set write lock
00335   // block, if no access
00336   ACE_OSCALL_RETURN (ACE_OS::fcntl (lock->handle_, F_SETLKW,
00337                                     reinterpret_cast<long> (&lock->lock_)),
00338                      int, -1);
00339 #endif /* ACE_WIN32 */
00340 }
00341 
00342 #if !defined (ACE_LACKS_CLEARERR)
00343 ACE_INLINE void
00344 ACE_OS::clearerr (FILE* fp)
00345 {
00346   ace_clearerr_helper (fp);
00347 }
00348 #endif /* !ACE_LACKS_CLEARERR */
00349 
00350 #if !defined (ACE_LACKS_CUSERID)
00351 ACE_INLINE char *
00352 ACE_OS::cuserid (char *user, size_t maxlen)
00353 {
00354   ACE_OS_TRACE ("ACE_OS::cuserid");
00355 #if defined (ACE_VXWORKS)
00356   ACE_UNUSED_ARG (maxlen);
00357   if (user == 0)
00358     {
00359       // Require that the user field be non-null, i.e., don't
00360       // allocate or use static storage.
00361       ACE_NOTSUP_RETURN (0);
00362     }
00363   else
00364     {
00365       ::remCurIdGet (user, 0);
00366       return user;
00367     }
00368 #elif defined (__QNXNTO__) || defined (ACE_HAS_PHARLAP) || defined (ACE_HAS_WINCE)
00369   ACE_UNUSED_ARG (user);
00370   ACE_UNUSED_ARG (maxlen);
00371   ACE_NOTSUP_RETURN (0);
00372 #elif defined (ACE_WIN32)
00373   BOOL result = GetUserNameA (user, (u_long *) &maxlen);
00374   if (result == FALSE)
00375     ACE_FAIL_RETURN (0);
00376   else
00377     return user;
00378 #elif defined (ACE_HAS_ALT_CUSERID)
00379 #  if defined (ACE_LACKS_PWD_FUNCTIONS)
00380 #    error Cannot use alternate cuserid() without POSIX password functions!
00381 #  endif  /* ACE_LACKS_PWD_FUNCTIONS */
00382 
00383   // POSIX.1 dropped the cuserid() function.
00384   // GNU GLIBC and other platforms correctly deprecate the cuserid()
00385   // function.
00386 
00387   if (maxlen == 0)
00388     {
00389       // It doesn't make sense to have a zero length user ID.
00390       errno = EINVAL;
00391       return 0;
00392     }
00393 
00394   struct passwd *pw = 0;
00395 
00396   // Make sure the file pointer is at the beginning of the password file
00397   ACE_OS::setpwent ();
00398   // Should use ACE_OS::setpwent() but I didn't want to move this
00399   // method after it.
00400 
00401   // Use the effective user ID to determine the user name.
00402   pw = ::getpwuid (ACE_OS::geteuid ());
00403 
00404   // Make sure the password file is closed.
00405   ACE_OS::endpwent ();
00406 
00407   if (pw == 0)
00408     {
00409       errno = ENOENT;
00410       return 0;
00411     }
00412 
00413   size_t max_length = 0;
00414   char *userid = 0;
00415 
00416   if (user == 0)
00417     {
00418       // Not reentrant/thread-safe, but nothing else can be done if a
00419       // zero pointer was passed in as the destination.
00420 
00421 #if defined (_POSIX_SOURCE) && defined (L_cuserid)
00422       const size_t ACE_L_cuserid = L_cuserid;
00423 #else
00424       const size_t ACE_L_cuserid = 9;  // 8 character user ID + NULL
00425 #endif  /* _POSIX_SOURCE */
00426 
00427       static char tmp[ACE_L_cuserid] = { '\0' };
00428       max_length = ACE_L_cuserid - 1; // Do not include NULL in length
00429 
00430       userid = tmp;
00431     }
00432   else
00433     {
00434       max_length = maxlen;
00435       userid = user;
00436     }
00437 
00438   // Extract the user name from the passwd structure.
00439   if (ACE_OS::strlen (pw->pw_name) <= max_length)
00440     {
00441       return ACE_OS::strcpy (userid, pw->pw_name);
00442     }
00443   else
00444     {
00445       errno = ENOSPC;  // Buffer is not large enough.
00446       return 0;
00447     }
00448 #else
00449   // Hackish because of missing buffer size!
00450   ACE_UNUSED_ARG (maxlen);
00451   ACE_OSCALL_RETURN (::ace_cuserid(user), char*, 0);
00452 #endif /* ACE_VXWORKS */
00453 }
00454 
00455 #if defined (ACE_HAS_WCHAR)
00456 ACE_INLINE wchar_t *
00457 ACE_OS::cuserid (wchar_t *user, size_t maxlen)
00458 {
00459 # if defined (ACE_HAS_WINCE)
00460   ACE_UNUSED_ARG (user);
00461   ACE_UNUSED_ARG (maxlen);
00462   ACE_NOTSUP_RETURN (0);
00463 # elif defined (ACE_WIN32)
00464   BOOL result = GetUserNameW (user, (u_long *) &maxlen);
00465   if (result == FALSE)
00466     ACE_FAIL_RETURN (0);
00467   else
00468     return user;
00469 # else /* ACE_WIN32 */
00470   char *char_user;
00471   wchar_t *result = 0;
00472 
00473   ACE_NEW_RETURN (char_user, char[maxlen + 1], 0);
00474 
00475   if (ACE_OS::cuserid (char_user, maxlen))
00476     {
00477       ACE_OS::strcpy (user, ACE_Ascii_To_Wide (char_user).wchar_rep ());
00478       result = user;
00479     }
00480 
00481   delete [] char_user;
00482 
00483   return result;
00484 # endif /* ACE_WIN32 */
00485 }
00486 #endif /* ACE_HAS_WCHAR  */
00487 #endif /* ACE_LACKS_CUSERID */
00488 
00489 ACE_INLINE int
00490 ACE_OS::fclose (FILE *fp)
00491 {
00492   ACE_OS_TRACE ("ACE_OS::fclose");
00493   ACE_OSCALL_RETURN (ACE_STD_NAMESPACE::fclose (fp), int, -1);
00494 }
00495 
00496 ACE_INLINE FILE *
00497 ACE_OS::fdopen (ACE_HANDLE handle, const ACE_TCHAR *mode)
00498 {
00499   ACE_OS_TRACE ("ACE_OS::fdopen");
00500 #if defined (ACE_HAS_WINCE)
00501   ACE_OSCALL_RETURN (::_wfdopen (handle, ACE_TEXT_ALWAYS_WCHAR (mode)),
00502                      FILE*,
00503                      0);
00504 #elif defined (ACE_WIN32)
00505   // kernel file handle -> FILE* conversion...
00506   // Options: _O_APPEND, _O_RDONLY and _O_TEXT are lost
00507 
00508   FILE * file = 0;
00509 
00510   int const crt_handle = ::_open_osfhandle (intptr_t (handle), 0);
00511 
00512   if (crt_handle != -1)
00513     {
00514 #   if defined(ACE_HAS_NONCONST_FDOPEN) && !defined (ACE_USES_WCHAR)
00515       file = ::_fdopen (crt_handle, const_cast<ACE_TCHAR *> (mode));
00516 #   elif defined (ACE_HAS_NONCONST_FDOPEN) && defined (ACE_USES_WCHAR)
00517       file = ::_wfdopen (crt_handle, const_cast<ACE_TCHAR *> (mode));
00518 #   elif defined (ACE_USES_WCHAR)
00519       file = ::_wfdopen (crt_handle, mode);
00520 #   else
00521       file = ::_fdopen (crt_handle, mode);
00522 #   endif /* __BORLANDC__ */
00523 
00524       if (!file)
00525         {
00526 #   if defined(__BORLANDC__)
00527           ::_rtl_close (crt_handle);
00528 #   else
00529           ::_close (crt_handle);
00530 #   endif /* defined(__BORLANDC__) */
00531         }
00532     }
00533 
00534   return file;
00535 #elif defined (ACE_LACKS_FDOPEN)
00536   ACE_UNUSED_ARG (handle);
00537   ACE_UNUSED_ARG (mode);
00538   ACE_NOTSUP_RETURN (0);
00539 #else
00540   ACE_OSCALL_RETURN
00541     (::fdopen (handle, ACE_TEXT_ALWAYS_CHAR (mode)), FILE *, 0);
00542 #endif /* ACE_HAS_WINCE */
00543 }
00544 
00545 ACE_INLINE int
00546 ACE_OS::fflush (FILE *fp)
00547 {
00548   ACE_OS_TRACE ("ACE_OS::fflush");
00549 #if defined (ACE_VXWORKS)
00550   if (fp == 0)
00551     {
00552       // Do not allow fflush(0) on VxWorks
00553       return 0;
00554     }
00555 #endif /* ACE_VXWORKS */
00556 
00557   ACE_OSCALL_RETURN (ACE_STD_NAMESPACE::fflush (fp), int, -1);
00558 }
00559 
00560 ACE_INLINE int
00561 ACE_OS::fgetc (FILE* fp)
00562 {
00563   return ace_fgetc_helper (fp);
00564 }
00565 
00566 ACE_INLINE int
00567 ACE_OS::getc (FILE* fp)
00568 {
00569   return ace_getc_helper (fp);
00570 }
00571 
00572 ACE_INLINE int
00573 ACE_OS::fgetpos (FILE* fp, fpos_t* pos)
00574 {
00575   ACE_OSCALL_RETURN (ACE_STD_NAMESPACE::fgetpos (fp, pos), int, -1);
00576 }
00577 
00578 ACE_INLINE char *
00579 ACE_OS::fgets (char *buf, int size, FILE *fp)
00580 {
00581   ACE_OS_TRACE ("ACE_OS::fgets");
00582   ACE_OSCALL_RETURN (ACE_STD_NAMESPACE::fgets (buf, size, fp), char *, 0);
00583 }
00584 
00585 #if defined (ACE_HAS_WCHAR) && !defined(ACE_LACKS_FGETWS)
00586 ACE_INLINE wchar_t *
00587 ACE_OS::fgets (wchar_t *buf, int size, FILE *fp)
00588 {
00589   ACE_OS_TRACE ("ACE_OS::fgets");
00590   ACE_OSCALL_RETURN (ACE_STD_NAMESPACE::fgetws (buf, size, fp), wchar_t *, 0);
00591 }
00592 #endif /* ACE_HAS_WCHAR && !ACE_LACKS_FGETWS */
00593 
00594 #if !(defined (ACE_WIN32) && !defined (ACE_HAS_WINCE))
00595 // Win32 PC implementation of fopen () is in OS_NS_stdio.cpp.
00596 ACE_INLINE FILE *
00597 ACE_OS::fopen (const char *filename, const ACE_TCHAR *mode)
00598 {
00599   ACE_OS_TRACE ("ACE_OS::fopen");
00600   ACE_OSCALL_RETURN
00601     (::fopen (filename, ACE_TEXT_ALWAYS_CHAR (mode)), FILE *, 0);
00602 }
00603 
00604 #if defined (ACE_HAS_WCHAR)
00605 ACE_INLINE FILE *
00606 ACE_OS::fopen (const wchar_t *filename, const ACE_TCHAR *mode)
00607 {
00608   ACE_OS_TRACE ("ACE_OS::fopen");
00609 #if defined (ACE_HAS_WINCE)
00610   ACE_OSCALL_RETURN
00611     (::_wfopen (filename, ACE_TEXT_ALWAYS_WCHAR (mode)), FILE *, 0);
00612 #else
00613   // Non-Windows doesn't use wchar_t file systems.
00614   ACE_Wide_To_Ascii n_filename (filename);
00615   ACE_OSCALL_RETURN
00616     (::fopen (n_filename.char_rep (), ACE_TEXT_ALWAYS_CHAR (mode)), FILE*, 0);
00617 #endif /* ACE_HAS_WINCE */
00618 }
00619 #endif /* ACE_HAS_WCHAR */
00620 
00621 #endif /* ACE_WIN32 */
00622 
00623 ACE_INLINE int
00624 ACE_OS::ungetc (int c, FILE *fp)
00625 {
00626   return ace_ungetc_helper (c, fp);
00627 }
00628 
00629 ACE_INLINE int
00630 ACE_OS::fputc (int c, FILE *fp)
00631 {
00632   return ace_fputc_helper (c, fp);
00633 }
00634 
00635 ACE_INLINE int
00636 ACE_OS::putc (int c, FILE *fp)
00637 {
00638   return ace_putc_helper (c, fp);
00639 }
00640 
00641 ACE_INLINE int
00642 ACE_OS::fputs (const char *s, FILE *stream)
00643 {
00644   ACE_OS_TRACE ("ACE_OS::fputs");
00645   ACE_OSCALL_RETURN (ACE_STD_NAMESPACE::fputs (s, stream), int, -1);
00646 }
00647 
00648 #if defined (ACE_HAS_WCHAR) && !defined(ACE_LACKS_FPUTWS)
00649 ACE_INLINE int
00650 ACE_OS::fputs (const wchar_t *s, FILE *stream)
00651 {
00652   ACE_OS_TRACE ("ACE_OS::fputs");
00653   ACE_OSCALL_RETURN (ACE_STD_NAMESPACE::fputws (s, stream), int, -1);
00654 }
00655 #endif /* ACE_HAS_WCHAR && !ACE_LACKS_FPUTWS */
00656 
00657 ACE_INLINE size_t
00658 ACE_OS::fread (void *ptr, size_t size, size_t nelems, FILE *fp)
00659 {
00660   ACE_OS_TRACE ("ACE_OS::fread");
00661   ACE_OSCALL_RETURN (ACE_STD_NAMESPACE::fread (ptr, size, nelems, fp),
00662                      size_t,
00663                      0);
00664 }
00665 
00666 ACE_INLINE FILE *
00667 ACE_OS::freopen (const ACE_TCHAR *filename, const ACE_TCHAR *mode, FILE* stream)
00668 {
00669   ACE_OS_TRACE ("ACE_OS::freopen");
00670 #if defined (ACE_WIN32) && (defined(ACE_USES_WCHAR) || defined(ACE_HAS_WINCE))
00671   ACE_OSCALL_RETURN (::_wfreopen (ACE_TEXT_ALWAYS_WCHAR (filename),
00672                                   ACE_TEXT_ALWAYS_WCHAR (mode),
00673                                   stream),
00674                      FILE *, 0);
00675 #else
00676   ACE_OSCALL_RETURN
00677     (ACE_STD_NAMESPACE::freopen (ACE_TEXT_ALWAYS_CHAR (filename),
00678                                  ACE_TEXT_ALWAYS_CHAR (mode),
00679                                  stream),
00680      FILE *, 0);
00681 #endif /* ACE_WIN32 && ACE_USES_WCHAR */
00682 }
00683 
00684 ACE_INLINE int
00685 ACE_OS::fseek (FILE *fp, long offset, int whence)
00686 {
00687 # if defined (ACE_WIN32)
00688 #   if SEEK_SET != FILE_BEGIN || SEEK_CUR != FILE_CURRENT || SEEK_END != FILE_END
00689   //#error Windows NT is evil AND rude!
00690   switch (whence)
00691     {
00692     case SEEK_SET:
00693       whence = FILE_BEGIN;
00694       break;
00695     case SEEK_CUR:
00696       whence = FILE_CURRENT;
00697       break;
00698     case SEEK_END:
00699       whence = FILE_END;
00700       break;
00701     default:
00702       errno = EINVAL;
00703       return -1; // rather safe than sorry
00704     }
00705 #   endif  /* SEEK_SET != FILE_BEGIN || SEEK_CUR != FILE_CURRENT || SEEK_END != FILE_END */
00706 # endif   /* ACE_WIN32 */
00707   ACE_OSCALL_RETURN (ACE_STD_NAMESPACE::fseek (fp, offset, whence), int, -1);
00708 }
00709 
00710 ACE_INLINE int
00711 ACE_OS::fsetpos (FILE* fp, fpos_t* pos)
00712 {
00713   ACE_OSCALL_RETURN (::fsetpos (fp, pos), int, -1);
00714 }
00715 
00716 ACE_INLINE long
00717 ACE_OS::ftell (FILE* fp)
00718 {
00719   ACE_OSCALL_RETURN (ACE_STD_NAMESPACE::ftell (fp), long, -1);
00720 }
00721 
00722 ACE_INLINE size_t
00723 ACE_OS::fwrite (const void *ptr, size_t size, size_t nitems, FILE *fp)
00724 {
00725   ACE_OS_TRACE ("ACE_OS::fwrite");
00726   ACE_OSCALL_RETURN (ACE_STD_NAMESPACE::fwrite (ptr, size, nitems, fp),
00727                      size_t,
00728                      0);
00729 }
00730 
00731 ACE_INLINE void
00732 ACE_OS::perror (const char *s)
00733 {
00734   ACE_OS_TRACE ("ACE_OS::perror");
00735 #if defined (ACE_LACKS_PERROR)
00736   ACE_UNUSED_ARG (s);
00737 #else
00738   ::perror (s);
00739 #endif /* ACE_HAS_WINCE */
00740 }
00741 
00742 #if defined (ACE_HAS_WCHAR)
00743 ACE_INLINE void
00744 ACE_OS::perror (const wchar_t *s)
00745 {
00746   ACE_OS_TRACE ("ACE_OS::perror");
00747 #if defined (ACE_LACKS_PERROR)
00748   ACE_UNUSED_ARG (s);
00749 #elif defined (ACE_WIN32)
00750   ::_wperror (s);
00751 #else
00752   ACE_Wide_To_Ascii n_s (s);
00753   ::perror (n_s.char_rep ());
00754 #endif /* ACE_HAS_WINCE */
00755 }
00756 #endif /* ACE_HAS_WCHAR */
00757 
00758 ACE_INLINE int
00759 ACE_OS::puts (const char *s)
00760 {
00761   ACE_OS_TRACE ("ACE_OS::puts");
00762   ACE_OSCALL_RETURN (::puts (s), int, -1);
00763 }
00764 
00765 #if defined (ACE_HAS_WCHAR)
00766 ACE_INLINE int
00767 ACE_OS::puts (const wchar_t *s)
00768 {
00769   ACE_OS_TRACE ("ACE_OS::puts");
00770 #if defined (ACE_WIN32)
00771   ACE_OSCALL_RETURN (::_putws (s), int, -1);
00772 #else /* ACE_WIN32 */
00773   // There's no putws()...
00774   ACE_Wide_To_Ascii n_s (s);
00775   ACE_OSCALL_RETURN (::puts (n_s.char_rep ()), int, -1);
00776 #endif /* ACE_WIN32 */
00777 }
00778 #endif /* ACE_HAS_WCHAR */
00779 
00780 ACE_INLINE int
00781 ACE_OS::rename (const char *old_name,
00782                 const char *new_name,
00783                 int flags)
00784 {
00785 # if defined (ACE_LACKS_RENAME)
00786   ACE_UNUSED_ARG (old_name);
00787   ACE_UNUSED_ARG (new_name);
00788   ACE_UNUSED_ARG (flags);
00789   ACE_NOTSUP_RETURN (-1);
00790 # elif defined (ACE_HAS_WINCE)
00791   // Win CE is always wide-char.
00792   ACE_UNUSED_ARG (flags);
00793   if (0 != MoveFile (ACE_TEXT_CHAR_TO_TCHAR (old_name),
00794                      ACE_TEXT_CHAR_TO_TCHAR (new_name)))
00795     ACE_FAIL_RETURN (-1);
00796   return 0;
00797 # elif defined (ACE_WIN32) && !defined (ACE_LACKS_WIN32_MOVEFILEEX)
00798   // NT4 (and up) provides a way to rename/move a file with similar semantics
00799   // to what's usually done on UNIX - if there's an existing file with
00800   // <new_name> it is removed before the file is renamed/moved. The
00801   // MOVEFILE_COPY_ALLOWED is specified to allow such a rename across drives.
00802   if (flags == -1)
00803     flags = MOVEFILE_COPY_ALLOWED | MOVEFILE_REPLACE_EXISTING;
00804   if (::MoveFileExA (old_name, new_name, flags) == 0)
00805     ACE_FAIL_RETURN (-1);
00806   return 0;
00807 # else /* ACE_LACKS_RENAME */
00808   ACE_UNUSED_ARG (flags);
00809   ACE_OSCALL_RETURN (::rename (old_name, new_name), int, -1);
00810 # endif /* ACE_LACKS_RENAME */
00811 }
00812 
00813 #if defined (ACE_HAS_WCHAR)
00814 ACE_INLINE int
00815 ACE_OS::rename (const wchar_t *old_name,
00816                 const wchar_t *new_name,
00817                 int flags)
00818 {
00819 # if defined (ACE_LACKS_RENAME)
00820   ACE_UNUSED_ARG (old_name);
00821   ACE_UNUSED_ARG (new_name);
00822   ACE_UNUSED_ARG (flags);
00823   ACE_NOTSUP_RETURN (-1);
00824 # elif defined (ACE_HAS_WINCE)
00825   ACE_UNUSED_ARG (flags);
00826   if (MoveFileW (old_name, new_name) != 0)
00827     ACE_FAIL_RETURN (-1);
00828   return 0;
00829 # elif defined (ACE_WIN32) && !defined (ACE_LACKS_WIN32_MOVEFILEEX)
00830   // NT4 (and up) provides a way to rename/move a file with similar semantics
00831   // to what's usually done on UNIX - if there's an existing file with
00832   // <new_name> it is removed before the file is renamed/moved. The
00833   // MOVEFILE_COPY_ALLOWED is specified to allow such a rename across drives.
00834   if (flags == -1)
00835     flags = MOVEFILE_COPY_ALLOWED | MOVEFILE_REPLACE_EXISTING;
00836   if (::MoveFileExW (old_name, new_name, flags) == 0)
00837     ACE_FAIL_RETURN (-1);
00838   return 0;
00839 # elif defined (ACE_WIN32)
00840   ACE_UNUSED_ARG (flags);
00841   ACE_OSCALL_RETURN (::_wrename (old_name, new_name), int, -1);
00842 # else /* ACE_LACKS_RENAME */
00843   ACE_Wide_To_Ascii nold_name (old_name);
00844   ACE_Wide_To_Ascii nnew_name (new_name);
00845   return ACE_OS::rename (nold_name.char_rep (), nnew_name.char_rep (), flags);
00846 # endif /* ACE_LACKS_RENAME */
00847 }
00848 #endif /* ACE_HAS_WCHAR */
00849 
00850 ACE_INLINE void
00851 ACE_OS::rewind (FILE *fp)
00852 {
00853 #if !defined (ACE_HAS_WINCE)
00854   ACE_OS_TRACE ("ACE_OS::rewind");
00855   ::rewind (fp);
00856 #else
00857   // This isn't perfect since it doesn't reset EOF, but it's probably
00858   // the closest we can get on WINCE.
00859   (void) fseek (fp, 0L, SEEK_SET);
00860 #endif /* ACE_HAS_WINCE */
00861 }
00862 
00863 ACE_INLINE char *
00864 ACE_OS::tempnam (const char *dir, const char *pfx)
00865 {
00866   ACE_OS_TRACE ("ACE_OS::tempnam");
00867 #if defined (ACE_LACKS_TEMPNAM)
00868   ACE_UNUSED_ARG (dir);
00869   ACE_UNUSED_ARG (pfx);
00870   ACE_NOTSUP_RETURN (0);
00871 #elif defined (ACE_HAS_NONCONST_TEMPNAM)
00872   ACE_OSCALL_RETURN (ACE_STD_NAMESPACE::tempnam (const_cast <char *> (dir), const_cast<char *> (pfx)), char *, 0);
00873 #else /* ACE_LACKS_TEMPNAM */
00874   ACE_OSCALL_RETURN (ACE_STD_NAMESPACE::tempnam (dir, pfx), char *, 0);
00875 #endif /* ACE_LACKS_TEMPNAM */
00876 }
00877 
00878 #if defined (ACE_HAS_WCHAR)
00879 ACE_INLINE wchar_t *
00880 ACE_OS::tempnam (const wchar_t *dir, const wchar_t *pfx)
00881 {
00882   ACE_OS_TRACE ("ACE_OS::tempnam");
00883 #if defined (ACE_LACKS_TEMPNAM)
00884   ACE_UNUSED_ARG (dir);
00885   ACE_UNUSED_ARG (pfx);
00886   ACE_NOTSUP_RETURN (0);
00887 #elif defined(ACE_WIN32)
00888 #  if defined (ACE_HAS_NONCONST_TEMPNAM)
00889   ACE_OSCALL_RETURN (::_wtempnam (const_cast <wchar_t*> (dir), const_cast <wchar_t*> (pfx)), wchar_t *, 0);
00890 #  else
00891   ACE_OSCALL_RETURN (::_wtempnam (dir, pfx), wchar_t *, 0);
00892 #  endif /* __BORLANDC__ */
00893 #else /* ACE_LACKS_TEMPNAM */
00894   // No native wide-char support; convert to narrow and call the char* variant.
00895   char *ndir = ACE_Wide_To_Ascii (dir).char_rep ();
00896   char *npfx = ACE_Wide_To_Ascii (pfx).char_rep ();
00897   char *name = ACE_OS::tempnam (ndir, npfx);
00898   // ACE_OS::tempnam returns a pointer to a malloc()-allocated space.
00899   // Convert that string to wide-char and free() the original.
00900   wchar_t *wname = 0;
00901   if (name != 0)
00902     {
00903       size_t namelen = ACE_OS::strlen (name) + 1;
00904       wname = reinterpret_cast<wchar_t *>
00905         (ACE_OS::malloc (namelen * sizeof (wchar_t)));
00906       if (wname != 0)
00907         ACE_OS::strcpy (wname, ACE_Ascii_To_Wide (name).wchar_rep ());
00908       ACE_OS::free (name);
00909     }
00910   return wname;
00911 #endif /* ACE_LACKS_TEMPNAM */
00912 }
00913 #endif /* ACE_HAS_WCHAR */
00914 
00915 ACE_INLINE int
00916 ACE_OS::vasprintf (char **bufp, const char* format, va_list argptr)
00917 {
00918 #if defined (ACE_HAS_VASPRINTF)
00919   return ::vasprintf (bufp, format, argptr);
00920 #else
00921   return ACE_OS::vasprintf_emulation (bufp, format, argptr);
00922 #endif /* ACE_HAS_VASPRINTF */
00923 }
00924 
00925 #if defined (ACE_HAS_WCHAR)
00926 ACE_INLINE int
00927 ACE_OS::vasprintf (wchar_t **bufp, const wchar_t* format, va_list argptr)
00928 {
00929 #if defined (ACE_HAS_VASWPRINTF)
00930   return ::vaswprintf (bufp, format, argptr);
00931 #else
00932   return ACE_OS::vaswprintf_emulation (bufp, format, argptr);
00933 #endif /* ACE_HAS_VASWPRINTF */
00934 }
00935 #endif /* ACE_HAS_WCHAR */
00936 
00937 ACE_INLINE int
00938 ACE_OS::vprintf (const char *format, va_list argptr)
00939 {
00940   return ::vprintf (format, argptr);
00941 }
00942 
00943 #if defined (ACE_HAS_WCHAR)
00944 ACE_INLINE int
00945 ACE_OS::vprintf (const wchar_t *format, va_list argptr)
00946 {
00947 #if defined (ACE_HAS_VWPRINTF)
00948   return ::vwprintf (format, argptr);
00949 #else
00950   ACE_UNUSED_ARG (format);
00951   ACE_UNUSED_ARG (argptr);
00952   ACE_NOTSUP_RETURN (-1);
00953 #endif /* ACE_HAS_VWPRINTF */
00954 }
00955 #endif /* ACE_HAS_WCHAR */
00956 
00957 ACE_INLINE int
00958 ACE_OS::vfprintf (FILE *fp, const char *format, va_list argptr)
00959 {
00960   return ACE_STD_NAMESPACE::vfprintf (fp, format, argptr);
00961 }
00962 
00963 #if defined (ACE_HAS_WCHAR)
00964 ACE_INLINE int
00965 ACE_OS::vfprintf (FILE *fp, const wchar_t *format, va_list argptr)
00966 {
00967 #if defined (ACE_HAS_VFWPRINTF)
00968   return ::vfwprintf (fp, format, argptr);
00969 #else
00970   ACE_UNUSED_ARG (fp);
00971   ACE_UNUSED_ARG (format);
00972   ACE_UNUSED_ARG (argptr);
00973   ACE_NOTSUP_RETURN (-1);
00974 #endif /* ACE_HAS_VFWPRINTF */
00975 }
00976 #endif /* ACE_HAS_WCHAR */
00977 
00978 ACE_INLINE int
00979 ACE_OS::vsprintf (char *buffer, const char *format, va_list argptr)
00980 {
00981   return ::vsprintf (buffer, format, argptr);
00982 }
00983 
00984 #if defined (ACE_HAS_WCHAR)
00985 ACE_INLINE int
00986 ACE_OS::vsprintf (wchar_t *buffer, const wchar_t *format, va_list argptr)
00987 {
00988 # if (defined _XOPEN_SOURCE && (_XOPEN_SOURCE - 0) >= 500) || \
00989      (defined (sun) && !(defined(_XOPEN_SOURCE) && (_XOPEN_VERSION-0==4))) || \
00990       defined (ACE_HAS_DINKUM_STL) || defined (__DMC__) || \
00991       defined (ACE_HAS_VSWPRINTF) || defined (ACE_WIN32_VC9) || \
00992      (defined (ACE_WIN32_VC8) && !defined (ACE_HAS_WINCE) && \
00993       _MSC_FULL_VER > 140050000)
00994 
00995   // The XPG4/UNIX98/C99 signature of the wide-char sprintf has a
00996   // maxlen argument. Since this method doesn't supply one, pass in
00997   // a length that works (ULONG_MAX doesn't on all platform since some check
00998   // to see if the operation will remain in bounds). If this isn't ok, use
00999   // ACE_OS::snprintf().
01000   return vswprintf (buffer, 4096, format, argptr);
01001 
01002 # elif defined (ACE_WIN32)
01003   // Windows has vswprintf, but the pre-VC8 signature is from the older
01004   // ISO C standard. Also see ACE_OS::snprintf() for more info on this.
01005 
01006   return vswprintf (buffer, format, argptr);
01007 
01008 # else
01009   ACE_UNUSED_ARG (buffer);
01010   ACE_UNUSED_ARG (format);
01011   ACE_UNUSED_ARG (argptr);
01012   ACE_NOTSUP_RETURN (-1);
01013 
01014 # endif /* XPG5 || ACE_HAS_DINKUM_STL */
01015 }
01016 #endif /* ACE_HAS_WCHAR */
01017 
01018 ACE_INLINE int
01019 ACE_OS::vsnprintf (char *buffer, size_t maxlen, const char *format, va_list ap)
01020 {
01021 #if !defined (ACE_LACKS_VSNPRINTF)
01022   int result;
01023 #  if 0 /* defined (ACE_HAS_TR24731_2005_CRT) */
01024   // _vsnprintf_s() doesn't report the length needed when it truncates. This
01025   // info is needed and relied on by others things in ACE+TAO, so don't use
01026   // this. There's adequate protection via the maxlen.
01027   result = _vsnprintf_s (buffer, maxlen, _TRUNCATE, format, ap);
01028 #  elif !defined (ACE_WIN32)
01029   result = ::vsnprintf (buffer, maxlen, format, ap);
01030 #  else
01031   result = ::_vsnprintf (buffer, maxlen, format, ap);
01032 
01033   // Win32 doesn't regard a full buffer with no 0-terminate as an overrun.
01034   if (result == static_cast<int> (maxlen))
01035     buffer[maxlen-1] = '\0';
01036 
01037   // Win32 doesn't 0-terminate the string if it overruns maxlen.
01038   if (result == -1)
01039     buffer[maxlen-1] = '\0';
01040 # endif
01041   // In out-of-range conditions, C99 defines vsnprintf() to return the number
01042   // of characters that would have been written if enough space was available.
01043   // Earlier variants of the vsnprintf() (e.g. UNIX98) defined it to return
01044   // -1. This method follows the C99 standard, but needs to guess at the
01045   // value; uses maxlen + 1.
01046   if (result == -1)
01047     {
01048       result = static_cast <int> (maxlen + 1);
01049     }
01050 
01051   return result;
01052 #elif defined (ACE_HAS_TRIO)
01053   return trio_vsnprintf (buffer, maxlen, format, ap);
01054 #else
01055   ACE_UNUSED_ARG (buffer);
01056   ACE_UNUSED_ARG (maxlen);
01057   ACE_UNUSED_ARG (format);
01058   ACE_UNUSED_ARG (ap);
01059   ACE_NOTSUP_RETURN (-1);
01060 #endif /* ACE_LACKS_VSNPRINTF */
01061 }
01062 
01063 #if defined (ACE_HAS_WCHAR)
01064 ACE_INLINE int
01065 ACE_OS::vsnprintf (wchar_t *buffer, size_t maxlen, const wchar_t *format, va_list ap)
01066 {
01067 # if (defined _XOPEN_SOURCE && (_XOPEN_SOURCE - 0) >= 500) || \
01068      (defined (sun) && !(defined(_XOPEN_SOURCE) && (_XOPEN_VERSION-0==4))) || \
01069      (defined (ACE_HAS_DINKUM_STL) || defined (__DMC__)) || \
01070       defined (ACE_HAS_VSWPRINTF) || \
01071       defined (ACE_WIN32)
01072 
01073   int result;
01074 
01075 # if defined (ACE_WIN32)
01076   // Microsoft's vswprintf() doesn't have the maxlen argument that
01077   // XPG4/UNIX98 define. They do, however, recommend use of _vsnwprintf()
01078   // as a substitute, which does have the same signature as the UNIX98 one.
01079   result = ::_vsnwprintf (buffer, maxlen, format, ap);
01080 
01081   // Win32 doesn't regard a full buffer with no 0-terminate as an overrun.
01082   if (result == static_cast<int> (maxlen))
01083     buffer[maxlen-1] = '\0';
01084 
01085   // Win32 doesn't 0-terminate the string if it overruns maxlen.
01086   if (result == -1)
01087     buffer[maxlen-1] = '\0';
01088 # else
01089   result = vswprintf (buffer, maxlen, format, ap);
01090 #endif
01091 
01092   // In out-of-range conditions, C99 defines vsnprintf() to return the number
01093   // of characters that would have been written if enough space was available.
01094   // Earlier variants of the vsnprintf() (e.g. UNIX98) defined it to return
01095   // -1. This method follows the C99 standard, but needs to guess at the
01096   // value; uses maxlen + 1.
01097   if (result == -1)
01098     {
01099       result = static_cast <int> (maxlen + 1);
01100     }
01101 
01102   return result;
01103 
01104 # else
01105 
01106   ACE_UNUSED_ARG (buffer);
01107   ACE_UNUSED_ARG (maxlen);
01108   ACE_UNUSED_ARG (format);
01109   ACE_UNUSED_ARG (ap);
01110   ACE_NOTSUP_RETURN (-1);
01111 
01112 # endif /* platforms with a variant of vswprintf */
01113 }
01114 #endif /* ACE_HAS_WCHAR */
01115 
01116 #if defined (ACE_MT_SAFE) && (ACE_MT_SAFE != 0)
01117 #if defined (ACE_WIN32)
01118 ACE_INLINE const ACE_TEXT_OSVERSIONINFO &
01119 ACE_OS::get_win32_versioninfo ()
01120 {
01121   return ACE_OS::win32_versioninfo_;
01122 }
01123 
01124 ACE_INLINE HINSTANCE
01125 ACE_OS::get_win32_resource_module ()
01126 {
01127   return ACE_OS::win32_resource_module_;
01128 }
01129 
01130 ACE_INLINE void
01131 ACE_OS::set_win32_resource_module (HINSTANCE instance)
01132 {
01133   ACE_OS::win32_resource_module_ = instance;
01134 }
01135 
01136 ACE_INLINE LPSECURITY_ATTRIBUTES
01137 ACE_OS::default_win32_security_attributes (LPSECURITY_ATTRIBUTES sa)
01138 {
01139 #if defined (ACE_DEFINES_DEFAULT_WIN32_SECURITY_ATTRIBUTES)
01140   if (sa == 0)
01141     {
01142       // @@ This is a good place to use pthread_once.
01143       static SECURITY_ATTRIBUTES default_sa;
01144       static SECURITY_DESCRIPTOR sd;
01145       InitializeSecurityDescriptor(&sd, SECURITY_DESCRIPTOR_REVISION);
01146       SetSecurityDescriptorDacl(&sd, TRUE, 0, FALSE);
01147       default_sa.nLength = sizeof(SECURITY_ATTRIBUTES);
01148       default_sa.lpSecurityDescriptor = &sd;
01149       default_sa.bInheritHandle       = TRUE;
01150       sa = &default_sa;
01151     }
01152   return sa;
01153 #else /* !ACE_DEFINES_DEFAULT_WIN32_SECURITY_ATTRIBUTES */
01154   return sa;
01155 #endif /* ACE_DEFINES_DEFAULT_WIN32_SECURITY_ATTRIBUTES */
01156 }
01157 
01158 ACE_INLINE LPSECURITY_ATTRIBUTES
01159 ACE_OS::default_win32_security_attributes_r (LPSECURITY_ATTRIBUTES sa,
01160                                              LPSECURITY_ATTRIBUTES sa_buffer,
01161                                              SECURITY_DESCRIPTOR* sd_buffer)
01162 {
01163 #if defined (ACE_DEFINES_DEFAULT_WIN32_SECURITY_ATTRIBUTES)
01164   if (sa == 0)
01165     {
01166       if (sa_buffer != 0 && sd_buffer != 0)
01167         {
01168           InitializeSecurityDescriptor
01169             (sd_buffer, SECURITY_DESCRIPTOR_REVISION);
01170           SetSecurityDescriptorDacl (sd_buffer, TRUE, 0, FALSE);
01171           sa_buffer->nLength = sizeof(SECURITY_ATTRIBUTES);
01172           sa_buffer->lpSecurityDescriptor = sd_buffer;
01173           sa_buffer->bInheritHandle       = TRUE;
01174           sa = sa_buffer;
01175         }
01176     }
01177   return sa;
01178 #else /* !ACE_DEFINES_DEFAULT_WIN32_SECURITY_ATTRIBUTES */
01179   ACE_UNUSED_ARG(sa_buffer);
01180   ACE_UNUSED_ARG(sd_buffer);
01181   return sa;
01182 #endif /* ACE_DEFINES_DEFAULT_WIN32_SECURITY_ATTRIBUTES */
01183 }
01184 
01185 #endif /* ACE_WIN32 */
01186 #endif
01187 
01188 ACE_END_VERSIONED_NAMESPACE_DECL

Generated on Tue Feb 2 17:18:41 2010 for ACE by  doxygen 1.4.7