Changeset 2300 for trunk/src/kernel32/oslibdos.cpp
- Timestamp:
- Jan 2, 2000, 11:51:12 PM (26 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/kernel32/oslibdos.cpp
r1924 r2300 1 /* $Id: oslibdos.cpp,v 1.12 1999-12-01 18:40:48 sandervl Exp $ */2 3 1 /* 4 2 * Wrappers for OS/2 Dos* API 5 3 * 6 * Copyright 1998 Sander van Leeuwen (sandervl@xs4all.nl) 7 * 4 * Copyright 1998-2000 Sander van Leeuwen (sandervl@xs4all.nl) 5 * Copyright 1999-2000 Edgar Buerkle <Edgar.Buerkle@gmx.net> 6 * Copyright 2000 Przemyslaw Dobrowolski <dobrawka@asua.org.pl> 8 7 * 9 8 * Project Odin Software License can be found in LICENSE.TXT … … 15 14 #define INCL_DOSPROCESS 16 15 #define INCL_DOSERRORS 16 #define INCL_NPIPES 17 17 #include <os2wrap.h> //Odin32 OS/2 api wrappers 18 18 #include <stdlib.h> … … 20 20 #include <string.h> 21 21 #include <win32type.h> 22 #include <winconst.h> 22 23 #include <misc.h> 23 24 #include "initterm.h" 24 25 #include "oslibdos.h" 25 26 #include "dosqss.h" 27 28 /*********************************** 29 * PH: fixups for missing os2win.h * 30 ***********************************/ 31 32 void _System SetLastError(ULONG ulError); 26 33 27 34 APIRET APIENTRY DosAliasMem(PVOID pb, ULONG cb, PPVOID ppbAlias, ULONG fl); … … 403 410 DWORD os2Open=0; 404 411 405 #define GENERIC_READ 0x80000000 406 #define GENERIC_WRITE 0x40000000 407 if(dwAccess == (GENERIC_READ | GENERIC_WRITE)) 412 if(dwAccess == (GENERIC_READ_W | GENERIC_WRITE_W)) 408 413 os2Flags |= OPEN_ACCESS_READWRITE; 409 else if(dwAccess & GENERIC_WRITE )414 else if(dwAccess & GENERIC_WRITE_W) 410 415 os2Flags |= OPEN_ACCESS_WRITEONLY; 411 else if(dwAccess & GENERIC_READ )416 else if(dwAccess & GENERIC_READ_W) 412 417 os2Flags |= OPEN_ACCESS_READONLY; 413 418 414 #define FILE_SHARE_READ 0x00000001L415 #define FILE_SHARE_WRITE 0x00000002L416 419 if(dwShare == 0) 417 420 os2Flags |= OPEN_SHARE_DENYREADWRITE; 418 else if(dwShare == (FILE_SHARE_READ | FILE_SHARE_WRITE))421 else if(dwShare == (FILE_SHARE_READ_W | FILE_SHARE_WRITE_W)) 419 422 os2Flags |= OPEN_SHARE_DENYNONE; 420 else if(dwShare & FILE_SHARE_READ )423 else if(dwShare & FILE_SHARE_READ_W) 421 424 os2Flags |= OPEN_SHARE_DENYWRITE; 422 else if(dwShare & FILE_SHARE_WRITE )425 else if(dwShare & FILE_SHARE_WRITE_W) 423 426 os2Flags |= OPEN_SHARE_DENYREAD; 424 427 425 #define CREATE_NEW 1 426 #define CREATE_ALWAYS 2 427 #define OPEN_EXISTING 3 428 #define OPEN_ALWAYS 4 429 #define TRUNCATE_EXISTING 5 430 if(dwCreation == CREATE_NEW) 428 if(dwCreation == CREATE_NEW_W) 431 429 os2Open = OPEN_ACTION_FAIL_IF_EXISTS | OPEN_ACTION_CREATE_IF_NEW; 432 else if(dwCreation == CREATE_ALWAYS )430 else if(dwCreation == CREATE_ALWAYS_W) 433 431 os2Open = OPEN_ACTION_REPLACE_IF_EXISTS | OPEN_ACTION_CREATE_IF_NEW; 434 else if(dwCreation == OPEN_EXISTING )432 else if(dwCreation == OPEN_EXISTING_W) 435 433 os2Open = OPEN_ACTION_OPEN_IF_EXISTS | OPEN_ACTION_FAIL_IF_NEW; 436 else if(dwCreation == OPEN_ALWAYS )434 else if(dwCreation == OPEN_ALWAYS_W) 437 435 os2Open = OPEN_ACTION_OPEN_IF_EXISTS | OPEN_ACTION_CREATE_IF_NEW; 438 else if(dwCreation == TRUNCATE_EXISTING )436 else if(dwCreation == TRUNCATE_EXISTING_W) 439 437 os2Open = OPEN_ACTION_REPLACE_IF_EXISTS;// |OPEN_ACTION_FAIL_IF_NEW; 440 438 441 #define FILE_ATTRIBUTE_READONLY 0x00000001L 442 #define FILE_ATTRIBUTE_HIDDEN 0x00000002L 443 #define FILE_ATTRIBUTE_SYSTEM 0x00000004L 444 #define FILE_ATTRIBUTE_DIRECTORY 0x00000010L 445 #define FILE_ATTRIBUTE_ARCHIVE 0x00000020L 446 #define FILE_ATTRIBUTE_NORMAL 0x00000080L 447 #define FILE_ATTRIBUTE_TEMPORARY 0x00000100L 448 if(dwFlags & FILE_ATTRIBUTE_READONLY) 439 if(dwFlags & FILE_ATTRIBUTE_READONLY_W) 449 440 os2Attrib |= FILE_READONLY; 450 if(dwFlags & FILE_ATTRIBUTE_HIDDEN )441 if(dwFlags & FILE_ATTRIBUTE_HIDDEN_W) 451 442 os2Attrib |= FILE_HIDDEN; 452 if(dwFlags & FILE_ATTRIBUTE_SYSTEM )443 if(dwFlags & FILE_ATTRIBUTE_SYSTEM_W) 453 444 os2Attrib |= FILE_SYSTEM; 454 if(dwFlags & FILE_ATTRIBUTE_DIRECTORY )445 if(dwFlags & FILE_ATTRIBUTE_DIRECTORY_W) 455 446 os2Attrib |= FILE_DIRECTORY; 456 if(dwFlags & FILE_ATTRIBUTE_ARCHIVE )447 if(dwFlags & FILE_ATTRIBUTE_ARCHIVE_W) 457 448 os2Attrib |= FILE_ARCHIVED; 458 if(dwFlags & FILE_ATTRIBUTE_NORMAL )449 if(dwFlags & FILE_ATTRIBUTE_NORMAL_W) 459 450 os2Attrib |= FILE_NORMAL; 460 451 461 #define FILE_FLAG_WRITE_THROUGH 0x80000000UL 462 #define FILE_FLAG_OVERLAPPED 0x40000000L 463 #define FILE_FLAG_NO_BUFFERING 0x20000000L 464 #define FILE_FLAG_RANDOM_ACCESS 0x10000000L 465 #define FILE_FLAG_SEQUENTIAL_SCAN 0x08000000L 466 #define FILE_FLAG_DELETE_ON_CLOSE 0x04000000L 467 #define FILE_FLAG_BACKUP_SEMANTICS 0x02000000L 468 #define FILE_FLAG_POSIX_SEMANTICS 0x01000000L 469 if(dwFlags & FILE_FLAG_WRITE_THROUGH) 452 if(dwFlags & FILE_FLAG_WRITE_THROUGH_W) 470 453 os2Flags |= OPEN_FLAGS_WRITE_THROUGH; 471 if(dwFlags & FILE_FLAG_NO_BUFFERING )454 if(dwFlags & FILE_FLAG_NO_BUFFERING_W) 472 455 os2Flags |= OPEN_FLAGS_NO_CACHE; 473 if(dwFlags & FILE_FLAG_RANDOM_ACCESS )456 if(dwFlags & FILE_FLAG_RANDOM_ACCESS_W) 474 457 os2Flags |= OPEN_FLAGS_RANDOM; 475 if(dwFlags & FILE_FLAG_SEQUENTIAL_SCAN )458 if(dwFlags & FILE_FLAG_SEQUENTIAL_SCAN_W) 476 459 os2Flags |= OPEN_FLAGS_SEQUENTIAL; 477 460 478 461 // TODO: 479 // if(dwFlags & FILE_FLAG_OVERLAPPED )480 // if(dwFlags & FILE_FLAG_DELETE_ON_CLOSE 462 // if(dwFlags & FILE_FLAG_OVERLAPPED_W) 463 // if(dwFlags & FILE_FLAG_DELETE_ON_CLOSE_W 481 464 482 465 rc = DosOpen(lpFileName, &hFile, &ulAction, 0, … … 486 469 { 487 470 // TODO: TEST TEST 488 dprintf(("DosOpen Error rc:%d, try without GENERIC_WRITE ", rc));489 if(dwAccess & GENERIC_WRITE )471 dprintf(("DosOpen Error rc:%d, try without GENERIC_WRITE_W", rc)); 472 if(dwAccess & GENERIC_WRITE_W) 490 473 os2Flags &= ~(OPEN_ACCESS_READWRITE | OPEN_ACCESS_WRITEONLY); 491 474 rc = DosOpen(lpFileName, &hFile, &ulAction, 0, … … 584 567 //****************************************************************************** 585 568 //****************************************************************************** 569 // TODO: implement SecurityAttributes parameter 570 DWORD OSLibDosCreateNamedPipe(LPCTSTR lpName, 571 DWORD dwOpenMode, 572 DWORD dwPipeMode, 573 DWORD nMaxInstances, 574 DWORD nOutBufferSize, 575 DWORD nInBufferSize, 576 DWORD nDefaultTimeOut, 577 void* lpSecurityAttributes) 578 { DWORD dwOS2Mode = 0; 579 DWORD dwOS2PipeMode = 0; 580 LPSTR lpOS2Name; 581 DWORD hPipe; 582 DWORD rc; 583 584 if (dwOpenMode & PIPE_ACCESS_DUPLEX_W) 585 dwOS2Mode |= NP_ACCESS_DUPLEX; 586 else 587 if (dwOpenMode & PIPE_ACCESS_INBOUND_W) 588 dwOS2Mode |= NP_ACCESS_INBOUND; 589 else 590 if (dwOpenMode & PIPE_ACCESS_OUTBOUND_W) 591 dwOS2Mode |= NP_ACCESS_OUTBOUND; 592 // TODO: 593 // if(dwOpenMode & FILE_FLAG_OVERLAPPED) 594 // if(dwOpenMode & WRITE_DAC) 595 // if(dwOpenMode & WRITE_OWNER) 596 // if(dwOpenMode & ACCESS_SYSTEM_SECURITY) 597 if(dwOpenMode & FILE_FLAG_WRITE_THROUGH_W) 598 dwOS2Mode |= NP_WRITEBEHIND; // FIXME: I'm not sure! 599 600 if (dwPipeMode & PIPE_WAIT_W) 601 dwOS2PipeMode |= NP_WAIT; 602 if (dwPipeMode & PIPE_NOWAIT_W) 603 dwOS2PipeMode |= NP_NOWAIT; 604 if (dwPipeMode & PIPE_READMODE_BYTE_W) 605 dwOS2PipeMode |= NP_READMODE_BYTE; 606 if (dwPipeMode & PIPE_READMODE_MESSAGE_W) 607 dwOS2PipeMode |= NP_READMODE_MESSAGE; 608 if (dwPipeMode & PIPE_TYPE_BYTE_W) 609 dwOS2PipeMode |= NP_TYPE_BYTE; 610 if (dwPipeMode & PIPE_TYPE_MESSAGE_W) 611 dwOS2PipeMode |= NP_TYPE_MESSAGE; 612 613 if (nMaxInstances>0xff) 614 { 615 SetLastError(87); // ERROR_INVALID_PARAMETER 616 return -1; // INVALID_HANDLE_VALUE 617 } 618 dwOS2PipeMode |= nMaxInstances; 619 620 // we must delete string \.\ because 621 // in Windows named pipes scheme is a \.\PIPE\pipename 622 // but in OS/2 only \PIPE\pipename 623 lpOS2Name = (LPSTR)lpName + 3; 624 625 626 dprintf(("DosCreateNPipe(%s,%x,%x,%x,%x,%x)",lpOS2Name,dwOS2Mode,dwOS2PipeMode,nInBufferSize,nOutBufferSize,nDefaultTimeOut)); 627 rc=DosCreateNPipe(lpOS2Name, 628 &hPipe, 629 dwOS2Mode, 630 dwOS2PipeMode, 631 nInBufferSize, 632 nInBufferSize, 633 nDefaultTimeOut); // Timeouts must be tested! 634 635 dprintf(("DosCreateNPipe rc=%d",rc)); 636 if (rc) 637 { 638 if ( rc == ERROR_PIPE_BUSY ) SetLastError(ERROR_PIPE_BUSY_W); 639 else 640 if ( rc == ERROR_PATH_NOT_FOUND ) SetLastError(ERROR_PATH_NOT_FOUND_W); 641 else 642 if ( rc == ERROR_NOT_ENOUGH_MEMORY ) SetLastError(ERROR_NOT_ENOUGH_MEMORY_W); 643 else 644 if ( rc == ERROR_INVALID_PARAMETER ) SetLastError(ERROR_INVALID_PARAMETER_W); 645 else 646 if ( rc == ERROR_OUT_OF_STRUCTURES ) SetLastError(ERROR_OUT_OF_STRUCTURES_W); 647 else 648 // Unknown error 649 SetLastError(ERROR_INVALID_PARAMETER_W); // fixme! 650 return -1; // INVALID_HANDLE_VALUE 651 } 652 return hPipe; 653 } 654 655 //****************************************************************************** 656 //****************************************************************************** 657 // TODO: implement lpOverlapped parameter! 658 BOOL OSLibDosConnectNamedPipe(DWORD hNamedPipe, LPOVERLAPPED lpOverlapped) 659 { 660 DWORD rc; 661 662 rc=DosConnectNPipe(hNamedPipe); 663 dprintf(("DosConnectNPipe rc=%d",rc)); 664 665 if (!rc) return (TRUE); 666 else 667 if (rc==ERROR_BROKEN_PIPE) SetLastError(ERROR_BROKEN_PIPE_W); 668 else 669 if (rc==ERROR_BAD_PIPE) SetLastError(ERROR_BAD_PIPE_W); 670 else 671 if (rc==ERROR_PIPE_NOT_CONNECTED) SetLastError(ERROR_PIPE_NOT_CONNECTED_W); 672 else 673 // TODO: Implemnt this using Windows Errors 674 // if (rc==ERROR_INTERRUPT) 675 SetLastError(ERROR_PIPE_NOT_CONNECTED_W); 676 677 return (FALSE); 678 } 679 680 //****************************************************************************** 681 //****************************************************************************** 682 BOOL OSLibDosCallNamedPipe( LPCTSTR lpNamedPipeName, 683 LPVOID lpInBuffer, 684 DWORD nInBufferSize, 685 LPVOID lpOutBuffer, 686 DWORD nOutBufferSize, 687 LPDWORD lpBytesRead, 688 DWORD nTimeOut ) 689 { 690 LPSTR lpOS2Name; 691 DWORD rc; 692 // we must delete string \.\ because 693 // in Windows named pipes scheme is a \.\PIPE\pipename 694 // but in OS/2 only \PIPE\pipename 695 lpOS2Name = (LPSTR)lpNamedPipeName + 3; 696 697 rc=DosCallNPipe(lpOS2Name, 698 lpInBuffer, 699 nInBufferSize, 700 lpOutBuffer, 701 nOutBufferSize, 702 lpBytesRead, 703 nTimeOut ); 704 705 706 if (!rc) return (TRUE); 707 else 708 if ( rc==ERROR_FILE_NOT_FOUND ) SetLastError(ERROR_FILE_NOT_FOUND_W); 709 else 710 if ( rc==ERROR_PATH_NOT_FOUND ) SetLastError(ERROR_PATH_NOT_FOUND_W); 711 else 712 if ( rc==ERROR_ACCESS_DENIED ) SetLastError(ERROR_ACCESS_DENIED_W); 713 else 714 if ( rc==ERROR_MORE_DATA ) SetLastError(ERROR_MORE_DATA_W); 715 else 716 if ( rc==ERROR_PIPE_BUSY ) SetLastError(ERROR_PIPE_BUSY_W); 717 else 718 if ( rc==ERROR_BAD_FORMAT ) SetLastError(ERROR_BAD_FORMAT_W); 719 else 720 if ( rc==ERROR_BROKEN_PIPE ) SetLastError(ERROR_BROKEN_PIPE_W); 721 else 722 if ( rc==ERROR_BAD_PIPE ) SetLastError(ERROR_BAD_PIPE_W); 723 else 724 if ( rc==ERROR_PIPE_NOT_CONNECTED ) SetLastError(ERROR_PIPE_NOT_CONNECTED_W); 725 else 726 // TODO: Implemnt this using Windows Errors 727 // if (rc==ERROR_INTERRUPT) 728 SetLastError(233); 729 730 return (FALSE); 731 } 732 733 //****************************************************************************** 734 //****************************************************************************** 735 BOOL OSLibDosTransactNamedPipe( DWORD hNamedPipe, 736 LPVOID lpInBuffer, 737 DWORD nInBufferSize, 738 LPVOID lpOutBuffer, 739 DWORD nOutBufferSize, 740 LPDWORD lpBytesRead, 741 LPOVERLAPPED lpOverlapped) 742 { 743 DWORD rc; 744 745 rc=DosTransactNPipe(hNamedPipe, 746 lpOutBuffer, 747 nOutBufferSize, 748 lpInBuffer, 749 nInBufferSize, 750 lpBytesRead); 751 752 if (!rc) return (TRUE); 753 else 754 if ( rc==ERROR_ACCESS_DENIED ) SetLastError(ERROR_ACCESS_DENIED_W); 755 else 756 if ( rc==ERROR_MORE_DATA ) SetLastError(ERROR_MORE_DATA_W); 757 else 758 if ( rc==ERROR_PIPE_BUSY ) SetLastError(ERROR_PIPE_BUSY_W); 759 else 760 if ( rc==ERROR_BAD_FORMAT ) SetLastError(ERROR_BAD_FORMAT_W); 761 else 762 if ( rc==ERROR_BROKEN_PIPE ) SetLastError(ERROR_BROKEN_PIPE_W); 763 else 764 if ( rc==ERROR_BAD_PIPE ) SetLastError(ERROR_BAD_PIPE_W); 765 else 766 if ( rc==ERROR_PIPE_NOT_CONNECTED ) SetLastError(ERROR_PIPE_NOT_CONNECTED_W); 767 else 768 // Unknown error 769 SetLastError(ERROR_PIPE_NOT_CONNECTED_W); 770 771 return FALSE; 772 }
Note:
See TracChangeset
for help on using the changeset viewer.