1c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org/* crypto/bio/bss_sock.c */ 2c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) 3c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * All rights reserved. 4c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * 5c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * This package is an SSL implementation written 6c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * by Eric Young (eay@cryptsoft.com). 7c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * The implementation was written so as to conform with Netscapes SSL. 8c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * 9c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * This library is free for commercial and non-commercial use as long as 10c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * the following conditions are aheared to. The following conditions 11c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * apply to all code found in this distribution, be it the RC4, RSA, 12c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * lhash, DES, etc., code; not just the SSL code. The SSL documentation 13c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * included with this distribution is covered by the same copyright terms 14c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * except that the holder is Tim Hudson (tjh@cryptsoft.com). 15c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * 16c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * Copyright remains Eric Young's, and as such any Copyright notices in 17c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * the code are not to be removed. 18c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * If this package is used in a product, Eric Young should be given attribution 19c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * as the author of the parts of the library used. 20c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * This can be in the form of a textual message at program startup or 21c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * in documentation (online or textual) provided with the package. 22c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * 23c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * Redistribution and use in source and binary forms, with or without 24c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * modification, are permitted provided that the following conditions 25c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * are met: 26c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * 1. Redistributions of source code must retain the copyright 27c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * notice, this list of conditions and the following disclaimer. 28c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * 2. Redistributions in binary form must reproduce the above copyright 29c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * notice, this list of conditions and the following disclaimer in the 30c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * documentation and/or other materials provided with the distribution. 31c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * 3. All advertising materials mentioning features or use of this software 32c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * must display the following acknowledgement: 33c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * "This product includes cryptographic software written by 34c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * Eric Young (eay@cryptsoft.com)" 35c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * The word 'cryptographic' can be left out if the rouines from the library 36c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * being used are not cryptographic related :-). 37c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * 4. If you include any Windows specific code (or a derivative thereof) from 38c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * the apps directory (application code) you must include an acknowledgement: 39c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" 40c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * 41c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND 42c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 43c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 44c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 45c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 46c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 47c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 48c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 49c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 50c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 51c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * SUCH DAMAGE. 52c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * 53c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * The licence and distribution terms for any publically available version or 54c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * derivative of this code cannot be changed. i.e. this code cannot simply be 55c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * copied and put under another distribution licence 56c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * [including the GNU Public Licence.] 57c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org */ 58c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 59c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#include <stdio.h> 60c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#include <errno.h> 61c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#define USE_SOCKETS 62c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#include "cryptlib.h" 63c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 64c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#ifndef OPENSSL_NO_SOCK 65c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 66c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#include <openssl/bio.h> 67c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 68c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#ifdef WATT32 69c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#define sock_write SockWrite /* Watt-32 uses same names */ 70c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#define sock_read SockRead 71c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#define sock_puts SockPuts 72c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#endif 73c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 74c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgstatic int sock_write(BIO *h, const char *buf, int num); 75c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgstatic int sock_read(BIO *h, char *buf, int size); 76c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgstatic int sock_puts(BIO *h, const char *str); 77c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgstatic long sock_ctrl(BIO *h, int cmd, long arg1, void *arg2); 78c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgstatic int sock_new(BIO *h); 79c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgstatic int sock_free(BIO *data); 80c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgint BIO_sock_should_retry(int s); 81c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 82c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgstatic BIO_METHOD methods_sockp= 83c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 84c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org BIO_TYPE_SOCKET, 85c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org "socket", 86c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org sock_write, 87c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org sock_read, 88c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org sock_puts, 89c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org NULL, /* sock_gets, */ 90c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org sock_ctrl, 91c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org sock_new, 92c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org sock_free, 93c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org NULL, 94c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org }; 95c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 96c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgBIO_METHOD *BIO_s_socket(void) 97c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 98c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org return(&methods_sockp); 99c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 100c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 101c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgBIO *BIO_new_socket(int fd, int close_flag) 102c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 103c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org BIO *ret; 104c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 105c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ret=BIO_new(BIO_s_socket()); 106c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (ret == NULL) return(NULL); 107c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org BIO_set_fd(ret,fd,close_flag); 108c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org return(ret); 109c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 110c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 111c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgstatic int sock_new(BIO *bi) 112c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 113c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org bi->init=0; 114c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org bi->num=0; 115c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org bi->ptr=NULL; 116c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org bi->flags=0; 117c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org return(1); 118c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 119c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 120c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgstatic int sock_free(BIO *a) 121c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 122c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (a == NULL) return(0); 123c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (a->shutdown) 124c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 125c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (a->init) 126c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 127c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org SHUTDOWN2(a->num); 128c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 129c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org a->init=0; 130c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org a->flags=0; 131c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 132c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org return(1); 133c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 134c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 135c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgstatic int sock_read(BIO *b, char *out, int outl) 136c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 137c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org int ret=0; 138c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 139c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (out != NULL) 140c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 141c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org clear_socket_error(); 142c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ret=readsocket(b->num,out,outl); 143c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org BIO_clear_retry_flags(b); 144c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (ret <= 0) 145c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 146c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (BIO_sock_should_retry(ret)) 147c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org BIO_set_retry_read(b); 148c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 149c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 150c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org return(ret); 151c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 152c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 153c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgstatic int sock_write(BIO *b, const char *in, int inl) 154c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 155c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org int ret; 156c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 157c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org clear_socket_error(); 158c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ret=writesocket(b->num,in,inl); 159c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org BIO_clear_retry_flags(b); 160c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (ret <= 0) 161c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 162c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (BIO_sock_should_retry(ret)) 163c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org BIO_set_retry_write(b); 164c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 165c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org return(ret); 166c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 167c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 168c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgstatic long sock_ctrl(BIO *b, int cmd, long num, void *ptr) 169c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 170c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org long ret=1; 171c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org int *ip; 172c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 173c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org switch (cmd) 174c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 175c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org case BIO_C_SET_FD: 176c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org sock_free(b); 177c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org b->num= *((int *)ptr); 178c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org b->shutdown=(int)num; 179c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org b->init=1; 180c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org break; 181c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org case BIO_C_GET_FD: 182c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (b->init) 183c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 184c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ip=(int *)ptr; 185c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (ip != NULL) *ip=b->num; 186c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ret=b->num; 187c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 188c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org else 189c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ret= -1; 190c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org break; 191c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org case BIO_CTRL_GET_CLOSE: 192c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ret=b->shutdown; 193c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org break; 194c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org case BIO_CTRL_SET_CLOSE: 195c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org b->shutdown=(int)num; 196c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org break; 197c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org case BIO_CTRL_DUP: 198c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org case BIO_CTRL_FLUSH: 199c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ret=1; 200c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org break; 201c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org default: 202c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ret=0; 203c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org break; 204c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 205c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org return(ret); 206c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 207c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 208c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgstatic int sock_puts(BIO *bp, const char *str) 209c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 210c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org int n,ret; 211c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 212c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org n=strlen(str); 213c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ret=sock_write(bp,str,n); 214c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org return(ret); 215c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 216c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 217c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgint BIO_sock_should_retry(int i) 218c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 219c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org int err; 220c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 221c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if ((i == 0) || (i == -1)) 222c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 223c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org err=get_last_socket_error(); 224c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 225c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#if defined(OPENSSL_SYS_WINDOWS) && 0 /* more microsoft stupidity? perhaps not? Ben 4/1/99 */ 226c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if ((i == -1) && (err == 0)) 227c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org return(1); 228c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#endif 229c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 230c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org return(BIO_sock_non_fatal_error(err)); 231c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 232c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org return(0); 233c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 234c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 235c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgint BIO_sock_non_fatal_error(int err) 236c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 237c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org switch (err) 238c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 239c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#if defined(OPENSSL_SYS_WINDOWS) || defined(OPENSSL_SYS_NETWARE) 240c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org# if defined(WSAEWOULDBLOCK) 241c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org case WSAEWOULDBLOCK: 242c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org# endif 243c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 244c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org# if 0 /* This appears to always be an error */ 245c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org# if defined(WSAENOTCONN) 246c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org case WSAENOTCONN: 247c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org# endif 248c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org# endif 249c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#endif 250c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 251c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#ifdef EWOULDBLOCK 252c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org# ifdef WSAEWOULDBLOCK 253c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org# if WSAEWOULDBLOCK != EWOULDBLOCK 254c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org case EWOULDBLOCK: 255c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org# endif 256c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org# else 257c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org case EWOULDBLOCK: 258c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org# endif 259c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#endif 260c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 261c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#if defined(ENOTCONN) 262c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org case ENOTCONN: 263c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#endif 264c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 265c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#ifdef EINTR 266c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org case EINTR: 267c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#endif 268c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 269c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#ifdef EAGAIN 270c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org# if EWOULDBLOCK != EAGAIN 271c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org case EAGAIN: 272c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org# endif 273c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#endif 274c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 275c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#ifdef EPROTO 276c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org case EPROTO: 277c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#endif 278c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 279c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#ifdef EINPROGRESS 280c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org case EINPROGRESS: 281c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#endif 282c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 283c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#ifdef EALREADY 284c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org case EALREADY: 285c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#endif 286c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org return(1); 287c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org /* break; */ 288c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org default: 289c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org break; 290c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 291c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org return(0); 292c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 293c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 294c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#endif /* #ifndef OPENSSL_NO_SOCK */ 295