diff options
author | Justus Winter <4winter@informatik.uni-hamburg.de> | 2013-11-28 11:04:38 +0100 |
---|---|---|
committer | Justus Winter <4winter@informatik.uni-hamburg.de> | 2014-12-07 15:38:18 +0100 |
commit | 831a341d6b32d1005c6667e71aec9f67c3d48456 (patch) | |
tree | 4172d4ff2a58f5f2ab6c0972d64b74f311b6caa6 /libtrivfs | |
parent | 66bfd16b75e8731a3b03a99e931e100b00c0d266 (diff) |
libtrivfs: add payload-aware intrans functions
* libtrivfs/mig-decls.h (trivfs_begin_using_protid_payload): New function.
(trivfs_begin_using_control_payload): Likewise.
* libtrivfs/mig-mutate.h: Add mutators.
Diffstat (limited to 'libtrivfs')
-rw-r--r-- | libtrivfs/mig-decls.h | 58 | ||||
-rw-r--r-- | libtrivfs/mig-mutate.h | 3 |
2 files changed, 61 insertions, 0 deletions
diff --git a/libtrivfs/mig-decls.h b/libtrivfs/mig-decls.h index 2baaee86..13a9eb71 100644 --- a/libtrivfs/mig-decls.h +++ b/libtrivfs/mig-decls.h @@ -61,6 +61,35 @@ trivfs_begin_using_protid (mach_port_t port) return ports_lookup_port (0, port, trivfs_dynamic_protid_port_classes[0]); } +static inline struct trivfs_protid * __attribute__ ((unused)) +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]); +} + static inline void __attribute__ ((unused)) trivfs_end_using_protid (struct trivfs_protid *cred) { @@ -95,6 +124,35 @@ trivfs_begin_using_control (mach_port_t port) return ports_lookup_port (0, port, trivfs_dynamic_control_port_classes[0]); } +static inline struct trivfs_control * __attribute__ ((unused)) +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]); +} + static inline void __attribute__ ((unused)) trivfs_end_using_control (struct trivfs_control *cred) { diff --git a/libtrivfs/mig-mutate.h b/libtrivfs/mig-mutate.h index cc15d38d..dcbebf69 100644 --- a/libtrivfs/mig-mutate.h +++ b/libtrivfs/mig-mutate.h @@ -20,13 +20,16 @@ #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 FILE_IMPORTS import "libtrivfs/mig-decls.h"; #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 IO_IMPORTS import "libtrivfs/mig-decls.h"; #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 FSYS_IMPORTS import "libtrivfs/mig-decls.h"; |