Enlightenment Wi-Fi module to manage iwd backend
  • C 98.2%
  • Meson 1.8%
Find a file
Pierre-Olivier Mercier 8b3ef2c346 defensive: NULL-check calloc results before dereferencing
Five sites allocated with calloc() and dereferenced the result on the
very next line. Under OOM the module would have segfaulted instead of
degrading. Each site now bails (or sends a Canceled D-Bus error, in
the agent path) when the allocation fails.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-29 18:27:44 +07:00
data Phase 2: gadcon provider with state-driven icon 2026-04-09 12:45:09 +07:00
src defensive: NULL-check calloc results before dereferencing 2026-04-29 18:27:44 +07:00
.gitignore Phase 0: scaffold e_iwd Enlightenment module 2026-04-09 12:45:09 +07:00
e_iwd.spec Phase 5/6: log Connect failures + RPM spec 2026-04-09 12:45:09 +07:00
LICENSE Phase 0: scaffold e_iwd Enlightenment module 2026-04-09 12:45:09 +07:00
meson.build build: pin UTF-8 input/exec charset 2026-04-29 12:52:49 +07:00
README.md README: comprehensive rewrite 2026-04-09 12:47:20 +07:00

e_iwd — Enlightenment Wi-Fi module (iwd backend)

A native Enlightenment gadget that manages wireless connections through iwd, the Intel Wireless Daemon. No NetworkManager, no ConnMan, no shelling out to iwctl — everything goes over iwd's DBus API.

It is roughly the iwd-only equivalent of econnman.

Features

  • Shelf gadget with a signal-tier icon (off / acquiring / weak…excellent) and a tooltip showing the current SSID, security type, and signal level.
  • Popup network browser (left-click the gadget):
    • status line: disabled / disconnected / scanning / connecting / connected
    • sorted network list — connected first, then known networks, then by signal strength; long SSIDs are truncated to keep the popup tidy
    • per-row signal bars and security tag (open / WPA / WEP / 802.1X)
    • Connect by clicking a row, Forget () on known networks
    • Rescan, Enable / Disable WiFi
    • Disconnect button visible while connected
    • Hidden… button to join a non-broadcasting SSID
  • Authentication agent registered with iwd:
    • passphrase prompt for new protected networks (modal dialog window)
    • cancel-on-Agent.Cancel so iwd-initiated cancellations close the open prompt cleanly
    • polite stubs for RequestUserNameAndPassword, RequestUserPassword and RequestPrivateKeyPassphrase so iwd doesn't unregister us when it tries them on EAP networks
  • Settings dialog (right-click the gadget → Settings):
    • auto-connect to known networks
    • show hidden networks
    • signal refresh interval
    • preferred wireless adapter
  • Robust to iwd lifecycle: tracks net.connman.iwd name owner, re-binds objects on restart, clears state on departure.

Architecture

e_iwd/
├── src/
│   ├── e_mod_main.c           module init/shutdown
│   ├── e_mod_gadget.c         gadcon provider, icon + tooltip + menu
│   ├── e_mod_popup.c          network list popup
│   ├── e_mod_config.c         persistent settings + E_Config_Dialog
│   ├── iwd/
│   │   ├── iwd_dbus.c         system bus, name owner, ObjectManager
│   │   ├── iwd_manager.c      top-level state aggregator + listeners
│   │   ├── iwd_adapter.c      net.connman.iwd.Adapter (Powered)
│   │   ├── iwd_device.c       Device + Station, scan/connect/disconnect,
│   │   │                      GetOrderedNetworks → signal strength
│   │   ├── iwd_network.c      Network.Connect, KnownNetwork.Forget
│   │   ├── iwd_agent.c        net.connman.iwd.Agent (passphrase, cancel)
│   │   └── iwd_props.c        a{sv} parsing helpers
│   └── ui/
│       ├── wifi_auth.c        passphrase dialog (floating elm_win)
│       └── wifi_hidden.c      hidden-network SSID + passphrase dialog
└── meson.build

Data flow:

iwd (D-Bus) ──► iwd_dbus ──► iwd_manager ──► iwd_device / iwd_network
                                 │
                                 ├──► listeners (gadget, popup)
                                 └──► Iwd_Agent ──► UI passphrase prompt

The module uses Eldbus for all bus traffic and Elementary for its widgets. Everything is async — no blocking calls on the UI thread.

Building

Dependencies (development headers):

  • Enlightenment ≥ 0.25 (tested against 0.27)
  • EFL ≥ 1.26 (Eldbus, Elementary, Edje, Ecore, Eina)
  • meson + ninja
  • a running iwd ≥ 1.0 (runtime, not build-time)

Build and install:

meson setup build
ninja -C build
sudo ninja -C build install

The module is installed to <libdir>/enlightenment/modules/iwd/<module_arch>/module.so. The module_arch and libdir are pulled from Enlightenment's pkg-config file, so the install path matches whatever your distro packages.

Once installed, enable it from Settings → Modules → Extensions → iwd, then add the gadget to a shelf or the desktop via Settings → Gadgets.

Runtime requirements

  • iwd running as a system service (systemctl enable --now iwd).
  • Your user must be allowed to talk to net.connman.iwd on the system bus. On most distros this means being in the network group, or having a polkit rule for the net.connman.iwd interfaces. The module degrades gracefully when permissions are missing — you'll just see an empty list.
  • A wireless adapter managed by iwd (i.e. not claimed by NetworkManager / wpa_supplicant).

Usage

Action How
Open the network list Left-click the gadget
Open settings Right-click the gadget → Settings
Connect to a known network Click its row in the list
Connect to a new protected network Click its row, enter the passphrase in the dialog
Forget a known network Click the button on its row
Disconnect Click Disconnect in the popup (visible while connected)
Join a hidden SSID Click Hidden…, enter SSID and (optional) passphrase
Rescan Click Rescan
Disable / enable Wi-Fi Click Disable / Enable in the popup

Passphrases are sent straight to iwd over D-Bus. They are never logged, never written to the module config, and are zeroed in memory once the dialog closes.

Configuration

Settings are persisted via Enlightenment's standard config system as module.iwd (an eet file under your E config profile, e.g. ~/.e/e/config/<profile>/module.iwd.cfg). Fields:

Field Default Meaning
auto_connect on Let iwd auto-connect to known networks
show_hidden off Reveal hidden networks in the list
refresh_interval 5 Signal-strength refresh interval (seconds)
preferred_adapter Preferred wireless adapter (blank = auto)

Status

Phases 04 of the project are complete and the module builds cleanly against EFL 1.28 / Enlightenment 0.27. Phase 5 (robustness) and Phase 6 (packaging) are partially landed.

Known gaps:

  • No custom theme edj — the gadget uses freedesktop icon names from the active icon theme.
  • No suspend / resume integration.
  • No EAP UI (RequestUserName / RequestPrivateKey are stubbed to refuse).
  • Multi-adapter UX is auto-select-first; the preferred-adapter setting is plumbed but not yet honored by the manager.
  • Not yet tested by valgrind for leaks.

License

MIT-style, matching Enlightenment and EFL. See LICENSE.