diff --git a/src/miracle.h b/src/miracle.h index f5e8b63..2b64c16 100644 --- a/src/miracle.h +++ b/src/miracle.h @@ -128,4 +128,90 @@ static inline int64_t now(clockid_t clock_id) (int64_t)ts.tv_nsec / 1000LL; } +static inline char hexchar(int x) +{ + static const char table[16] = "0123456789abcdef"; + return table[x & 15]; +} + +static inline int unhexchar(char c) +{ + if (c >= '0' && c <= '9') + return c - '0'; + + if (c >= 'a' && c <= 'f') + return c - 'a' + 10; + + if (c >= 'A' && c <= 'F') + return c - 'A' + 10; + + return -1; +} + +static inline char *bus_label_escape(const char *s) +{ + char *r, *t; + const char *f; + + if (*s == 0) + return strdup("_"); + + r = calloc(sizeof(char), strlen(s)*3 + 1); + if (!r) + return NULL; + + for (f = s, t = r; *f; f++) { + + /* Escape everything that is not a-zA-Z0-9. We also + * escape 0-9 if it's the first character */ + + if (!(*f >= 'A' && *f <= 'Z') && + !(*f >= 'a' && *f <= 'z') && + !(f > s && *f >= '0' && *f <= '9')) { + *(t++) = '_'; + *(t++) = hexchar(*f >> 4); + *(t++) = hexchar(*f); + } else + *(t++) = *f; + } + + *t = 0; + + return r; +} + +static inline char *bus_label_unescape(const char *f) +{ + char *r, *t; + + /* Special case for the empty string */ + if (!strcmp(f, "_")) + return strdup(""); + + r = calloc(sizeof(char), strlen(f) + 1); + if (!r) + return NULL; + + for (t = r; *f; f++) { + + if (*f == '_') { + int a, b; + + if ((a = unhexchar(f[1])) < 0 || + (b = unhexchar(f[2])) < 0) { + /* Invalid escape code, let's take it literal then */ + *(t++) = '_'; + } else { + *(t++) = (char) ((a << 4) | b); + f += 2; + } + } else + *(t++) = *f; + } + + *t = 0; + + return r; +} + #endif /* MIRACLE_H */ diff --git a/src/miraclectl.c b/src/miraclectl.c index 5cbe534..ab2e80c 100644 --- a/src/miraclectl.c +++ b/src/miraclectl.c @@ -404,10 +404,10 @@ static int cli_init(void) sigprocmask(SIG_BLOCK, &mask, NULL); r = sd_event_add_signal(cli_event, + &cli_sigs[i], sigs[i], cli_signal_fn, - NULL, - &cli_sigs[i]); + NULL); if (r < 0) { cli_vERR(r); goto error; @@ -415,11 +415,11 @@ static int cli_init(void) } r = sd_event_add_io(cli_event, + &cli_stdin, fileno(stdin), EPOLLHUP | EPOLLERR | EPOLLIN, cli_stdin_fn, - NULL, - &cli_stdin); + NULL); if (r < 0) { cli_vERR(r); goto error; @@ -559,7 +559,7 @@ static int cmd_list_links(sd_bus_message *m) } free(link); - link = sd_bus_label_unescape(obj); + link = bus_label_unescape(obj); if (!link) return cli_ENOMEM(); @@ -634,7 +634,7 @@ static int cmd_list_peer(sd_bus_message *m, "/org/freedesktop/miracle/link/"); if (obj) { free(link); - link = sd_bus_label_unescape(obj); + link = bus_label_unescape(obj); if (!link) return cli_ENOMEM(); } @@ -717,7 +717,7 @@ static int cmd_list_peers(sd_bus_message *m, const char *link_filter) } free(peer); - peer = sd_bus_label_unescape(obj); + peer = bus_label_unescape(obj); if (!peer) return cli_ENOMEM(); @@ -806,7 +806,7 @@ static int cmd_select(char **args, unsigned int n) return 0; } - name = sd_bus_label_escape(args[0]); + name = bus_label_escape(args[0]); if (!name) return cli_ENOMEM(); @@ -855,7 +855,7 @@ static int cmd_show_link(char **args, unsigned int n) else if (!(arg_link = selected_link)) return log_error("no link selected"), -EINVAL; - name = sd_bus_label_escape(arg_link); + name = bus_label_escape(arg_link); if (!name) return cli_ENOMEM(); @@ -955,7 +955,7 @@ static int cmd_show_peer(char **args, unsigned int n) const char *t; int r, is_connected = false; - name = sd_bus_label_escape(args[0]); + name = bus_label_escape(args[0]); if (!name) return cli_ENOMEM(); @@ -995,7 +995,7 @@ static int cmd_show_peer(char **args, unsigned int n) "/org/freedesktop/miracle/link/"); if (t) { free(link); - link = sd_bus_label_unescape(t); + link = bus_label_unescape(t); if (!link) return cli_ENOMEM(); } @@ -1115,7 +1115,7 @@ static int cmd_add_link(char **args, unsigned int n) if (r < 0) return cli_log_parser(r); - link = sd_bus_label_unescape(name); + link = bus_label_unescape(name); if (!link) return cli_ENOMEM(); @@ -1171,7 +1171,7 @@ static int cmd_set_link_name(char **args, unsigned int n) arg_name = args[0]; } - name = sd_bus_label_escape(arg_link); + name = bus_label_escape(arg_link); if (!name) return cli_ENOMEM(); @@ -1180,11 +1180,11 @@ static int cmd_set_link_name(char **args, unsigned int n) return cli_ENOMEM(); r = sd_bus_message_new_method_call(bus, + &m, "org.freedesktop.miracle", path, "org.freedesktop.DBus.Properties", - "Set", - &m); + "Set"); if (r < 0) return log_bus_create(r); @@ -1233,7 +1233,7 @@ static int cmd_start_scan(char **args, unsigned int n) else if (!(arg_link = selected_link)) return log_error("no link selected"), -EINVAL; - name = sd_bus_label_escape(arg_link); + name = bus_label_escape(arg_link); if (!name) return cli_ENOMEM(); @@ -1275,7 +1275,7 @@ static int cmd_stop_scan(char **args, unsigned int n) else if (!(arg_link = selected_link)) return log_error("no link selected"), -EINVAL; - name = sd_bus_label_escape(arg_link); + name = bus_label_escape(arg_link); if (!name) return cli_ENOMEM(); @@ -1316,7 +1316,7 @@ static int cmd_scan_stop(bool async) if (!scan_link) return 0; - name = sd_bus_label_escape(scan_link); + name = bus_label_escape(scan_link); if (!name) return cli_ENOMEM(); @@ -1390,7 +1390,7 @@ static int cmd_scan(char **args, unsigned int n) else if (!(arg_link = selected_link)) return log_error("no link selected"), -EINVAL; - name = sd_bus_label_escape(arg_link); + name = bus_label_escape(arg_link); if (!name) return cli_ENOMEM(); @@ -1436,7 +1436,7 @@ static int cmd_allow(char **args, unsigned int n) if (n > 1) pin = args[1]; - name = sd_bus_label_escape(args[0]); + name = bus_label_escape(args[0]); if (!name) return cli_ENOMEM(); @@ -1473,7 +1473,7 @@ static int cmd_reject(char **args, unsigned int n) _shl_cleanup_free_ char *name = NULL, *path = NULL; int r; - name = sd_bus_label_escape(args[0]); + name = bus_label_escape(args[0]); if (!name) return cli_ENOMEM(); @@ -1515,7 +1515,7 @@ static int cmd_connect(char **args, unsigned int n) prov = (n > 1) ? args[1] : ""; pin = (n > 2) ? args[2] : ""; - name = sd_bus_label_escape(peer); + name = bus_label_escape(peer); if (!name) return cli_ENOMEM(); @@ -1552,7 +1552,7 @@ static int cmd_disconnect(char **args, unsigned int n) _shl_cleanup_free_ char *name = NULL, *path = NULL; int r; - name = sd_bus_label_escape(args[0]); + name = bus_label_escape(args[0]); if (!name) return cli_ENOMEM(); @@ -1602,7 +1602,7 @@ static int filters_show_peer(const char *peer) const char *t; int r; - name = sd_bus_label_escape(peer); + name = bus_label_escape(peer); if (!name) return cli_ENOMEM(); @@ -1642,7 +1642,7 @@ static int filters_show_peer(const char *peer) "/org/freedesktop/miracle/link/"); if (t) { free(link); - link = sd_bus_label_unescape(t); + link = bus_label_unescape(t); if (!link) return cli_ENOMEM(); } @@ -1686,7 +1686,7 @@ static int filters_show_link(const char *link) const char *t; int r; - name = sd_bus_label_escape(link); + name = bus_label_escape(link); if (!name) return cli_ENOMEM(); @@ -1767,7 +1767,7 @@ static int filters_object_fn(sd_bus *bus, t = shl_startswith(obj, "/org/freedesktop/miracle/peer/"); if (t) { - peer = sd_bus_label_unescape(t); + peer = bus_label_unescape(t); if (!peer) return cli_ENOMEM(); @@ -1783,7 +1783,7 @@ static int filters_object_fn(sd_bus *bus, t = shl_startswith(obj, "/org/freedesktop/miracle/link/"); if (t) { - link = sd_bus_label_unescape(t); + link = bus_label_unescape(t); if (!link) return cli_ENOMEM(); @@ -1861,14 +1861,14 @@ static int filters_props_fn(sd_bus *bus, path = sd_bus_message_get_path(m); t = shl_startswith(path, "/org/freedesktop/miracle/peer/"); if (t) { - peer = sd_bus_label_unescape(t); + peer = bus_label_unescape(t); if (!peer) return cli_ENOMEM(); } t = shl_startswith(path, "/org/freedesktop/miracle/link/"); if (t) { - link = sd_bus_label_unescape(t); + link = bus_label_unescape(t); if (!link) return cli_ENOMEM(); } @@ -1928,7 +1928,7 @@ static int filters_peer_fn(sd_bus *bus, if (!path) return 0; - peer = sd_bus_label_unescape(path); + peer = bus_label_unescape(path); if (!peer) return cli_ENOMEM(); @@ -1969,7 +1969,7 @@ static int filters_link_fn(sd_bus *bus, if (!path) return 0; - link = sd_bus_label_unescape(path); + link = bus_label_unescape(path); if (!link) return cli_ENOMEM(); diff --git a/src/miracled-dbus.c b/src/miracled-dbus.c index df8b4ba..049a8df 100644 --- a/src/miracled-dbus.c +++ b/src/miracled-dbus.c @@ -685,7 +685,7 @@ static int manager_dbus_remove_link(sd_bus *bus, sd_bus_message *msg, if (r < 0) return r; - link = sd_bus_label_escape(name); + link = bus_label_escape(name); if (!link) return log_ENOMEM(); diff --git a/src/miracled-link.c b/src/miracled-link.c index c77f8ae..ccaa157 100644 --- a/src/miracled-link.c +++ b/src/miracled-link.c @@ -86,7 +86,7 @@ int link_make_name(unsigned int type, const char *interface, char **out) if (!name) return log_ENOMEM(); - res = sd_bus_label_escape(name); + res = bus_label_escape(name); free(name); if (!res) return log_ENOMEM(); @@ -236,20 +236,20 @@ static int link_wifi_init(struct link *l) return r; r = sd_event_add_child(l->m->event, + &l->wpa_child_source, wifi_get_supplicant_pid(l->w), WEXITED, link_wifi_child_fn, - l, - &l->wpa_child_source); + l); if (r < 0) return r; r = sd_event_add_monotonic(l->m->event, + &l->wpa_startup_source, now(CLOCK_MONOTONIC) + 200 * 1000, 0, link_wifi_startup_fn, - l, - &l->wpa_startup_source); + l); if (r < 0) return r; diff --git a/src/miracled-peer.c b/src/miracled-peer.c index fdbfa23..598b5de 100644 --- a/src/miracled-peer.c +++ b/src/miracled-peer.c @@ -42,7 +42,7 @@ int peer_make_name(unsigned int id, char **out) return 0; snprintf(buf, sizeof(buf) - 1, "%u", id); - name = sd_bus_label_escape(buf); + name = bus_label_escape(buf); if (!name) return log_ENOMEM(); diff --git a/src/miracled-wifi.c b/src/miracled-wifi.c index aa179b9..116a9cc 100644 --- a/src/miracled-wifi.c +++ b/src/miracled-wifi.c @@ -766,11 +766,11 @@ int wifi_new(sd_event *event, wifi_event_t event_fn, void *data, goto error; r = sd_event_add_io(w->event, + &w->wpa_source, wfd_wpa_ctrl_get_fd(w->wpa), EPOLLHUP | EPOLLERR | EPOLLIN, wifi_wpa_fd_fn, - w, - &w->wpa_source); + w); if (r < 0) { log_vERR(r); goto error; @@ -1335,22 +1335,22 @@ static int wifi_dev_start(struct wifi_dev *d, const char *ifname, } r = sd_event_add_io(d->w->event, + &d->dhcp_comm_source, d->dhcp_comm, EPOLLHUP | EPOLLERR | EPOLLIN, wifi_dev_comm_fn, - d, - &d->dhcp_comm_source); + d); if (r < 0) { log_vERR(r); goto error; } r = sd_event_add_child(d->w->event, + &d->dhcp_pid_source, d->dhcp_pid, WEXITED, wifi_dev_pid_fn, - d, - &d->dhcp_pid_source); + d); if (r < 0) { log_vERR(r); goto error; diff --git a/src/miracled.c b/src/miracled.c index 14b9c6f..bb919d0 100644 --- a/src/miracled.c +++ b/src/miracled.c @@ -248,10 +248,10 @@ static int manager_new(struct manager **out) sigprocmask(SIG_BLOCK, &mask, NULL); r = sd_event_add_signal(m->event, + &m->sigs[i], sigs[i], manager_signal_fn, - m, - &m->sigs[i]); + m); if (r < 0) { log_vERR(r); goto error; @@ -285,11 +285,11 @@ static int manager_new(struct manager **out) } r = sd_event_add_io(m->event, + &m->udev_mon_source, udev_monitor_get_fd(m->udev_mon), EPOLLHUP | EPOLLERR | EPOLLIN, manager_udev_fn, - m, - &m->udev_mon_source); + m); if (r < 0) { log_vERR(r); goto error;