mirror of
https://gitlab.alpinelinux.org/alpine/aports.git
synced 2025-08-09 07:17:12 +02:00
Daemon that connects to wpa_supplicant and handles connect and disconnect events https://git.archlinux.org/wpa_actiond.git Use case: A plain and simple way to automatically configure wireless networks depending on SSID by invoking user supplied scripts. I provided a patch to convert the nested function into a regular one, so that GCC won't generate a trampoline. In addition, OpenRC integration was added.
96 lines
2.8 KiB
Diff
96 lines
2.8 KiB
Diff
--- wpa_actiond-1.4-old/wpa_actiond.c
|
|
+++ wpa_actiond-1.4-new/wpa_actiond.c
|
|
@@ -72,6 +72,23 @@
|
|
WPA_ACTIOND_LOG_CUSTOM_ERROR
|
|
};
|
|
|
|
+/* wpa_supplicant control structure */
|
|
+static struct wpa_ctrl *ctrl;
|
|
+
|
|
+/* states and events */
|
|
+static enum wpastate state = WPA_ACTIOND_STATE_UNDEFINED;
|
|
+static enum wpaevent ev;
|
|
+/* select stuff */
|
|
+static int ctrl_fd;
|
|
+static fd_set ctrl_fds;
|
|
+/* save ssid */
|
|
+static char ssid[SSIDLEN], old_ssid[SSIDLEN];
|
|
+static char idstr[IDSTRLEN], old_idstr[IDSTRLEN];
|
|
+/* for terminate handler*/
|
|
+static const char *iface;
|
|
+static const char *script;
|
|
+static const char *pidfile;
|
|
+
|
|
static void logevent(enum wpa_actiond_logevent l, const char *iface, const char *arg) {
|
|
static int isopen = 0, tostderr = 0;
|
|
|
|
@@ -270,48 +287,43 @@
|
|
}
|
|
}
|
|
|
|
-static void loop(const char *iface, const char *ctrlpath, const int disconnect_timeout, const char *script, const char *pidfile) {
|
|
- /* wpa_supplicant control structure */
|
|
- struct wpa_ctrl *ctrl;
|
|
+static void terminate(int s) {
|
|
+ if(state == WPA_ACTIOND_STATE_CONNECTED || state == WPA_ACTIOND_STATE_CONNECTION_LOST) {
|
|
+ logevent(WPA_ACTIOND_LOG_DISCONNECTED, iface, ssid);
|
|
+ action(WPA_ACTIOND_ACTION_DISCONNECT, iface, ssid, idstr, wpa_ctrl_get_fd(ctrl), script);
|
|
+ }
|
|
+ logevent(WPA_ACTIOND_LOG_TERMINATE, iface, "");
|
|
+
|
|
+ FD_ZERO(&ctrl_fds);
|
|
+ wpa_ctrl_detach(ctrl);
|
|
+ wpa_ctrl_close(ctrl);
|
|
+ unlink(pidfile);
|
|
+ exit(0);
|
|
+}
|
|
+
|
|
+static void loop(const char *_iface, const char *ctrlpath, const int disconnect_timeout, const char *_script, const char *_pidfile) {
|
|
/* buffer for wpa_supplicant replies */
|
|
char reply[BUFLEN];
|
|
size_t reply_len;
|
|
- /* states and events */
|
|
- enum wpastate state = WPA_ACTIOND_STATE_UNDEFINED;
|
|
- enum wpaevent ev;
|
|
- /* select stuff */
|
|
- int ctrl_fd;
|
|
- fd_set ctrl_fds;
|
|
int r;
|
|
/* select timeout */
|
|
struct timeval timeout;
|
|
struct timeval ping_timeout;
|
|
- /* save ssid */
|
|
- char ssid[SSIDLEN], old_ssid[SSIDLEN];
|
|
- char idstr[IDSTRLEN], old_idstr[IDSTRLEN];
|
|
/* path to control socket */
|
|
char *ctrlsock = NULL;
|
|
int ctrlsocklen;
|
|
|
|
+ /* set up globals for terminate signal handler */
|
|
+ iface = _iface;
|
|
+ script = _script;
|
|
+ pidfile = _pidfile;
|
|
+
|
|
ssid[0] = '\0';
|
|
old_ssid[0] = '\0';
|
|
idstr[0] = '\0';
|
|
old_idstr[0] = '\0';
|
|
|
|
/* set up signals */
|
|
- void terminate(int s) {
|
|
- if(state == WPA_ACTIOND_STATE_CONNECTED || state == WPA_ACTIOND_STATE_CONNECTION_LOST) {
|
|
- logevent(WPA_ACTIOND_LOG_DISCONNECTED, iface, ssid);
|
|
- action(WPA_ACTIOND_ACTION_DISCONNECT, iface, ssid, idstr, wpa_ctrl_get_fd(ctrl), script);
|
|
- }
|
|
- logevent(WPA_ACTIOND_LOG_TERMINATE, iface, "");
|
|
-
|
|
- FD_ZERO(&ctrl_fds);
|
|
- wpa_ctrl_detach(ctrl);
|
|
- wpa_ctrl_close(ctrl);
|
|
- unlink(pidfile);
|
|
- exit(0);
|
|
- }
|
|
signal(SIGTERM, terminate);
|
|
signal(SIGHUP, SIG_IGN);
|
|
|