]> mj.ucw.cz Git - teatimer.git/commitdiff
Fix expansion in cmd master
authorJiri Kalvoda <jirikalvoda@kam.mff.cuni.cz>
Sat, 25 Feb 2023 23:51:04 +0000 (00:51 +0100)
committerMartin Mares <mj@ucw.cz>
Sun, 26 Feb 2023 20:32:20 +0000 (21:32 +0100)
Command is expanded after parsing to argument list array, so name couldn't split
to more arguments.

teatimer.c

index b0e3b5c6c3f12530527c36f043d9d40c86542c64..c58f7896aab1cb699932eae919c5eddf43915571 100644 (file)
@@ -58,42 +58,50 @@ quit(void)
 static int // return pid of new process or 0 if failed
 expand_and_exec(char *cmd)
 {
-  GString *expanded_cmd = g_string_new("");
-  if (!expanded_cmd)
-    return 0;
-  for (int i=0; cmd[i]; i++)
-    {
-      if (cmd[i]=='%' && cmd[i+1]=='%')
-       {
-         i++;
-         g_string_append_c(expanded_cmd, '%');
-       }
-      else
-      if (cmd[i]=='%' && cmd[i+1]=='n')
-       {
-         i++;
-         const gchar *name = gtk_entry_get_text(GTK_ENTRY(namebox));
-         g_string_append(expanded_cmd, name);
-       }
-      else
-       g_string_append_c(expanded_cmd, cmd[i]);
-    }
-
   GError *err = NULL;
   gint argc;
   gchar ** argv = NULL;
   int pid;
 
-  g_shell_parse_argv(expanded_cmd->str, &argc, &argv, &err);
-  g_string_free(expanded_cmd, 1);
+  g_shell_parse_argv(cmd, &argc, &argv, &err);
+  GString ** expanded_argv = malloc(sizeof(expanded_argv[0])*argc);
+  if (!expanded_argv)
+    return 0;
+  gchar ** expanded_argv_gchar = malloc(sizeof(expanded_argv_gchar[0])*(argc+1));
   if (err)
     {
-      fprintf(stderr, "teatimer: Unable to run command: %s\n", err->message);
+      fprintf(stderr, "teatimer: Unable to parse command: %s\n", err->message);
       g_error_free(err);
       return 0;
     }
-  g_spawn_async(NULL, argv, NULL, G_SPAWN_SEARCH_PATH, NULL, NULL, &pid, &err);
+  if(!expanded_argv_gchar) return 0;
+  for (int i=0; i<argc; i++)
+    {
+      expanded_argv[i] = g_string_new("");
+      for (int j=0; argv[i][j]; j++)
+       {
+         if (argv[i][j]=='%' && argv[i][j+1]=='%')
+           {
+             j++;
+             g_string_append_c(expanded_argv[i], '%');
+           }
+         else
+         if (argv[i][j]=='%' && argv[i][j+1]=='n')
+           {
+             j++;
+             const gchar * name = gtk_entry_get_text(GTK_ENTRY(namebox));
+             g_string_append(expanded_argv[i], name);
+           }
+         else
+           g_string_append_c(expanded_argv[i], argv[i][j]);
+       }
+      expanded_argv_gchar[i] = expanded_argv[i]->str;
+    }
+  expanded_argv_gchar[argc]=NULL;
+  g_spawn_async(NULL, expanded_argv_gchar, NULL, G_SPAWN_SEARCH_PATH, NULL, NULL, &pid, &err);
   g_strfreev(argv);
+  for (int i=0; i<argc; i++)
+    g_string_free(expanded_argv[i], 1);
   if (err)
     {
       fprintf(stderr, "teatimer: Unable to run command: %s\n", err->message);