示例#1
0
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;
}
示例#2
0
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;
}
示例#3
0
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;
}