/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ /* * The contents of this file are subject to the Netscape Public License * Version 1.0 (the "NPL"); you may not use this file except in * compliance with the NPL. You may obtain a copy of the NPL at * http://www.mozilla.org/NPL/ * * Software distributed under the NPL is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL * for the specific language governing rights and limitations under the * NPL. * * The Initial Developer of this code under the NPL is Netscape * Communications Corporation. Portions created by Netscape are * Copyright (C) 1998 Netscape Communications Corporation. All Rights * Reserved. */ #include "primpl.h" #include /* for memset() */ /************************************************************************/ PRLock *_pr_flock_lock; void _PR_InitIO(void) { const PRIOMethods *methods = PR_GetFileMethods(); _PR_InitFdCache(); _pr_flock_lock = PR_NewLock(); #ifdef WIN32 _pr_stdin = PR_AllocFileDesc((PRInt32)GetStdHandle(STD_INPUT_HANDLE), methods); _pr_stdout = PR_AllocFileDesc((PRInt32)GetStdHandle(STD_OUTPUT_HANDLE), methods); _pr_stderr = PR_AllocFileDesc((PRInt32)GetStdHandle(STD_ERROR_HANDLE), methods); #ifdef WINNT _pr_stdin->secret->md.nonoverlapped = PR_TRUE; _pr_stdout->secret->md.nonoverlapped = PR_TRUE; _pr_stderr->secret->md.nonoverlapped = PR_TRUE; #endif #else _pr_stdin = PR_AllocFileDesc(0, methods); _pr_stdout = PR_AllocFileDesc(1, methods); _pr_stderr = PR_AllocFileDesc(2, methods); #endif _PR_MD_INIT_IO(); } PR_IMPLEMENT(PRFileDesc*) PR_GetSpecialFD(PRSpecialFD osfd) { PRFileDesc *result = NULL; PR_ASSERT((int) osfd >= PR_StandardInput && osfd <= PR_StandardError); if (!_pr_initialized) _PR_ImplicitInitialization(); switch (osfd) { case PR_StandardInput: result = _pr_stdin; break; case PR_StandardOutput: result = _pr_stdout; break; case PR_StandardError: result = _pr_stderr; break; default: (void)PR_SetError(PR_INVALID_ARGUMENT_ERROR, 0); } return result; } PR_IMPLEMENT(PRFileDesc*) PR_AllocFileDesc( PRInt32 osfd, const PRIOMethods *methods) { PRFileDesc *fd; #ifdef XP_UNIX /* * Assert that the file descriptor is small enough to fit in the * fd_set passed to select */ PR_ASSERT(osfd < FD_SETSIZE); #endif fd = _PR_Getfd(); if (fd) { /* Initialize the members of PRFileDesc and PRFilePrivate */ fd->methods = methods; fd->secret->state = _PR_FILEDESC_OPEN; fd->secret->md.osfd = osfd; } else { PR_SetError(PR_OUT_OF_MEMORY_ERROR, 0); } return fd; } PR_IMPLEMENT(void) PR_FreeFileDesc(PRFileDesc *fd) { PR_ASSERT(fd); _PR_Putfd(fd); } /* ** Wait for some i/o to finish on one or more more poll descriptors. */ PR_IMPLEMENT(PRInt32) PR_Poll(PRPollDesc *pds, PRIntn npds, PRIntervalTime timeout) { return(_PR_MD_PR_POLL(pds, npds, timeout)); }