1 /* 2 * dev.c 3 */ 4 5 /*- 6 * SPDX-License-Identifier: BSD-2-Clause-FreeBSD 7 * 8 * Copyright (c) 2009 Maksim Yevmenkin <m_evmenkin@yahoo.com> 9 * All rights reserved. 10 * 11 * Redistribution and use in source and binary forms, with or without 12 * modification, are permitted provided that the following conditions 13 * are met: 14 * 1. Redistributions of source code must retain the above copyright 15 * notice, this list of conditions and the following disclaimer. 16 * 2. Redistributions in binary form must reproduce the above copyright 17 * notice, this list of conditions and the following disclaimer in the 18 * documentation and/or other materials provided with the distribution. 19 * 20 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 21 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 22 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 23 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 24 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 25 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 26 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 27 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 28 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 29 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 30 * SUCH DAMAGE. 31 * 32 * $FreeBSD$ 33 */ 34 35 #define L2CAP_SOCKET_CHECKED 36 #include <bluetooth.h> 37 #include <stdio.h> 38 #include <string.h> 39 40 struct bt_devaddr_match_arg 41 { 42 char devname[HCI_DEVNAME_SIZE]; 43 bdaddr_t const *bdaddr; 44 }; 45 46 static bt_devenum_cb_t bt_devaddr_match; 47 48 int 49 bt_devaddr(char const *devname, bdaddr_t *addr) 50 { 51 struct bt_devinfo di; 52 53 strlcpy(di.devname, devname, sizeof(di.devname)); 54 55 if (bt_devinfo(&di) < 0) 56 return (0); 57 58 if (addr != NULL) 59 bdaddr_copy(addr, &di.bdaddr); 60 61 return (1); 62 } 63 64 int 65 bt_devname(char *devname, bdaddr_t const *addr) 66 { 67 struct bt_devaddr_match_arg arg; 68 69 memset(&arg, 0, sizeof(arg)); 70 arg.bdaddr = addr; 71 72 if (bt_devenum(&bt_devaddr_match, &arg) < 0) 73 return (0); 74 75 if (arg.devname[0] == '\0') { 76 errno = ENXIO; 77 return (0); 78 } 79 80 if (devname != NULL) 81 strlcpy(devname, arg.devname, HCI_DEVNAME_SIZE); 82 83 return (1); 84 } 85 86 static int 87 bt_devaddr_match(int s, struct bt_devinfo const *di, void *arg) 88 { 89 struct bt_devaddr_match_arg *m = (struct bt_devaddr_match_arg *)arg; 90 91 if (!bdaddr_same(&di->bdaddr, m->bdaddr)) 92 return (0); 93 94 strlcpy(m->devname, di->devname, sizeof(m->devname)); 95 96 return (1); 97 } 98 99