mirror of
https://git.kernel.org/pub/scm/bluetooth/bluez.git
synced 2024-11-29 23:24:20 +08:00
194 lines
4.0 KiB
C
194 lines
4.0 KiB
C
|
/*
|
||
|
*
|
||
|
* BlueZ - Bluetooth protocol stack for Linux
|
||
|
*
|
||
|
* Copyright (C) 2004-2005 Marcel Holtmann <marcel@holtmann.org>
|
||
|
*
|
||
|
*
|
||
|
* 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$
|
||
|
*/
|
||
|
|
||
|
#ifdef HAVE_CONFIG_H
|
||
|
#include <config.h>
|
||
|
#endif
|
||
|
|
||
|
#include <stdio.h>
|
||
|
#include <errno.h>
|
||
|
#include <stdlib.h>
|
||
|
#include <getopt.h>
|
||
|
#include <sys/socket.h>
|
||
|
|
||
|
#include <bluetooth/bluetooth.h>
|
||
|
#include <bluetooth/hci.h>
|
||
|
#include <bluetooth/hci_lib.h>
|
||
|
|
||
|
#include "csr.h"
|
||
|
|
||
|
static int cmd_keylen(int dd, int argc, char *argv[])
|
||
|
{
|
||
|
uint8_t buf[8];
|
||
|
uint16_t handle, keylen;
|
||
|
int err;
|
||
|
|
||
|
if (argc < 1) {
|
||
|
errno = EINVAL;
|
||
|
return -1;
|
||
|
}
|
||
|
|
||
|
if (argc > 1) {
|
||
|
errno = E2BIG;
|
||
|
return -1;
|
||
|
}
|
||
|
|
||
|
handle = atoi(argv[0]);
|
||
|
|
||
|
memset(buf, 0, sizeof(buf));
|
||
|
buf[0] = handle & 0xff;
|
||
|
buf[1] = handle >> 8;
|
||
|
|
||
|
err = csr_read_varid_complex(dd, 0x4711,
|
||
|
CSR_VARID_CRYPT_KEY_LENGTH, buf, sizeof(buf));
|
||
|
if (err < 0) {
|
||
|
errno = -err;
|
||
|
return -1;
|
||
|
}
|
||
|
|
||
|
handle = buf[0] | (buf[1] << 8);
|
||
|
keylen = buf[2] | (buf[3] << 8);
|
||
|
|
||
|
printf("Crypt key length: %d bit\n", keylen * 8);
|
||
|
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
static struct {
|
||
|
char *str;
|
||
|
int (*func)(int dd, int argc, char **argv);
|
||
|
char *arg;
|
||
|
char *doc;
|
||
|
} commands[] = {
|
||
|
{ "keylen", cmd_keylen, "<handle>", "Get current crypt key length" },
|
||
|
{ NULL },
|
||
|
};
|
||
|
|
||
|
static void usage(void)
|
||
|
{
|
||
|
int i;
|
||
|
|
||
|
printf("bccmd - Utility for the CSR BCCMD interface\n\n");
|
||
|
printf("Usage:\n"
|
||
|
"\tbccmd [-i <dev>] <command>\n\n");
|
||
|
|
||
|
printf("Commands:\n");
|
||
|
for (i = 0; commands[i].str; i++)
|
||
|
printf("\t%s\t%s\t%s\n", commands[i].str,
|
||
|
commands[i].arg, commands[i].doc);
|
||
|
}
|
||
|
|
||
|
static struct option main_options[] = {
|
||
|
{ "help", 0, 0, 'h' },
|
||
|
{ "device", 1, 0, 'i' },
|
||
|
{ 0, 0, 0, 0 }
|
||
|
};
|
||
|
|
||
|
int main(int argc, char *argv[])
|
||
|
{
|
||
|
struct hci_dev_info di;
|
||
|
struct hci_version ver;
|
||
|
int i, err, dd, opt, dev = 0;
|
||
|
|
||
|
while ((opt=getopt_long(argc, argv, "+i:h", main_options, NULL)) != -1) {
|
||
|
switch (opt) {
|
||
|
case 'i':
|
||
|
dev = hci_devid(optarg);
|
||
|
if (dev < 0) {
|
||
|
perror("Invalid device");
|
||
|
exit(1);
|
||
|
}
|
||
|
break;
|
||
|
|
||
|
case 'h':
|
||
|
default:
|
||
|
usage();
|
||
|
exit(0);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
argc -= optind;
|
||
|
argv += optind;
|
||
|
optind = 0;
|
||
|
|
||
|
if (argc < 1) {
|
||
|
usage();
|
||
|
exit(1);
|
||
|
}
|
||
|
|
||
|
dd = hci_open_dev(dev);
|
||
|
if (dd < 0) {
|
||
|
fprintf(stderr, "Can't open device hci%d: %s (%d)\n",
|
||
|
dev, strerror(errno), errno);
|
||
|
exit(1);
|
||
|
}
|
||
|
|
||
|
if (hci_devinfo(dev, &di) < 0) {
|
||
|
fprintf(stderr, "Can't get device info for hci%d: %s (%d)\n",
|
||
|
dev, strerror(errno), errno);
|
||
|
hci_close_dev(dd);
|
||
|
exit(1);
|
||
|
}
|
||
|
|
||
|
if (hci_read_local_version(dd, &ver, 1000) < 0) {
|
||
|
fprintf(stderr, "Can't read version info for hci%d: %s (%d)\n",
|
||
|
dev, strerror(errno), errno);
|
||
|
hci_close_dev(dd);
|
||
|
exit(1);
|
||
|
}
|
||
|
|
||
|
if (ver.manufacturer != 10) {
|
||
|
fprintf(stderr, "Unsupported manufacturer\n");
|
||
|
hci_close_dev(dd);
|
||
|
exit(1);
|
||
|
}
|
||
|
|
||
|
for (i = 0; commands[i].str; i++) {
|
||
|
if (strcasecmp(commands[i].str, argv[0]))
|
||
|
continue;
|
||
|
|
||
|
err = commands[i].func(dd, argc - 1, argv + 1);
|
||
|
|
||
|
hci_close_dev(dd);
|
||
|
|
||
|
if (err < 0) {
|
||
|
fprintf(stderr, "Can't execute command: %s (%d)\n",
|
||
|
strerror(errno), errno);
|
||
|
exit(1);
|
||
|
}
|
||
|
|
||
|
exit(0);
|
||
|
}
|
||
|
|
||
|
fprintf(stderr, "Unsupported command\n");
|
||
|
|
||
|
hci_close_dev(dd);
|
||
|
|
||
|
exit(1);
|
||
|
}
|