diff options
Diffstat (limited to 'network/connection.c')
-rw-r--r-- | network/connection.c | 95 |
1 files changed, 60 insertions, 35 deletions
diff --git a/network/connection.c b/network/connection.c index 18bba87c..e6a6c151 100644 --- a/network/connection.c +++ b/network/connection.c @@ -55,14 +55,14 @@ typedef enum { } conn_state; struct network_conn { - DBusConnection *conn; DBusMessage *msg; bdaddr_t src; bdaddr_t dst; char *path; /* D-Bus path */ - char dev[16]; /* BNEP interface name */ - char *name; - char *desc; + char dev[16]; /* Interface name */ + char *name; /* Service Name */ + char *desc; /* Service Description*/ + char *script; /* Interface up script*/ uint16_t id; /* Role: Service Class Identifier */ conn_state state; int sk; @@ -73,15 +73,17 @@ struct __service_16 { uint16_t src; } __attribute__ ((packed)); -static char netdev[16] = "bnep%d"; +static DBusConnection *connection = NULL; +static struct connection_conf *conf = NULL; +static const char *prefix = NULL; static gboolean bnep_watchdog_cb(GIOChannel *chan, GIOCondition cond, gpointer data) { struct network_conn *nc = data; - if (nc->conn != NULL) { - dbus_connection_emit_signal(nc->conn, nc->path, + if (connection != NULL) { + dbus_connection_emit_signal(connection, nc->path, NETWORK_CONNECTION_INTERFACE, "Disconnected", DBUS_TYPE_INVALID); @@ -89,7 +91,7 @@ static gboolean bnep_watchdog_cb(GIOChannel *chan, GIOCondition cond, info("%s disconnected", nc->dev); nc->state = DISCONNECTED; memset(nc->dev, 0, 16); - strncpy(nc->dev, netdev, 16); + strncpy(nc->dev, prefix, strlen(prefix)); g_io_channel_close(chan); return FALSE; } @@ -156,7 +158,7 @@ static gboolean bnep_connect_cb(GIOChannel *chan, GIOCondition cond, } bnep_if_up(nc->dev, TRUE); - dbus_connection_emit_signal(nc->conn, nc->path, + dbus_connection_emit_signal(connection, nc->path, NETWORK_CONNECTION_INTERFACE, "Connected", DBUS_TYPE_INVALID); @@ -166,7 +168,7 @@ static gboolean bnep_connect_cb(GIOChannel *chan, GIOCondition cond, pdev = nc->dev; dbus_message_append_args(reply, DBUS_TYPE_STRING, &pdev, DBUS_TYPE_INVALID); - send_message_and_unref(nc->conn, reply); + send_message_and_unref(connection, reply); nc->state = CONNECTED; @@ -178,7 +180,7 @@ static gboolean bnep_connect_cb(GIOChannel *chan, GIOCondition cond, failed: if (nc->state != DISCONNECTED) { nc->state = DISCONNECTED; - err_connection_failed(nc->conn, nc->msg, "bnep failed"); + err_connection_failed(connection, nc->msg, "bnep failed"); g_io_channel_close(chan); } return FALSE; @@ -251,7 +253,7 @@ static gboolean l2cap_connect_cb(GIOChannel *chan, return FALSE; failed: nc->state = DISCONNECTED; - err_connection_failed(nc->conn, nc->msg, strerror(errno)); + err_connection_failed(connection, nc->msg, strerror(errno)); g_io_channel_close(chan); return FALSE; } @@ -597,7 +599,7 @@ static void connection_free(struct network_conn *nc) if (nc->desc) g_free(nc->desc); - + g_free(nc); nc = NULL; } @@ -632,30 +634,27 @@ static DBusSignalVTable connection_signals[] = { { NULL, NULL } }; -int connection_register(DBusConnection *conn, const char *path, bdaddr_t *src, - bdaddr_t *dst, uint16_t id, const char *name, const char *desc) +int connection_register(const char *path, bdaddr_t *src, bdaddr_t *dst, + uint16_t id, const char *name, const char *desc) { struct network_conn *nc; - if (!conn) - return -1; - nc = g_new0(struct network_conn, 1); /* register path */ - if (!dbus_connection_create_object_path(conn, path, nc, + if (!dbus_connection_create_object_path(connection, path, nc, connection_unregister)) { connection_free(nc); return -1; } - if (!dbus_connection_register_interface(conn, path, + if (!dbus_connection_register_interface(connection, path, NETWORK_CONNECTION_INTERFACE, connection_methods, connection_signals, NULL)) { error("D-Bus failed to register %s interface", NETWORK_CONNECTION_INTERFACE); - dbus_connection_destroy_object_path(conn, path); + dbus_connection_destroy_object_path(connection, path); return -1; } @@ -666,17 +665,21 @@ int connection_register(DBusConnection *conn, const char *path, bdaddr_t *src, nc->name = g_strdup(name); nc->desc = g_strdup(desc); memset(nc->dev, 0, 16); - strncpy(nc->dev, netdev, 16); + strncpy(nc->dev, prefix, strlen(prefix)); + if (id == BNEP_SVC_PANU) + nc->script = conf->panu_script; + else if (id == BNEP_SVC_GN) + nc->script = conf->gn_script; + else + nc->script = conf->nap_script; nc->state = DISCONNECTED; - nc->conn = conn; info("Registered connection path:%s", path); return 0; } -int connection_store(DBusConnection *conn, const char *path, - gboolean default_path) +int connection_store(const char *path, gboolean default_path) { struct network_conn *nc; const char *role; @@ -685,7 +688,8 @@ int connection_store(DBusConnection *conn, const char *path, char src_addr[18], dst_addr[18]; int len, err; - if (!dbus_connection_get_object_user_data(conn, path, (void *) &nc)) + if (!dbus_connection_get_object_user_data(connection, path, + (void *) &nc)) return -ENOENT; if (!nc->name || !nc->desc) @@ -714,14 +718,14 @@ int connection_store(DBusConnection *conn, const char *path, return err; } -int connection_find_data(DBusConnection *conn, - const char *path, const char *pattern) +int connection_find_data(const char *path, const char *pattern) { struct network_conn *nc; char addr[18], key[32]; const char *role; - if (!dbus_connection_get_object_user_data(conn, path, (void *) &nc)) + if (!dbus_connection_get_object_user_data(connection, path, + (void *) &nc)) return -1; if (strcasecmp(pattern, nc->dev) == 0) @@ -744,17 +748,18 @@ int connection_find_data(DBusConnection *conn, return -1; } -gboolean connection_has_pending(DBusConnection *conn, const char *path) +gboolean connection_has_pending(const char *path) { struct network_conn *nc; - if (!dbus_connection_get_object_user_data(conn, path, (void *) &nc)) + if (!dbus_connection_get_object_user_data(connection, path, + (void *) &nc)) return FALSE; return (nc->state == CONNECTING); } -int connection_remove_stored(DBusConnection *conn, const char *path) +int connection_remove_stored(const char *path) { struct network_conn *nc; const char *role; @@ -763,7 +768,8 @@ int connection_remove_stored(DBusConnection *conn, const char *path) char src_addr[18], dst_addr[18]; int err; - if (!dbus_connection_get_object_user_data(conn, path, (void *) &nc)) + if (!dbus_connection_get_object_user_data(connection, path, + (void *) &nc)) return -ENOENT; ba2str(&nc->dst, dst_addr); @@ -778,12 +784,31 @@ int connection_remove_stored(DBusConnection *conn, const char *path) return err; } -gboolean connection_is_connected(DBusConnection *conn, const char *path) +gboolean connection_is_connected(const char *path) { struct network_conn *nc; - if (!dbus_connection_get_object_user_data(conn, path, (void *) &nc)) + if (!dbus_connection_get_object_user_data(connection, path, + (void *) &nc)) return FALSE; return (nc->state == CONNECTED); } + +int connection_init(DBusConnection *conn, const char *iface_prefix, + struct connection_conf *conn_conf) +{ + connection = dbus_connection_ref(conn); + conf = conn_conf; + prefix = iface_prefix; + + return 0; +} + +void connection_exit() +{ + dbus_connection_unref(connection); + connection = NULL; + conf = NULL; + prefix = NULL; +} |