diff options
-rw-r--r-- | libfshelp/set-active.c | 37 |
1 files changed, 36 insertions, 1 deletions
diff --git a/libfshelp/set-active.c b/libfshelp/set-active.c index af5dcc89..5cf3ec38 100644 --- a/libfshelp/set-active.c +++ b/libfshelp/set-active.c @@ -19,13 +19,48 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include "fshelp.h" +#include <hurd/fsys.h> error_t fshelp_set_active (struct transbox *box, - mach_port_t active) + mach_port_t active, + int excl, int goaway, int flags) { + error_t error; + + start_over: + if (excl && box->active != MACH_PORT_NULL) + return EBUSY; + + if (goaway && box->active != MACH_PORT_NULL) + { + fsys_t control; + + error = fshelp_fetch_control (box, &control); + if (error) + return error; + + mutex_unlock (box->lock); + error = fsys_goaway (control, flags); + mutex_lock (box->lock); + if (error) + { + mach_port_deallocate (mach_task_self (), control); + return error; + } + + /* If it changed while we were unlocked, better start over. */ + if (box->active != control) + { + mach_port_deallocate (mach_task_self (), control); + goto start_over; + } + mach_port_deallocate (mach_task_self (), control); + } + if (box->active != MACH_PORT_NULL) mach_port_deallocate (mach_task_self (), box->active); + box->active = active; return 0; } |