bss_dgram.c revision 656d9c7f52f88b3a3daccafa7655dec086c4756e
1656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* crypto/bio/bio_dgram.c */
2656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/*
3656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * DTLS implementation written by Nagendra Modadugu
4656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * (nagendra@cs.stanford.edu) for the OpenSSL project 2005.
5656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project */
6656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* ====================================================================
7656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * Copyright (c) 1999-2005 The OpenSSL Project.  All rights reserved.
8656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
9656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * Redistribution and use in source and binary forms, with or without
10656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * modification, are permitted provided that the following conditions
11656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * are met:
12656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
13656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 1. Redistributions of source code must retain the above copyright
14656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    notice, this list of conditions and the following disclaimer.
15656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
16656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 2. Redistributions in binary form must reproduce the above copyright
17656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    notice, this list of conditions and the following disclaimer in
18656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    the documentation and/or other materials provided with the
19656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    distribution.
20656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
21656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 3. All advertising materials mentioning features or use of this
22656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    software must display the following acknowledgment:
23656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    "This product includes software developed by the OpenSSL Project
24656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)"
25656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
26656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
27656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    endorse or promote products derived from this software without
28656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    prior written permission. For written permission, please contact
29656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    openssl-core@OpenSSL.org.
30656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
31656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 5. Products derived from this software may not be called "OpenSSL"
32656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    nor may "OpenSSL" appear in their names without prior written
33656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    permission of the OpenSSL Project.
34656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
35656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 6. Redistributions of any form whatsoever must retain the following
36656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    acknowledgment:
37656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    "This product includes software developed by the OpenSSL Project
38656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)"
39656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
40656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
41656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
42656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
43656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
44656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
45656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
46656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
47656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
48656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
49656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
50656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
51656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * OF THE POSSIBILITY OF SUCH DAMAGE.
52656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * ====================================================================
53656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
54656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * This product includes cryptographic software written by Eric Young
55656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * (eay@cryptsoft.com).  This product includes software written by Tim
56656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * Hudson (tjh@cryptsoft.com).
57656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
58656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project */
59656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
60656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef OPENSSL_NO_DGRAM
61656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
62656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <stdio.h>
63656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <errno.h>
64656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define USE_SOCKETS
65656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include "cryptlib.h"
66656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
67656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <openssl/bio.h>
68656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
69656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define IP_MTU      14 /* linux is lame */
70656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
71656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef WATT32
72656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define sock_write SockWrite  /* Watt-32 uses same names */
73656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define sock_read  SockRead
74656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define sock_puts  SockPuts
75656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
76656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
77656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int dgram_write(BIO *h, const char *buf, int num);
78656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int dgram_read(BIO *h, char *buf, int size);
79656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int dgram_puts(BIO *h, const char *str);
80656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic long dgram_ctrl(BIO *h, int cmd, long arg1, void *arg2);
81656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int dgram_new(BIO *h);
82656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int dgram_free(BIO *data);
83656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int dgram_clear(BIO *bio);
84656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
85656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint BIO_dgram_should_retry(int s);
86656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
87656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic BIO_METHOD methods_dgramp=
88656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
89656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	BIO_TYPE_DGRAM,
90656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	"datagram socket",
91656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	dgram_write,
92656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	dgram_read,
93656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	dgram_puts,
94656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	NULL, /* dgram_gets, */
95656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	dgram_ctrl,
96656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	dgram_new,
97656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	dgram_free,
98656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	NULL,
99656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	};
100656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
101656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projecttypedef struct bio_dgram_data_st
102656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
103656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	struct sockaddr peer;
104656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	unsigned int connected;
105656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	unsigned int _errno;
106656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	unsigned int mtu;
107656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	} bio_dgram_data;
108656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
109656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectBIO_METHOD *BIO_s_datagram(void)
110656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
111656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return(&methods_dgramp);
112656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
113656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
114656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectBIO *BIO_new_dgram(int fd, int close_flag)
115656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
116656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	BIO *ret;
117656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
118656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ret=BIO_new(BIO_s_datagram());
119656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (ret == NULL) return(NULL);
120656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	BIO_set_fd(ret,fd,close_flag);
121656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return(ret);
122656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
123656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
124656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int dgram_new(BIO *bi)
125656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
126656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	bio_dgram_data *data = NULL;
127656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
128656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	bi->init=0;
129656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	bi->num=0;
130656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	data = OPENSSL_malloc(sizeof(bio_dgram_data));
131656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (data == NULL)
132656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return 0;
133656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	memset(data, 0x00, sizeof(bio_dgram_data));
134656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    bi->ptr = data;
135656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
136656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	bi->flags=0;
137656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return(1);
138656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
139656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
140656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int dgram_free(BIO *a)
141656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
142656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	bio_dgram_data *data;
143656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
144656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (a == NULL) return(0);
145656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if ( ! dgram_clear(a))
146656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return 0;
147656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
148656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	data = (bio_dgram_data *)a->ptr;
149656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if(data != NULL) OPENSSL_free(data);
150656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
151656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return(1);
152656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
153656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
154656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int dgram_clear(BIO *a)
155656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
156656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (a == NULL) return(0);
157656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (a->shutdown)
158656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
159656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (a->init)
160656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
161656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			SHUTDOWN2(a->num);
162656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
163656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		a->init=0;
164656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		a->flags=0;
165656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
166656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return(1);
167656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
168656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
169656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int dgram_read(BIO *b, char *out, int outl)
170656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
171656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int ret=0;
172656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	bio_dgram_data *data = (bio_dgram_data *)b->ptr;
173656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
174656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	struct sockaddr peer;
175656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int peerlen = sizeof(peer);
176656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
177656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (out != NULL)
178656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
179656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		clear_socket_error();
180656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		memset(&peer, 0x00, peerlen);
181656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		/* Last arg in recvfrom is signed on some platforms and
182656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		 * unsigned on others. It is of type socklen_t on some
183656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		 * but this is not universal. Cast to (void *) to avoid
184656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		 * compiler warnings.
185656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		 */
186656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		ret=recvfrom(b->num,out,outl,0,&peer,(void *)&peerlen);
187656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
188656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if ( ! data->connected  && ret > 0)
189656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			BIO_ctrl(b, BIO_CTRL_DGRAM_CONNECT, 0, &peer);
190656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
191656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		BIO_clear_retry_flags(b);
192656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (ret <= 0)
193656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
194656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if (BIO_dgram_should_retry(ret))
195656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				{
196656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				BIO_set_retry_read(b);
197656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				data->_errno = get_last_socket_error();
198656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				}
199656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
200656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
201656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return(ret);
202656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
203656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
204656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int dgram_write(BIO *b, const char *in, int inl)
205656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
206656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int ret;
207656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	bio_dgram_data *data = (bio_dgram_data *)b->ptr;
208656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	clear_socket_error();
209656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
210656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    if ( data->connected )
211656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        ret=writesocket(b->num,in,inl);
212656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    else
213656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#if defined(NETWARE_CLIB) && defined(NETWARE_BSDSOCK)
214656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        ret=sendto(b->num, (char *)in, inl, 0, &data->peer, sizeof(data->peer));
215656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#else
216656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        ret=sendto(b->num, in, inl, 0, &data->peer, sizeof(data->peer));
217656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
218656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
219656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	BIO_clear_retry_flags(b);
220656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (ret <= 0)
221656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
222656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (BIO_sock_should_retry(ret))
223656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
224656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			BIO_set_retry_write(b);
225656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			data->_errno = get_last_socket_error();
226656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
227656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#if 0 /* higher layers are responsible for querying MTU, if necessary */
228656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if ( data->_errno == EMSGSIZE)
229656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				/* retrieve the new MTU */
230656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				BIO_ctrl(b, BIO_CTRL_DGRAM_QUERY_MTU, 0, NULL);
231656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
232656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
233656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
234656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return(ret);
235656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
236656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
237656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic long dgram_ctrl(BIO *b, int cmd, long num, void *ptr)
238656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
239656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	long ret=1;
240656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int *ip;
241656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	struct sockaddr *to = NULL;
242656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	bio_dgram_data *data = NULL;
243656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	long sockopt_val = 0;
244656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	unsigned int sockopt_len = 0;
245656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
246656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	data = (bio_dgram_data *)b->ptr;
247656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
248656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	switch (cmd)
249656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
250656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	case BIO_CTRL_RESET:
251656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		num=0;
252656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	case BIO_C_FILE_SEEK:
253656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		ret=0;
254656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		break;
255656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	case BIO_C_FILE_TELL:
256656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	case BIO_CTRL_INFO:
257656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		ret=0;
258656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		break;
259656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	case BIO_C_SET_FD:
260656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		dgram_clear(b);
261656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		b->num= *((int *)ptr);
262656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		b->shutdown=(int)num;
263656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		b->init=1;
264656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		break;
265656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	case BIO_C_GET_FD:
266656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (b->init)
267656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
268656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			ip=(int *)ptr;
269656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if (ip != NULL) *ip=b->num;
270656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			ret=b->num;
271656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
272656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		else
273656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			ret= -1;
274656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		break;
275656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	case BIO_CTRL_GET_CLOSE:
276656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		ret=b->shutdown;
277656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		break;
278656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	case BIO_CTRL_SET_CLOSE:
279656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		b->shutdown=(int)num;
280656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		break;
281656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	case BIO_CTRL_PENDING:
282656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	case BIO_CTRL_WPENDING:
283656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		ret=0;
284656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		break;
285656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	case BIO_CTRL_DUP:
286656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	case BIO_CTRL_FLUSH:
287656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		ret=1;
288656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		break;
289656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	case BIO_CTRL_DGRAM_CONNECT:
290656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		to = (struct sockaddr *)ptr;
291656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#if 0
292656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (connect(b->num, to, sizeof(struct sockaddr)) < 0)
293656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{ perror("connect"); ret = 0; }
294656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		else
295656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
296656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
297656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			memcpy(&(data->peer),to, sizeof(struct sockaddr));
298656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#if 0
299656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
300656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
301656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		break;
302656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		/* (Linux)kernel sets DF bit on outgoing IP packets */
303656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef IP_MTU_DISCOVER
304656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	case BIO_CTRL_DGRAM_MTU_DISCOVER:
305656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		sockopt_val = IP_PMTUDISC_DO;
306656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if ((ret = setsockopt(b->num, IPPROTO_IP, IP_MTU_DISCOVER,
307656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			&sockopt_val, sizeof(sockopt_val))) < 0)
308656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			perror("setsockopt");
309656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		break;
310656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
311656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	case BIO_CTRL_DGRAM_QUERY_MTU:
312656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project         sockopt_len = sizeof(sockopt_val);
313656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if ((ret = getsockopt(b->num, IPPROTO_IP, IP_MTU, (void *)&sockopt_val,
314656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			&sockopt_len)) < 0 || sockopt_val < 0)
315656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{ ret = 0; }
316656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		else
317656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
318656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			data->mtu = sockopt_val;
319656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			ret = data->mtu;
320656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
321656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		break;
322656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	case BIO_CTRL_DGRAM_GET_MTU:
323656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return data->mtu;
324656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		break;
325656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	case BIO_CTRL_DGRAM_SET_MTU:
326656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		data->mtu = num;
327656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		ret = num;
328656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		break;
329656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	case BIO_CTRL_DGRAM_SET_CONNECTED:
330656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		to = (struct sockaddr *)ptr;
331656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
332656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if ( to != NULL)
333656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
334656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			data->connected = 1;
335656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			memcpy(&(data->peer),to, sizeof(struct sockaddr));
336656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
337656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		else
338656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
339656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			data->connected = 0;
340656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			memset(&(data->peer), 0x00, sizeof(struct sockaddr));
341656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
342656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		break;
343656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    case BIO_CTRL_DGRAM_SET_PEER:
344656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        to = (struct sockaddr *) ptr;
345656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
346656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        memcpy(&(data->peer), to, sizeof(struct sockaddr));
347656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        break;
348656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	case BIO_CTRL_DGRAM_SET_RECV_TIMEOUT:
349656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if ( setsockopt(b->num, SOL_SOCKET, SO_RCVTIMEO, ptr,
350656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			sizeof(struct timeval)) < 0)
351656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{ perror("setsockopt");	ret = -1; }
352656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		break;
353656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	case BIO_CTRL_DGRAM_GET_RECV_TIMEOUT:
354656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if ( getsockopt(b->num, SOL_SOCKET, SO_RCVTIMEO,
355656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			ptr, (void *)&ret) < 0)
356656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{ perror("getsockopt"); ret = -1; }
357656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		break;
358656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	case BIO_CTRL_DGRAM_SET_SEND_TIMEOUT:
359656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if ( setsockopt(b->num, SOL_SOCKET, SO_SNDTIMEO, ptr,
360656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			sizeof(struct timeval)) < 0)
361656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{ perror("setsockopt");	ret = -1; }
362656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		break;
363656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	case BIO_CTRL_DGRAM_GET_SEND_TIMEOUT:
364656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if ( getsockopt(b->num, SOL_SOCKET, SO_SNDTIMEO,
365656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			ptr, (void *)&ret) < 0)
366656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{ perror("getsockopt"); ret = -1; }
367656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		break;
368656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	case BIO_CTRL_DGRAM_GET_SEND_TIMER_EXP:
369656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		/* fall-through */
370656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	case BIO_CTRL_DGRAM_GET_RECV_TIMER_EXP:
371656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if ( data->_errno == EAGAIN)
372656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
373656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			ret = 1;
374656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			data->_errno = 0;
375656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
376656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		else
377656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			ret = 0;
378656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		break;
379656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef EMSGSIZE
380656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	case BIO_CTRL_DGRAM_MTU_EXCEEDED:
381656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if ( data->_errno == EMSGSIZE)
382656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
383656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			ret = 1;
384656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			data->_errno = 0;
385656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
386656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		else
387656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			ret = 0;
388656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		break;
389656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
390656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	default:
391656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		ret=0;
392656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		break;
393656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
394656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return(ret);
395656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
396656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
397656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int dgram_puts(BIO *bp, const char *str)
398656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
399656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int n,ret;
400656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
401656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	n=strlen(str);
402656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ret=dgram_write(bp,str,n);
403656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return(ret);
404656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
405656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
406656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint BIO_dgram_should_retry(int i)
407656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
408656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int err;
409656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
410656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if ((i == 0) || (i == -1))
411656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
412656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		err=get_last_socket_error();
413656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
414656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#if defined(OPENSSL_SYS_WINDOWS) && 0 /* more microsoft stupidity? perhaps not? Ben 4/1/99 */
415656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if ((i == -1) && (err == 0))
416656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			return(1);
417656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
418656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
419656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return(BIO_dgram_non_fatal_error(err));
420656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
421656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return(0);
422656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
423656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
424656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint BIO_dgram_non_fatal_error(int err)
425656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
426656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	switch (err)
427656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
428656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#if defined(OPENSSL_SYS_WINDOWS)
429656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# if defined(WSAEWOULDBLOCK)
430656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	case WSAEWOULDBLOCK:
431656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# endif
432656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
433656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# if 0 /* This appears to always be an error */
434656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#  if defined(WSAENOTCONN)
435656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	case WSAENOTCONN:
436656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#  endif
437656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# endif
438656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
439656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
440656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef EWOULDBLOCK
441656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# ifdef WSAEWOULDBLOCK
442656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#  if WSAEWOULDBLOCK != EWOULDBLOCK
443656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	case EWOULDBLOCK:
444656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#  endif
445656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# else
446656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	case EWOULDBLOCK:
447656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# endif
448656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
449656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
450656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#if defined(ENOTCONN)
451656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	case ENOTCONN:
452656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
453656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
454656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef EINTR
455656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	case EINTR:
456656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
457656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
458656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef EAGAIN
459656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#if EWOULDBLOCK != EAGAIN
460656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	case EAGAIN:
461656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# endif
462656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
463656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
464656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef EPROTO
465656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	case EPROTO:
466656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
467656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
468656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef EINPROGRESS
469656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	case EINPROGRESS:
470656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
471656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
472656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef EALREADY
473656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	case EALREADY:
474656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
475656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
476656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* DF bit set, and packet larger than MTU */
477656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef EMSGSIZE
478656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	case EMSGSIZE:
479656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
480656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
481656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return(1);
482656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		/* break; */
483656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	default:
484656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		break;
485656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
486656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return(0);
487656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
488656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
489