2 #include "ace/OS_NS_sys_utsname.h"
3 #include "ace/OS_NS_string.h"
4 #include "ace/OS_NS_errno.h"
5 #include "ace/OS_NS_macros.h"
6 #include "ace/OS_NS_fcntl.h"
7 #include "ace/Default_Constants.h"
8 #include "ace/OS_Memory.h"
9 #include "ace/Truncate.h"
11 #if defined (ACE_HAS_CLOCK_GETTIME)
12 # include "ace/os_include/os_time.h"
13 #endif /* ACE_HAS_CLOCK_GETTIME */
15 #if defined (ACE_LACKS_ACCESS)
16 # include "ace/OS_NS_stdio.h"
17 #endif /* ACE_LACKS_ACCESS */
19 #if defined (ACE_HAS_ACCESS_EMULATION)
20 # include "ace/os_include/os_unistd.h"
21 #endif /* ACE_HAS_ACCESS_EMULATION */
23 #if defined (ACE_VXWORKS) && (ACE_VXWORKS <= 0x690)
24 # if defined (__RTP__)
25 # include "ace/os_include/os_strings.h"
27 # include "ace/os_include/os_string.h"
32 # include "ace/MQX_Filesystem.h"
35 ACE_BEGIN_VERSIONED_NAMESPACE_DECL
38 ACE_OS::access (const char *path, int amode)
40 ACE_OS_TRACE ("ACE_OS::access");
41 #if defined (ACE_LACKS_ACCESS)
42 # if defined (ACE_HAS_ACCESS_EMULATION)
43 // @@ WINCE: There should be a Win32 API that can do this.
44 // Hard coded read access here.
45 ACE_UNUSED_ARG (amode);
46 FILE* handle = ACE_OS::fopen (ACE_TEXT_CHAR_TO_TCHAR(path),
50 ACE_OS::fclose (handle);
55 ACE_UNUSED_ARG (path);
56 ACE_UNUSED_ARG (amode);
57 ACE_NOTSUP_RETURN (-1);
58 # endif /* ACE_HAS_ACCESS_EMULATION */
59 #elif defined(ACE_WIN32)
60 // Windows doesn't support checking X_OK(6)
61 # if defined (ACE_ACCESS_EQUIVALENT)
62 ACE_OSCALL_RETURN (ACE_ACCESS_EQUIVALENT (path, amode & 6), int, -1);
64 ACE_OSCALL_RETURN (::access (path, amode & 6), int, -1);
67 ACE_OSCALL_RETURN (::access (path, amode), int, -1);
68 #endif /* ACE_LACKS_ACCESS */
72 #if defined (ACE_HAS_WCHAR)
74 ACE_OS::access (const wchar_t *path, int amode)
76 #if defined (ACE_WIN32) && !defined (ACE_LACKS__WACCESS)
77 ACE_OSCALL_RETURN (::_waccess (path, amode), int, -1);
78 #else /* ACE_WIN32 && !ACE_HAS_WINCE */
79 return ACE_OS::access (ACE_Wide_To_Ascii (path).char_rep (), amode);
80 #endif /* ACE_WIN32 && !ACE_LACKS__WACCESS */
82 #endif /* ACE_HAS_WCHAR */
85 ACE_OS::alarm (u_int secs)
87 ACE_OS_TRACE ("ACE_OS::alarm");
88 #if defined (ACE_LACKS_ALARM)
89 ACE_UNUSED_ARG (secs);
90 ACE_NOTSUP_RETURN (0);
92 return ::alarm (secs);
93 #endif /* ACE_LACKS_ALARM */
97 ACE_OS::getpagesize (void)
99 ACE_OS_TRACE ("ACE_OS::getpagesize");
100 #if defined (ACE_WIN32) && !defined (ACE_HAS_PHARLAP)
101 SYSTEM_INFO sys_info;
102 ::GetSystemInfo (&sys_info);
103 return (long) sys_info.dwPageSize;
104 #elif defined (_SC_PAGESIZE) && !defined (ACE_HAS_NOTSUP_SC_PAGESIZE)
105 return ::sysconf (_SC_PAGESIZE);
106 #elif defined (ACE_HAS_GETPAGESIZE)
107 return ::getpagesize ();
109 // Use the default set in config.h
110 return ACE_PAGE_SIZE;
111 #endif /* ACE_WIN32 */
115 ACE_OS::allocation_granularity (void)
117 #if defined (ACE_WIN32)
118 SYSTEM_INFO sys_info;
119 ::GetSystemInfo (&sys_info);
120 return sys_info.dwAllocationGranularity;
122 return ACE_OS::getpagesize ();
123 #endif /* ACE_WIN32 */
127 ACE_OS::chdir (const char *path)
129 ACE_OS_TRACE ("ACE_OS::chdir");
130 #if defined (ACE_LACKS_CHDIR)
131 ACE_UNUSED_ARG (path);
132 ACE_NOTSUP_RETURN (-1);
133 #elif defined (ACE_HAS_NONCONST_CHDIR)
134 ACE_OSCALL_RETURN (::chdir (const_cast<char *> (path)), int, -1);
135 #elif defined (ACE_CHDIR_EQUIVALENT)
136 ACE_OSCALL_RETURN (ACE_CHDIR_EQUIVALENT (path), int, -1);
138 ACE_OSCALL_RETURN (::chdir (path), int, -1);
139 #endif /* ACE_HAS_NONCONST_CHDIR */
142 #if defined (ACE_HAS_WCHAR)
144 ACE_OS::chdir (const wchar_t *path)
146 #if defined (ACE_LACKS_CHDIR)
147 ACE_UNUSED_ARG (path);
148 ACE_NOTSUP_RETURN (-1);
149 #elif defined (ACE_WIN32)
150 ACE_OSCALL_RETURN (::_wchdir (path), int, -1);
151 #else /* ACE_WIN32 */
152 return ACE_OS::chdir (ACE_Wide_To_Ascii (path).char_rep ());
153 #endif /* ACE_WIN32 */
155 #endif /* ACE_HAS_WCHAR */
158 ACE_OS::rmdir (const char *path)
160 #if defined (ACE_HAS_WINCE)
161 ACE_WIN32CALL_RETURN (ACE_ADAPT_RETVAL (::RemoveDirectory (ACE_TEXT_CHAR_TO_TCHAR(path)),
164 #elif defined (ACE_RMDIR_EQUIVALENT)
165 ACE_OSCALL_RETURN (ACE_RMDIR_EQUIVALENT (path), int, -1);
167 ACE_OSCALL_RETURN (::rmdir (path), int, -1);
168 #endif /* ACE_WIN32 */
171 #if defined (ACE_HAS_WCHAR)
173 ACE_OS::rmdir (const wchar_t *path)
175 #if defined (ACE_HAS_WINCE)
176 ACE_WIN32CALL_RETURN (ACE_ADAPT_RETVAL (::RemoveDirectoryW (path),
179 #elif defined (ACE_WIN32)
180 ACE_OSCALL_RETURN (::_wrmdir (path), int, -1);
182 ACE_Wide_To_Ascii n_path (path);
183 return ACE_OS::rmdir (n_path.char_rep ());
184 #endif /* ACE_HAS_WINCE */
186 #endif /* ACE_HAS_WCHAR */
188 // @todo: which 4 and why??? dhinton
189 // NOTE: The following four function definitions must appear before
190 // ACE_OS::sema_init ().
193 ACE_OS::close (ACE_HANDLE handle)
195 ACE_OS_TRACE ("ACE_OS::close");
196 #if defined (ACE_WIN32)
197 ACE_WIN32CALL_RETURN (ACE_ADAPT_RETVAL (::CloseHandle (handle), ace_result_), int, -1);
198 #elif defined (ACE_MQX)
199 return MQX_Filesystem::inst ().close (handle);
201 ACE_OSCALL_RETURN (::close (handle), int, -1);
202 #endif /* ACE_WIN32 */
205 ACE_INLINE ACE_HANDLE
206 ACE_OS::dup (ACE_HANDLE handle)
208 ACE_OS_TRACE ("ACE_OS::dup");
209 #if defined (ACE_LACKS_DUP)
210 ACE_UNUSED_ARG (handle);
211 ACE_NOTSUP_RETURN (ACE_INVALID_HANDLE);
212 #elif defined (ACE_WIN32)
214 if (::DuplicateHandle(::GetCurrentProcess (),
216 ::GetCurrentProcess(),
220 DUPLICATE_SAME_ACCESS))
223 ACE_FAIL_RETURN (ACE_INVALID_HANDLE);
226 ACE_OSCALL_RETURN (::dup (handle), ACE_HANDLE, ACE_INVALID_HANDLE);
227 #endif /* ACE_LACKS_DUP */
230 ACE_INLINE ACE_HANDLE
231 ACE_OS::dup(ACE_HANDLE handle, pid_t pid)
233 ACE_OS_TRACE("ACE_OS::dup");
234 #if defined (ACE_LACKS_DUP)
235 ACE_UNUSED_ARG (handle);
236 ACE_UNUSED_ARG (pid);
237 ACE_NOTSUP_RETURN (ACE_INVALID_HANDLE);
238 #elif defined (ACE_WIN32)
240 ACE_HANDLE hTargetProcess = ::OpenProcess (PROCESS_DUP_HANDLE,
243 if(::DuplicateHandle(::GetCurrentProcess (),
249 DUPLICATE_SAME_ACCESS))
251 ::CloseHandle (hTargetProcess);
255 ACE_FAIL_RETURN (ACE_INVALID_HANDLE);
258 ACE_UNUSED_ARG (pid);
259 ACE_OSCALL_RETURN(::dup(handle), ACE_HANDLE, ACE_INVALID_HANDLE);
260 #endif /*ACE_WIN32 && !ACE_HAS_WINCE*/
264 ACE_OS::dup2 (ACE_HANDLE oldhandle, ACE_HANDLE newhandle)
266 ACE_OS_TRACE ("ACE_OS::dup2");
267 #if defined (ACE_LACKS_DUP2)
268 // msvcrt has _dup2 ?!
269 ACE_UNUSED_ARG (oldhandle);
270 ACE_UNUSED_ARG (newhandle);
271 ACE_NOTSUP_RETURN (-1);
273 ACE_OSCALL_RETURN (::dup2 (oldhandle, newhandle), int, -1);
274 #endif /* ACE_LACKS_DUP2 */
278 ACE_OS::execv (const char *path,
281 ACE_OS_TRACE ("ACE_OS::execv");
282 #if defined (ACE_LACKS_EXEC)
283 ACE_UNUSED_ARG (path);
284 ACE_UNUSED_ARG (argv);
286 ACE_NOTSUP_RETURN (-1);
287 #elif defined (ACE_WIN32)
288 # if defined (__BORLANDC__)
289 return ::execv (path, argv);
290 # elif defined (__MINGW32__)
291 return ::_execv (path, (char *const *) argv);
293 // Why this odd-looking code? If execv() returns at all, it's an error.
294 // Windows defines this as returning an intptr_t rather than a simple int,
295 // and the conversion triggers compile warnings. So just return -1 if
297 ::_execv (path, (const char *const *) argv);
299 # endif /* __BORLANDC__ */
301 ACE_OSCALL_RETURN (::execv (path, argv), int, -1);
302 #endif /* ACE_LACKS_EXEC */
306 ACE_OS::execve (const char *path,
310 ACE_OS_TRACE ("ACE_OS::execve");
311 #if defined (ACE_LACKS_EXEC)
312 ACE_UNUSED_ARG (path);
313 ACE_UNUSED_ARG (argv);
314 ACE_UNUSED_ARG (envp);
316 ACE_NOTSUP_RETURN (-1);
317 #elif defined (ACE_WIN32)
318 # if defined (__BORLANDC__)
319 return ::execve (path, argv, envp);
320 # elif defined (__MINGW32__)
321 return ::_execve (path, (char *const *) argv, (char *const *) envp);
323 // Why this odd-looking code? If execv() returns at all, it's an error.
324 // Windows defines this as returning an intptr_t rather than a simple int,
325 // and the conversion triggers compile warnings. So just return -1 if
327 ::_execve (path, (const char *const *) argv, (const char *const *) envp);
329 # endif /* __BORLANDC__ */
331 ACE_OSCALL_RETURN (::execve (path, argv, envp), int, -1);
332 #endif /* ACE_LACKS_EXEC */
336 ACE_OS::execvp (const char *file,
339 ACE_OS_TRACE ("ACE_OS::execvp");
340 #if defined (ACE_LACKS_EXEC) || defined (ACE_LACKS_EXECVP)
341 ACE_UNUSED_ARG (file);
342 ACE_UNUSED_ARG (argv);
344 ACE_NOTSUP_RETURN (-1);
345 #elif defined (ACE_WIN32)
346 # if defined (__BORLANDC__)
347 return ::execvp (file, argv);
348 # elif defined (__MINGW32__)
349 return ::_execvp (file, (char *const *) argv);
351 // Why this odd-looking code? If execv() returns at all, it's an error.
352 // Windows defines this as returning an intptr_t rather than a simple int,
353 // and the conversion triggers compile warnings. So just return -1 if
355 ::_execvp (file, (const char *const *) argv);
357 # endif /* __BORLANDC__ */
359 ACE_OSCALL_RETURN (::execvp (file, argv), int, -1);
360 #endif /* ACE_LACKS_EXEC */
366 ACE_OS_TRACE ("ACE_OS::fork");
367 #if defined (ACE_LACKS_FORK)
368 ACE_NOTSUP_RETURN (pid_t (-1));
370 ACE_OSCALL_RETURN (::fork (), pid_t, -1);
371 #endif /* ACE_LACKS_FORK */
375 ACE_OS::fsync (ACE_HANDLE handle)
377 ACE_OS_TRACE ("ACE_OS::fsync");
378 # if defined (ACE_LACKS_FSYNC)
379 ACE_UNUSED_ARG (handle);
380 ACE_NOTSUP_RETURN (-1);
381 # elif defined (ACE_WIN32)
382 ACE_WIN32CALL_RETURN (ACE_ADAPT_RETVAL (::FlushFileBuffers (handle), ace_result_), int, -1);
384 ACE_OSCALL_RETURN (::fsync (handle), int, -1);
385 # endif /* ACE_LACKS_FSYNC */
389 ACE_OS::ftruncate (ACE_HANDLE handle, ACE_OFF_T offset)
391 ACE_OS_TRACE ("ACE_OS::ftruncate");
392 #if defined (ACE_WIN32)
393 # if !defined (ACE_LACKS_WIN32_SETFILEPOINTEREX)
395 loff.QuadPart = offset;
396 if (::SetFilePointerEx (handle, loff, 0, FILE_BEGIN))
398 if (::SetFilePointer (handle,
401 FILE_BEGIN) != INVALID_SET_FILE_POINTER)
403 ACE_WIN32CALL_RETURN (ACE_ADAPT_RETVAL (::SetEndOfFile (handle), ace_result_), int, -1);
405 ACE_FAIL_RETURN (-1);
406 #elif defined (ACE_LACKS_FTRUNCATE)
407 ACE_NOTSUP_RETURN (-1);
409 ACE_OSCALL_RETURN (::ftruncate (handle, offset), int, -1);
410 #endif /* ACE_WIN32 */
414 ACE_OS::getcwd (char *buf, size_t size)
416 ACE_OS_TRACE ("ACE_OS::getcwd");
417 #if defined (ACE_LACKS_GETCWD)
418 ACE_UNUSED_ARG (buf);
419 ACE_UNUSED_ARG (size);
420 ACE_NOTSUP_RETURN (0);
421 #elif defined (ACE_GETCWD_EQUIVALENT)
422 return ACE_GETCWD_EQUIVALENT (buf, static_cast<int> (size));
423 #elif defined (ACE_WIN32)
424 return ::getcwd (buf, static_cast<int> (size));
426 ACE_OSCALL_RETURN (::getcwd (buf, size), char *, 0);
427 #endif /* ACE_LACKS_GETCWD */
430 #if defined (ACE_HAS_WCHAR)
432 ACE_OS::getcwd (wchar_t *buf, size_t size)
434 # if defined (ACE_HAS_WINCE)
435 ACE_UNUSED_ARG (buf);
436 ACE_UNUSED_ARG (size);
437 ACE_NOTSUP_RETURN (0);
438 # elif defined (ACE_WIN32)
439 return ::_wgetcwd (buf, static_cast<int> (size));
441 char *narrow_buf = new char[size];
443 result = ACE_OS::getcwd (narrow_buf, size);
444 ACE_Ascii_To_Wide wide_buf (result);
445 delete [] narrow_buf;
447 ACE_OS::strsncpy (buf, wide_buf.wchar_rep (), size);
448 return result == 0 ? 0 : buf;
449 # endif /* ACE_WIN32 */
451 #endif /* ACE_HAS_WCHAR */
454 ACE_OS::getgid (void)
456 ACE_OS_TRACE ("ACE_OS::getgid");
457 #if defined (ACE_LACKS_GETGID)
458 ACE_NOTSUP_RETURN (static_cast<gid_t> (-1));
460 ACE_OSCALL_RETURN (::getgid (), gid_t, static_cast<gid_t> (-1));
461 # endif /* ACE_LACKS_GETGID */
465 ACE_OS::getegid (void)
467 ACE_OS_TRACE ("ACE_OS::getegid");
468 #if defined (ACE_LACKS_GETEGID)
469 ACE_NOTSUP_RETURN (static_cast<gid_t> (-1));
471 ACE_OSCALL_RETURN (::getegid (), gid_t, static_cast<gid_t> (-1));
472 # endif /* ACE_LACKS_GETEGID */
476 ACE_OS::getopt (int argc, char *const *argv, const char *optstring)
478 ACE_OS_TRACE ("ACE_OS::getopt");
479 #if defined (ACE_LACKS_GETOPT)
480 ACE_UNUSED_ARG (argc);
481 ACE_UNUSED_ARG (argv);
482 ACE_UNUSED_ARG (optstring);
483 ACE_NOTSUP_RETURN (-1);
485 ACE_OSCALL_RETURN (::getopt (argc, argv, optstring), int, -1);
486 # endif /* ACE_LACKS_GETOPT */
490 ACE_OS::getpgid (pid_t pid)
492 ACE_OS_TRACE ("ACE_OS::getpgid");
493 #if defined (ACE_LACKS_GETPGID)
494 ACE_UNUSED_ARG (pid);
495 ACE_NOTSUP_RETURN (-1);
496 #elif defined (ACE_LINUX) && __GLIBC__ > 1 && __GLIBC_MINOR__ >= 0
497 // getpgid() is from SVR4, which appears to be the reason why GLIBC
498 // doesn't enable its prototype by default.
499 // Rather than create our own extern prototype, just use the one
500 // that is visible (ugh).
501 ACE_OSCALL_RETURN (::__getpgid (pid), pid_t, -1);
503 ACE_OSCALL_RETURN (::getpgid (pid), pid_t, -1);
504 #endif /* ACE_LACKS_GETPGID */
508 ACE_OS::getpid (void)
510 // ACE_OS_TRACE ("ACE_OS::getpid");
511 #if defined (ACE_LACKS_GETPID)
512 ACE_NOTSUP_RETURN (-1);
513 #elif defined (ACE_WIN32)
514 return ::GetCurrentProcessId ();
516 ACE_OSCALL_RETURN (::getpid (), pid_t, -1);
517 #endif /* ACE_LACKS_GETPID */
521 ACE_OS::getppid (void)
523 ACE_OS_TRACE ("ACE_OS::getppid");
524 #if defined (ACE_LACKS_GETPPID)
525 ACE_NOTSUP_RETURN (-1);
527 ACE_OSCALL_RETURN (::getppid (), pid_t, -1);
528 #endif /* ACE_LACKS_GETPPID */
532 ACE_OS::getuid (void)
534 ACE_OS_TRACE ("ACE_OS::getuid");
535 #if defined (ACE_LACKS_GETUID)
536 ACE_NOTSUP_RETURN (static_cast<uid_t> (-1));
538 ACE_OSCALL_RETURN (::getuid (), uid_t, static_cast<uid_t> (-1));
539 # endif /* ACE_LACKS_GETUID*/
543 ACE_OS::geteuid (void)
545 ACE_OS_TRACE ("ACE_OS::geteuid");
546 #if defined (ACE_LACKS_GETEUID)
547 ACE_NOTSUP_RETURN (static_cast<uid_t> (-1));
549 ACE_OSCALL_RETURN (::geteuid (), uid_t, (uid_t) -1);
550 # endif /* ACE_LACKS_GETEUID */
554 ACE_OS::hostname (char name[], size_t maxnamelen)
556 ACE_OS_TRACE ("ACE_OS::hostname");
557 #if defined (ACE_HAS_PHARLAP)
558 // PharLap only can do net stuff with the RT version.
559 # if defined (ACE_HAS_PHARLAP_RT)
560 // @@This is not at all reliable... requires ethernet and BOOTP to be used.
561 // A more reliable way is to go thru the devices w/ EtsTCPGetDeviceCfg until
562 // a legit IP address is found, then get its name w/ gethostbyaddr.
563 ACE_SOCKCALL_RETURN (gethostname (name, maxnamelen), int, SOCKET_ERROR);
565 ACE_UNUSED_ARG (name);
566 ACE_UNUSED_ARG (maxnamelen);
567 ACE_NOTSUP_RETURN (-1);
568 # endif /* ACE_HAS_PHARLAP_RT */
569 #elif defined (ACE_VXWORKS) || defined (ACE_HAS_WINCE)
570 ACE_OSCALL_RETURN (::gethostname (name, maxnamelen), int, -1);
571 #elif defined (ACE_WIN32)
572 if (::gethostname (name, ACE_Utils::truncate_cast<int> (maxnamelen)) == 0)
578 ACE_WIN32CALL_RETURN (ACE_ADAPT_RETVAL (::GetComputerNameA (name,
579 LPDWORD (&maxnamelen)),
580 ace_result_), int, -1);
582 #elif defined (ACE_MQX)
583 const int enet_device = 0;
584 IPCFG_IP_ADDRESS_DATA ip_data;
585 if (ipcfg_get_ip (enet_device, &ip_data))
587 ACE_OS::snprintf(name, maxnamelen, "%d.%d.%d.%d", IPBYTES(ip_data.ip));
591 #elif defined (ACE_LACKS_GETHOSTNAME)
592 ACE_NOTSUP_RETURN (-1);
593 #else /* ACE_HAS_PHARLAP */
594 ACE_utsname host_info;
596 if (ACE_OS::uname (&host_info) == -1)
600 ACE_OS::strsncpy (name, host_info.nodename, maxnamelen);
603 #endif /* ACE_HAS_PHARLAP */
606 #if defined (ACE_HAS_WCHAR)
608 ACE_OS::hostname (wchar_t name[], size_t maxnamelen)
610 #if defined (ACE_WIN32) && !defined (ACE_HAS_WINCE)
611 ACE_WIN32CALL_RETURN (ACE_ADAPT_RETVAL (GetComputerNameW (name,
612 LPDWORD (&maxnamelen)),
613 ace_result_), int, -1);
614 #else /* ACE_WIN32 && !ACE_HAS_WINCE */
615 // Emulate using the char version
618 ACE_NEW_RETURN (char_name, char[maxnamelen], -1);
620 int result = ACE_OS::hostname(char_name, maxnamelen);
621 ACE_OS::strcpy (name, ACE_Ascii_To_Wide (char_name).wchar_rep ());
625 #endif /* ACE_WIN32 && !ACE_HAS_WINCE */
627 #endif /* ACE_HAS_WCHAR */
630 ACE_OS::isatty (int handle)
632 ACE_OS_TRACE ("ACE_OS::isatty");
633 #if defined (ACE_LACKS_ISATTY)
634 ACE_UNUSED_ARG (handle);
636 # elif defined (ACE_WIN32)
637 return ::_isatty (handle);
639 ACE_OSCALL_RETURN (::isatty (handle), int, -1);
640 # endif /* ACE_LACKS_ISATTY */
643 #if defined (ACE_WIN32)
645 ACE_OS::isatty (ACE_HANDLE handle)
647 #if defined (ACE_LACKS_ISATTY)
648 ACE_UNUSED_ARG (handle);
651 int const fd = ::_open_osfhandle (intptr_t (handle), 0);
655 status = ::_isatty (fd);
659 #endif /* ACE_LACKS_ISATTY */
662 #endif /* ACE_WIN32 */
665 ACE_OS::lseek (ACE_HANDLE handle, ACE_OFF_T offset, int whence)
667 ACE_OS_TRACE ("ACE_OS::lseek");
668 #if defined (ACE_WIN32)
669 # if SEEK_SET != FILE_BEGIN || SEEK_CUR != FILE_CURRENT || SEEK_END != FILE_END
670 //#error Windows NT is evil AND rude!
677 whence = FILE_CURRENT;
684 return static_cast<ACE_OFF_T> (-1); // rather safe than sorry
686 # endif /* SEEK_SET != FILE_BEGIN || SEEK_CUR != FILE_CURRENT || SEEK_END != FILE_END */
687 LONG low_offset = ACE_LOW_PART(offset);
688 LONG high_offset = ACE_HIGH_PART(offset);
690 ::SetFilePointer (handle, low_offset, &high_offset, whence);
691 if (result == INVALID_SET_FILE_POINTER && GetLastError() != NO_ERROR)
692 ACE_FAIL_RETURN (static_cast<ACE_OFF_T> (-1));
695 #elif defined (ACE_MQX)
699 whence = IO_SEEK_SET;
702 whence = IO_SEEK_CUR;
705 whence = IO_SEEK_END;
709 return static_cast<ACE_OFF_T> (-1);
711 return static_cast<ACE_OFF_T> (MQX_Filesystem::inst ().lseek (handle, offset, whence));
713 ACE_OSCALL_RETURN (::lseek (handle, offset, whence), ACE_OFF_T, -1);
714 #endif /* ACE_WIN32 */
717 #if defined (ACE_HAS_LLSEEK) || defined (ACE_HAS_LSEEK64)
718 ACE_INLINE ACE_LOFF_T
719 ACE_OS::llseek (ACE_HANDLE handle, ACE_LOFF_T offset, int whence)
721 ACE_OS_TRACE ("ACE_OS::llseek");
723 #if ACE_SIZEOF_LONG == 8
724 /* The native lseek is 64 bit. Use it. */
725 return ACE_OS::lseek (handle, offset, whence);
726 #elif defined (ACE_HAS_LLSEEK) && defined (ACE_HAS_LSEEK64)
727 # error Either ACE_HAS_LSEEK64 and ACE_HAS_LLSEEK should be defined, not both!
728 #elif defined (ACE_HAS_LSEEK64)
729 ACE_OSCALL_RETURN (::lseek64 (handle, offset, whence), ACE_LOFF_T, -1);
730 #elif defined (ACE_HAS_LLSEEK)
731 # if defined (ACE_WIN32)
732 # ifndef ACE_LACKS_WIN32_SETFILEPOINTEREX
733 LARGE_INTEGER distance, new_file_pointer;
735 distance.QuadPart = offset;
738 (::SetFilePointerEx (handle, distance, &new_file_pointer, whence)
739 ? new_file_pointer.QuadPart
740 : static_cast<ACE_LOFF_T> (-1));
742 LARGE_INTEGER l_offset;
743 l_offset.QuadPart = offset;
744 LONG low_offset = l_offset.LowPart;
745 LONG high_offset = l_offset.HighPart;
747 l_offset.LowPart = ::SetFilePointer (handle,
751 if (l_offset.LowPart == INVALID_SET_FILE_POINTER &&
752 GetLastError () != NO_ERROR)
753 return static_cast<ACE_LOFF_T> (-1);
754 l_offset.HighPart = high_offset;
755 return l_offset.QuadPart;
756 # endif /* ACE_LACKS_WIN32_SETFILEPOINTEREX */
758 ACE_OSCALL_RETURN (::llseek (handle, offset, whence), ACE_LOFF_T, -1);
762 #endif /* ACE_HAS_LLSEEK || ACE_HAS_LSEEK64 */
765 ACE_OS::read (ACE_HANDLE handle, void *buf, size_t len)
767 ACE_OS_TRACE ("ACE_OS::read");
768 #if defined (ACE_WIN32)
770 if (::ReadFile (handle, buf, static_cast<DWORD> (len), &ok_len, 0))
771 return (ssize_t) ok_len;
773 ACE_FAIL_RETURN (-1);
775 #elif defined (ACE_MQX)
776 return MQX_Filesystem::inst ().read (handle, reinterpret_cast<unsigned char *> (buf), len);
782 # if defined (ACE_HAS_CHARPTR_SOCKOPT)
783 ACE_OSCALL (::read (handle, static_cast <char *> (buf), len), ssize_t, -1, result);
785 ACE_OSCALL (::read (handle, buf, len), ssize_t, -1, result);
786 # endif /* ACE_HAS_CHARPTR_SOCKOPT */
788 # if !(defined (EAGAIN) && defined (EWOULDBLOCK) && EAGAIN == EWOULDBLOCK)
789 // Optimize this code out if we can detect that EAGAIN ==
790 // EWOULDBLOCK at compile time. If we cannot detect equality at
791 // compile-time (e.g. if EAGAIN or EWOULDBLOCK are not preprocessor
792 // macros) perform the check at run-time. The goal is to avoid two
793 // TSS accesses in the _REENTRANT case when EAGAIN == EWOULDBLOCK.
795 # if !defined (EAGAIN) || !defined (EWOULDBLOCK)
796 && EAGAIN != EWOULDBLOCK
797 # endif /* !EAGAIN || !EWOULDBLOCK */
802 # endif /* EAGAIN != EWOULDBLOCK*/
805 #endif /* ACE_WIN32 */
809 ACE_OS::read (ACE_HANDLE handle, void *buf, size_t len,
810 ACE_OVERLAPPED *overlapped)
812 ACE_OS_TRACE ("ACE_OS::read");
813 #if defined (ACE_WIN32)
815 DWORD short_len = static_cast<DWORD> (len);
816 if (::ReadFile (handle, buf, short_len, &ok_len, overlapped))
817 return (ssize_t) ok_len;
819 ACE_FAIL_RETURN (-1);
821 ACE_UNUSED_ARG (overlapped);
822 return ACE_OS::read (handle, buf, len);
823 #endif /* ACE_WIN32 */
827 ACE_OS::readlink (const char *path, char *buf, size_t bufsiz)
829 ACE_OS_TRACE ("ACE_OS::readlink");
830 # if defined (ACE_LACKS_READLINK)
831 ACE_UNUSED_ARG (path);
832 ACE_UNUSED_ARG (buf);
833 ACE_UNUSED_ARG (bufsiz);
834 ACE_NOTSUP_RETURN (-1);
835 # elif defined(ACE_HAS_NONCONST_READLINK)
837 ::readlink (const_cast <char *>(path), buf, bufsiz), ssize_t, -1);
839 ACE_OSCALL_RETURN (::readlink (path, buf, bufsiz), ssize_t, -1);
840 # endif /* ACE_LACKS_READLINK */
844 ACE_OS::pipe (ACE_HANDLE fds[])
846 ACE_OS_TRACE ("ACE_OS::pipe");
847 # if defined (ACE_LACKS_PIPE)
848 ACE_UNUSED_ARG (fds);
849 ACE_NOTSUP_RETURN (-1);
850 # elif defined (ACE_WIN32)
851 ACE_WIN32CALL_RETURN (ACE_ADAPT_RETVAL
852 (::CreatePipe (&fds[0], &fds[1], 0, 0),
853 ace_result_), int, -1);
855 ACE_OSCALL_RETURN (::pipe (fds), int, -1);
856 # endif /* ACE_LACKS_PIPE */
860 ACE_OS::sbrk (intptr_t brk)
862 #if defined (ACE_LACKS_SBRK)
863 ACE_UNUSED_ARG (brk);
864 ACE_NOTSUP_RETURN (0);
866 ACE_OSCALL_RETURN (::sbrk (brk), void *, 0);
867 #endif /* ACE_LACKS_SBRK */
871 ACE_OS::setgid (gid_t gid)
873 ACE_OS_TRACE ("ACE_OS::setgid");
874 #if defined (ACE_LACKS_SETGID)
875 ACE_UNUSED_ARG (gid);
876 ACE_NOTSUP_RETURN (-1);
878 ACE_OSCALL_RETURN (::setgid (gid), int, -1);
879 # endif /* ACE_LACKS_SETGID */
883 ACE_OS::setegid (gid_t gid)
885 ACE_OS_TRACE ("ACE_OS::setegid");
886 #if defined (ACE_LACKS_SETEGID)
887 ACE_UNUSED_ARG (gid);
888 ACE_NOTSUP_RETURN (-1);
890 ACE_OSCALL_RETURN (::setegid (gid), int, -1);
891 # endif /* ACE_LACKS_SETEGID */
895 ACE_OS::setpgid (pid_t pid, pid_t pgid)
897 ACE_OS_TRACE ("ACE_OS::setpgid");
898 #if defined (ACE_LACKS_SETPGID)
899 ACE_UNUSED_ARG (pid);
900 ACE_UNUSED_ARG (pgid);
901 ACE_NOTSUP_RETURN (-1);
903 ACE_OSCALL_RETURN (::setpgid (pid, pgid), int, -1);
904 #endif /* ACE_LACKS_SETPGID */
908 ACE_OS::setregid (gid_t rgid, gid_t egid)
910 ACE_OS_TRACE ("ACE_OS::setregid");
911 #if defined (ACE_LACKS_SETREGID)
912 ACE_UNUSED_ARG (rgid);
913 ACE_UNUSED_ARG (egid);
914 ACE_NOTSUP_RETURN (-1);
916 ACE_OSCALL_RETURN (::setregid (rgid, egid), int, -1);
917 #endif /* ACE_LACKS_SETREGID */
921 ACE_OS::setreuid (uid_t ruid, uid_t euid)
923 ACE_OS_TRACE ("ACE_OS::setreuid");
924 #if defined (ACE_LACKS_SETREUID)
925 ACE_UNUSED_ARG (ruid);
926 ACE_UNUSED_ARG (euid);
927 ACE_NOTSUP_RETURN (-1);
929 ACE_OSCALL_RETURN (::setreuid (ruid, euid), int, -1);
930 #endif /* ACE_LACKS_SETREUID */
934 ACE_OS::setsid (void)
936 ACE_OS_TRACE ("ACE_OS::setsid");
937 #if defined (ACE_LACKS_SETSID)
938 ACE_NOTSUP_RETURN (-1);
940 ACE_OSCALL_RETURN (::setsid (), int, -1);
941 # endif /* ACE_LACKS_SETSID */
945 ACE_OS::setuid (uid_t uid)
947 ACE_OS_TRACE ("ACE_OS::setuid");
948 #if defined (ACE_LACKS_SETUID)
949 ACE_UNUSED_ARG (uid);
950 ACE_NOTSUP_RETURN (-1);
952 ACE_OSCALL_RETURN (::setuid (uid), int, -1);
953 # endif /* ACE_LACKS_SETUID */
957 ACE_OS::seteuid (uid_t uid)
959 ACE_OS_TRACE ("ACE_OS::seteuid");
960 #if defined (ACE_LACKS_SETEUID)
961 ACE_UNUSED_ARG (uid);
962 ACE_NOTSUP_RETURN (-1);
964 ACE_OSCALL_RETURN (::seteuid (uid), int, -1);
965 # endif /* ACE_LACKS_SETEUID */
969 ACE_OS::sleep (u_int seconds)
971 ACE_OS_TRACE ("ACE_OS::sleep");
972 #if defined (ACE_HAS_CLOCK_GETTIME)
973 struct timespec rqtp;
974 // Initializer doesn't work with Green Hills 1.8.7
975 rqtp.tv_sec = seconds;
977 //FUZZ: disable check_for_lack_ACE_OS
978 ACE_OSCALL_RETURN (::nanosleep (&rqtp, 0), int, -1);
979 //FUZZ: enable check_for_lack_ACE_OS
980 #elif defined (ACE_LACKS_SLEEP)
981 ACE_UNUSED_ARG (seconds);
982 ACE_NOTSUP_RETURN (-1);
983 #elif defined (ACE_WIN32)
984 ::Sleep (seconds * ACE_ONE_SECOND_IN_MSECS);
986 #elif defined (ACE_MQX)
987 _time_delay (seconds * ACE_ONE_SECOND_IN_MSECS);
990 ACE_OSCALL_RETURN (::sleep (seconds), int, -1);
991 #endif /* ACE_WIN32 */
995 ACE_OS::sleep (const ACE_Time_Value &tv)
997 ACE_OS_TRACE ("ACE_OS::sleep");
998 #if defined (ACE_WIN32)
999 ::Sleep (tv.msec ());
1001 #elif defined (ACE_MQX)
1002 _time_delay (tv.msec ());
1004 #elif defined (ACE_HAS_CLOCK_GETTIME)
1005 timespec_t rqtp = tv;
1006 //FUZZ: disable check_for_lack_ACE_OS
1007 ACE_OSCALL_RETURN (::nanosleep (&rqtp, 0), int, -1);
1008 //FUZZ: enable check_for_lack_ACE_OS
1010 # if defined (ACE_HAS_NONCONST_SELECT_TIMEVAL)
1011 // Copy the timeval, because this platform doesn't declare the timeval
1012 // as a pointer to const.
1013 timeval tv_copy = tv;
1014 //FUZZ: disable check_for_lack_ACE_OS
1015 ACE_OSCALL_RETURN (::select (0, 0, 0, 0, &tv_copy), int, -1);
1016 //FUZZ: enable check_for_lack_ACE_OS
1017 # else /* ! ACE_HAS_NONCONST_SELECT_TIMEVAL */
1018 const timeval *tvp = tv;
1019 //FUZZ: disable check_for_lack_ACE_OS
1020 ACE_OSCALL_RETURN (::select (0, 0, 0, 0, tvp), int, -1);
1021 //FUZZ: enable check_for_lack_ACE_OS
1022 # endif /* ACE_HAS_NONCONST_SELECT_TIMEVAL */
1023 #endif /* ACE_WIN32 */
1027 ACE_OS::swab (const void *src,
1031 #if defined (ACE_LACKS_SWAB)
1032 // ------------------------------------------------------------
1033 // The following copyright notice applies to the swab()
1034 // implementation within this "ACE_LACKS_SWAB" block of code.
1035 // ------------------------------------------------------------
1037 Copyright (c) 1994-2006 Red Hat, Inc. All rights reserved.
1039 This copyrighted material is made available to anyone wishing to
1040 use, modify, copy, or redistribute it subject to the terms and
1041 conditions of the BSD License. This program is distributed in
1042 the hope that it will be useful, but WITHOUT ANY WARRANTY
1043 expressed or implied, including the implied warranties of
1044 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. A copy of
1045 this license is available at
1046 http://www.opensource.org/licenses. Any Red Hat trademarks that
1047 are incorporated in the source code or documentation are not
1048 subject to the BSD License and may only be used or replicated with
1049 the express permission of Red Hat, Inc.
1052 const char *from = static_cast<const char*> (src);
1053 char *to = static_cast<char *> (dest);
1055 for (ptr = 1; ptr < length; ptr += 2)
1058 char q = from[ptr-1];
1062 if (ptr == length) /* I.e., if length is odd, */
1063 to[ptr-1] = 0; /* then pad with a NUL. */
1064 #elif defined (ACE_HAS_NONCONST_SWAB)
1065 const char *tmp = static_cast<const char*> (src);
1066 char *from = const_cast<char *> (tmp);
1067 char *to = static_cast<char *> (dest);
1068 # if defined (ACE_HAS_INT_SWAB)
1069 int ilength = ACE_Utils::truncate_cast<int> (length);
1070 # if defined (ACE_SWAB_EQUIVALENT)
1071 ACE_SWAB_EQUIVALENT (from, to, ilength);
1073 ::swab (from, to, ilength);
1076 ::swab (from, to, length);
1077 # endif /* ACE_HAS_INT_SWAB */
1078 #elif defined (ACE_HAS_CONST_CHAR_SWAB)
1079 const char *from = static_cast<const char*> (src);
1080 char *to = static_cast<char *> (dest);
1081 ::swab (from, to, length);
1083 ::swab (src, dest, length);
1084 #endif /* ACE_LACKS_SWAB */
1089 ACE_OS::sysconf (int name)
1091 ACE_OS_TRACE ("ACE_OS::sysconf");
1092 #if defined (ACE_LACKS_SYSCONF)
1093 ACE_UNUSED_ARG (name);
1094 ACE_NOTSUP_RETURN (-1);
1096 ACE_OSCALL_RETURN (::sysconf (name), long, -1);
1097 #endif /* ACE_LACKS_SYSCONF */
1101 ACE_OS::sysinfo (int cmd, char *buf, long count)
1103 ACE_OS_TRACE ("ACE_OS::sysinfo");
1104 #if defined (ACE_HAS_SYSV_SYSINFO)
1105 ACE_OSCALL_RETURN (::sysinfo (cmd, buf, count), long, -1);
1107 ACE_UNUSED_ARG (cmd);
1108 ACE_UNUSED_ARG (buf);
1109 ACE_UNUSED_ARG (count);
1111 ACE_NOTSUP_RETURN (0);
1112 #endif /* ACE_HAS_SYSV_SYSINFO */
1116 ACE_OS::truncate (const ACE_TCHAR *filename,
1119 ACE_OS_TRACE ("ACE_OS::truncate");
1120 #if defined (ACE_WIN32)
1121 ACE_HANDLE handle = ACE_OS::open (filename,
1123 ACE_DEFAULT_FILE_PERMS);
1125 # if !defined (ACE_LACKS_WIN32_SETFILEPOINTEREX)
1126 LARGE_INTEGER loffset;
1127 loffset.QuadPart = offset;
1129 LONG low_offset = ACE_LOW_PART(offset);
1130 LONG high_offset = ACE_HIGH_PART(offset);
1133 if (handle == ACE_INVALID_HANDLE)
1134 ACE_FAIL_RETURN (-1);
1136 # if !defined (ACE_LACKS_WIN32_SETFILEPOINTEREX)
1137 else if (::SetFilePointerEx (handle,
1142 else if (::SetFilePointer (handle,
1145 FILE_BEGIN) != INVALID_SET_FILE_POINTER
1146 || GetLastError () == NO_ERROR)
1147 # endif /* ACE_LACKS_WIN32_SETFILEPOINTEREX */
1149 BOOL result = ::SetEndOfFile (handle);
1150 ::CloseHandle (handle);
1151 ACE_WIN32CALL_RETURN (ACE_ADAPT_RETVAL (result, ace_result_), int, -1);
1155 ::CloseHandle (handle);
1156 ACE_FAIL_RETURN (-1);
1159 #elif !defined (ACE_LACKS_TRUNCATE)
1161 (::truncate (ACE_TEXT_ALWAYS_CHAR (filename), offset), int, -1);
1163 ACE_UNUSED_ARG (filename);
1164 ACE_UNUSED_ARG (offset);
1165 ACE_NOTSUP_RETURN (-1);
1166 #endif /* ACE_WIN32 */
1169 ACE_INLINE useconds_t
1170 ACE_OS::ualarm (useconds_t usecs, useconds_t interval)
1172 ACE_OS_TRACE ("ACE_OS::ualarm");
1174 #if defined (ACE_HAS_UALARM)
1175 return ::ualarm (usecs, interval);
1176 #elif !defined (ACE_LACKS_UNIX_SIGNALS) && !defined (ACE_LACKS_ALARM)
1177 ACE_UNUSED_ARG (interval);
1178 # if defined (ACE_VXWORKS) && ACE_VXWORKS >= 0x690 && defined (_WRS_CONFIG_LP64)
1179 return ::alarm (static_cast<unsigned int> (usecs * ACE_ONE_SECOND_IN_USECS));
1181 return ::alarm (usecs * ACE_ONE_SECOND_IN_USECS);
1184 ACE_UNUSED_ARG (usecs);
1185 ACE_UNUSED_ARG (interval);
1186 ACE_NOTSUP_RETURN (0);
1187 #endif /* ACE_HAS_UALARM */
1190 ACE_INLINE useconds_t
1191 ACE_OS::ualarm (const ACE_Time_Value &tv,
1192 const ACE_Time_Value &tv_interval)
1194 ACE_OS_TRACE ("ACE_OS::ualarm");
1196 #if defined (ACE_HAS_UALARM)
1197 useconds_t usecs = (tv.sec () * ACE_ONE_SECOND_IN_USECS) + tv.usec ();
1198 useconds_t interval =
1199 (tv_interval.sec () * ACE_ONE_SECOND_IN_USECS) + tv_interval.usec ();
1200 return ::ualarm (usecs, interval);
1201 #elif !defined (ACE_LACKS_UNIX_SIGNALS) && !defined (ACE_LACKS_ALARM)
1202 ACE_UNUSED_ARG (tv_interval);
1203 # if defined (ACE_VXWORKS) && ACE_VXWORKS >= 0x690 && defined (_WRS_CONFIG_LP64)
1204 return ::alarm (static_cast<unsigned int> (tv.sec ()));
1206 return ::alarm (tv.sec ());
1209 ACE_UNUSED_ARG (tv_interval);
1210 ACE_UNUSED_ARG (tv);
1211 ACE_NOTSUP_RETURN (0);
1212 #endif /* ACE_HAS_UALARM */
1216 ACE_OS::unlink (const char *path)
1218 ACE_OS_TRACE ("ACE_OS::unlink");
1219 # if defined (ACE_HAS_NONCONST_UNLINK)
1220 ACE_OSCALL_RETURN (::unlink (const_cast<char *> (path)), int, -1);
1221 # elif defined (ACE_HAS_WINCE)
1222 // @@ The problem is, DeleteFile is not actually equals to unlink. ;(
1223 ACE_WIN32CALL_RETURN (ACE_ADAPT_RETVAL (::DeleteFile (ACE_TEXT_CHAR_TO_TCHAR (path)), ace_result_),
1225 # elif defined (ACE_LACKS_UNLINK)
1226 ACE_UNUSED_ARG (path);
1227 ACE_NOTSUP_RETURN (-1);
1228 # elif defined (ACE_UNLINK_EQUIVALENT)
1229 ACE_OSCALL_RETURN (ACE_UNLINK_EQUIVALENT (path), int, -1);
1231 ACE_OSCALL_RETURN (::unlink (path), int, -1);
1232 # endif /* ACE_HAS_NONCONST_UNLINK */
1235 #if defined (ACE_HAS_WCHAR)
1237 ACE_OS::unlink (const wchar_t *path)
1239 ACE_OS_TRACE ("ACE_OS::unlink");
1240 # if defined (ACE_HAS_WINCE)
1241 // @@ The problem is, DeleteFile is not actually equals to unlink. ;(
1242 ACE_WIN32CALL_RETURN (ACE_ADAPT_RETVAL (::DeleteFileW (path), ace_result_),
1244 # elif defined (ACE_WIN32)
1245 ACE_OSCALL_RETURN (::_wunlink (path), int, -1);
1247 ACE_Wide_To_Ascii npath (path);
1248 return ACE_OS::unlink (npath.char_rep ());
1249 # endif /* ACE_HAS_WINCE */
1251 #endif /* ACE_HAS_WCHAR */
1254 ACE_OS::write (ACE_HANDLE handle, const void *buf, size_t nbyte)
1256 ACE_OS_TRACE ("ACE_OS::write");
1257 #if defined (ACE_WIN32)
1258 DWORD bytes_written; // This is set to 0 byte WriteFile.
1260 // Strictly correctly, we should loop writing all the data if more
1261 // than a DWORD length can hold.
1262 DWORD short_nbyte = static_cast<DWORD> (nbyte);
1263 if (::WriteFile (handle, buf, short_nbyte, &bytes_written, 0))
1264 return (ssize_t) bytes_written;
1266 ACE_FAIL_RETURN (-1);
1267 #elif defined (ACE_MQX)
1268 return MQX_Filesystem::inst ().write (handle, reinterpret_cast<const unsigned char *> (buf), nbyte);
1270 # if defined (ACE_HAS_CHARPTR_SOCKOPT)
1271 ACE_OSCALL_RETURN (::write (handle, static_cast <char *> (const_cast <void *> (buf)), nbyte), ssize_t, -1);
1273 ACE_OSCALL_RETURN (::write (handle, buf, nbyte), ssize_t, -1);
1274 # endif /* ACE_HAS_CHARPTR_SOCKOPT */
1275 #endif /* ACE_WIN32 */
1279 ACE_OS::write (ACE_HANDLE handle,
1282 ACE_OVERLAPPED *overlapped)
1284 ACE_OS_TRACE ("ACE_OS::write");
1285 #if defined (ACE_WIN32)
1286 DWORD bytes_written; // This is set to 0 byte WriteFile.
1288 DWORD short_nbyte = static_cast<DWORD> (nbyte);
1289 if (::WriteFile (handle, buf, short_nbyte, &bytes_written, overlapped))
1290 return (ssize_t) bytes_written;
1292 ACE_FAIL_RETURN (-1);
1294 ACE_UNUSED_ARG (overlapped);
1295 return ACE_OS::write (handle, buf, nbyte);
1296 #endif /* ACE_WIN32 */
1299 ACE_END_VERSIONED_NAMESPACE_DECL