DirectResult fusion_call_add_permissions( FusionCall *call, FusionID fusion_id, FusionCallPermissions call_permissions ) { FusionEntryPermissions permissions; permissions.type = FT_CALL; permissions.id = call->call_id; permissions.fusion_id = fusion_id; permissions.permissions = 0; if (call_permissions & FUSION_CALL_PERMIT_EXECUTE) { FUSION_ENTRY_PERMISSIONS_ADD( permissions.permissions, FUSION_CALL_EXECUTE ); FUSION_ENTRY_PERMISSIONS_ADD( permissions.permissions, FUSION_CALL_EXECUTE2 ); FUSION_ENTRY_PERMISSIONS_ADD( permissions.permissions, FUSION_CALL_EXECUTE3 ); } while (ioctl( _fusion_fd( call->shared ), FUSION_ENTRY_ADD_PERMISSIONS, &permissions ) < 0) { if (errno != EINTR) { D_PERROR( "Fusion/Call: FUSION_ENTRY_ADD_PERMISSIONS( id %d ) failed!\n", call->call_id ); return DR_FAILURE; } } return DR_OK; }
DirectResult fusion_skirmish_add_permissions( FusionSkirmish *skirmish, FusionID fusion_id, FusionSkirmishPermissions skirmish_permissions ) { FusionEntryPermissions permissions; if (skirmish->single) return DR_OK; permissions.type = FT_SKIRMISH; permissions.id = skirmish->multi.id; permissions.fusion_id = fusion_id; permissions.permissions = 0; if (skirmish_permissions & FUSION_SKIRMISH_PERMIT_PREVAIL) FUSION_ENTRY_PERMISSIONS_ADD( permissions.permissions, FUSION_SKIRMISH_PREVAIL ); if (skirmish_permissions & FUSION_SKIRMISH_PERMIT_SWOOP) FUSION_ENTRY_PERMISSIONS_ADD( permissions.permissions, FUSION_SKIRMISH_SWOOP ); if (skirmish_permissions & FUSION_SKIRMISH_PERMIT_DISMISS) FUSION_ENTRY_PERMISSIONS_ADD( permissions.permissions, FUSION_SKIRMISH_DISMISS ); if (skirmish_permissions & FUSION_SKIRMISH_PERMIT_LOCK_COUNT) FUSION_ENTRY_PERMISSIONS_ADD( permissions.permissions, FUSION_SKIRMISH_LOCK_COUNT ); if (skirmish_permissions & FUSION_SKIRMISH_PERMIT_WAIT) FUSION_ENTRY_PERMISSIONS_ADD( permissions.permissions, FUSION_SKIRMISH_WAIT ); if (skirmish_permissions & FUSION_SKIRMISH_PERMIT_NOTIFY) FUSION_ENTRY_PERMISSIONS_ADD( permissions.permissions, FUSION_SKIRMISH_NOTIFY ); if (skirmish_permissions & FUSION_SKIRMISH_PERMIT_DESTROY) FUSION_ENTRY_PERMISSIONS_ADD( permissions.permissions, FUSION_SKIRMISH_DESTROY ); while (ioctl( _fusion_fd( skirmish->multi.shared ), FUSION_ENTRY_ADD_PERMISSIONS, &permissions ) < 0) { if (errno != EINTR) { D_PERROR( "Fusion/Reactor: FUSION_ENTRY_ADD_PERMISSIONS( id %d ) failed!\n", skirmish->multi.id ); return DR_FAILURE; } } return DR_OK; }
DirectResult fusion_ref_add_permissions( FusionRef *ref, FusionID fusion_id, FusionRefPermissions ref_permissions ) { FusionEntryPermissions permissions; permissions.type = FT_REF; permissions.id = ref->multi.id; permissions.fusion_id = fusion_id; permissions.permissions = 0; if (ref_permissions & FUSION_REF_PERMIT_REF_UNREF_LOCAL) { FUSION_ENTRY_PERMISSIONS_ADD( permissions.permissions, FUSION_REF_UP ); FUSION_ENTRY_PERMISSIONS_ADD( permissions.permissions, FUSION_REF_DOWN ); } if (ref_permissions & FUSION_REF_PERMIT_REF_UNREF_GLOBAL) { FUSION_ENTRY_PERMISSIONS_ADD( permissions.permissions, FUSION_REF_UP_GLOBAL ); FUSION_ENTRY_PERMISSIONS_ADD( permissions.permissions, FUSION_REF_DOWN_GLOBAL ); } if (ref_permissions & FUSION_REF_PERMIT_ZERO_LOCK_UNLOCK) { FUSION_ENTRY_PERMISSIONS_ADD( permissions.permissions, FUSION_REF_ZERO_LOCK ); FUSION_ENTRY_PERMISSIONS_ADD( permissions.permissions, FUSION_REF_ZERO_TRYLOCK ); FUSION_ENTRY_PERMISSIONS_ADD( permissions.permissions, FUSION_REF_UNLOCK ); } if (ref_permissions & FUSION_REF_PERMIT_WATCH) FUSION_ENTRY_PERMISSIONS_ADD( permissions.permissions, FUSION_REF_WATCH ); if (ref_permissions & FUSION_REF_PERMIT_INHERIT) FUSION_ENTRY_PERMISSIONS_ADD( permissions.permissions, FUSION_REF_INHERIT ); if (ref_permissions & FUSION_REF_PERMIT_DESTROY) FUSION_ENTRY_PERMISSIONS_ADD( permissions.permissions, FUSION_REF_DESTROY ); if (ref_permissions & FUSION_REF_PERMIT_CATCH) FUSION_ENTRY_PERMISSIONS_ADD( permissions.permissions, FUSION_REF_CATCH ); if (ref_permissions & FUSION_REF_PERMIT_THROW) FUSION_ENTRY_PERMISSIONS_ADD( permissions.permissions, FUSION_REF_THROW ); while (ioctl( _fusion_fd( ref->multi.shared ), FUSION_ENTRY_ADD_PERMISSIONS, &permissions ) < 0) { if (errno != EINTR) { D_PERROR( "Fusion/Reactor: FUSION_ENTRY_ADD_PERMISSIONS( id %d ) failed!\n", ref->multi.id ); return DR_FAILURE; } } return DR_OK; }