static int server_connadd(struct network_server *ns, struct network_session *session, uint16_t dst_role) { char devname[16]; int err, nsk; memset(devname, 0, sizeof(devname)); strcpy(devname, "bnep%d"); nsk = g_io_channel_unix_get_fd(session->io); err = bnep_connadd(nsk, dst_role, devname); if (err < 0) return err; info("Added new connection: %s", devname); if (bnep_add_to_bridge(devname, ns->bridge) < 0) { error("Can't add %s to the bridge %s: %s(%d)", devname, ns->bridge, strerror(errno), errno); return -EPERM; } bnep_if_up(devname); ns->sessions = g_slist_append(ns->sessions, session); return 0; }
int bnep_server_add(int sk, uint16_t dst, char *bridge, char *iface, const bdaddr_t *addr) { if (!bridge || !iface || !addr) return -EINVAL; if (bnep_connadd(sk, dst, iface) < 0) { error("Can't add connection to the bridge %s: %s(%d)", bridge, strerror(errno), errno); return -errno; } if (bnep_add_to_bridge(iface, bridge) < 0) { error("Can't add %s to the bridge %s: %s(%d)", iface, bridge, strerror(errno), errno); bnep_conndel(addr); return -errno; } if (bnep_if_up(iface) < 0) { error("Can't up the interface %s: %s(%d)", iface, strerror(errno), errno); return -errno; } return 0; }
static int server_connadd(struct network_server *ns, struct network_session *session, uint16_t dst_role) { char devname[16]; char address[18]; const char *paddr = address; const char *pdevname = devname; int err, nsk; memset(devname, 0, sizeof(devname)); strcpy(devname, "bnep%d"); nsk = g_io_channel_unix_get_fd(session->io); err = bnep_connadd(nsk, dst_role, devname); if (err < 0) return err; info("Added new connection: %s", devname); #ifndef ANDROID_NO_BRIDGE if (bnep_add_to_bridge(devname, ns->bridge) < 0) { error("Can't add %s to the bridge %s: %s(%d)", devname, ns->bridge, strerror(errno), errno); return -EPERM; } #endif bnep_if_up(devname); ns->sessions = g_slist_append(ns->sessions, session); ba2str(&session->dst, address); gboolean result = g_dbus_emit_signal(connection, adapter_get_path(ns->na->adapter), ns->iface, "DeviceConnected", DBUS_TYPE_STRING, &paddr, DBUS_TYPE_STRING, &pdevname, DBUS_TYPE_UINT16, &dst_role, DBUS_TYPE_INVALID); session->io_watch = g_io_add_watch(session->io, G_IO_ERR | G_IO_HUP, (GIOFunc) bnep_watchdog_cb, ns); return 0; }