return err;
}
+static int nfctool_set_powered(gboolean powered)
+{
+ struct nfc_adapter *adapter;
+ int err;
+
+ adapter = adapter_get(opts.adapter_idx);
+ if (!adapter)
+ return -ENODEV;
+
+ err = nl_set_powered(adapter, powered);
+
+ if (err == 0)
+ adapter->powered = powered;
+
+ return err;
+}
+
static int nfctool_dep_link_up_cb(guint8 cmd, guint32 idx, gpointer data)
{
struct nfc_adapter *adapter;
.poll_mode = POLLING_MODE_INITIATOR,
.device_name = NULL,
.adapter_idx = INVALID_ADAPTER_IDX,
+ .enable_dev = FALSE,
+ .disable_dev = FALSE,
.set_param = FALSE,
.lto = -1,
.rw = -1,
{ "poll", 'p', G_OPTION_FLAG_OPTIONAL_ARG, G_OPTION_ARG_CALLBACK,
opt_parse_poll_arg, "start polling as initiator, target, or both; "
"default mode is initiator", "[Initiator|Target|Both]" },
+ { "enable", '1', 0, G_OPTION_ARG_NONE, &opts.enable_dev,
+ "enable device", NULL },
+ { "disable", '0', 0, G_OPTION_ARG_NONE, &opts.disable_dev,
+ "disable device", NULL },
{ "set-param", 's', 0, G_OPTION_ARG_CALLBACK, opt_parse_set_param_arg,
"set lto, rw, and/or miux parameters", "lto=150,rw=1,miux=100" },
{ "snl", 'k', 0, G_OPTION_ARG_CALLBACK, &opt_parse_snl_arg,
}
}
+ if (opts.enable_dev || opts.disable_dev)
+ opts.list = TRUE;
+
opts.need_netlink = opts.list || opts.poll ||
opts.set_param || opts.snl;
goto exit;
}
- if ((opts.poll || opts.set_param || opts.sniff || opts.snl) &&
+ if ((opts.poll || opts.set_param || opts.sniff || opts.snl ||
+ opts.enable_dev || opts.disable_dev) &&
opts.adapter_idx == INVALID_ADAPTER_IDX) {
print_error("Please specify a device with -d nfcX option");
goto exit_err;
}
+ if (opts.enable_dev || opts.disable_dev) {
+ err = nfctool_set_powered(opts.enable_dev);
+
+ if (err && err != -EALREADY)
+ goto exit_err;
+
+ err = 0;
+ }
+
if (opts.list && !opts.set_param)
adapter_idx_print_info(opts.adapter_idx);
return err;
}
+int nl_set_powered(struct nfc_adapter *adapter, gboolean powered)
+{
+ struct nl_msg *msg;
+ void *hdr;
+ int err;
+ uint8_t cmd;
+
+ DBG("");
+
+ msg = nlmsg_alloc();
+ if (msg == NULL)
+ return -ENOMEM;
+
+ if (powered == TRUE)
+ cmd = NFC_CMD_DEV_UP;
+ else
+ cmd = NFC_CMD_DEV_DOWN;
+
+ hdr = genlmsg_put(msg, NL_AUTO_PID, NL_AUTO_SEQ, nfc_state->nfc_id, 0,
+ NLM_F_REQUEST, cmd, NFC_GENL_VERSION);
+ if (hdr == NULL) {
+ err = -EINVAL;
+ goto nla_put_failure;
+ }
+
+ err = -EMSGSIZE;
+
+ NLA_PUT_U32(msg, NFC_ATTR_DEVICE_INDEX, adapter->idx);
+
+ err = nl_send_msg(nfc_state->cmd_sock, msg, NULL, NULL);
+
+nla_put_failure:
+ nlmsg_free(msg);
+
+ return err;
+}
+
int nl_send_sdreq(struct nfc_adapter *adapter, GSList *uris)
{
struct nl_msg *msg;