00001
00002
00003
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
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
00060
00061 # if defined (_FILE_OFFSET_BITS) && _FILE_OFFSET_BITS == 64
00062 start += offset.QuadPart;
00063 # else
00064 start += offset.LowPart;
00065 # endif
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
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
00098 lock->overlapped_.Internal = 0;
00099 lock->overlapped_.InternalHigh = 0;
00100 lock->overlapped_.OffsetHigh = 0;
00101 lock->overlapped_.hEvent = 0;
00102 #endif
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;
00149
00150
00151 ACE_OSCALL_RETURN (ACE_OS::fcntl (lock->handle_, F_SETLK,
00152 reinterpret_cast<long> (&lock->lock_)),
00153 int, -1);
00154 #endif
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
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;
00209
00210 ACE_OSCALL_RETURN (ACE_OS::fcntl (lock->handle_, F_SETLKW,
00211 reinterpret_cast<long> (&lock->lock_)),
00212 int, -1);
00213 #endif
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;
00246
00247 int result = 0;
00248
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
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;
00290
00291 int result = 0;
00292
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
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;
00335
00336 ACE_OSCALL_RETURN (ACE_OS::fcntl (lock->handle_, F_SETLKW,
00337 reinterpret_cast<long> (&lock->lock_)),
00338 int, -1);
00339 #endif
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
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
00360
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
00382
00383
00384
00385
00386
00387 if (maxlen == 0)
00388 {
00389
00390 errno = EINVAL;
00391 return 0;
00392 }
00393
00394 struct passwd *pw = 0;
00395
00396
00397 ACE_OS::setpwent ();
00398
00399
00400
00401
00402 pw = ::getpwuid (ACE_OS::geteuid ());
00403
00404
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
00419
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;
00425 #endif
00426
00427 static char tmp[ACE_L_cuserid] = { '\0' };
00428 max_length = ACE_L_cuserid - 1;
00429
00430 userid = tmp;
00431 }
00432 else
00433 {
00434 max_length = maxlen;
00435 userid = user;
00436 }
00437
00438
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;
00446 return 0;
00447 }
00448 #else
00449
00450 ACE_UNUSED_ARG (maxlen);
00451 ACE_OSCALL_RETURN (::ace_cuserid(user), char*, 0);
00452 #endif
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
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
00485 }
00486 #endif
00487 #endif
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
00506
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
00523
00524 if (!file)
00525 {
00526 # if defined(__BORLANDC__)
00527 ::_rtl_close (crt_handle);
00528 # else
00529 ::_close (crt_handle);
00530 # endif
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
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
00553 return 0;
00554 }
00555 #endif
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
00593
00594 #if !(defined (ACE_WIN32) && !defined (ACE_HAS_WINCE))
00595
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
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
00618 }
00619 #endif
00620
00621 #endif
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
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
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
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;
00704 }
00705 # endif
00706 # endif
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
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
00755 }
00756 #endif
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
00773
00774 ACE_Wide_To_Ascii n_s (s);
00775 ACE_OSCALL_RETURN (::puts (n_s.char_rep ()), int, -1);
00776 #endif
00777 }
00778 #endif
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
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
00799
00800
00801
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
00808 ACE_UNUSED_ARG (flags);
00809 ACE_OSCALL_RETURN (::rename (old_name, new_name), int, -1);
00810 # endif
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
00831
00832
00833
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
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
00847 }
00848 #endif
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
00858
00859 (void) fseek (fp, 0L, SEEK_SET);
00860 #endif
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
00874 ACE_OSCALL_RETURN (ACE_STD_NAMESPACE::tempnam (dir, pfx), char *, 0);
00875 #endif
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
00893 #else
00894
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
00899
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
00912 }
00913 #endif
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
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
00934 }
00935 #endif
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
00954 }
00955 #endif
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
00975 }
00976 #endif
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
00996
00997
00998
00999
01000 return vswprintf (buffer, 4096, format, argptr);
01001
01002 # elif defined (ACE_WIN32)
01003
01004
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
01015 }
01016 #endif
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
01024
01025
01026
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
01034 if (result == static_cast<int> (maxlen))
01035 buffer[maxlen-1] = '\0';
01036
01037
01038 if (result == -1)
01039 buffer[maxlen-1] = '\0';
01040 # endif
01041
01042
01043
01044
01045
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
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
01077
01078
01079 result = ::_vsnwprintf (buffer, maxlen, format, ap);
01080
01081
01082 if (result == static_cast<int> (maxlen))
01083 buffer[maxlen-1] = '\0';
01084
01085
01086 if (result == -1)
01087 buffer[maxlen-1] = '\0';
01088 # else
01089 result = vswprintf (buffer, maxlen, format, ap);
01090 #endif
01091
01092
01093
01094
01095
01096
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
01113 }
01114 #endif
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
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
01154 return sa;
01155 #endif
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
01179 ACE_UNUSED_ARG(sa_buffer);
01180 ACE_UNUSED_ARG(sd_buffer);
01181 return sa;
01182 #endif
01183 }
01184
01185 #endif
01186 #endif
01187
01188 ACE_END_VERSIONED_NAMESPACE_DECL