summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libfshelp/set-active.c37
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;
}