Пример #1
0
GList *
verve_env_get_path_binaries (VerveEnv *env)
{
  if (G_UNLIKELY (env->binaries == NULL))
    {
      gchar **paths;
      int     i;
      
      /* Get $PATH directories */
      paths = verve_env_get_path (env);
      
      /* Iterate over paths list */
      for (i=0; i<g_strv_length (paths); i++)
      {
        GError *error = NULL;

        /* Try opening the directory */
        GDir *dir = g_dir_open (paths[i], 0, &error);

        /* Skip directory when errors have occured */
        if (G_LIKELY (error == NULL))
          {
            const gchar *current;

            /* Iterate over files in this directory */
            while ((current = g_dir_read_name (dir)) != NULL)
              {
                /* Add file filename to the list */
                env->binaries = g_list_prepend (env->binaries, g_strdup (current));
              }

            /* Close directory */
            g_dir_close (dir);
          }
        else
          g_error_free (error);
      }
    }

  return env->binaries;
}
Пример #2
0
static gpointer
verve_env_load_thread (gpointer user_data)
{
  VerveEnv *env = VERVE_ENV (user_data);
  gchar   **paths;
  int       i;
  
  /* Get $PATH directories */
  paths = verve_env_get_path (env);
  
  /* Iterate over paths list */
  for (i=0; !env->load_thread_cancelled && i<g_strv_length (paths); i++)
  {
    const gchar *current;
    gchar       *filename;
    GList       *lp;
    /* Try opening the directory */
    GDir *dir = g_dir_open (paths[i], 0, NULL);

    /* Continue with next directory if this one cant' be opened */
    if (G_UNLIKELY (dir == NULL)) 
      continue;

    /* Iterate over files in this directory */
    while (!env->load_thread_cancelled && (current = g_dir_read_name (dir)) != NULL)
      {
        /* Convert to valid UTF-8 */
        filename = g_filename_display_name (current);

        /* Avoid duplicates */
        for (lp = g_list_first (env->binaries); lp != NULL; lp = lp->next)
          if (g_ascii_strcasecmp (lp->data, filename) == 0)
            break;
       
        /* Check details of file if it's not in the list already */
        if (G_LIKELY (lp == NULL))
          {
            /* Determine the absolute path to the file */
            gchar *path = g_build_filename (paths[i], current, NULL);

            /* Check if the path refers to an executable */
            if (g_file_test (path, G_FILE_TEST_IS_EXECUTABLE) &&
                !g_file_test (path, G_FILE_TEST_IS_DIR))
              {
                /* Add file filename to the list */
                env->binaries = g_list_prepend (env->binaries, filename);

                /* No need to free the filename later in this function */
                filename = NULL;
              }

            /* Free absolute path */
            g_free (path);
          }

        /* Release filename if necessary */
        g_free (filename);
      }

    /* Close directory */
    g_dir_close (dir);
  }

  /* Sort binaries */
  env->binaries = g_list_sort (env->binaries, (GCompareFunc) g_utf8_collate);

  /* Emit 'load-binaries' signal */
  g_signal_emit_by_name (env, "load-binaries");

  return env->binaries;
}