diff options
author | Michael I. Bushnell <mib@gnu.org> | 1995-06-19 21:17:18 +0000 |
---|---|---|
committer | Michael I. Bushnell <mib@gnu.org> | 1995-06-19 21:17:18 +0000 |
commit | 09e20e8fcfcc45ed18cf1ca9e6738c82bd1f9dce (patch) | |
tree | a880146b7dc669dd387d515af61aefd1d918783c | |
parent | a272d55adc5b7e5dbae536a59a5c5c6e6d73c6bb (diff) |
(fshelp_set_active): Implement new interface.
-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; } |