This is an automated email from the git hooks/post-receive script.

git pushed a commit to branch nm-vpn-username-capture
in repository enlightenment.

View the commit online.

commit 37a9c3afb17342204fa07b2ed6a9d10862f732ba
Author: [email protected] <[email protected]>
AuthorDate: Sun Jun 21 20:55:40 2026 -0600

    networkmanager: add async nmcli username writer
    
    Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>
---
 .../networkmanager/e_networkmanager_vpn_username.c | 88 +++++++++++++++++++++-
 1 file changed, 86 insertions(+), 2 deletions(-)

diff --git a/src/modules/networkmanager/e_networkmanager_vpn_username.c b/src/modules/networkmanager/e_networkmanager_vpn_username.c
index c9f8b9b47..a86cbf2a2 100644
--- a/src/modules/networkmanager/e_networkmanager_vpn_username.c
+++ b/src/modules/networkmanager/e_networkmanager_vpn_username.c
@@ -41,6 +41,90 @@ enm_vpn_username_needed(const char *svc_short, const char *conn_type,
 }
 
 #ifndef ENM_VPN_USERNAME_TEST
-/* enm_vpn_username_set / enm_vpn_username_dialog / enm_vpn_username_maybe_prompt
- * are added in Tasks 2 and 3. */
+
+/* ---- shared shell-escape (same scheme as e_networkmanager_import.c) ------- */
+static char *
+_username_shell_escape(const char *s)
+{
+   Eina_Strbuf *b;
+   char *out;
+
+   if (!s) return strdup("");
+   b = eina_strbuf_new();
+   if (!b) return NULL;
+   for (const char *p = s; *p; p++)
+     {
+        if (*p == '\'') eina_strbuf_append(b, "'\\''");
+        else            eina_strbuf_append_char(b, *p);
+     }
+   out = strdup(eina_strbuf_string_get(b));
+   eina_strbuf_free(b);
+   return out;
+}
+
+typedef struct _Username_Set_Ctx
+{
+   Enm_Username_Done_Cb  cb;
+   void                 *data;
+   Ecore_Exe            *exe;
+   Ecore_Event_Handler  *handler_del;
+} Username_Set_Ctx;
+
+static Eina_Bool
+_username_set_on_del(void *data, int type EINA_UNUSED, void *event)
+{
+   Username_Set_Ctx *ctx = data;
+   Ecore_Exe_Event_Del *ev = event;
+
+   if (!ev || !ev->exe || ev->exe != ctx->exe)
+     return ECORE_CALLBACK_PASS_ON;
+
+   if (ctx->handler_del) ecore_event_handler_del(ctx->handler_del);
+   if (ctx->cb)
+     ctx->cb(ctx->data, (ev->exited && ev->exit_code == 0));
+   free(ctx);
+   return ECORE_CALLBACK_DONE;
+}
+
+void
+enm_vpn_username_set(const char *conn_name, const char *username,
+                     Enm_Username_Done_Cb cb, void *data)
+{
+   const char *nmcli;
+   char *esc_nmcli, *esc_name, *esc_user;
+   char cmd[4096];
+   Username_Set_Ctx *ctx;
+
+   if (!conn_name) { if (cb) cb(data, EINA_FALSE); return; }
+
+   nmcli = enm_import_nmcli_path();
+   if (!nmcli) { if (cb) cb(data, EINA_FALSE); return; }
+
+   esc_nmcli = _username_shell_escape(nmcli);
+   esc_name  = _username_shell_escape(conn_name);
+   esc_user  = _username_shell_escape(username);
+   if (!esc_nmcli || !esc_name || !esc_user)
+     {
+        free(esc_nmcli); free(esc_name); free(esc_user);
+        if (cb) cb(data, EINA_FALSE);
+        return;
+     }
+
+   snprintf(cmd, sizeof(cmd),
+            "'%s' connection modify '%s' vpn.data 'username=%s'",
+            esc_nmcli, esc_name, esc_user);
+   free(esc_nmcli); free(esc_name); free(esc_user);
+
+   ctx = calloc(1, sizeof(*ctx));
+   if (!ctx) { if (cb) cb(data, EINA_FALSE); return; }
+   ctx->cb = cb;
+   ctx->data = ""
+   ctx->exe = ecore_exe_pipe_run(cmd,
+                                 ECORE_EXE_NOT_LEADER |
+                                 ECORE_EXE_TERM_WITH_PARENT, ctx);
+   if (!ctx->exe) { free(ctx); if (cb) cb(data, EINA_FALSE); return; }
+   ctx->handler_del = ecore_event_handler_add(ECORE_EXE_EVENT_DEL,
+                                              _username_set_on_del, ctx);
+}
+
 #endif

-- 
To stop receiving notification emails like this one, please contact
the administrator of this repository.

Reply via email to