[Author Prev][Author Next][Thread Prev][Thread Next][Author Index][Thread Index]
[or-cvs] r8426: Add a from-scratch implementation of a BIO using bsocket so (bsockets/trunk/contrib/tor/src/common)
- To: or-cvs@xxxxxxxxxxxxx
- Subject: [or-cvs] r8426: Add a from-scratch implementation of a BIO using bsocket so (bsockets/trunk/contrib/tor/src/common)
- From: nickm@xxxxxxxx
- Date: Tue, 19 Sep 2006 16:13:17 -0400 (EDT)
- Delivered-to: archiver@seul.org
- Delivered-to: or-cvs-outgoing@seul.org
- Delivered-to: or-cvs@seul.org
- Delivery-date: Tue, 19 Sep 2006 16:13:35 -0400
- Reply-to: or-talk@xxxxxxxxxxxxx
- Sender: owner-or-cvs@xxxxxxxxxxxxx
Author: nickm
Date: 2006-09-19 16:13:17 -0400 (Tue, 19 Sep 2006)
New Revision: 8426
Added:
bsockets/trunk/contrib/tor/src/common/bio_bsock2.c
Log:
Add a from-scratch implementation of a BIO using bsocket so we will not have to be a derived work of openssl.
Added: bsockets/trunk/contrib/tor/src/common/bio_bsock2.c
===================================================================
--- bsockets/trunk/contrib/tor/src/common/bio_bsock2.c 2006-09-19 18:53:34 UTC (rev 8425)
+++ bsockets/trunk/contrib/tor/src/common/bio_bsock2.c 2006-09-19 20:13:17 UTC (rev 8426)
@@ -0,0 +1,155 @@
+/* Copyright (c) 2006 Nick Mathewson. */
+/* See Tor LICENSE for licensing information */
+
+#include <openssl/bio.h>
+#include <string.h>
+#include <bsocket.h>
+
+static int bsocket_write(BIO *bio, const char *buf, int length);
+static int bsocket_read(BIO *bio, char *buf, int size);
+static int bsocket_puts(BIO *bio, const char *str);
+static long bsocket_ctrl(BIO *bio, int command, long arg1, void *arg2);
+static int bsocket_create(BIO *bio);
+static int bsocket_destroy(BIO *bio);
+
+/* XXXX connect() on windows can return WSAEINVAL. */
+
+#define ERRNO_IS_RETRY(e) ((e) == EWOULDBLOCK || \
+ (e) == EINTR || \
+ (e) == EAGAIN || \
+ (e) == EINPROGRESS)
+
+/* 0x100 : handle-based: bio->num will be set.
+ * 0x400 : source or sink: not a filter. */
+#define BIO_TYPE_BSOCKET = (99|0x0100|0x0400)
+
+static BIO_METHOD methods_bsocket = {
+ BIO_TYPE_BSOCKET, /* type */
+ "bsocket", /* name */
+ bsocket_write, /* write */
+ bsocket_read, /* read */
+ bsocket_puts, /* puts */
+ NULL, /* gets */
+ bsocket_ctrl, /* ctrl */
+ bsocket_create, /* create */
+ bsocket_destry, /* destroy */
+ NULL /* callback_ctrl */
+};
+
+BIO_METHOD *
+BIO_s_bsocket(void);
+{
+ return &methods_bsocket;
+}
+
+
+BIO *
+BIO_new_bsocket(int fd, int close_flag)
+{
+ BIO *result = BIO_new(BIO_s_bsocket());
+ if (!result)
+ return NULL;
+ BIO_set_fd(result, fd, close_flag);
+ return result;
+}
+
+static int
+bsocket_write(BIO *bio, const char *in, int length)
+{
+ result = brecv(bio->num, buf, buf_size);
+ if (ret <= 0 && ERRNO_IS_RETRY(errno))
+ BIO_set_retry_write(bio);
+
+ return result;
+}
+
+static int
+bsocket_read(BIO *bio, char *buf, int buf_size)
+{
+ int result;
+
+ if (!buf)
+ return 0;
+
+ result = brecv(bio->num, buf, buf_size);
+ if (ret <= 0 && ERRNO_IS_RETRY(errno))
+ BIO_set_retry_read(bio);
+
+ return result;
+}
+
+static int
+bsocket_puts(BIO *bio, const char *s)
+{
+ return bsocket_write(bio, s, strlen(s));
+}
+
+static long
+bsocket_ctrl(BIO *bio, int command, long num, void *ptr)
+{
+ int result = 1;
+
+ switch (command)
+ {
+ case BIO_CTRL_GET_CLOSE:
+ return bio->shutdown;
+
+ case BIO_CTRL_SET_CLOSE:
+ bio->shutdown = (int) num;
+ return 1;
+
+ case BIO_CTRL_FLUSH:
+ return 1;
+
+ case BIO_CTRL_DUP:
+ return 1;
+
+ case BIO_C_SET_FD:
+ if (!ptr)
+ return 0;
+ bsocket_destroy(bio);
+ bio->num = *(int *)ptr;
+ bio->shutdown = (int) num;
+ bio->init = 1;
+ return 1;
+
+ case BIO_C_GET_FD:
+ if (!bio->init)
+ return -1;
+ else if (ptr)
+ return (*(int *)ptr = bio->num);
+ else
+ return bio->num;
+ break;
+
+ default: /* operation not supported */
+ return 0;
+ }
+}
+
+static int
+bsocket_create(BIO *bio)
+{
+ bio->init = 0;
+ bio->num = 0;
+ bio->ptr = NULL;
+ bio->flags = 0;
+ return 1;
+}
+
+static int
+bsocket_destroy(BIO *bio)
+{
+ if (bio && bio->shutdown) {
+ if (bio->init) {
+ bclose(bio->num);
+ }
+ a->init = 0;
+ a->flags = 0;
+ return 1;
+ } else if (bio) {
+ return 1;
+ } else {
+ return 0;
+ }
+}