static PRStatus PR_CALLBACK SocketClose(PRFileDesc *fd) { if (!fd || !fd->secret || (fd->secret->state != _PR_FILEDESC_OPEN && fd->secret->state != _PR_FILEDESC_CLOSED)) { PR_SetError(PR_BAD_DESCRIPTOR_ERROR, 0); return PR_FAILURE; } if (fd->secret->state == _PR_FILEDESC_OPEN) { if (_PR_MD_CLOSE_SOCKET(fd->secret->md.osfd) < 0) { return PR_FAILURE; } fd->secret->state = _PR_FILEDESC_CLOSED; } #ifdef _PR_HAVE_PEEK_BUFFER if (fd->secret->peekBuffer) { PR_ASSERT(fd->secret->peekBufSize > 0); PR_DELETE(fd->secret->peekBuffer); fd->secret->peekBufSize = 0; fd->secret->peekBytes = 0; } #endif PR_FreeFileDesc(fd); return PR_SUCCESS; }
void _PR_CleanupIO(void) { PR_FreeFileDesc(_pr_stdin); _pr_stdin = NULL; PR_FreeFileDesc(_pr_stdout); _pr_stdout = NULL; PR_FreeFileDesc(_pr_stderr); _pr_stderr = NULL; if (_pr_flock_cv) { PR_DestroyCondVar(_pr_flock_cv); _pr_flock_cv = NULL; } if (_pr_flock_lock) { PR_DestroyLock(_pr_flock_lock); _pr_flock_lock = NULL; } _PR_CleanupFdCache(); }
static PRInt32 PR_CALLBACK SocketTransmitFile(PRFileDesc *sd, PRFileDesc *fd, const void *headers, PRInt32 hlen, PRTransmitFileFlags flags, PRIntervalTime timeout) { PRInt32 rv; PRThread *me = _PR_MD_CURRENT_THREAD(); if (_PR_PENDING_INTERRUPT(me)) { me->flags &= ~_PR_INTERRUPT; PR_SetError(PR_PENDING_INTERRUPT_ERROR, 0); return -1; } if (_PR_IO_PENDING(me)) { PR_SetError(PR_IO_PENDING_ERROR, 0); return -1; } #if defined(WINNT) rv = _PR_MD_TRANSMITFILE( sd, fd, headers, hlen, flags, timeout); if (rv < 0) { rv = -1; } if (flags & PR_TRANSMITFILE_CLOSE_SOCKET) { /* * This should be kept the same as SocketClose, except * that _PR_MD_CLOSE_SOCKET(sd->secret->md.osfd) should * not be called because the socket will be recycled. */ sd->secret->state = _PR_FILEDESC_CLOSED; PR_FreeFileDesc(sd); } #else #if defined(XP_UNIX) /* * On HPUX11, we could call _PR_HPUXTransmitFile(), but that * would require that we not override the malloc() functions. */ rv = _PR_UnixTransmitFile(sd, fd, headers, hlen, flags, timeout); #else /* XP_UNIX */ rv = _PR_EmulateTransmitFile(sd, fd, headers, hlen, flags, timeout); #endif /* XP_UNIX */ #endif /* WINNT */ return rv; }
static PRStatus PR_CALLBACK SocketClose(PRFileDesc *fd) { PRInt32 rv; if (!fd || fd->secret->state != _PR_FILEDESC_OPEN) { PR_SetError(PR_BAD_DESCRIPTOR_ERROR, 0); return PR_FAILURE; } fd->secret->state = _PR_FILEDESC_CLOSED; rv = _PR_MD_CLOSE_SOCKET(fd->secret->md.osfd); PR_FreeFileDesc(fd); if (rv < 0) { return PR_FAILURE; } return PR_SUCCESS; }
static PRInt32 PR_CALLBACK SocketSendFile( PRFileDesc *sd, PRSendFileData *sfd, PRTransmitFileFlags flags, PRIntervalTime timeout) { PRInt32 rv; PRThread *me = _PR_MD_CURRENT_THREAD(); if (_PR_PENDING_INTERRUPT(me)) { me->flags &= ~_PR_INTERRUPT; PR_SetError(PR_PENDING_INTERRUPT_ERROR, 0); return -1; } if (_PR_IO_PENDING(me)) { PR_SetError(PR_IO_PENDING_ERROR, 0); return -1; } /* The socket must be in blocking mode. */ if (sd->secret->nonblocking) { PR_SetError(PR_INVALID_ARGUMENT_ERROR, 0); return -1; } #if defined(WINNT) rv = _PR_MD_SENDFILE(sd, sfd, flags, timeout); if ((rv >= 0) && (flags == PR_TRANSMITFILE_CLOSE_SOCKET)) { /* * This should be kept the same as SocketClose, except * that _PR_MD_CLOSE_SOCKET(sd->secret->md.osfd) should * not be called because the socket will be recycled. */ PR_FreeFileDesc(sd); } #else rv = PR_EmulateSendFile(sd, sfd, flags, timeout); #endif /* WINNT */ return rv; }