summaryrefslogtreecommitdiff
path: root/libfshelp
diff options
context:
space:
mode:
Diffstat (limited to 'libfshelp')
-rw-r--r--libfshelp/fshelp.h10
-rw-r--r--libfshelp/translator-list.c43
2 files changed, 17 insertions, 36 deletions
diff --git a/libfshelp/fshelp.h b/libfshelp/fshelp.h
index 7663ba1d..e8ce9733 100644
--- a/libfshelp/fshelp.h
+++ b/libfshelp/fshelp.h
@@ -55,12 +55,6 @@ fshelp_set_active_translator (struct port_info *pi,
error_t
fshelp_remove_active_translator (mach_port_t active);
-/* This kind of function is used by fshelp_get_active_translators to
- filter the list of translators to return. If a filter returns an
- error for a given PATH, the translator bound to the PATH is not
- included in the list. */
-typedef error_t (*fshelp_filter) (const char *path);
-
/* Records the list of active translators below PREFIX into the argz
vector specified by TRANSLATORS filtered by FILTER. If PREFIX is
NULL, entries with any prefix are considered. If FILTER is NULL,
@@ -68,8 +62,8 @@ typedef error_t (*fshelp_filter) (const char *path);
error_t
fshelp_get_active_translators (char **translators,
size_t *translators_len,
- fshelp_filter filter,
- const char *prefix);
+ mach_port_t **controls,
+ size_t *controls_count);
/* Call FUN for each active translator. If FUN returns non-zero, the
iteration immediately stops, and returns that value. FUN is called
diff --git a/libfshelp/translator-list.c b/libfshelp/translator-list.c
index 7077b217..92b31dd0 100644
--- a/libfshelp/translator-list.c
+++ b/libfshelp/translator-list.c
@@ -198,45 +198,32 @@ fshelp_remove_active_translator (mach_port_t active)
error_t
fshelp_get_active_translators (char **translators,
size_t *translators_len,
- fshelp_filter filter,
- const char *prefix)
+ mach_port_t **controls,
+ size_t *controls_count)
{
error_t err = 0;
pthread_mutex_lock (&translator_ihash_lock);
- if (prefix && strlen (prefix) == 0)
- prefix = NULL;
+ *controls = calloc (translator_ihash.nr_items, sizeof **controls);
+ if (*controls == NULL)
+ {
+ pthread_mutex_unlock (&translator_ihash_lock);
+ return ENOMEM;
+ }
+ *controls_count = 0;
HURD_IHASH_ITERATE (&translator_ihash, value)
{
struct translator *t = value;
- if (prefix != NULL
- && (strncmp (t->name, prefix, strlen (prefix)) != 0
- || t->name[strlen (prefix)] != '/'))
- /* Skip this entry, as it is not below PREFIX. */
+ err = mach_port_mod_refs (mach_task_self (), t->active,
+ MACH_PORT_RIGHT_SEND, +1);
+ if (err)
continue;
+ (*controls)[*controls_count] = t->active;
+ (*controls_count)++;
- if (filter)
- {
- char *dir = strdup (t->name);
- if (! dir)
- {
- err = ENOMEM;
- break;
- }
-
- err = filter (dirname (dir));
- free (dir);
- if (err)
- {
- err = 0;
- continue; /* Skip this entry. */
- }
- }
-
- err = argz_add (translators, translators_len,
- &t->name[prefix? strlen (prefix) + 1: 0]);
+ err = argz_add (translators, translators_len, t->name);
if (err)
break;
}