mirror of
https://github.com/albfan/miraclecast.git
synced 2025-03-09 23:38:56 +00:00
Make miracle-wifid conexists with other network tools
The new option --lazy-managed will let miracle-wifid don't managed the links automatically. Instead, the link will be managed only when the new DBus property Managed was set to true. So this will be possible that miracle-wifid could be conexists with other network tools like networkmanager. For example, unmange the device in networkmanager with setting the DBus property org.freedesktop.NetworkManager.Device.Managed to false and manage it in miracle-wifid with setting org.freedesktop.miracle.wifi.Link.Managed to true, then both them could works and don't need to kill each other. Besides, there is new command named make-managed in miracle-wifictl and miracle-sinkctla.
This commit is contained in:
parent
d239c528ff
commit
7d7df75bc9
9 changed files with 260 additions and 26 deletions
|
@ -570,6 +570,42 @@ static int link_dbus_set_friendly_name(sd_bus *bus,
|
|||
return link_set_friendly_name(l, name);
|
||||
}
|
||||
|
||||
static int link_dbus_get_managed(sd_bus *bus,
|
||||
const char *path,
|
||||
const char *interface,
|
||||
const char *property,
|
||||
sd_bus_message *reply,
|
||||
void *data,
|
||||
sd_bus_error *err)
|
||||
{
|
||||
struct link *l = data;
|
||||
int r;
|
||||
|
||||
r = sd_bus_message_append(reply, "b", link_get_managed(l));
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int link_dbus_set_managed(sd_bus *bus,
|
||||
const char *path,
|
||||
const char *interface,
|
||||
const char *property,
|
||||
sd_bus_message *value,
|
||||
void *data,
|
||||
sd_bus_error *err)
|
||||
{
|
||||
struct link *l = data;
|
||||
int val, r;
|
||||
|
||||
r = sd_bus_message_read(value, "b", &val);
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
return link_set_managed(l, val);
|
||||
}
|
||||
|
||||
static int link_dbus_get_p2p_scanning(sd_bus *bus,
|
||||
const char *path,
|
||||
const char *interface,
|
||||
|
@ -661,6 +697,12 @@ static const sd_bus_vtable link_dbus_vtable[] = {
|
|||
link_dbus_set_friendly_name,
|
||||
0,
|
||||
SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE),
|
||||
SD_BUS_WRITABLE_PROPERTY("Managed",
|
||||
"b",
|
||||
link_dbus_get_managed,
|
||||
link_dbus_set_managed,
|
||||
0,
|
||||
SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE),
|
||||
SD_BUS_WRITABLE_PROPERTY("P2PScanning",
|
||||
"b",
|
||||
link_dbus_get_p2p_scanning,
|
||||
|
|
|
@ -100,6 +100,8 @@ int link_new(struct manager *m,
|
|||
if (out)
|
||||
*out = l;
|
||||
|
||||
l->public = true;
|
||||
link_dbus_added(l);
|
||||
return 0;
|
||||
|
||||
error:
|
||||
|
@ -116,6 +118,9 @@ void link_free(struct link *l)
|
|||
|
||||
link_set_managed(l, false);
|
||||
|
||||
link_dbus_removed(l);
|
||||
l->public = false;
|
||||
|
||||
if (shl_htable_remove_uint(&l->m->links, l->ifindex, NULL)) {
|
||||
log_info("remove link: %s", l->ifname);
|
||||
--l->m->link_cnt;
|
||||
|
@ -142,14 +147,19 @@ bool link_is_using_dev(struct link *l)
|
|||
return l->use_dev;
|
||||
}
|
||||
|
||||
void link_set_managed(struct link *l, bool set)
|
||||
bool link_get_managed(struct link *l)
|
||||
{
|
||||
return l->managed;
|
||||
}
|
||||
|
||||
int link_set_managed(struct link *l, bool set)
|
||||
{
|
||||
int r;
|
||||
|
||||
if (!l)
|
||||
return log_vEINVAL();
|
||||
return log_EINVAL();
|
||||
if (l->managed == set)
|
||||
return;
|
||||
return 0;
|
||||
|
||||
if (set) {
|
||||
log_info("manage link %s", l->ifname);
|
||||
|
@ -157,7 +167,7 @@ void link_set_managed(struct link *l, bool set)
|
|||
r = supplicant_start(l->s);
|
||||
if (r < 0) {
|
||||
log_error("cannot start supplicant on %s", l->ifname);
|
||||
return;
|
||||
return -EFAULT;
|
||||
}
|
||||
} else {
|
||||
log_info("link %s no longer managed", l->ifname);
|
||||
|
@ -165,6 +175,7 @@ void link_set_managed(struct link *l, bool set)
|
|||
}
|
||||
|
||||
l->managed = set;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int link_renamed(struct link *l, const char *ifname)
|
||||
|
@ -199,6 +210,9 @@ int link_set_friendly_name(struct link *l, const char *name)
|
|||
if (!l || !name || !*name)
|
||||
return log_EINVAL();
|
||||
|
||||
if (!l->managed)
|
||||
return log_EUNMANAGED();
|
||||
|
||||
t = strdup(name);
|
||||
if (!t)
|
||||
return log_ENOMEM();
|
||||
|
@ -234,6 +248,9 @@ int link_set_wfd_subelements(struct link *l, const char *val)
|
|||
if (!l || !val)
|
||||
return log_EINVAL();
|
||||
|
||||
if (!l->managed)
|
||||
return log_EUNMANAGED();
|
||||
|
||||
t = strdup(val);
|
||||
if (!t)
|
||||
return log_ENOMEM();
|
||||
|
@ -266,6 +283,9 @@ int link_set_p2p_scanning(struct link *l, bool set)
|
|||
if (!l)
|
||||
return log_EINVAL();
|
||||
|
||||
if (!l->managed)
|
||||
return log_EUNMANAGED();
|
||||
|
||||
if (set) {
|
||||
return supplicant_p2p_start_scan(l->s);
|
||||
} else {
|
||||
|
@ -276,7 +296,16 @@ int link_set_p2p_scanning(struct link *l, bool set)
|
|||
|
||||
bool link_get_p2p_scanning(struct link *l)
|
||||
{
|
||||
return l && supplicant_p2p_scanning(l->s);
|
||||
if (!l) {
|
||||
log_vEINVAL();
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!l->managed) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return supplicant_p2p_scanning(l->s);
|
||||
}
|
||||
|
||||
void link_supplicant_started(struct link *l)
|
||||
|
@ -284,9 +313,8 @@ void link_supplicant_started(struct link *l)
|
|||
if (!l || l->public)
|
||||
return;
|
||||
|
||||
log_debug("link %s started", l->ifname);
|
||||
l->public = true;
|
||||
link_dbus_added(l);
|
||||
link_set_friendly_name(l, l->m->friendly_name);
|
||||
log_info("link %s managed", l->ifname);
|
||||
}
|
||||
|
||||
void link_supplicant_stopped(struct link *l)
|
||||
|
@ -294,9 +322,7 @@ void link_supplicant_stopped(struct link *l)
|
|||
if (!l || !l->public)
|
||||
return;
|
||||
|
||||
log_debug("link %s stopped", l->ifname);
|
||||
link_dbus_removed(l);
|
||||
l->public = false;
|
||||
log_info("link %s unmanaged", l->ifname);
|
||||
}
|
||||
|
||||
void link_supplicant_p2p_scan_changed(struct link *l, bool new_value)
|
||||
|
|
|
@ -43,6 +43,7 @@
|
|||
const char *interface_name = NULL;
|
||||
unsigned int arg_wpa_loglevel = LOG_NOTICE;
|
||||
bool use_dev = false;
|
||||
bool lazy_managed = false;
|
||||
|
||||
/*
|
||||
* Manager Handling
|
||||
|
@ -101,15 +102,13 @@ static void manager_add_udev_link(struct manager *m,
|
|||
if (r < 0)
|
||||
return;
|
||||
|
||||
link_set_friendly_name(l, m->friendly_name);
|
||||
|
||||
if(use_dev)
|
||||
link_use_dev(l);
|
||||
|
||||
#ifdef RELY_UDEV
|
||||
if (udev_device_has_tag(d, "miracle")) {
|
||||
if (udev_device_has_tag(d, "miracle") && !lazy_managed) {
|
||||
#else
|
||||
if (!interface_name || !strcmp(interface_name, ifname)) {
|
||||
if ((!interface_name || !strcmp(interface_name, ifname)) && !lazy_managed) {
|
||||
#endif
|
||||
link_set_managed(l, true);
|
||||
} else {
|
||||
|
@ -150,12 +149,12 @@ static int manager_udev_fn(sd_event_source *source,
|
|||
}
|
||||
|
||||
#ifdef RELY_UDEV
|
||||
if (udev_device_has_tag(d, "miracle"))
|
||||
if (udev_device_has_tag(d, "miracle") && !lazy_managed)
|
||||
link_set_managed(l, true);
|
||||
else
|
||||
link_set_managed(l, false);
|
||||
#else
|
||||
if (!interface_name || !strcmp(interface_name, ifname)) {
|
||||
if ((!interface_name || !strcmp(interface_name, ifname)) && !lazy_managed) {
|
||||
link_set_managed(l, true);
|
||||
} else {
|
||||
log_debug("ignored device: %s", ifname);
|
||||
|
@ -463,6 +462,7 @@ static int help(void)
|
|||
"\n"
|
||||
" --wpa-loglevel <lvl wpa_supplicant log-level\n"
|
||||
" --use-dev enable workaround for 'no ifname' issue\n"
|
||||
" --lazy-managed manage interface only when user decide to do\n"
|
||||
, program_invocation_short_name);
|
||||
/*
|
||||
* 80-char barrier:
|
||||
|
@ -482,6 +482,7 @@ static int parse_argv(int argc, char *argv[])
|
|||
ARG_WPA_LOGLEVEL,
|
||||
|
||||
ARG_USE_DEV,
|
||||
ARG_LAZY_MANAGED,
|
||||
};
|
||||
static const struct option options[] = {
|
||||
{ "help", no_argument, NULL, 'h' },
|
||||
|
@ -492,6 +493,7 @@ static int parse_argv(int argc, char *argv[])
|
|||
{ "wpa-loglevel", required_argument, NULL, ARG_WPA_LOGLEVEL },
|
||||
{ "interface", required_argument, NULL, 'i' },
|
||||
{ "use-dev", no_argument, NULL, ARG_USE_DEV },
|
||||
{ "lazy-managed", no_argument, NULL, ARG_LAZY_MANAGED },
|
||||
{}
|
||||
};
|
||||
int c;
|
||||
|
@ -515,6 +517,9 @@ static int parse_argv(int argc, char *argv[])
|
|||
case ARG_USE_DEV:
|
||||
use_dev = true;
|
||||
break;
|
||||
case ARG_LAZY_MANAGED:
|
||||
lazy_managed = true;
|
||||
break;
|
||||
|
||||
case ARG_WPA_LOGLEVEL:
|
||||
arg_wpa_loglevel = log_parse_arg(optarg);
|
||||
|
|
|
@ -158,7 +158,8 @@ void link_free(struct link *l);
|
|||
void link_use_dev(struct link *l);
|
||||
bool link_is_using_dev(struct link *l);
|
||||
|
||||
void link_set_managed(struct link *l, bool set);
|
||||
int link_set_managed(struct link *l, bool set);
|
||||
bool link_get_managed(struct link *l);
|
||||
int link_renamed(struct link *l, const char *ifname);
|
||||
|
||||
int link_set_friendly_name(struct link *l, const char *name);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue