summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormkaply%us.ibm.com <devnull@localhost>2004-04-01 16:54:23 +0000
committermkaply%us.ibm.com <devnull@localhost>2004-04-01 16:54:23 +0000
commit67d9ab0713c7532eb33bd04eba71efbb8486ece4 (patch)
tree034d416f871c799b59ec2fadbc506f5925cb1929
parentc038b2f9b9176504c01d0976fa609b953ed4a45d (diff)
downloadnspr-hg-67d9ab0713c7532eb33bd04eba71efbb8486ece4.tar.gz
#126928
r=mkaply, a=mkaply OS/2 only - code from knut st. osmundsen - implement PR_SetFDInheritable on OS/2
-rw-r--r--pr/src/md/os2/os2io.c49
1 files changed, 33 insertions, 16 deletions
diff --git a/pr/src/md/os2/os2io.c b/pr/src/md/os2/os2io.c
index acccf6a6..4897a31c 100644
--- a/pr/src/md/os2/os2io.c
+++ b/pr/src/md/os2/os2io.c
@@ -61,6 +61,7 @@
#include "primpl.h"
#include "prio.h"
#include <ctype.h>
+#include <string.h>
#ifdef XP_OS2_VACPP
#include <direct.h>
#else
@@ -147,8 +148,6 @@ _PR_MD_OPEN(const char *name, PRIntn osflags, int mode)
APIRET rc = 0;
PRUword actionTaken;
- ULONG CurMaxFH = 0;
- LONG ReqCount = 1;
ULONG fattr;
if (osflags & PR_SYNC) access |= OPEN_FLAGS_WRITE_THROUGH;
@@ -767,25 +766,43 @@ _PR_MD_UNLOCKFILE(PRInt32 f)
PRStatus
_PR_MD_SET_FD_INHERITABLE(PRFileDesc *fd, PRBool inheritable)
{
- int rv = 0;
+ APIRET rc = 0;
ULONG flags;
+ switch (fd->methods->file_type)
+ {
+ case PR_DESC_PIPE:
+ case PR_DESC_FILE:
+ rc = DosQueryFHState((HFILE)fd->secret->md.osfd, &flags);
+ if (rc != NO_ERROR) {
+ PR_SetError(PR_UNKNOWN_ERROR, _MD_ERRNO());
+ return PR_FAILURE;
+ }
- rv = DosQueryFHState((HFILE)fd->secret->md.osfd, &flags);
- if (rv != 0) {
- PR_SetError(PR_UNKNOWN_ERROR, _MD_ERRNO());
- return PR_FAILURE;
- }
+ if (inheritable)
+ flags &= ~OPEN_FLAGS_NOINHERIT;
+ else
+ flags |= OPEN_FLAGS_NOINHERIT;
+
+ /* Mask off flags DosSetFHState don't want. */
+ flags &= (OPEN_FLAGS_WRITE_THROUGH | OPEN_FLAGS_FAIL_ON_ERROR | OPEN_FLAGS_NO_CACHE | OPEN_FLAGS_NOINHERIT);
+ rc = DosSetFHState((HFILE)fd->secret->md.osfd, flags);
+ if (rc != NO_ERROR) {
+ PR_SetError(PR_UNKNOWN_ERROR, _MD_ERRNO());
+ return PR_FAILURE;
+ }
+ break;
- if (inheritable)
- flags &= ~OPEN_FLAGS_NOINHERIT;
- else
- flags |= OPEN_FLAGS_NOINHERIT;
+ case PR_DESC_LAYERED:
+ /* what to do here? */
+ PR_SetError(PR_UNKNOWN_ERROR, 87 /*ERROR_INVALID_PARAMETER*/);
+ return PR_FAILURE;
- rv = DosSetFHState((HFILE)fd->secret->md.osfd, flags);
- if (rv != 0) {
- PR_SetError(PR_UNKNOWN_ERROR, _MD_ERRNO());
- return PR_FAILURE;
+ case PR_DESC_SOCKET_TCP:
+ case PR_DESC_SOCKET_UDP:
+ /* These are global on OS/2. */
+ break;
}
+
return PR_SUCCESS;
}