diff options
Diffstat (limited to 'src/bluetooth.c')
-rw-r--r-- | src/bluetooth.c | 164 |
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; + } +} |