summaryrefslogtreecommitdiffstats
path: root/serial/manager.c
diff options
context:
space:
mode:
Diffstat (limited to 'serial/manager.c')
-rw-r--r--serial/manager.c137
1 files changed, 64 insertions, 73 deletions
diff --git a/serial/manager.c b/serial/manager.c
index db5a9d12..498e2846 100644
--- a/serial/manager.c
+++ b/serial/manager.c
@@ -106,7 +106,7 @@ static struct {
struct proxy {
bdaddr_t src;
bdaddr_t dst;
- uuid_t uuid; /* UUID 128 */
+ char *uuid128; /* UUID 128 */
char *tty; /* TTY name */
struct termios sys_ti; /* Default TTY setting */
struct termios proxy_ti; /* Proxy TTY settings */
@@ -127,6 +127,8 @@ static void proxy_free(struct proxy *prx)
{
if (prx->tty)
g_free(prx->tty);
+ if (prx->uuid128)
+ g_free(prx->uuid128);
g_free(prx);
}
@@ -744,7 +746,7 @@ static DBusHandlerResult create_port(DBusConnection *conn,
DBusMessage *reply;
DBusError derr;
bdaddr_t src, dst;
- char path[MAX_PATH_LENGTH], port_name[16], uuid[37];
+ char path[MAX_PATH_LENGTH], port_name[16], uuid[MAX_LEN_UUID_STR];
const char *bda, *pattern, *ppath = path;
long val;
int dev_id, err;
@@ -977,10 +979,46 @@ static void add_lang_attr(sdp_record_t *r)
sdp_list_free(langs, 0);
}
-static int create_proxy_record(sdp_buf_t *buf, uuid_t *uuid, uint8_t channel)
+static int str2uuid(uuid_t *uuid, const char *string)
+{
+ uint16_t data1, data2, data3, data5;
+ uint32_t data0, data4;
+
+ if (strlen(string) == 36 &&
+ string[8] == '-' &&
+ string[13] == '-' &&
+ string[18] == '-' &&
+ string[23] == '-' &&
+ sscanf(string, "%08x-%04hx-%04hx-%04hx-%08x%04hx",
+ &data0, &data1, &data2, &data3, &data4, &data5) == 6) {
+ uint8_t val[16];
+
+ data0 = htonl(data0);
+ data1 = htons(data1);
+ data2 = htons(data2);
+ data3 = htons(data3);
+ data4 = htonl(data4);
+ data5 = htons(data5);
+
+ memcpy(&val[0], &data0, 4);
+ memcpy(&val[4], &data1, 2);
+ memcpy(&val[6], &data2, 2);
+ memcpy(&val[8], &data3, 2);
+ memcpy(&val[10], &data4, 4);
+ memcpy(&val[14], &data5, 2);
+
+ sdp_uuid128_create(uuid, val);
+
+ return 0;
+ }
+
+ return -1;
+}
+
+static int create_proxy_record(sdp_buf_t *buf, const char *uuid128, uint8_t channel)
{
sdp_list_t *apseq, *aproto, *profiles, *proto[2], *root, *svclass_id;
- uuid_t root_uuid, l2cap, rfcomm;
+ uuid_t uuid, root_uuid, l2cap, rfcomm;
sdp_profile_desc_t profile;
sdp_record_t record;
sdp_data_t *ch;
@@ -993,7 +1031,8 @@ static int create_proxy_record(sdp_buf_t *buf, uuid_t *uuid, uint8_t channel)
sdp_set_browse_groups(&record, root);
sdp_list_free(root, NULL);
- svclass_id = sdp_list_append(NULL, uuid);
+ str2uuid(&uuid, uuid128);
+ svclass_id = sdp_list_append(NULL, &uuid);
sdp_set_service_classes(&record, svclass_id);
sdp_list_free(svclass_id, NULL);
@@ -1236,7 +1275,7 @@ static DBusHandlerResult proxy_enable(DBusConnection *conn,
return err_failed(conn, msg, "Already enabled");
/* Listen */
- /* FIXME: missing options, update the stored channel */
+ /* FIXME: missing options */
sk = rfcomm_listen(&prx->src, &prx->channel, 0);
if (sk < 0) {
const char *strerr = strerror(errno);
@@ -1245,7 +1284,7 @@ static DBusHandlerResult proxy_enable(DBusConnection *conn,
}
/* Create the record */
- create_proxy_record(&buf, &prx->uuid, prx->channel);
+ create_proxy_record(&buf, prx->uuid128, prx->channel);
/* Register the record */
prx->record_id = add_proxy_record(conn, &buf);
@@ -1288,9 +1327,6 @@ static DBusHandlerResult proxy_get_info(DBusConnection *conn,
DBusMessage *reply;
DBusMessageIter iter, dict;
dbus_bool_t boolean;
- char uuid_str[MAX_LEN_UUID_STR];
- char bda[18];
- const char *pstr;
reply = dbus_message_new_method_return(msg);
if (!reply)
@@ -1303,10 +1339,8 @@ static DBusHandlerResult proxy_get_info(DBusConnection *conn,
DBUS_TYPE_STRING_AS_STRING DBUS_TYPE_VARIANT_AS_STRING
DBUS_DICT_ENTRY_END_CHAR_AS_STRING, &dict);
- sdp_uuid2strn(&prx->uuid, uuid_str, MAX_LEN_UUID_STR);
- pstr = uuid_str;
dbus_message_iter_append_dict_entry(&dict, "uuid",
- DBUS_TYPE_STRING, &pstr);
+ DBUS_TYPE_STRING, &prx->uuid128);
dbus_message_iter_append_dict_entry(&dict, "tty",
DBUS_TYPE_STRING, &prx->tty);
@@ -1325,8 +1359,10 @@ static DBusHandlerResult proxy_get_info(DBusConnection *conn,
/* If connected: append the remote address */
if (boolean) {
+ char bda[18];
+ const char *pstr = bda;
+
ba2str(&prx->dst, bda);
- pstr = bda;
dbus_message_iter_append_dict_entry(&dict, "address",
DBUS_TYPE_STRING, &pstr);
}
@@ -1364,7 +1400,7 @@ static void proxy_handler_unregister(DBusConnection *conn, void *data)
}
static int proxy_register(DBusConnection *conn, bdaddr_t *src, const char *path,
- uuid_t *uuid, const char *tty, struct termios *ti)
+ const char *uuid128, const char *tty, struct termios *ti)
{
struct termios sys_ti;
struct proxy *prx;
@@ -1378,7 +1414,7 @@ static int proxy_register(DBusConnection *conn, bdaddr_t *src, const char *path,
prx = g_new0(struct proxy, 1);
prx->tty = g_strdup(tty);
- memcpy(&prx->uuid, uuid, sizeof(uuid_t));
+ prx->uuid128 = g_strdup(uuid128);
bacpy(&prx->src, src);
if (!dbus_connection_create_object_path(conn, path, prx,
@@ -1421,47 +1457,11 @@ static int proxy_register(DBusConnection *conn, bdaddr_t *src, const char *path,
return 0;
}
-static int str2uuid(uuid_t *uuid, const char *string)
-{
- uint16_t data1, data2, data3, data5;
- uint32_t data0, data4;
-
- if (strlen(string) == 36 &&
- string[8] == '-' &&
- string[13] == '-' &&
- string[18] == '-' &&
- string[23] == '-' &&
- sscanf(string, "%08x-%04hx-%04hx-%04hx-%08x%04hx",
- &data0, &data1, &data2, &data3, &data4, &data5) == 6) {
- uint8_t val[16];
-
- data0 = htonl(data0);
- data1 = htons(data1);
- data2 = htons(data2);
- data3 = htons(data3);
- data4 = htonl(data4);
- data5 = htons(data5);
-
- memcpy(&val[0], &data0, 4);
- memcpy(&val[4], &data1, 2);
- memcpy(&val[6], &data2, 2);
- memcpy(&val[8], &data3, 2);
- memcpy(&val[10], &data4, 4);
- memcpy(&val[14], &data5, 2);
-
- sdp_uuid128_create(uuid, val);
-
- return 0;
- }
-
- return -1;
-}
-
static DBusHandlerResult create_proxy(DBusConnection *conn,
DBusMessage *msg, void *data)
{
char path[MAX_PATH_LENGTH];
- const char *uuidstr, *tty, *ppath = path;
+ const char *uuid128, *tty, *ppath = path;
DBusMessage *reply;
GSList *l;
DBusError derr;
@@ -1472,7 +1472,7 @@ static DBusHandlerResult create_proxy(DBusConnection *conn,
dbus_error_init(&derr);
if (!dbus_message_get_args(msg, &derr,
- DBUS_TYPE_STRING, &uuidstr,
+ DBUS_TYPE_STRING, &uuid128,
DBUS_TYPE_STRING, &tty,
DBUS_TYPE_INVALID)) {
err_invalid_args(conn, msg, derr.message);
@@ -1480,7 +1480,7 @@ static DBusHandlerResult create_proxy(DBusConnection *conn,
return DBUS_HANDLER_RESULT_HANDLED;
}
- if (str2uuid(&uuid, uuidstr) < 0)
+ if (str2uuid(&uuid, uuid128) < 0)
return err_invalid_args(conn, msg, "Invalid UUID");
sscanf(tty, "/dev/%n", &pos);
@@ -1504,7 +1504,7 @@ static DBusHandlerResult create_proxy(DBusConnection *conn,
if (!reply)
return DBUS_HANDLER_RESULT_NEED_MEMORY;
- if (proxy_register(conn, &src, path, &uuid, tty, NULL) < 0) {
+ if (proxy_register(conn, &src, path, uuid128, tty, NULL) < 0) {
dbus_message_unref(reply);
return err_failed(conn, msg, "Create object path failed");
}
@@ -1581,7 +1581,7 @@ static DBusHandlerResult connect_service(DBusConnection *conn,
const char *bda, *pattern;
long val;
int dev_id, err;
- char uuid[37];
+ char uuid[MAX_LEN_UUID_STR];
dbus_error_init(&derr);
if (!dbus_message_get_args(msg, &derr,
@@ -1745,13 +1745,9 @@ static void proxy_path_free(gpointer data, gpointer udata)
/* Store/Update the proxy entries before exit */
if (dbus_connection_get_object_user_data(conn,
- path, (void *) &prx) && prx) {
- char uuid_str[MAX_LEN_UUID_STR];
-
- sdp_uuid2strn(&prx->uuid, uuid_str, MAX_LEN_UUID_STR);
- proxy_store(&prx->src, uuid_str, prx->tty, NULL,
+ path, (void *) &prx) && prx)
+ proxy_store(&prx->src, prx->uuid128, prx->tty, NULL,
prx->channel, 0, &prx->proxy_ti);
- }
g_free(data);
}
@@ -1853,20 +1849,15 @@ static void parse_port(char *key, char *value, void *data)
static void parse_proxy(char *key, char *value, void *data)
{
- char path[MAX_PATH_LENGTH], uuid_str[MAX_LEN_UUID_STR], tmp[3], *pvalue;
- char *src_addr = data;
+ char path[MAX_PATH_LENGTH], uuid128[MAX_LEN_UUID_STR], tmp[3];
+ char *pvalue, *src_addr = data;
struct termios ti;
int ch, opts, pos = 0;
bdaddr_t src;
- uuid_t uuid;
uint8_t *pti;
- memset(uuid_str, 0, sizeof(uuid_str));
- if (sscanf(value,"%s %d 0x%04X %n", uuid_str, &ch, &opts, &pos) != 3)
- return;
-
- /* UUID format valid? */
- if (str2uuid(&uuid, uuid_str) < 0)
+ memset(uuid128, 0, sizeof(uuid128));
+ if (sscanf(value,"%s %d 0x%04X %n", uuid128, &ch, &opts, &pos) != 3)
return;
/* Extracting name */
@@ -1902,7 +1893,7 @@ static void parse_proxy(char *key, char *value, void *data)
"/org/bluez/serial/proxy%s", key + pos);
str2ba(src_addr, &src);
- proxy_register(connection, &src, path, &uuid, key, &ti);
+ proxy_register(connection, &src, path, uuid128, key, &ti);
proxies_paths = g_slist_append(proxies_paths, g_strdup(path));
}