/* Do not remove the headers from this file! see /USAGE for more info. */


#pragma save_types

#include <security.h>
#include <driver/origin.h>

private nosave mixed privilege;
private nosave mixed unguarded_privilege;
private nosave mixed *security_handle;

nomask protected void set_privilege(mixed priv)
{
  if (origin() != ORIGIN_LOCAL)
    return;
  if (file_name(this_object())==SECURE_D)
  {
    privilege = priv;
    return;
  }
  if (!SECURE_D->valid_privilege(priv))
    return;
  privilege =
  SECURE_D->reduced_privilege(priv,SECURE_D->query_protection(this_object(),1));
}

nomask mixed query_privilege()
{
  return privilege;
}

nomask mixed query_unguarded_privilege()
{
  return unguarded_privilege;
}

nomask int verify_privilege_granted(mixed *handle)
{
  return security_handle == handle;
}

nomask varargs protected mixed unguarded(mixed priv,function code)
{
  if (origin() != ORIGIN_LOCAL)
    return 0;
  unguarded_privilege = priv;
  return SECURE_D->call_unguarded(code,security_handle=allocate(1));
}

/* Do not remove the headers from this file! see /USAGE for more info. */
