00001
00002
00003 #include "ace/OS_NS_stdio.h"
00004 #include "ace/OS_NS_Thread.h"
00005
00006 ACE_RCSID (ace,
00007 OS_NS_stdio,
00008 "$Id: OS_NS_stdio.cpp 80826 2008-03-04 14:51:23Z wotte $")
00009
00010
00011 #if !defined (ACE_HAS_INLINED_OSCALLS)
00012 # include "ace/OS_NS_stdio.inl"
00013 #endif
00014
00015 # if defined (ACE_WIN32)
00016
00017 ACE_BEGIN_VERSIONED_NAMESPACE_DECL
00018 ACE_TEXT_OSVERSIONINFO ACE_OS::win32_versioninfo_;
00019 HINSTANCE ACE_OS::win32_resource_module_;
00020 ACE_END_VERSIONED_NAMESPACE_DECL
00021
00022 # if defined (ACE_HAS_DLL) && (ACE_HAS_DLL == 1) && !defined (ACE_HAS_WINCE)
00023
00024
00025 extern "C" BOOL WINAPI DllMain(HINSTANCE instance, DWORD reason, LPVOID)
00026 {
00027 if (reason == DLL_PROCESS_ATTACH)
00028 {
00029 # if defined (ACE_DISABLES_THREAD_LIBRARY_CALLS) && (ACE_DISABLES_THREAD_LIBRARY_CALLS == 1)
00030 ::DisableThreadLibraryCalls (instance);
00031 # endif
00032 ACE_OS::set_win32_resource_module(instance);
00033 }
00034 else if (reason == DLL_THREAD_DETACH)
00035 {
00036 ACE_OS::cleanup_tss (0);
00037 }
00038 return TRUE;
00039 }
00040 # endif
00041 # endif
00042
00043 ACE_BEGIN_VERSIONED_NAMESPACE_DECL
00044
00045 void
00046 ACE_OS::ace_flock_t::dump (void) const
00047 {
00048 #if defined (ACE_HAS_DUMP)
00049 ACE_OS_TRACE ("ACE_OS::ace_flock_t::dump");
00050
00051 # if 0
00052 ACE_DEBUG ((LM_DEBUG, ACE_BEGIN_DUMP, this));
00053 ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("handle_ = %u"), this->handle_));
00054 # if defined (ACE_WIN32)
00055 ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("\nInternal = %d"),
00056 this->overlapped_.Internal));
00057 ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("\nInternalHigh = %d"),
00058 this->overlapped_.InternalHigh));
00059 ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("\nOffsetHigh = %d"),
00060 this->overlapped_.OffsetHigh));
00061 ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("\nhEvent = %d"),
00062 this->overlapped_.hEvent));
00063 # else
00064 ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("\nl_whence = %d"),
00065 this->lock_.l_whence));
00066 ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("\nl_start = %d"), this->lock_.l_start));
00067 ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("\nl_len = %d"), this->lock_.l_len));
00068 ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("\nl_type = %d"), this->lock_.l_type));
00069 # endif
00070 ACE_DEBUG ((LM_DEBUG, ACE_END_DUMP));
00071 # endif
00072 #endif
00073 }
00074
00075
00076
00077 #if defined (ACE_USES_WCHAR)
00078 void ACE_OS::checkUnicodeFormat (FILE* fp)
00079 {
00080 if (fp != 0)
00081 {
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091 ACE_UINT16 first_two_bytes;
00092 size_t numRead =
00093 ACE_OS::fread(&first_two_bytes, sizeof (first_two_bytes), 1, fp);
00094
00095 if (numRead == 1)
00096 {
00097 if ((first_two_bytes != 0xFFFE) &&
00098 (first_two_bytes != 0xFEFF))
00099 {
00100
00101 #if defined (ACE_WIN32)
00102 ACE_OS::fseek(fp, 0, FILE_BEGIN);
00103 #else
00104 ACE_OS::fseek(fp, 0, SEEK_SET);
00105 #endif
00106 }
00107 }
00108
00109
00110 }
00111 }
00112 #endif // ACE_USES_WCHAR
00113
00114 #if defined (ACE_WIN32) && !defined (ACE_HAS_WINCE)
00115 namespace
00116 {
00117
00118
00119 void
00120 fopen_mode_to_open_mode_converter (ACE_TCHAR x, int & hmode)
00121 {
00122 switch (x)
00123 {
00124 case ACE_TEXT ('r'):
00125 if (ACE_BIT_DISABLED (hmode, _O_RDWR))
00126 {
00127 ACE_CLR_BITS (hmode, _O_WRONLY);
00128 ACE_SET_BITS (hmode, _O_RDONLY);
00129 }
00130 break;
00131 case ACE_TEXT ('w'):
00132 if (ACE_BIT_DISABLED (hmode, _O_RDWR))
00133 {
00134 ACE_CLR_BITS (hmode, _O_RDONLY);
00135 ACE_SET_BITS (hmode, _O_WRONLY);
00136 }
00137 ACE_SET_BITS (hmode, _O_CREAT | _O_TRUNC);
00138 break;
00139 case ACE_TEXT ('a'):
00140 if (ACE_BIT_DISABLED (hmode, _O_RDWR))
00141 {
00142 ACE_CLR_BITS (hmode, _O_RDONLY);
00143 ACE_SET_BITS (hmode, _O_WRONLY);
00144 }
00145 ACE_SET_BITS (hmode, _O_CREAT | _O_APPEND);
00146 break;
00147 case ACE_TEXT ('+'):
00148 ACE_CLR_BITS (hmode, _O_RDONLY | _O_WRONLY);
00149 ACE_SET_BITS (hmode, _O_RDWR);
00150 break;
00151 case ACE_TEXT ('t'):
00152 ACE_CLR_BITS (hmode, _O_BINARY);
00153 ACE_SET_BITS (hmode, _O_TEXT);
00154 break;
00155 case ACE_TEXT ('b'):
00156 ACE_CLR_BITS (hmode, _O_TEXT);
00157 ACE_SET_BITS (hmode, _O_BINARY);
00158 break;
00159 }
00160 }
00161 }
00162
00163 FILE *
00164 ACE_OS::fopen (const char *filename,
00165 const ACE_TCHAR *mode)
00166 {
00167 ACE_OS_TRACE ("ACE_OS::fopen");
00168 int hmode = _O_TEXT;
00169
00170
00171
00172
00173 ACE_TCHAR const empty_mode[] = ACE_TEXT ("");
00174 if (!mode)
00175 mode = empty_mode;
00176
00177 for (ACE_TCHAR const* mode_ptr = mode; *mode_ptr != 0; ++mode_ptr)
00178 fopen_mode_to_open_mode_converter (*mode_ptr, hmode);
00179
00180 ACE_HANDLE const handle = ACE_OS::open (filename, hmode);
00181 if (handle != ACE_INVALID_HANDLE)
00182 {
00183 hmode &= _O_TEXT | _O_RDONLY | _O_APPEND;
00184
00185 int const fd = ::_open_osfhandle (intptr_t (handle), hmode);
00186
00187 if (fd != -1)
00188 {
00189 # if defined (__BORLANDC__) && !defined (ACE_USES_WCHAR)
00190 FILE * const fp = ::_fdopen (fd, const_cast<ACE_TCHAR *> (mode));
00191 # elif defined (__BORLANDC__) && defined (ACE_USES_WCHAR)
00192 FILE * const fp = ::_wfdopen (fd, const_cast<ACE_TCHAR *> (mode));
00193 # elif defined (ACE_USES_WCHAR)
00194 FILE * const fp = ::_wfdopen (fd, mode);
00195 # else
00196 FILE * const fp = ::fdopen (fd, mode);
00197 # endif
00198 if (fp != 0)
00199 {
00200 # if defined (ACE_USES_WCHAR)
00201 checkUnicodeFormat(fp);
00202 # endif // ACE_USES_WCHAR
00203 return fp;
00204 }
00205 ::_close (fd);
00206 }
00207
00208 ACE_OS::close (handle);
00209 }
00210 return 0;
00211 }
00212
00213 #if defined (ACE_HAS_WCHAR)
00214 FILE *
00215 ACE_OS::fopen (const wchar_t *filename,
00216 const ACE_TCHAR *mode)
00217 {
00218 ACE_OS_TRACE ("ACE_OS::fopen");
00219 int hmode = _O_TEXT;
00220
00221 for (const ACE_TCHAR *mode_ptr = mode; *mode_ptr != 0; mode_ptr++)
00222 fopen_mode_to_open_mode_converter (*mode_ptr, hmode);
00223
00224 ACE_HANDLE handle = ACE_OS::open (filename, hmode);
00225 if (handle != ACE_INVALID_HANDLE)
00226 {
00227 hmode &= _O_TEXT | _O_RDONLY | _O_APPEND;
00228
00229 int const fd = ::_open_osfhandle (intptr_t (handle), hmode);
00230
00231 if (fd != -1)
00232 {
00233 # if defined (__BORLANDC__) && !defined (ACE_USES_WCHAR)
00234 FILE *fp = ::_fdopen (fd, const_cast<char *> (mode));
00235 # elif defined (__BORLANDC__) && defined (ACE_USES_WCHAR)
00236 FILE *fp = ::_wfdopen (fd, const_cast<wchar_t *> (mode));
00237 # elif defined (ACE_USES_WCHAR)
00238 FILE *fp = ::_wfdopen (fd, mode);
00239 # else
00240 FILE *fp = ::fdopen (fd, mode);
00241 # endif
00242 if (fp != 0)
00243 {
00244 # if defined (ACE_USES_WCHAR)
00245 checkUnicodeFormat(fp);
00246 # endif // ACE_USES_WCHAR
00247 return fp;
00248 }
00249 ::_close (fd);
00250 }
00251
00252 ACE_OS::close (handle);
00253 }
00254 return 0;
00255 }
00256 #endif
00257
00258 #endif
00259
00260
00261
00262
00263 int
00264 ACE_OS::fprintf (FILE *fp, const char *format, ...)
00265 {
00266
00267 int result = 0;
00268 va_list ap;
00269 va_start (ap, format);
00270 result = ACE_OS::vfprintf (fp, format, ap);
00271 va_end (ap);
00272 return result;
00273 }
00274
00275 #if defined (ACE_HAS_WCHAR)
00276 int
00277 ACE_OS::fprintf (FILE *fp, const wchar_t *format, ...)
00278 {
00279
00280 int result = 0;
00281 va_list ap;
00282 va_start (ap, format);
00283 result = ACE_OS::vfprintf (fp, format, ap);
00284 va_end (ap);
00285 return result;
00286 }
00287 #endif
00288
00289 int
00290 ACE_OS::asprintf (char **bufp, const char *format, ...)
00291 {
00292
00293 int result;
00294 va_list ap;
00295 va_start (ap, format);
00296 result = ACE_OS::vasprintf (bufp, format, ap);
00297 va_end (ap);
00298 return result;
00299 }
00300
00301 #if defined (ACE_HAS_WCHAR)
00302 int
00303 ACE_OS::asprintf (wchar_t **bufp, const wchar_t *format, ...)
00304 {
00305
00306 int result;
00307 va_list ap;
00308 va_start (ap, format);
00309 result = ACE_OS::vasprintf (bufp, format, ap);
00310 va_end (ap);
00311 return result;
00312 }
00313 #endif
00314
00315 int
00316 ACE_OS::printf (const char *format, ...)
00317 {
00318
00319 int result;
00320 va_list ap;
00321 va_start (ap, format);
00322 result = ACE_OS::vprintf (format, ap);
00323 va_end (ap);
00324 return result;
00325 }
00326
00327 #if defined (ACE_HAS_WCHAR)
00328 int
00329 ACE_OS::printf (const wchar_t *format, ...)
00330 {
00331
00332 int result;
00333 va_list ap;
00334 va_start (ap, format);
00335 result = ACE_OS::vprintf (format, ap);
00336 va_end (ap);
00337 return result;
00338 }
00339 #endif
00340
00341 int
00342 ACE_OS::snprintf (char *buf, size_t maxlen, const char *format, ...)
00343 {
00344
00345 int result;
00346 va_list ap;
00347 va_start (ap, format);
00348 result = ACE_OS::vsnprintf (buf, maxlen, format, ap);
00349 va_end (ap);
00350 return result;
00351 }
00352
00353 #if defined (ACE_HAS_WCHAR)
00354 int
00355 ACE_OS::snprintf (wchar_t *buf, size_t maxlen, const wchar_t *format, ...)
00356 {
00357
00358 int result;
00359 va_list ap;
00360 va_start (ap, format);
00361 result = ACE_OS::vsnprintf (buf, maxlen, format, ap);
00362 va_end (ap);
00363 return result;
00364 }
00365 #endif
00366
00367 int
00368 ACE_OS::sprintf (char *buf, const char *format, ...)
00369 {
00370
00371 int result;
00372 va_list ap;
00373 va_start (ap, format);
00374 result = ACE_OS::vsprintf (buf, format, ap);
00375 va_end (ap);
00376 return result;
00377 }
00378
00379 #if defined (ACE_HAS_WCHAR)
00380 int
00381 ACE_OS::sprintf (wchar_t *buf, const wchar_t *format, ...)
00382 {
00383
00384 int result;
00385 va_list ap;
00386 va_start (ap, format);
00387 result = ACE_OS::vsprintf (buf, format, ap);
00388 va_end (ap);
00389 return result;
00390 }
00391 #endif
00392
00393 #if !defined (ACE_HAS_VASPRINTF)
00394 int
00395 ACE_OS::vasprintf_emulation(char **bufp, const char *format, va_list argptr)
00396 {
00397 int size;
00398
00399 va_list ap;
00400 va_copy (ap, argptr);
00401 size = ACE_OS::vsnprintf(0, 0, format, ap);
00402 va_end (ap);
00403
00404 if (size != -1)
00405 {
00406 char *buf = reinterpret_cast<char*>(ACE_OS::malloc(size + 1));
00407 if (!buf)
00408 return -1;
00409
00410 va_list aq;
00411 va_copy (aq, argptr);
00412 size = ACE_OS::vsnprintf(buf, size + 1, format, aq);
00413 va_end (aq);
00414
00415 if (size != -1)
00416 *bufp = buf;
00417 }
00418
00419 return size;
00420 }
00421 #endif
00422
00423 #if defined (ACE_HAS_WCHAR)
00424 #if !defined (ACE_HAS_VASWPRINTF)
00425 int
00426 ACE_OS::vaswprintf_emulation(wchar_t **bufp, const wchar_t *format, va_list argptr)
00427 {
00428 int size;
00429
00430 va_list ap;
00431 va_copy (ap, argptr);
00432 size = ACE_OS::vsnprintf(0, 0, format, ap);
00433 va_end (ap);
00434
00435 if (size != -1)
00436 {
00437 wchar_t *buf = reinterpret_cast<wchar_t*>
00438 (ACE_OS::malloc((size + 1) * sizeof(wchar_t)));
00439 if (!buf)
00440 return -1;
00441
00442 va_list aq;
00443 va_copy (aq, argptr);
00444 size = ACE_OS::vsnprintf(buf, size + 1, format, aq);
00445 va_end (aq);
00446
00447 if (size != -1)
00448 *bufp = buf;
00449 }
00450
00451 return size;
00452 }
00453 #endif
00454 #endif
00455
00456 ACE_END_VERSIONED_NAMESPACE_DECL