GList *client_list;
};
+/* common function for socket binding */
static int __p2p_bind(struct p2p_data *server_data, GIOFunc listener)
{
int err, fd = server_data->fd;
if (err < 0) {
if (errno == EADDRINUSE) {
DBG("%s is already bound", driver->name);
- close(fd);
- return 0;
+ err = 0;
+ goto out_err;
}
near_error("%s bind failed %d %d", driver->name, err, errno);
- close(fd);
- return err;
+ goto out_err;
}
- err = listen(fd, 10);
- if (err < 0) {
- near_error("%s listen failed %d", driver->name, err);
- close(fd);
- return err;
+ if (server_data->driver->sock_type == SOCK_STREAM) {
+ err = listen(fd, 10);
+ if (err < 0) {
+ near_error("%s listen failed %d", driver->name, err);
+ goto out_err;
+ }
}
channel = g_io_channel_unix_new(fd);
g_io_channel_unref(channel);
return 0;
+
+out_err:
+ close(fd);
+ return err;
}
static gboolean p2p_listener_event(GIOChannel *channel, GIOCondition condition,
__p2p_bind(server_data, p2p_listener_event);
}
- g_free(client_data);
+ if (client_data->driver->sock_type == SOCK_STREAM)
+ g_free(client_data);
return FALSE;
}
{
int err, fd;
struct p2p_data *server_data;
+ GIOFunc g_func;
- fd = socket(AF_NFC, SOCK_STREAM, NFC_SOCKPROTO_LLCP);
+ DBG("");
+
+ if (driver->sock_type == SOCK_DGRAM)
+ g_func = p2p_client_event;
+ else
+ g_func = p2p_listener_event;
+
+ if (driver->sock_type != SOCK_DGRAM &&
+ driver->sock_type != SOCK_STREAM) {
+ near_error("Undefined socket type for %s ", driver->name);
+ return -EINVAL;
+ }
+
+ fd = socket(AF_NFC, driver->sock_type, NFC_SOCKPROTO_LLCP);
if (fd < 0)
return -errno;
server_data->fd = fd;
server_data->cb = cb;
- err = __p2p_bind(server_data, p2p_listener_event);
+ err = __p2p_bind(server_data, g_func);
if (err < 0) {
g_free(server_data);
return err;
const char *service_name;
const char *fallback_service_name;
near_bool_t single_connection;
+ int sock_type;
near_bool_t (*read)(int client_fd,
uint32_t adapter_idx, uint32_t target_idx,
near_device_io_cb cb);
.name = "VALIDATION_SNEP",
.service_name = "urn:nfc:xsn:nfc-forum.org:snep-validation",
.fallback_service_name = NULL,
+ .sock_type = SOCK_STREAM,
.read = snep_validation_read,
.push = near_snep_core_push,
.close = snep_validation_close,
.name = "SNEP",
.service_name = NEAR_DEVICE_SN_SNEP,
.fallback_service_name = NEAR_DEVICE_SN_NPP,
+ .sock_type = SOCK_STREAM,
.read = snep_default_read,
.push = near_snep_core_push,
.close = near_snep_core_close,