summaryrefslogtreecommitdiff
path: root/libfshelp/fshelp.h
diff options
context:
space:
mode:
Diffstat (limited to 'libfshelp/fshelp.h')
-rw-r--r--libfshelp/fshelp.h51
1 files changed, 32 insertions, 19 deletions
diff --git a/libfshelp/fshelp.h b/libfshelp/fshelp.h
index 80d94de4..ab12ffe9 100644
--- a/libfshelp/fshelp.h
+++ b/libfshelp/fshelp.h
@@ -34,6 +34,13 @@
returning the control port. They do not require multi threading
or the ports library. */
+/* A callback used by the translator starting functions, which should be a
+ function that given some open flags, opens the appropiate file, and
+ returns the node port. */
+typedef error_t (*fshelp_open_fn_t) (int flags,
+ file_t *node,
+ mach_msg_type_name_t *node_type);
+
/* Start a passive translator NAME with arguments ARGZ (length
ARGZ_LEN). Initialize the initports to PORTS (length PORTS_LEN),
the initints to INTS (length INTS_LEN), and the file descriptor
@@ -42,8 +49,7 @@
milliseconds (if TIMEOUT > 0), return an appropriate error. If the
translator dies before responding, return EDIED. */
error_t
-fshelp_start_translator_long (mach_port_t underlying,
- mach_msg_type_name_t underlying_type,
+fshelp_start_translator_long (fshelp_open_fn_t underlying_open_fn,
char *name, char *argz, int argz_len,
mach_port_t *fds,
mach_msg_type_name_t fds_type, int fds_len,
@@ -57,8 +63,7 @@ fshelp_start_translator_long (mach_port_t underlying,
are copied from our own state, fd[2] is copied from our own stderr,
and the other fds are cleared. */
error_t
-fshelp_start_translator (mach_port_t underlying,
- mach_msg_type_name_t underlying_type,
+fshelp_start_translator (fshelp_open_fn_t underlying_open_fn,
char *name, char *argz, int argz_len,
int timeout, fsys_t *control);
@@ -86,20 +91,26 @@ struct transbox
fshelp_fetch_root should not need to create them on every call, since
usually there will be an existing active translator. */
-/* This routine is called by fshelp_fetch_root to fetch more
- information. Return the owner and group of the underlying
- translated file in *UID and *GID; return an unauthenticated
- node for the file itself in *UNDERLYING, and point *ARGZ at
- the entire passive translator spec for the file (setting
- *ARGZ_LEN to the length.) If there is no passive
- translator, then return ENOENT. COOKIE1 is the cookie passed
- in fshelp_transbox_init. COOKIE2 is the cookie passed in the
- call to fshelp_fetch_root. */
-typedef error_t (*fshelp_callback_t) (void *cookie1, void *cookie2,
- mach_port_t *underlying,
- uid_t *uid, gid_t *gid,
- char **argz, int *argz_len);
-
+/* This routine is called by fshelp_fetch_root to fetch more information.
+ Return the owner and group of the underlying translated file in *UID and
+ *GID; point *ARGZ at the entire passive translator spec for the file
+ (setting *ARGZ_LEN to the length.) If there is no passive translator,
+ then return ENOENT. COOKIE1 is the cookie passed in fshelp_transbox_init.
+ COOKIE2 is the cookie passed in the call to fshelp_fetch_root. */
+typedef error_t (*fshelp_fetch_root_callback1_t) (void *cookie1, void *cookie2,
+ uid_t *uid, gid_t *gid,
+ char **argz, int *argz_len);
+
+/* This routine is called by fshelp_fetch_root to fetch more information.
+ Return an unauthenticated node for the file itself in *UNDERLYING and
+ *UNDERLYING_TYPE (opened with FLAGS). COOKIE1 is the cookie passed in
+ fshelp_transbox_init. COOKIE2 is the cookie passed in the call to
+ fshelp_fetch_root. */
+typedef error_t (*fshelp_fetch_root_callback2_t) (void *cookie1, void *cookie2,
+ int flags,
+ mach_port_t *underlying,
+ mach_msg_type_name_t
+ *underlying_type);
/* Fetch the root from TRANSBOX. DOTDOT is an unauthenticated port
for the directory in which we are looking; UIDS (length UIDS_LEN)
@@ -114,7 +125,9 @@ fshelp_fetch_root (struct transbox *transbox, void *cookie,
file_t dotdot,
uid_t *uids, int uids_len,
uid_t *gids, int gids_len,
- int flags, fshelp_callback_t callback,
+ int flags,
+ fshelp_fetch_root_callback1_t callback1,
+ fshelp_fetch_root_callback2_t callback2,
retry_type *retry, char *retryname, mach_port_t *root);
void