DCE-Perl

 view release on metacpan or  search on metacpan

Registry/Registry.xs  view on Meta::CPAN

      svp = hv_true_fetch(hv, "flags", 5, 1); \
      if(svp) user_part.flags = SvIV(*svp); \
    }

/*  pgo_item.id = uuid_struct; \ */

#define FETCH_PGO_ITEM \
  memset(&pgo_item, 0, sizeof(pgo_item)); \
  if (SvOK(hash_ref)) { \
    info = (HV*)SvRV(hash_ref);  \
    svp = hv_true_fetch(info, "unix_num", 8, 1); \
    if(svp) pgo_item.unix_num = (signed32 )SvIV(*svp); \
    svp = hv_true_fetch(info, "quota", 5, 1); \
    if(svp) pgo_item.quota = (signed32 )SvIV(*svp); \
    svp = hv_true_fetch(info, "flags", 5, 1); \
    if(svp) pgo_item.flags = (sec_rgy_pgo_flags_t )SvIV(*svp); \
    svp = hv_true_fetch(info, "fullname", 8, 1); \
    if(svp) strncpy(pgo_item.fullname, (char *)SvPV(*svp,PL_na), 256); \
    svp = hv_true_fetch(info, "id", 2, 1); \
    if(svp) UUIDmagic_sv(pgo_item.id, *svp); \
  }

/*   BLESS_UUID(pgo_item.id); \   */

#define STORE_PGO_ITEM \
   iniHV; \
   hv_store(hv,"quota",5,newSViv((IV)pgo_item.quota),0); \
   hv_store(hv,"unix_num",8,newSViv((IV)pgo_item.unix_num),0); \
   hv_store(hv,"flags",5,newSViv((IV)pgo_item.flags),0); \
   hv_store(hv,"fullname", 8, newSVpv(pgo_item.fullname,0),0); \
   {\
       unsigned_char_t *uuid_str; \
       error_status_t  uuid_str_status; \
       uuid_to_string(&pgo_item.id, &uuid_str, &uuid_str_status); \
       uuid_sv = newSVpv(uuid_str, 0); \
       hv_store(hv, "id", 2, (SV*)uuid_sv, 0); \
       rpc_string_free(&uuid_str, &uuid_str_status); \
   } \
   rv = newRV((SV*)hv)

#define STORE_POLICY_DATA \
   iniHV; \
   hv_store(hv,"passwd_min_len",14,newSViv(policy_data.passwd_min_len),0); \
   hv_store(hv,"passwd_lifetime",15,newSViv(policy_data.passwd_lifetime),0); \
   hv_store(hv,"passwd_exp_date",15,newSViv(policy_data.passwd_exp_date),0); \
   hv_store(hv,"acct_lifespan",13,newSViv(policy_data.acct_lifespan),0); \
   hv_store(hv,"passwd_flags",12,newSViv(policy_data.passwd_flags),0); \
   XPUSHs(newRV((SV*)hv)); \
   DCESTATUS

typedef sec_rgy_login_name_t * DCE__login_name;

MODULE = DCE::Registry  PACKAGE = DCE::Registry  PREFIX = sec_rgy_
PROTOTYPES: DISABLE

void
sec_rgy_DESTROY(rgy_context)
  DCE::Registry	rgy_context
   
    
  PPCODE:
  {
    error_status_t	status = error_status_ok;
    if (rgy_context != sec_rgy_default_handle)
      sec_rgy_site_close(rgy_context, &status);
    DCESTATUS;
  }

void
sec_rgy_site_default(package="DCE::Registry")
  char * package;
  
  PPCODE:
  {
    sec_rgy_handle_t rgy_context = sec_rgy_default_handle;
    error_status_t status = error_status_ok;

    SV *sv = sv_newmortal();
    sv_setref_iv(sv,package,(int)rgy_context);
    XPUSHs(sv);
    DCESTATUS;
  }

void
sec_rgy_site_bind(package="DCE::Registry",site_name="",hash_ref=&PL_sv_undef)
  char *	package
  char *	site_name
  SV *	hash_ref

  PPCODE:
  {
  sec_rgy_handle_t	rgy_context; 
  error_status_t	status; 
  STRLEN len; 
  sec_rgy_bind_auth_info_t	auth_info; 
  SV *sv; 
  SV **svp;
  HV *stash, *info; 
  
  FETCH_AUTH_INFO;
  sec_rgy_site_bind(site_name, &auth_info, &rgy_context, &status);
  BLESS_RGY_CONTEXT;
  }

void
sec_rgy_cell_bind(package="DCE::Registry",cell_name="",hash_ref=&PL_sv_undef)
  char *	package
  char *	cell_name
  SV *	hash_ref

  PPCODE:
  {
  sec_rgy_handle_t	rgy_context; 
  error_status_t	status; 
  STRLEN len; 
  sec_rgy_bind_auth_info_t	auth_info; 
  SV *sv; 
  SV **svp;
  HV *stash, *info; 
  
  FETCH_AUTH_INFO;
  sec_rgy_site_bind(cell_name, &auth_info, &rgy_context, &status);
  BLESS_RGY_CONTEXT;
  }


void
sec_rgy_site_bind_query(package="DCE::Registry",site_name="",hash_ref=&PL_sv_undef)
  char *	package
  char *	site_name
  SV *	hash_ref

  PPCODE:
  {
  sec_rgy_handle_t	rgy_context; 
  error_status_t	status; 
  STRLEN len; 
  sec_rgy_bind_auth_info_t	auth_info; 
  SV *sv; 
  SV **svp;
  HV *stash, *info; 
  
  FETCH_AUTH_INFO;
  sec_rgy_site_bind_query(site_name, &auth_info, &rgy_context, &status);
  BLESS_RGY_CONTEXT;
  }

void
sec_rgy_site_bind_update(package="DCE::Registry",site_name="",hash_ref=&PL_sv_undef)
  char *	package
  char *	site_name
  SV *	hash_ref

  PPCODE:
  {
  sec_rgy_handle_t	rgy_context; 
  error_status_t	status; 
  STRLEN len; 
  sec_rgy_bind_auth_info_t	auth_info; 
  SV *sv; 
  SV **svp;
  HV *stash, *info; 
  
  FETCH_AUTH_INFO;
  sec_rgy_site_bind_update(site_name, &auth_info, &rgy_context, &status);
  BLESS_RGY_CONTEXT;
  }


void
sec_rgy_site_open(package="DCE::Registry",site_name="")
  char *	package
  char *	site_name

  PPCODE:
  {
    sec_rgy_handle_t	rgy_context; 
    error_status_t	status; 
    HV *stash;
    SV *sv;

    sec_rgy_site_open(site_name, &rgy_context, &status);
    BLESS_RGY_CONTEXT;
  }

void
sec_rgy_site_open_query(package="DCE::Registry",site_name="")
  char *	package
  char *	site_name

  PPCODE:
  {
    sec_rgy_handle_t	rgy_context; 
    error_status_t	status; 
    HV *stash;
    SV *sv;

    sec_rgy_site_open_query(site_name, &rgy_context, &status);
    BLESS_RGY_CONTEXT;
  }

void
sec_rgy_site_open_update(package="DCE::Registry",site_name="")
  char *	package
  char *	site_name

  PPCODE:
  {
    sec_rgy_handle_t	rgy_context; 
    error_status_t	status; 
    HV *stash;
    SV *sv;

    sec_rgy_site_open_update(site_name, &rgy_context, &status); 
    BLESS_RGY_CONTEXT;
  }

void
sec_rgy_site_binding_get_info(rgy_context)
  DCE::Registry	rgy_context

  PPCODE:
  {
    sec_rgy_bind_auth_info_t auth_info;
    unsigned_char_t *	cell_name;
    unsigned_char_t *	server_name;
    unsigned_char_t *	string_binding;
    error_status_t	status;
    STRLEN len;

    sec_rgy_site_binding_get_info(rgy_context, &cell_name, 
		&server_name, &string_binding, &auth_info, &status);

    CHK_STS(3);

    if(WANTARRAY) {
	EXTEND(sp, 3);
	PUSHs_pv(cell_name);
	PUSHs_pv(server_name);
	PUSHs_pv(string_binding);
	DCESTATUS;
    }
    else
	PUSHs_pv(cell_name);
  }

unsigned_char_t *
sec_rgy_site_get(rgy_context)
  DCE::Registry		rgy_context

  PPCODE:
  {
    unsigned_char_t * site_name;
    error_status_t status;

    sec_rgy_site_get(rgy_context, &site_name, &status);

    XPUSHs_pv(site_name);
    if(WANTARRAY)
	DCESTATUS;
  }

void
sec_rgy_site_close(rgy_context)
  DCE::Registry	rgy_context

  PPCODE:
  {
    error_status_t	status;
    sec_rgy_site_close(rgy_context, &status);
    DCESTATUS;
  }

boolean32
sec_rgy_site_is_readonly(rgy_context)
  DCE::Registry	rgy_context

  CODE:
  {
    RETVAL=sec_rgy_site_is_readonly(rgy_context);
  }

  OUTPUT:
  RETVAL

void
sec_rgy_pgo_unix_num_to_id(rgy_context, domain, unix_num)
  DCE::Registry	rgy_context
  sec_rgy_domain_t	domain
  long	unix_num

  PPCODE:
  {
   uuid_t uuid_struct;
   error_status_t status;
   SV *uuid_sv;

   sec_rgy_pgo_unix_num_to_id(rgy_context, domain, unix_num, 
			       &uuid_struct, &status);

   BLESS_UUID_mortal(uuid_struct);
   XPUSHs(uuid_sv); 

    if(WANTARRAY) 
	DCESTATUS;
  }

void
sec_rgy_pgo_unix_num_to_name(rgy_context, domain, unix_num)
  DCE::Registry	rgy_context
  sec_rgy_domain_t	domain
  long	unix_num

  PPCODE:
  {
    char *	name;
    error_status_t	status;
    name = (char *) malloc(sizeof(char)* 1025);
    sec_rgy_pgo_unix_num_to_name(rgy_context, domain, unix_num, name, &status);
    XPUSHs_pv(name);

    if(WANTARRAY) 
	DCESTATUS;
  }

void
sec_rgy_pgo_id_to_unix_num(rgy_context, domain, uuid)
  DCE::Registry	rgy_context
  sec_rgy_domain_t	domain
  SV  *uuid

  PPCODE:
  {
    uuid_t  uuid_struct;
    error_status_t	uuid_status;
    signed32	unix_id;
    error_status_t	status;

    UUIDmagic_sv(uuid_struct, uuid);
    sec_rgy_pgo_id_to_unix_num(rgy_context, domain, &uuid_struct, 
			       &unix_id, &status);
    XPUSHs_iv(unix_id);

    if(WANTARRAY) 
	DCESTATUS;
  }

void
sec_rgy_pgo_id_to_name(rgy_context, domain, item_id)
  DCE::Registry		rgy_context
  sec_rgy_domain_t	domain
  SV *item_id

  PPCODE:
  {
    error_status_t	status;
    uuid_t              uuid;
    sec_rgy_name_t	pgo_name;
    sec_rgy_name_t      retval;

    UUIDmagic_sv(uuid, item_id);
    sec_rgy_pgo_id_to_name(rgy_context, domain, &uuid, pgo_name, &status);
    strncpy(retval, pgo_name, 1024); 

    XPUSHs_pv(retval);
    if(WANTARRAY) 
	DCESTATUS;	
  }

void
sec_rgy_pgo_name_to_unix_num(rgy_context, domain, name)
  DCE::Registry	rgy_context
  sec_rgy_domain_t	domain
  char *	name

  PPCODE:
  {
    signed32	unix_id;
    error_status_t	status;

    sec_rgy_pgo_name_to_unix_num(rgy_context, domain, name, &unix_id, &status);

    XPUSHs(newSViv(unix_id));
    if(WANTARRAY) 
	DCESTATUS;
  }

void
sec_rgy_pgo_name_to_id(rgy_context, domain, name)
  DCE::Registry		rgy_context
  sec_rgy_domain_t	domain
  char *	name

  PPCODE:
  {
    uuid_t	uuid_struct;
    error_status_t	status;
    SV *uuid_sv;
    sec_rgy_pgo_name_to_id(rgy_context, domain, name, &uuid_struct, &status);

    BLESS_UUID_mortal(uuid_struct);
    XPUSHs(uuid_sv); 
    if(WANTARRAY) 
	DCESTATUS;
  }

void
sec_rgy_pgo_add(rgy_context, domain, name, hash_ref)
  DCE::Registry	rgy_context
  sec_rgy_domain_t	domain
  char *	name
  SV *hash_ref

  PPCODE:
  {
    error_status_t	status;
    sec_rgy_pgo_item_t  pgo_item;
    SV **svp;     
    HV *info; 

    FETCH_PGO_ITEM;
    sec_rgy_pgo_add(rgy_context, domain, name, &pgo_item, &status);
    DCESTATUS;
  }

void
sec_rgy_pgo_replace(rgy_context, domain, name, hash_ref)
  DCE::Registry	rgy_context
  sec_rgy_domain_t	domain
  char *	name
  SV *hash_ref

  PPCODE:
  {
    error_status_t	status;
    sec_rgy_pgo_item_t  pgo_item;
    SV **svp;     
    HV *info; 

    FETCH_PGO_ITEM;
    sec_rgy_pgo_replace(rgy_context, domain, name, &pgo_item, &status);
    DCESTATUS;
  }

void
sec_rgy_pgo_rename(rgy_context, domain, old_name, new_name)
  DCE::Registry	rgy_context
  sec_rgy_domain_t	domain
  char *	old_name
  char *	new_name

  PPCODE:
  {
    sec_rgy_name_t  old_pgo_name, new_pgo_name;
    error_status_t	status;    

    strncpy(old_pgo_name, old_name, 1024);
    strncpy(new_pgo_name, new_name, 1024);

    sec_rgy_pgo_rename(rgy_context,domain,old_pgo_name,new_pgo_name,&status);
    DCESTATUS;
  }

void
sec_rgy_pgo_delete(rgy_context, domain, name)
  DCE::Registry	rgy_context
  sec_rgy_domain_t	domain
  char *	name

  PPCODE:
  {
    error_status_t	status;

    sec_rgy_pgo_delete(rgy_context, domain, name, &status);
    DCESTATUS;
  }

void
sec_rgy_pgo_add_member(rgy_context, domain, name, person)
  DCE::Registry	rgy_context
  sec_rgy_domain_t	domain
  char *	name
  char *	person

  PPCODE:
  {
    sec_rgy_name_t	go_name;
    sec_rgy_name_t	person_name;
    error_status_t	status;

    strncpy(go_name, name, 1025);
    strncpy(person_name, person, 1025);

    sec_rgy_pgo_add_member(rgy_context, domain, go_name, person_name, &status);
    DCESTATUS;
  }

void
sec_rgy_pgo_delete_member(rgy_context, domain, name, person)
  DCE::Registry	rgy_context
  sec_rgy_domain_t	domain
  char *	name
  char *	person

  PPCODE:
  {
    sec_rgy_name_t	go_name;
    sec_rgy_name_t	person_name;
    error_status_t	status;

    strncpy(go_name, name, 1025);
    strncpy(person_name, person, 1025);

    sec_rgy_pgo_delete_member(rgy_context, domain, go_name, person_name, &status);
    DCESTATUS;
  }

void
sec_rgy_cursor_reset(rgy_context, cursor)
  DCE::Registry	rgy_context
  DCE::RegistryCursor	cursor

  CODE:
  {
    sec_rgy_cursor_reset(cursor);
  }

void
sec_rgy_create_cursor(rgy_context, cursor)
  DCE::Registry	rgy_context
  SV *	cursor

  CODE:
  {
    sec_rgy_cursor_t *rgy_cursor;
    rgy_cursor = malloc(sizeof(sec_rgy_cursor_t));
    sv_setref_pv((SV*)cursor, "DCE::RegistryCursor", (void *)rgy_cursor);
  }

DCE::RegistryCursor
sec_rgy_cursor(rgy_context)
  SV *	rgy_context

  CODE:
  {
    sec_rgy_cursor_t *rgy_cursor;
    rgy_cursor = malloc(sizeof(sec_rgy_cursor_t));
    RETVAL = rgy_cursor;
  }

  OUTPUT:
  RETVAL

void
sec_rgy_pgo_get_next(rgy_context, domain, scope, item_cursor)
  DCE::Registry	rgy_context
  sec_rgy_domain_t	domain
  char *	scope
  DCE::RegistryCursor	item_cursor

  PPCODE:
  {
    error_status_t	status;
    sec_rgy_pgo_item_t  pgo_item;
    uuid_t  uuid_struct;
    sec_rgy_name_t	pgo_name;
    SV *rv, *uuid_sv;
    HV *hv;

    sec_rgy_pgo_get_next(rgy_context, domain, scope, item_cursor, &pgo_item, pgo_name, &status);

    EXTEND(sp, 2);

    if (!status) {
      STORE_PGO_ITEM;
      PUSHs((SV*)rv);
      PUSHs_pv(pgo_name);
    }
    else {
      PUSHs_iv(0);
      PUSHs_iv(0);
    }
    DCESTATUS;
  }

void
sec_rgy_pgo_is_member(rgy_context, domain, name, person)
  DCE::Registry	rgy_context
  sec_rgy_domain_t	domain
  char *	name
  char *	person

  PPCODE:
  {
    sec_rgy_name_t	go_name;
    sec_rgy_name_t	person_name;
    boolean32           is_mem;
    error_status_t	status;

    strncpy(go_name, name, 1025);
    strncpy(person_name, person, 1025);

    is_mem = sec_rgy_pgo_is_member(rgy_context, domain, 
				   go_name, person_name, &status);
    XPUSHs_iv(is_mem);
    DCESTATUS;
  }

void
sec_rgy_pgo_get_by_name(rgy_context, domain, name, item_cursor)
  DCE::Registry	rgy_context
  sec_rgy_domain_t	domain
  char *	name
  DCE::RegistryCursor 	item_cursor

  PPCODE:
  {
    error_status_t	status;
    sec_rgy_pgo_item_t  pgo_item;
    uuid_t  uuid_struct;
    SV *rv, *uuid_sv;
    HV *hv;

    sec_rgy_pgo_get_by_name(rgy_context, domain, name, (sec_rgy_cursor_t *)item_cursor, &pgo_item, &status);

    if (!status) {
      STORE_PGO_ITEM;
      XPUSHs((SV*)rv);
    }
    else
      XPUSHs_iv(0);

    DCESTATUS;
  }

void
sec_rgy_pgo_get_by_unix_num(rgy_context, domain, scope, unix_id, allow_aliases, cursor)
  DCE::Registry	rgy_context
  sec_rgy_domain_t	domain
  char *	scope
  signed32	unix_id
  boolean32	allow_aliases
  DCE::RegistryCursor 	cursor

  PPCODE:
  {
    error_status_t	status;
    sec_rgy_pgo_item_t  pgo_item;
    uuid_t  uuid_struct;
    char *name;
    SV *rv, *uuid_sv;
    HV *hv;

    sec_rgy_pgo_get_by_unix_num(rgy_context, domain, scope, unix_id, 
				allow_aliases, (sec_rgy_cursor_t *)cursor, 
				&pgo_item, name, &status);

    if (!status) {
      STORE_PGO_ITEM;
      XPUSHs((SV*)rv);
      XPUSHs_pv(name);
    }
    else {
      XPUSHs_iv(0);
      XPUSHs_iv(0);
    }
    DCESTATUS;
  }

void
sec_rgy_pgo_get_by_id(rgy_context, domain, scope, id, allow_aliases, cursor)
  DCE::Registry	rgy_context
  sec_rgy_domain_t	domain
  char *	scope
  SV *	id
  boolean32	allow_aliases
  DCE::RegistryCursor	cursor

  PPCODE:
  {
    sec_rgy_pgo_item_t  pgo_item;
    uuid_t  uuid_struct;
    error_status_t status;
    char *name; 
    SV *rv, *uuid_sv;
    HV *hv;

    UUIDmagic_sv(uuid_struct, id);
    sec_rgy_pgo_get_by_id(rgy_context, domain, scope, &uuid_struct, 
			   allow_aliases, (sec_rgy_cursor_t *)cursor, 
			   &pgo_item, name, &status);

    if (!status) {
      STORE_PGO_ITEM;
      XPUSHs((SV*)rv);
      XPUSHs_pv(name);
    }
    else {
      XPUSHs_iv(0);
      XPUSHs_iv(0);
    }
    DCESTATUS;
  }

void
sec_rgy_pgo_get_members(rgy_context, domain, name, member_cursor, max_members = 20)
  DCE::Registry	rgy_context
  sec_rgy_domain_t	domain
  char *	name
  DCE::RegistryCursor	member_cursor
  long	 max_members

  PPCODE:
  {
    error_status_t	status;
    sec_rgy_member_t *member_list;
    signed32 number_supplied, number_members, i;
    AV *av;

    member_list = (sec_rgy_member_t *)malloc(sizeof(sec_rgy_member_t) * max_members);

    sec_rgy_pgo_get_members(rgy_context, domain, name, 
			    (sec_rgy_cursor_t *)member_cursor, max_members, 
			    member_list, &number_supplied, &number_members, 
			    &status);

    if(status == sec_rgy_no_more_entries)

    if((status != 0) && (status != sec_rgy_no_more_entries)) { 
      ST(0) = &PL_sv_undef;
      free(member_list);
      PUTBACK;
      return;
    }
    
    iniAV;

    for(i=0; i<number_supplied; i++) {
      av_push(av, newSVpv(member_list[i], strlen(member_list[i]))); 
    }
    free(member_list);    

    EXTEND(sp, 3);

    PUSHs(newRV((SV*)av));
    PUSHs(newSViv((long)number_supplied));
    PUSHs(newSViv((long)number_members));
    DCESTATUS;
  }


void
sec_rgy_acct_lookup(rgy_context, login_name_ref, cursor)
  DCE::Registry	rgy_context
  SV	*login_name_ref
  DCE::RegistryCursor	cursor

  PPCODE:
  {
    char *pname_result, *gname_result, *oname_result;
    sec_rgy_acct_key_t	key_parts;
    sec_timeval_sec_t	creation_date;
    error_status_t	status;
  
    sec_rgy_login_name_t login_name, name_result;
    sec_rgy_sid_t id_sid;
    sec_rgy_unix_sid_t unix_sid;
    sec_rgy_acct_user_t user_part;
    sec_rgy_acct_admin_t admin_part;
    error_status_t uuid_status;
    STRLEN len;
    HV *hv, *nhv;
    SV **svp, *uuid_sv;

    FETCH_LOGIN_NAME;
    sec_rgy_acct_lookup(rgy_context, &login_name, (sec_rgy_cursor_t *)cursor,
			&name_result, &id_sid, &unix_sid, &key_parts, 
			&user_part, &admin_part, &status);
    
    CHK_STS(4);

    iniHV;
    hv_store(hv, "pname", 5, newSVpv(name_result.pname,0),0);
    hv_store(hv, "gname", 5, newSVpv(name_result.gname,0),0);
    hv_store(hv, "oname", 5, newSVpv(name_result.oname,0),0);
    /* DCE_TIEHASH(&name_result, "DCE::login_name", hv); */
    sv_setsv(ST(1), newRV((SV*)hv));

    EXTEND(sp, 4);
    iniHV;
    BLESS_UUID(id_sid.person); 
    hv_store(hv,"person", 6, uuid_sv,0);
    BLESS_UUID(id_sid.group); 
    hv_store(hv,"group", 5, uuid_sv,0);
    BLESS_UUID(id_sid.org); 
    hv_store(hv,"org", 3, uuid_sv,0);
    PUSHs(newRV((SV*)hv));  

    iniHV;
    hv_store(hv, "person", 6, newSViv(unix_sid.person),0);
    hv_store(hv, "group", 5, newSViv(unix_sid.group),0);
    hv_store(hv, "org", 3, newSViv(unix_sid.org),0);
    PUSHs(newRV((SV*)hv));  

    iniHV;
    hv_store(hv, "gecos", 5, newSVpv(user_part.gecos,0),0);
    hv_store(hv, "homedir", 7, newSVpv(user_part.homedir,0),0);
    hv_store(hv, "shell", 5, newSVpv(user_part.shell,0),0);
    hv_store(hv, "passwd", 6, newSVpv(user_part.passwd,0),0);
    hv_store(hv, "passwd_version_number", 21,
	     newSViv(user_part.passwd_version_number),0);
    hv_store(hv, "passwd_dtm", 10, newSViv((IV)user_part.passwd_dtm),0);
    hv_store(hv, "flags", 5, newSViv(user_part.flags),0);
    PUSHs(newRV((SV*)hv));  

    iniHV;
    nhv = (HV*)sv_2mortal((SV*)newHV());
    BLESS_UUID(admin_part.creator.principal);
    hv_store(nhv, "principal", 9, uuid_sv, 0);
    BLESS_UUID(admin_part.creator.cell);
    hv_store(nhv, "cell", 4, uuid_sv, 0);      
    hv_store(hv, "creator", 7, newRV((SV*)nhv), 0); 

    nhv = (HV*)sv_2mortal((SV*)newHV());
    BLESS_UUID(admin_part.last_changer.principal);
    hv_store(nhv, "principal", 9, uuid_sv, 0);
    BLESS_UUID(admin_part.last_changer.cell);
    hv_store(nhv, "cell", 4, uuid_sv, 0);      
    hv_store(hv, "last_changer", 12, newRV((SV*)nhv), 0); 

    hv_store(hv, "creation_date", 13, newSViv(admin_part.creation_date),0);
    hv_store(hv, "change_date", 11, newSViv(admin_part.change_date),0);
    hv_store(hv, "expiration_date", 15, newSViv(admin_part.expiration_date),0);
    hv_store(hv, "good_since_date", 15, newSViv(admin_part.good_since_date),0);
    hv_store(hv, "flags", 5, newSViv(admin_part.flags),0);
    hv_store(hv, "authentication_flags", 20, newSViv(admin_part.authentication_flags),0);
    PUSHs(newRV((SV*)hv));  

    DCESTATUS;
  }

void
sec_rgy_acct_replace_all(rgy_context, login_name_ref, key_parts, user_part_ref, admin_part_ref, set_passwd, caller_key, new_key, new_keytype)
  DCE::Registry	rgy_context
  SV	*login_name_ref
  sec_rgy_acct_key_t	key_parts
  SV	*user_part_ref
  boolean32	set_passwd
  SV	*admin_part_ref
  char *	caller_key
  char *	new_key
  sec_passwd_type_t	new_keytype

  PPCODE:
  {
    sec_passwd_version_t	new_key_version;
    sec_rgy_login_name_t	login_name;
    sec_rgy_acct_user_t	user_part;
    sec_rgy_acct_admin_t admin_part;
    sec_passwd_rec_t	caller_key_rec, new_key_rec;
    char caller_key_arr[BUFSIZ], new_key_arr[BUFSIZ];
    error_status_t	status;
    SV **svp;
    HV *hv;
    STRLEN len;

    FETCH_LOGIN_NAME;
    FETCH_USER_PART;
    FETCH_ADMIN_PART;
 
    /* load encryption key struct */
    caller_key_rec.version_number = sec_passwd_c_version_none;
    caller_key_rec.pepper = NULL;
    caller_key_rec.key.key_type = sec_passwd_plain;
    strcpy(caller_key_arr, caller_key);
    caller_key_rec.key.tagged_union.plain = caller_key_arr;

    /* load password struct */
    new_key_rec.version_number = sec_passwd_c_version_none;
    new_key_rec.key.key_type = sec_passwd_plain;
    new_key_rec.pepper = NULL;
    strcpy(new_key_arr, new_key);
    new_key_rec.key.tagged_union.plain = new_key_arr;

    sec_rgy_acct_replace_all(rgy_context, &login_name, &key_parts, 
		     &user_part, &admin_part, set_passwd,
		     &caller_key_rec, &new_key_rec, new_keytype, 
		     &new_key_version, &status);

    EXTEND(sp, 2);
    PUSHs_iv(key_parts);
    PUSHs_iv(new_key_version);
    DCESTATUS;
  }

void
sec_rgy_acct_user_replace(rgy_context, login_name_ref, user_part_ref, set_passwd, caller_key, new_key, new_keytype)
  DCE::Registry	rgy_context
  SV	*login_name_ref
  SV	*user_part_ref
  boolean32	set_passwd
  char *	caller_key
  char *	new_key
  sec_passwd_type_t	new_keytype

  PPCODE:
  {
    sec_passwd_version_t	new_key_version;
    sec_rgy_login_name_t	login_name;
    sec_rgy_acct_user_t	user_part;
    sec_passwd_rec_t	caller_key_rec, new_key_rec;
    char caller_key_arr[BUFSIZ], new_key_arr[BUFSIZ];
    error_status_t	status;
    SV **svp;
    HV *hv;
    STRLEN len;

    FETCH_LOGIN_NAME;
    FETCH_USER_PART;
 
    /* load encryption key struct */
    caller_key_rec.version_number = sec_passwd_c_version_none;
    caller_key_rec.pepper = NULL;
    caller_key_rec.key.key_type = sec_passwd_plain;
    strcpy(caller_key_arr, caller_key);
    caller_key_rec.key.tagged_union.plain = caller_key_arr;

    /* load password struct */
    new_key_rec.version_number = sec_passwd_c_version_none;
    new_key_rec.key.key_type = sec_passwd_plain;
    new_key_rec.pepper = NULL;
    strcpy(new_key_arr, new_key);
    new_key_rec.key.tagged_union.plain = new_key_arr;

    sec_rgy_acct_user_replace(rgy_context, &login_name, 
		     &user_part, set_passwd, 
		     &caller_key_rec, &new_key_rec, new_keytype, 
		     &new_key_version, &status);

    XPUSHs_iv(new_key_version);
    DCESTATUS;
  }

void
sec_rgy_acct_add(rgy_context, login_name_ref, key_parts, user_part_ref, admin_part_ref, caller_key, new_key, new_keytype)
  DCE::Registry	rgy_context
  SV	*login_name_ref
  sec_rgy_acct_key_t	key_parts
  SV	*user_part_ref
  SV	*admin_part_ref
  char *	caller_key
  char *	new_key
  sec_passwd_type_t	new_keytype

  PPCODE:
  {
    sec_passwd_version_t	new_key_version;
    sec_rgy_login_name_t	login_name;
    sec_rgy_acct_user_t	user_part;
    sec_rgy_acct_admin_t admin_part;
    sec_passwd_rec_t	caller_key_rec, new_key_rec;
    char caller_key_arr[BUFSIZ], new_key_arr[BUFSIZ];
    error_status_t	status;
    SV **svp;
    HV *hv;
    STRLEN len;

    FETCH_LOGIN_NAME;
    FETCH_USER_PART;
    FETCH_ADMIN_PART;
 
    /* load encryption key struct */
    caller_key_rec.version_number = sec_passwd_c_version_none;
    caller_key_rec.pepper = NULL;
    caller_key_rec.key.key_type = sec_passwd_plain;
    strcpy(caller_key_arr, caller_key);
    caller_key_rec.key.tagged_union.plain = caller_key_arr;

    /* load password struct */
    new_key_rec.version_number = sec_passwd_c_version_none;
    new_key_rec.key.key_type = sec_passwd_plain;
    new_key_rec.pepper = NULL;
    strcpy(new_key_arr, new_key);
    new_key_rec.key.tagged_union.plain = new_key_arr;

    sec_rgy_acct_add(rgy_context, &login_name, &key_parts, 
		     &user_part, &admin_part, 
		     &caller_key_rec, &new_key_rec, new_keytype, 
		     &new_key_version, &status);

    EXTEND(sp, 2);
    PUSHs_iv(key_parts);
    PUSHs_iv(new_key_version);
    DCESTATUS;
  }

void
sec_rgy_acct_passwd(rgy_context, login_name_ref, caller_key, new_key, new_keytype)
  DCE::Registry	rgy_context
  SV	*login_name_ref
  char *	caller_key
  char *	new_key
  sec_passwd_type_t	new_keytype

  PPCODE:
  {
    sec_passwd_version_t	new_key_version;
    sec_rgy_login_name_t	login_name;
    sec_passwd_rec_t	caller_key_rec, new_key_rec;
    char caller_key_arr[BUFSIZ], new_key_arr[BUFSIZ];
    error_status_t	status;
    SV **svp;
    HV *hv;
    STRLEN len;

    FETCH_LOGIN_NAME;
 
    /* load encryption key struct */
    caller_key_rec.version_number = sec_passwd_c_version_none;
    caller_key_rec.pepper = NULL;
    caller_key_rec.key.key_type = sec_passwd_plain;
    strcpy(caller_key_arr, caller_key);
    caller_key_rec.key.tagged_union.plain = caller_key_arr;

    /* load password struct */
    new_key_rec.version_number = sec_passwd_c_version_none;
    new_key_rec.key.key_type = sec_passwd_plain;
    new_key_rec.pepper = NULL;
    strcpy(new_key_arr, new_key);
    new_key_rec.key.tagged_union.plain = new_key_arr;

    sec_rgy_acct_passwd(rgy_context, &login_name, 
			&caller_key_rec, &new_key_rec, new_keytype, 
			&new_key_version, &status);

    XPUSHs_iv(new_key_version);
    DCESTATUS;
  }

void
sec_rgy_acct_admin_replace(rgy_context, login_name_ref, key_parts, admin_part_ref)
  DCE::Registry	rgy_context
  SV	*login_name_ref
  sec_rgy_acct_key_t	key_parts
  SV	*admin_part_ref

  PPCODE:
  {
    sec_rgy_login_name_t	login_name;
    sec_rgy_acct_admin_t admin_part;
    sec_passwd_rec_t	caller_key_rec, new_key_rec;
    char caller_key_arr[BUFSIZ], new_key_arr[BUFSIZ];
    error_status_t	status;
    SV **svp;
    HV *hv;
    STRLEN len;

    FETCH_LOGIN_NAME;
    FETCH_ADMIN_PART;
 
    sec_rgy_acct_admin_replace(rgy_context, &login_name, &key_parts, 
			       &admin_part, &status);

    DCESTATUS;
  }

void
sec_rgy_acct_delete(rgy_context, login_name_ref)
  DCE::Registry	rgy_context
  SV	*login_name_ref

  PPCODE:
  {
    sec_rgy_login_name_t	login_name;
    error_status_t	status;
    SV **svp;
    HV *hv;
    STRLEN len;

    FETCH_LOGIN_NAME;
    sec_rgy_acct_delete(rgy_context, &login_name, &status);
    DCESTATUS;
  }


void
sec_rgy_acct_rename(rgy_context, old_login_name_ref, new_login_name_ref, new_key_parts)
  DCE::Registry	rgy_context
  SV *old_login_name_ref
  SV *new_login_name_ref
  sec_rgy_acct_key_t	new_key_parts

  CODE:
  {
    sec_rgy_login_name_t old_login_name, new_login_name;
    error_status_t	status;
    SV **svp;
    HV *hv;
    STRLEN len;
    
    hv = (HV*)SvRV(old_login_name_ref); 
    svp = hv_fetch(hv, "pname", 5, 1); 
    strcpy(old_login_name.pname, (char *)SvPV(*svp,len)); 
    svp = hv_fetch(hv, "gname", 5, 1); 
    strcpy(old_login_name.gname, (char *)SvPV(*svp,len)); 
    svp = hv_fetch(hv, "oname", 5, 1);   
    strcpy(old_login_name.oname, (char *)SvPV(*svp,len));

    hv = (HV*)SvRV(new_login_name_ref); 
    svp = hv_fetch(hv, "pname", 5, 1); 
    strcpy(new_login_name.pname, (char *)SvPV(*svp,len)); 
    svp = hv_fetch(hv, "gname", 5, 1); 
    strcpy(new_login_name.gname, (char *)SvPV(*svp,len)); 
    svp = hv_fetch(hv, "oname", 5, 1);   
    strcpy(new_login_name.oname, (char *)SvPV(*svp,len));

    sec_rgy_acct_rename(rgy_context, &old_login_name, &new_login_name, 
			&new_key_parts, &status);
    XPUSHs_iv(new_key_parts);
    DCESTATUS;
  }

void
sec_rgy_plcy_get_info(rgy_context, organization)
  DCE::Registry	rgy_context
  char *	organization

  PPCODE:
  {
    sec_rgy_plcy_t policy_data;
    error_status_t	status;
    HV *hv;

    sec_rgy_plcy_get_info(rgy_context, organization, &policy_data, &status);
    STORE_POLICY_DATA;
  }

void
sec_rgy_plcy_set_info(rgy_context, organization, policy_data_ref)
  DCE::Registry	rgy_context
  char	 *organization
  SV	*policy_data_ref

  PPCODE:
  {
    sec_rgy_plcy_t policy_data;
    error_status_t	status;
    HV *hv;
    SV **svp;

    hv = (HV*)SvRV(policy_data_ref);
    svp = hv_fetch(hv,"passwd_min_len",14,1);
    policy_data.passwd_min_len = (signed32 )SvIV(*svp);

    svp = hv_fetch(hv,"passwd_lifetime",15,1);
    policy_data.passwd_lifetime = (sec_timeval_period_t )SvIV(*svp);

    svp = hv_fetch(hv,"passwd_exp_date",15,1);
    policy_data.passwd_exp_date = (sec_timeval_sec_t )SvIV(*svp);

    svp = hv_fetch(hv,"acct_lifespan",13,1);
    policy_data.acct_lifespan = (sec_timeval_period_t )SvIV(*svp);

    svp = hv_fetch(hv,"passwd_flags",12,1);
    policy_data.passwd_flags = (sec_rgy_plcy_pwd_flags_t )SvIV(*svp);

    sec_rgy_plcy_set_info(rgy_context, organization, &policy_data, &status);
    DCESTATUS;
  }

void
sec_rgy_plcy_get_effective(rgy_context, organization)
  DCE::Registry	rgy_context
  char *	organization

  PPCODE:
  {
    sec_rgy_plcy_t policy_data;
    error_status_t	status;
    HV *hv;

    sec_rgy_plcy_get_effective(rgy_context, organization, &policy_data, &status);
    STORE_POLICY_DATA;
  }

MODULE = DCE::Registry  PACKAGE = DCE::Registry

void
era(rgy_context, era_name)
  DCE::Registry rgy_context
  char *era_name

  PPCODE:
     {
       SV *sv = &PL_sv_undef;
       DCE__Registry__era era;
       sec_attr_schema_entry_t era_schema;
       error_status_t status;

       era = (DCE__Registry__era)malloc(sizeof(era_obj_t));
       if (!era)
	 status = sec_s_no_memory;
       else
         {
	   sec_rgy_attr_sch_lookup_by_name(rgy_context, "", era_name, &era_schema, &status);
	   if (!status)
	     {
	       era->attr.attr_id = era_schema.attr_id;
	       era->attr.attr_value.attr_encoding = era_schema.attr_encoding;
	       strncpy(era->name, era_name, sec_rgy_name_max_len);
	       era->name[sec_rgy_name_max_len] = '\0';
	       era->initialized = 0;
	       sv = sv_newmortal();
	       sv_setref_pv(sv, "DCE::Registry::era", (void *)era);
	     }
	 }
       
       XPUSHs(sv);
       sv = sv_2mortal(newSViv(status));
       XPUSHs(sv);
     }



MODULE = DCE::Registry  PACKAGE = DCE::cursor

void
new(package)
  char	*package
     
  PPCODE:
  {
    SV *cursor;
    sec_rgy_cursor_t *rgy_cursor;
    rgy_cursor = malloc(sizeof(sec_rgy_cursor_t));
    cursor = sv_newmortal();
    warn("Don't call DCE::cursor->new, use DCE::Registry->cursor instead!!!");
    sv_setref_pv((SV*)cursor, "DCE::RegistryCursor", (void *)rgy_cursor);
    XPUSHs(cursor);
  }

MODULE = DCE::Registry  PACKAGE = DCE::RegistryCursor

void
DESTROY(cursor)
DCE::RegistryCursor   cursor

   CODE:
   {
     free(cursor);
   }

void
reset(cursor)
DCE::RegistryCursor	cursor

  CODE:
  {
    sec_rgy_cursor_reset(cursor);
  }

void
new(package)
  char	*package
     
  PPCODE:
  {
    SV *cursor;
    sec_rgy_cursor_t *rgy_cursor;
    rgy_cursor = malloc(sizeof(sec_rgy_cursor_t));
    cursor = sv_newmortal();
    sv_setref_pv((SV*)cursor, package, (void *)rgy_cursor);
    XPUSHs(cursor);
  }

MODULE = DCE::Registry          PACKAGE = DCE::Registry::era

void
DESTROY(era)
DCE::Registry::era era

  CODE:
  {
  }

void
name(era)
DCE::Registry::era era

  PPCODE:
  {
    XPUSHs(newSVpv(era->name, 0));
  }

int
type(era)
DCE::Registry::era era

  CODE:
  {
    RETVAL = era->attr.attr_value.attr_encoding;
  }

  OUTPUT:
  RETVAL

int
set_type(era, type)
DCE::Registry::era era
int type

  CODE:
  {
    error_status_t status;
    
    if (era->attr.attr_value.attr_encoding == sec_attr_enc_any)
      {
	switch (type)
	  {
	  case sec_attr_enc_any:
	  case sec_attr_enc_void:
	  case sec_attr_enc_integer:
	  case sec_attr_enc_printstring:
	  case sec_attr_enc_printstring_array:
	  case sec_attr_enc_bytes:
	  case sec_attr_enc_confidential_bytes:
	  case sec_attr_enc_i18n_data:
	  case sec_attr_enc_uuid:
	  case sec_attr_enc_attr_set:
	  case sec_attr_enc_binding:
	  case sec_attr_enc_trig_binding:
	    era->attr.attr_value.attr_encoding = type;
	    status = 0;
	    break;
	  default:
	   status = sec_attr_bad_type;
	  }
      }
    else
      status = sec_attr_field_no_update;

    RETVAL = status;
  }
  OUTPUT:
  RETVAL

void
value(era)
DCE::Registry::era era

  PPCODE:
  {
    HV *hv = newHV();
    error_status_t status = 0;

    
    if (!era->initialized)
      status = sec_attr_bad_param;
    else
      switch (era->attr.attr_value.attr_encoding)
	{
	case sec_attr_enc_any:
	  status = sec_attr_bad_param;
	  break;

	case sec_attr_enc_void:
	  break;

	case sec_attr_enc_integer:
	  hv_store(hv, "integer", 7, newSViv(era->attr.attr_value.tagged_union.signed_int), 0);
	  break;

	case sec_attr_enc_printstring:
	  hv_store(hv, "printstring", 11, newSVpv(era->attr.attr_value.tagged_union.printstring, 0), 0);
	  break;

	case sec_attr_enc_printstring_array:
	  status = sec_attr_not_implemented;
	  break;

	case sec_attr_enc_bytes:
	case sec_attr_enc_confidential_bytes:
	  hv_store(hv, "bytes", 5, newSVpv(era->attr.attr_value.tagged_union.bytes->data, era->attr.attr_value.tagged_union.bytes->length), 0);
	  break;

	case sec_attr_enc_i18n_data:
	  hv_store(hv, "codeset", 7, newSViv(era->attr.attr_value.tagged_union.idata->codeset), 0);
	  hv_store(hv, "data", 4, newSVpv(era->attr.attr_value.tagged_union.idata->data, era->attr.attr_value.tagged_union.idata->length), 0);
	  break;

	case sec_attr_enc_uuid:
	  status = sec_attr_not_implemented;
	  break;

	case sec_attr_enc_attr_set:
	  status = sec_attr_not_implemented;
	  break;

	case sec_attr_enc_binding:
	  {
	    HV *auth_info = newHV();
	    HV *binding = newHV();

	    hv_store(auth_info, "info_type", 9, newSViv(era->attr.attr_value.tagged_union.binding->auth_info.info_type), 0);
	    if (era->attr.attr_value.tagged_union.binding->auth_info.info_type == sec_attr_bind_auth_dce)
	      {
		hv_store(auth_info, "svr_princ_name", 14, newSVpv(era->attr.attr_value.tagged_union.binding->auth_info.tagged_union.dce_info.svr_princ_name, 0), 0);
		hv_store(auth_info, "protect_level", 13, newSViv(era->attr.attr_value.tagged_union.binding->auth_info.tagged_union.dce_info.protect_level), 0);
		hv_store(auth_info, "authn_svc", 9, newSViv(era->attr.attr_value.tagged_union.binding->auth_info.tagged_union.dce_info.authn_svc), 0);
		hv_store(auth_info, "authz_svc", 9, newSViv(era->attr.attr_value.tagged_union.binding->auth_info.tagged_union.dce_info.authz_svc), 0);
	      }



( run in 0.604 second using v1.01-cache-2.11-cpan-71847e10f99 )