summaryrefslogtreecommitdiffstats
path: root/hcid/security.c
diff options
context:
space:
mode:
Diffstat (limited to 'hcid/security.c')
-rw-r--r--hcid/security.c108
1 files changed, 7 insertions, 101 deletions
diff --git a/hcid/security.c b/hcid/security.c
index 0c8fd777..f6d409f6 100644
--- a/hcid/security.c
+++ b/hcid/security.c
@@ -202,97 +202,13 @@ void set_pin_length(bdaddr_t *sba, int length)
io_data[dev_id].pin_length = length;
}
-/*
- PIN helper is an external app that asks user for a PIN. It can
- implement its own PIN code generation policy and methods like
- PIN look up in some database, etc.
- HCId expects following output from PIN helper:
- PIN:12345678 - PIN code
- ERR - No PIN available
-*/
-
+#ifndef ENABLE_DBUS
static void call_pin_helper(int dev, bdaddr_t *sba, struct hci_conn_info *ci)
{
pin_code_reply_cp pr;
- struct sigaction sa;
- char addr[18], str[512], *pin, name[249], tmp[497], *ptr;
- FILE *pipe;
- int i, ret, len;
-
- /* Run PIN helper in the separate process */
- switch (fork()) {
- case 0:
- break;
- case -1:
- error("Can't fork PIN helper: %s (%d)",
- strerror(errno), errno);
- default:
- return;
- }
-
- if (access(hcid.pin_helper, R_OK | X_OK)) {
- error("Can't exec PIN helper %s: %s (%d)",
- hcid.pin_helper, strerror(errno), errno);
- goto reject;
- }
-
- memset(name, 0, sizeof(name));
- read_device_name(sba, &ci->bdaddr, name);
- //hci_remote_name(dev, &ci->bdaddr, sizeof(name), name, 0);
-
- memset(tmp, 0, sizeof(tmp));
- ptr = tmp;
-
- for (i = 0; i < 248 && name[i]; i++)
- if (isprint(name[i])) {
- switch (name[i]) {
- case '"':
- case '`':
- case '$':
- case '|':
- case '>':
- case '<':
- case '&':
- case ';':
- case '\\':
- *ptr++ = '\\';
- }
- *ptr++ = name[i];
- } else {
- name[i] = '.';
- *ptr++ = '.';
- }
-
- ba2str(&ci->bdaddr, addr);
- snprintf(str, sizeof(str), "%s %s %s \"%s\"", hcid.pin_helper,
- ci->out ? "out" : "in", addr, tmp);
-
- setenv("PATH", "/bin:/usr/bin:/usr/local/bin", 1);
-
- memset(&sa, 0, sizeof(sa));
- sa.sa_flags = SA_NOCLDSTOP;
- sa.sa_handler = SIG_DFL;
- sigaction(SIGCHLD, &sa, NULL);
-
- pipe = popen(str, "r");
- if (!pipe) {
- error("Can't exec PIN helper: %s (%d)",
- strerror(errno), errno);
- goto reject;
- }
-
- pin = fgets(str, sizeof(str), pipe);
- ret = pclose(pipe);
+ char *pin = "BlueZ";
+ int len;
- if (!pin || strlen(pin) < 5)
- goto nopin;
-
- strtok(pin, "\n\r");
-
- if (strncmp("PIN:", pin, 4))
- goto nopin;
-
- pin += 4;
len = strlen(pin);
set_pin_length(sba, len);
@@ -303,26 +219,16 @@ static void call_pin_helper(int dev, bdaddr_t *sba, struct hci_conn_info *ci)
pr.pin_len = len;
hci_send_cmd(dev, OGF_LINK_CTL, OCF_PIN_CODE_REPLY,
PIN_CODE_REPLY_CP_SIZE, &pr);
- exit(0);
-
-nopin:
- if (!pin || strncmp("ERR", pin, 3))
- error("PIN helper exited abnormally with code %d", ret);
-
-reject:
- hci_send_cmd(dev, OGF_LINK_CTL, OCF_PIN_CODE_NEG_REPLY, 6, &ci->bdaddr);
- exit(0);
}
+#endif
static void request_pin(int dev, bdaddr_t *sba, struct hci_conn_info *ci)
{
#ifdef ENABLE_DBUS
- if (hcid.dbus_pin_helper) {
- hcid_dbus_request_pin(dev, sba, ci);
- return;
- }
-#endif
+ hcid_dbus_request_pin(dev, sba, ci);
+#else
call_pin_helper(dev, sba, ci);
+#endif
}
static void pin_code_request(int dev, bdaddr_t *sba, bdaddr_t *dba)