diff --git a/app/src/main/java/com/wireguard/android/backend/WgQuickBackend.java b/app/src/main/java/com/wireguard/android/backend/WgQuickBackend.java index 33c7046f..4306b01e 100644 --- a/app/src/main/java/com/wireguard/android/backend/WgQuickBackend.java +++ b/app/src/main/java/com/wireguard/android/backend/WgQuickBackend.java @@ -103,18 +103,27 @@ public final class WgQuickBackend implements Backend { state = originalState == State.UP ? State.DOWN : State.UP; if (state == originalState) return originalState; + if (state == State.UP && !new File("/sys/module/wireguard").exists()) + throw new ModuleNotLoadedException("WireGuard module not loaded"); Log.d(TAG, "Changing tunnel " + tunnel.getName() + " to state " + state); toolsInstaller.ensureToolsAvailable(); final int result; - if (state == State.UP) { - if (!new File("/sys/module/wireguard").exists()) - throw new ErrnoException("WireGuard module not loaded", OsConstants.ENODEV); + if (state == State.UP) result = bringUpTunnel(tunnel, tunnel.getConfig()); - } else { + else result = rootShell.run(null, "wg-quick down '" + tunnel.getName() + '\''); - } if (result != 0) - throw new Exception("wg-quick failed"); + throw new Exception("Unable to configure tunnel"); return getState(tunnel); } + + public static class ModuleNotLoadedException extends Exception { + public ModuleNotLoadedException(final String message, final Throwable cause) { + super(message, cause); + } + + public ModuleNotLoadedException(final String message) { + super(message); + } + } } diff --git a/app/src/main/java/com/wireguard/android/fragment/TunnelController.java b/app/src/main/java/com/wireguard/android/fragment/TunnelController.java index 1d1dc6b9..8b86749d 100644 --- a/app/src/main/java/com/wireguard/android/fragment/TunnelController.java +++ b/app/src/main/java/com/wireguard/android/fragment/TunnelController.java @@ -4,8 +4,6 @@ import android.app.AlertDialog; import android.content.Context; import android.databinding.DataBindingUtil; import android.databinding.ViewDataBinding; -import android.system.ErrnoException; -import android.system.OsConstants; import android.text.Html; import android.text.method.LinkMovementMethod; import android.util.Log; @@ -14,6 +12,7 @@ import android.widget.TextView; import com.commonsware.cwac.crossport.design.widget.Snackbar; import com.wireguard.android.R; +import com.wireguard.android.backend.WgQuickBackend; import com.wireguard.android.databinding.TunnelDetailFragmentBinding; import com.wireguard.android.databinding.TunnelListItemBinding; import com.wireguard.android.model.Tunnel; @@ -48,8 +47,8 @@ public final class TunnelController { if (throwable == null) return; final Context context = view.getContext(); - if (throwable instanceof ErrnoException - && ((ErrnoException) throwable).errno == OsConstants.ENODEV) { + if (throwable instanceof WgQuickBackend.ModuleNotLoadedException || + throwable.getCause() instanceof WgQuickBackend.ModuleNotLoadedException) { final String message = context.getString(R.string.not_supported_message); final String title = context.getString(R.string.not_supported_title); final AlertDialog dialog = new AlertDialog.Builder(context)