summaryrefslogtreecommitdiffstats
path: root/src/bluetooth.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/bluetooth.c')
-rw-r--r--src/bluetooth.c164
1 files changed, 164 insertions, 0 deletions
diff --git a/src/bluetooth.c b/src/bluetooth.c
new file mode 100644
index 00000000..6dfccf44
--- /dev/null
+++ b/src/bluetooth.c
@@ -0,0 +1,164 @@
+/*
+ BlueZ - Bluetooth protocol stack for Linux
+ Copyright (C) 2000-2001 Qualcomm Incorporated
+
+ Written 2000,2001 by Maxim Krasnyansky <maxk@qualcomm.com>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License version 2 as
+ published by the Free Software Foundation;
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS.
+ IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) AND AUTHOR(S) BE LIABLE FOR ANY
+ CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES
+ WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+ ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS,
+ COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS
+ SOFTWARE IS DISCLAIMED.
+*/
+
+/*
+ * $Id$
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <errno.h>
+#include <sys/socket.h>
+
+#include <bluetooth.h>
+#include <hci.h>
+
+void baswap(bdaddr_t *dst, bdaddr_t *src)
+{
+ register unsigned char * d = (unsigned char *)dst;
+ register unsigned char * s = (unsigned char *)src;
+ register int i;
+ for(i=0; i<6; i++)
+ d[i] = s[5-i];
+}
+
+char * batostr(bdaddr_t *ba)
+{
+ static char str[2][18];
+ static int i = 1;
+
+ i ^= 1;
+ sprintf(str[i], "%2.2X:%2.2X:%2.2X:%2.2X:%2.2X:%2.2X",
+ ba->b[0], ba->b[1], ba->b[2],
+ ba->b[3], ba->b[4], ba->b[5]);
+ return str[i];
+}
+
+bdaddr_t * strtoba(char *str)
+{
+ static unsigned char ba[2][sizeof(bdaddr_t)];
+ static int i = 1;
+ register char *ptr = str;
+ register int x;
+
+ i ^= 1;
+ for(x=0; x<6; x++){
+ ba[i][x] = (uint8_t) strtol(ptr, NULL, 16);
+ if( x!=5 && !(ptr=strchr(ptr,':')) )
+ ptr = ":00:00:00:00:00";
+ ptr++;
+ }
+ return (bdaddr_t *) ba[i];
+}
+
+int ba2str(bdaddr_t *ba, char *str)
+{
+ return sprintf(str, "%2.2X:%2.2X:%2.2X:%2.2X:%2.2X:%2.2X",
+ ba->b[0], ba->b[1], ba->b[2],
+ ba->b[3], ba->b[4], ba->b[5]);
+}
+
+int str2ba(char *str, bdaddr_t *ba)
+{
+ unsigned char *b = (void *) ba;
+ char *ptr = str;
+ register int x;
+
+ for (x=0; x < 6; x++) {
+ b[x] = (uint8_t) strtol(ptr, NULL, 16);
+ if (x!=5 && !(ptr=strchr(ptr, ':')))
+ ptr = ":00:00:00:00:00";
+ ptr++;
+ }
+ return 0;
+}
+
+/* Bluetooth error codes to Unix errno mapping */
+int bterr(uint16_t code)
+{
+ switch(code) {
+ case 0:
+ return 0;
+ case 0x01:
+ return EBADRQC;
+ case 0x02:
+ return ENOTCONN;
+ case 0x03:
+ return EIO;
+ case 0x04:
+ return EHOSTDOWN;
+ case 0x05:
+ return EACCES;
+ case 0x06:
+ return EINVAL;
+ case 0x07:
+ return ENOMEM;
+ case 0x08:
+ return ETIMEDOUT;
+ case 0x09:
+ return EMLINK;
+ case 0x0a:
+ return EMLINK;
+ case 0x0b:
+ return EALREADY;
+ case 0x0c:
+ return EBUSY;
+ case 0x0d:
+ case 0x0e:
+ case 0x0f:
+ return ECONNREFUSED;
+ case 0x10:
+ return ETIMEDOUT;
+ case 0x11:
+ case 0x27:
+ case 0x29:
+ case 0x20:
+ return EOPNOTSUPP;
+ case 0x12:
+ return EINVAL;
+ case 0x13:
+ case 0x14:
+ case 0x15:
+ return ECONNRESET;
+ case 0x16:
+ return ECONNABORTED;
+ case 0x17:
+ return ELOOP;
+ case 0x18:
+ return EACCES;
+ case 0x1a:
+ return EPROTONOSUPPORT;
+ case 0x1b:
+ return ECONNREFUSED;
+ case 0x19:
+ case 0x1e:
+ case 0x23:
+ case 0x24:
+ case 0x25:
+ return EPROTO;
+ default:
+ return ENOSYS;
+ }
+}