* libtrivfs/fsmutations.h: Add mutators. * libtrivfs/migsupport.c (trivfs_begin_using_protid_payload): New function. (trivfs_begin_using_control_payload): Likewise. * libtrivfs/trivfs.h (trivfs_begin_using_protid_payload): New declaration. (trivfs_begin_using_control_payload): Likewise. --- libtrivfs/fsmutations.h | 3 +++ libtrivfs/migsupport.c | 58 +++++++++++++++++++++++++++++++++++++++++++++++ libtrivfs/trivfs.h | 2 ++ 3 files changed, 63 insertions(+)
diff --git a/libtrivfs/fsmutations.h b/libtrivfs/fsmutations.h index d81e5a8..3df0c96 100644 --- a/libtrivfs/fsmutations.h +++ b/libtrivfs/fsmutations.h @@ -20,12 +20,15 @@ #define REPLY_PORTS #define FILE_INTRAN trivfs_protid_t trivfs_begin_using_protid (file_t) +#define FILE_INTRAN_PAYLOAD trivfs_protid_t trivfs_begin_using_protid_payload #define FILE_DESTRUCTOR trivfs_end_using_protid (trivfs_protid_t) #define IO_INTRAN trivfs_protid_t trivfs_begin_using_protid (io_t) +#define IO_INTRAN_PAYLOAD trivfs_protid_t trivfs_begin_using_protid_payload #define IO_DESTRUCTOR trivfs_end_using_protid (trivfs_protid_t) #define FSYS_INTRAN trivfs_control_t trivfs_begin_using_control (fsys_t) +#define FSYS_INTRAN_PAYLOAD trivfs_control_t trivfs_begin_using_control_payload #define FSYS_DESTRUCTOR trivfs_end_using_control (trivfs_control_t) #define FILE_IMPORTS import <hurd/trivfs.h>; diff --git a/libtrivfs/migsupport.c b/libtrivfs/migsupport.c index b2d98e1..e2d3645 100644 --- a/libtrivfs/migsupport.c +++ b/libtrivfs/migsupport.c @@ -44,6 +44,35 @@ trivfs_begin_using_protid (mach_port_t port) return ports_lookup_port (0, port, trivfs_dynamic_protid_port_classes[0]); } +struct trivfs_protid * +trivfs_begin_using_protid_payload (unsigned long payload) +{ + if (trivfs_protid_nportclasses + trivfs_num_dynamic_protid_port_classes > 1) + { + struct port_info *pi = ports_lookup_payload (NULL, payload, NULL); + int i; + + if (pi) + { + for (i = 0; i < trivfs_protid_nportclasses; i++) + if (pi->class == trivfs_protid_portclasses[i]) + return (struct trivfs_protid *) pi; + for (i = 0; i < trivfs_num_dynamic_protid_port_classes; i++) + if (pi->class == trivfs_dynamic_protid_port_classes[i]) + return (struct trivfs_protid *) pi; + ports_port_deref (pi); + } + + return NULL; + } + else if (trivfs_protid_nportclasses == 1) + return ports_lookup_payload (NULL, payload, + trivfs_protid_portclasses[0]); + else + return ports_lookup_payload (NULL, payload, + trivfs_dynamic_protid_port_classes[0]); +} + void trivfs_end_using_protid (struct trivfs_protid *cred) { @@ -78,6 +107,35 @@ trivfs_begin_using_control (mach_port_t port) return ports_lookup_port (0, port, trivfs_dynamic_control_port_classes[0]); } +struct trivfs_control * +trivfs_begin_using_control_payload (unsigned long payload) +{ + if (trivfs_cntl_nportclasses + trivfs_num_dynamic_control_port_classes > 1) + { + struct port_info *pi = ports_lookup_payload (NULL, payload, NULL); + int i; + + if (pi) + { + for (i = 0; i < trivfs_cntl_nportclasses; i++) + if (pi->class == trivfs_cntl_portclasses[i]) + return (struct trivfs_control *) pi; + for (i = 0; i < trivfs_num_dynamic_control_port_classes; i++) + if (pi->class == trivfs_dynamic_control_port_classes[i]) + return (struct trivfs_control *) pi; + ports_port_deref (pi); + } + + return NULL; + } + else if (trivfs_cntl_nportclasses == 1) + return ports_lookup_payload (NULL, payload, + trivfs_cntl_portclasses[0]); + else + return ports_lookup_payload (NULL, payload, + trivfs_dynamic_control_port_classes[0]); +} + void trivfs_end_using_control (struct trivfs_control *cred) { diff --git a/libtrivfs/trivfs.h b/libtrivfs/trivfs.h index cf817b5..f560660 100644 --- a/libtrivfs/trivfs.h +++ b/libtrivfs/trivfs.h @@ -40,6 +40,7 @@ struct trivfs_protid /* These can be used as `intran' and `destructor' functions for a MiG port type, to have the stubs called with the protid pointer. */ struct trivfs_protid *trivfs_begin_using_protid (mach_port_t); +struct trivfs_protid *trivfs_begin_using_protid_payload (unsigned long); void trivfs_end_using_protid (struct trivfs_protid *); struct trivfs_peropen @@ -65,6 +66,7 @@ struct trivfs_control /* These can be used as `intran' and `destructor' functions for a MiG port type, to have the stubs called with the control pointer. */ struct trivfs_control *trivfs_begin_using_control (mach_port_t); +struct trivfs_control *trivfs_begin_using_control_payload (unsigned long); void trivfs_end_using_control (struct trivfs_control *); -- 1.7.10.4