17c478bd9Sstevel@tonic-gate /*
2*55fea89dSDan Cross * WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING
37c478bd9Sstevel@tonic-gate *
47c478bd9Sstevel@tonic-gate * Openvision retains the copyright to derivative works of
57c478bd9Sstevel@tonic-gate * this source code. Do *NOT* create a derivative of this
67c478bd9Sstevel@tonic-gate * source code before consulting with your legal department.
77c478bd9Sstevel@tonic-gate * Do *NOT* integrate *ANY* of this source code into another
87c478bd9Sstevel@tonic-gate * product before consulting with your legal department.
97c478bd9Sstevel@tonic-gate *
107c478bd9Sstevel@tonic-gate * For further information, read the top-level Openvision
117c478bd9Sstevel@tonic-gate * copyright which is contained in the top-level MIT Kerberos
127c478bd9Sstevel@tonic-gate * copyright.
137c478bd9Sstevel@tonic-gate *
147c478bd9Sstevel@tonic-gate * WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING
157c478bd9Sstevel@tonic-gate *
167c478bd9Sstevel@tonic-gate */
177c478bd9Sstevel@tonic-gate
187c478bd9Sstevel@tonic-gate
197c478bd9Sstevel@tonic-gate /*
207c478bd9Sstevel@tonic-gate * Copyright 1993 OpenVision Technologies, Inc., All Rights Reserved
217c478bd9Sstevel@tonic-gate *
22159d09a2SMark Phalan * $Header$
237c478bd9Sstevel@tonic-gate */
247c478bd9Sstevel@tonic-gate
257c478bd9Sstevel@tonic-gate #if !defined(lint) && !defined(__CODECENTER__)
26159d09a2SMark Phalan static char *rcsid = "$Header$";
277c478bd9Sstevel@tonic-gate #endif
287c478bd9Sstevel@tonic-gate
29159d09a2SMark Phalan #include "server_internal.h"
307c478bd9Sstevel@tonic-gate #include <sys/types.h>
317c478bd9Sstevel@tonic-gate #include <kadm5/admin.h>
327c478bd9Sstevel@tonic-gate #include <stdlib.h>
33159d09a2SMark Phalan #include <errno.h>
347c478bd9Sstevel@tonic-gate
357c478bd9Sstevel@tonic-gate #define MAX_PW_HISTORY 10
367c478bd9Sstevel@tonic-gate #define MIN_PW_HISTORY 1
377c478bd9Sstevel@tonic-gate #define MIN_PW_CLASSES 1
387c478bd9Sstevel@tonic-gate #define MAX_PW_CLASSES 5
397c478bd9Sstevel@tonic-gate #define MIN_PW_LENGTH 1
407c478bd9Sstevel@tonic-gate
417c478bd9Sstevel@tonic-gate /*
427c478bd9Sstevel@tonic-gate * Function: kadm5_create_policy
43*55fea89dSDan Cross *
447c478bd9Sstevel@tonic-gate * Purpose: Create Policies in the policy DB.
457c478bd9Sstevel@tonic-gate *
467c478bd9Sstevel@tonic-gate * Arguments:
477c478bd9Sstevel@tonic-gate * entry (input) The policy entry to be written out to the DB.
487c478bd9Sstevel@tonic-gate * mask (input) Specifies which fields in entry are to ge written out
497c478bd9Sstevel@tonic-gate * and which get default values.
5056a424ccSmp * <return value> 0 if successful otherwise an error code is returned.
517c478bd9Sstevel@tonic-gate *
527c478bd9Sstevel@tonic-gate * Requires:
537c478bd9Sstevel@tonic-gate * Entry must be a valid principal entry, and mask have a valid value.
54*55fea89dSDan Cross *
557c478bd9Sstevel@tonic-gate * Effects:
567c478bd9Sstevel@tonic-gate * Verifies that mask does not specify that the refcount should
577c478bd9Sstevel@tonic-gate * be set as part of the creation, and calls
587c478bd9Sstevel@tonic-gate * kadm5_create_policy_internal. If the refcount *is*
597c478bd9Sstevel@tonic-gate * specified, returns KADM5_BAD_MASK.
607c478bd9Sstevel@tonic-gate */
617c478bd9Sstevel@tonic-gate
627c478bd9Sstevel@tonic-gate kadm5_ret_t
kadm5_create_policy(void * server_handle,kadm5_policy_ent_t entry,long mask)637c478bd9Sstevel@tonic-gate kadm5_create_policy(void *server_handle,
647c478bd9Sstevel@tonic-gate kadm5_policy_ent_t entry, long mask)
657c478bd9Sstevel@tonic-gate {
667c478bd9Sstevel@tonic-gate CHECK_HANDLE(server_handle);
677c478bd9Sstevel@tonic-gate
6854925bf6Swillf krb5_clear_error_message(((kadm5_server_handle_t)server_handle)->context);
6954925bf6Swillf
707c478bd9Sstevel@tonic-gate if (mask & KADM5_REF_COUNT)
717c478bd9Sstevel@tonic-gate return KADM5_BAD_MASK;
727c478bd9Sstevel@tonic-gate else
737c478bd9Sstevel@tonic-gate return kadm5_create_policy_internal(server_handle, entry, mask);
747c478bd9Sstevel@tonic-gate }
757c478bd9Sstevel@tonic-gate
767c478bd9Sstevel@tonic-gate /*
777c478bd9Sstevel@tonic-gate * Function: kadm5_create_policy_internal
78*55fea89dSDan Cross *
797c478bd9Sstevel@tonic-gate * Purpose: Create Policies in the policy DB.
807c478bd9Sstevel@tonic-gate *
817c478bd9Sstevel@tonic-gate * Arguments:
827c478bd9Sstevel@tonic-gate * entry (input) The policy entry to be written out to the DB.
837c478bd9Sstevel@tonic-gate * mask (input) Specifies which fields in entry are to ge written out
847c478bd9Sstevel@tonic-gate * and which get default values.
8556a424ccSmp * <return value> 0 if successful otherwise an error code is returned.
867c478bd9Sstevel@tonic-gate *
877c478bd9Sstevel@tonic-gate * Requires:
887c478bd9Sstevel@tonic-gate * Entry must be a valid principal entry, and mask have a valid value.
89*55fea89dSDan Cross *
907c478bd9Sstevel@tonic-gate * Effects:
917c478bd9Sstevel@tonic-gate * Writes the data to the database, and does a database sync if
9256a424ccSmp * successful.
937c478bd9Sstevel@tonic-gate *
947c478bd9Sstevel@tonic-gate */
957c478bd9Sstevel@tonic-gate
967c478bd9Sstevel@tonic-gate kadm5_ret_t
kadm5_create_policy_internal(void * server_handle,kadm5_policy_ent_t entry,long mask)977c478bd9Sstevel@tonic-gate kadm5_create_policy_internal(void *server_handle,
987c478bd9Sstevel@tonic-gate kadm5_policy_ent_t entry, long mask)
997c478bd9Sstevel@tonic-gate {
1007c478bd9Sstevel@tonic-gate kadm5_server_handle_t handle = server_handle;
1017c478bd9Sstevel@tonic-gate osa_policy_ent_rec pent;
1027c478bd9Sstevel@tonic-gate int ret;
1037c478bd9Sstevel@tonic-gate char *p;
1047c478bd9Sstevel@tonic-gate
1057c478bd9Sstevel@tonic-gate CHECK_HANDLE(server_handle);
1067c478bd9Sstevel@tonic-gate
1077c478bd9Sstevel@tonic-gate if ((entry == (kadm5_policy_ent_t) NULL) || (entry->policy == NULL))
1087c478bd9Sstevel@tonic-gate return EINVAL;
1097c478bd9Sstevel@tonic-gate if(strlen(entry->policy) == 0)
1107c478bd9Sstevel@tonic-gate return KADM5_BAD_POLICY;
1117c478bd9Sstevel@tonic-gate if (!(mask & KADM5_POLICY))
1127c478bd9Sstevel@tonic-gate return KADM5_BAD_MASK;
113*55fea89dSDan Cross
1147c478bd9Sstevel@tonic-gate pent.name = entry->policy;
1157c478bd9Sstevel@tonic-gate p = entry->policy;
1167c478bd9Sstevel@tonic-gate while(*p != '\0') {
1177c478bd9Sstevel@tonic-gate if(*p < ' ' || *p > '~')
1187c478bd9Sstevel@tonic-gate return KADM5_BAD_POLICY;
1197c478bd9Sstevel@tonic-gate else
1207c478bd9Sstevel@tonic-gate p++;
1217c478bd9Sstevel@tonic-gate }
1227c478bd9Sstevel@tonic-gate if (!(mask & KADM5_PW_MAX_LIFE))
1237c478bd9Sstevel@tonic-gate pent.pw_max_life = 0;
1247c478bd9Sstevel@tonic-gate else
1257c478bd9Sstevel@tonic-gate pent.pw_max_life = entry->pw_max_life;
1267c478bd9Sstevel@tonic-gate if (!(mask & KADM5_PW_MIN_LIFE))
1277c478bd9Sstevel@tonic-gate pent.pw_min_life = 0;
1287c478bd9Sstevel@tonic-gate else {
1297c478bd9Sstevel@tonic-gate if((mask & KADM5_PW_MAX_LIFE)) {
1307c478bd9Sstevel@tonic-gate if(entry->pw_min_life > entry->pw_max_life && entry->pw_max_life != 0)
1317c478bd9Sstevel@tonic-gate return KADM5_BAD_MIN_PASS_LIFE;
1327c478bd9Sstevel@tonic-gate }
1337c478bd9Sstevel@tonic-gate pent.pw_min_life = entry->pw_min_life;
1347c478bd9Sstevel@tonic-gate }
1357c478bd9Sstevel@tonic-gate if (!(mask & KADM5_PW_MIN_LENGTH))
1367c478bd9Sstevel@tonic-gate pent.pw_min_length = MIN_PW_LENGTH;
1377c478bd9Sstevel@tonic-gate else {
1387c478bd9Sstevel@tonic-gate if(entry->pw_min_length < MIN_PW_LENGTH)
1397c478bd9Sstevel@tonic-gate return KADM5_BAD_LENGTH;
1407c478bd9Sstevel@tonic-gate pent.pw_min_length = entry->pw_min_length;
1417c478bd9Sstevel@tonic-gate }
1427c478bd9Sstevel@tonic-gate if (!(mask & KADM5_PW_MIN_CLASSES))
1437c478bd9Sstevel@tonic-gate pent.pw_min_classes = MIN_PW_CLASSES;
1447c478bd9Sstevel@tonic-gate else {
1457c478bd9Sstevel@tonic-gate if(entry->pw_min_classes > MAX_PW_CLASSES || entry->pw_min_classes < MIN_PW_CLASSES)
1467c478bd9Sstevel@tonic-gate return KADM5_BAD_CLASS;
1477c478bd9Sstevel@tonic-gate pent.pw_min_classes = entry->pw_min_classes;
1487c478bd9Sstevel@tonic-gate }
1497c478bd9Sstevel@tonic-gate if (!(mask & KADM5_PW_HISTORY_NUM))
1507c478bd9Sstevel@tonic-gate pent.pw_history_num = MIN_PW_HISTORY;
1517c478bd9Sstevel@tonic-gate else {
1527c478bd9Sstevel@tonic-gate if(entry->pw_history_num < MIN_PW_HISTORY ||
1537c478bd9Sstevel@tonic-gate entry->pw_history_num > MAX_PW_HISTORY)
1547c478bd9Sstevel@tonic-gate return KADM5_BAD_HISTORY;
1557c478bd9Sstevel@tonic-gate else
1567c478bd9Sstevel@tonic-gate pent.pw_history_num = entry->pw_history_num;
1577c478bd9Sstevel@tonic-gate }
1587c478bd9Sstevel@tonic-gate if (!(mask & KADM5_REF_COUNT))
1597c478bd9Sstevel@tonic-gate pent.policy_refcnt = 0;
1607c478bd9Sstevel@tonic-gate else
1617c478bd9Sstevel@tonic-gate pent.policy_refcnt = entry->policy_refcnt;
16254925bf6Swillf if ((ret = krb5_db_create_policy(handle->context, &pent)))
1637c478bd9Sstevel@tonic-gate return ret;
16454925bf6Swillf else
16554925bf6Swillf return KADM5_OK;
1667c478bd9Sstevel@tonic-gate }
167*55fea89dSDan Cross
1687c478bd9Sstevel@tonic-gate kadm5_ret_t
kadm5_delete_policy(void * server_handle,kadm5_policy_t name)1697c478bd9Sstevel@tonic-gate kadm5_delete_policy(void *server_handle, kadm5_policy_t name)
1707c478bd9Sstevel@tonic-gate {
1717c478bd9Sstevel@tonic-gate kadm5_server_handle_t handle = server_handle;
1727c478bd9Sstevel@tonic-gate osa_policy_ent_t entry;
1737c478bd9Sstevel@tonic-gate int ret;
17454925bf6Swillf int cnt=1;
1757c478bd9Sstevel@tonic-gate
1767c478bd9Sstevel@tonic-gate CHECK_HANDLE(server_handle);
1777c478bd9Sstevel@tonic-gate
17854925bf6Swillf krb5_clear_error_message(handle->context);
17954925bf6Swillf
1807c478bd9Sstevel@tonic-gate if(name == (kadm5_policy_t) NULL)
1817c478bd9Sstevel@tonic-gate return EINVAL;
1827c478bd9Sstevel@tonic-gate if(strlen(name) == 0)
1837c478bd9Sstevel@tonic-gate return KADM5_BAD_POLICY;
184159d09a2SMark Phalan if((ret = krb5_db_get_policy(handle->context, name, &entry,&cnt)))
1857c478bd9Sstevel@tonic-gate return ret;
18654925bf6Swillf if( cnt != 1 )
18754925bf6Swillf return KADM5_UNK_POLICY;
18854925bf6Swillf
1897c478bd9Sstevel@tonic-gate if(entry->policy_refcnt != 0) {
19054925bf6Swillf krb5_db_free_policy(handle->context, entry);
1917c478bd9Sstevel@tonic-gate return KADM5_POLICY_REF;
1927c478bd9Sstevel@tonic-gate }
19354925bf6Swillf krb5_db_free_policy(handle->context, entry);
19454925bf6Swillf if ((ret = krb5_db_delete_policy(handle->context, name)))
1957c478bd9Sstevel@tonic-gate return ret;
19654925bf6Swillf else
19754925bf6Swillf return KADM5_OK;
1987c478bd9Sstevel@tonic-gate }
1997c478bd9Sstevel@tonic-gate
2007c478bd9Sstevel@tonic-gate kadm5_ret_t
kadm5_modify_policy(void * server_handle,kadm5_policy_ent_t entry,long mask)2017c478bd9Sstevel@tonic-gate kadm5_modify_policy(void *server_handle,
2027c478bd9Sstevel@tonic-gate kadm5_policy_ent_t entry, long mask)
2037c478bd9Sstevel@tonic-gate {
2047c478bd9Sstevel@tonic-gate CHECK_HANDLE(server_handle);
2057c478bd9Sstevel@tonic-gate
20654925bf6Swillf krb5_clear_error_message(((kadm5_server_handle_t)server_handle)->context);
20754925bf6Swillf
2087c478bd9Sstevel@tonic-gate if (mask & KADM5_REF_COUNT)
2097c478bd9Sstevel@tonic-gate return KADM5_BAD_MASK;
2107c478bd9Sstevel@tonic-gate else
2117c478bd9Sstevel@tonic-gate return kadm5_modify_policy_internal(server_handle, entry, mask);
2127c478bd9Sstevel@tonic-gate }
2137c478bd9Sstevel@tonic-gate
2147c478bd9Sstevel@tonic-gate kadm5_ret_t
kadm5_modify_policy_internal(void * server_handle,kadm5_policy_ent_t entry,long mask)2157c478bd9Sstevel@tonic-gate kadm5_modify_policy_internal(void *server_handle,
2167c478bd9Sstevel@tonic-gate kadm5_policy_ent_t entry, long mask)
2177c478bd9Sstevel@tonic-gate {
2187c478bd9Sstevel@tonic-gate kadm5_server_handle_t handle = server_handle;
2197c478bd9Sstevel@tonic-gate osa_policy_ent_t p;
2207c478bd9Sstevel@tonic-gate int ret;
22154925bf6Swillf int cnt=1;
2227c478bd9Sstevel@tonic-gate
2237c478bd9Sstevel@tonic-gate CHECK_HANDLE(server_handle);
2247c478bd9Sstevel@tonic-gate
2257c478bd9Sstevel@tonic-gate if((entry == (kadm5_policy_ent_t) NULL) || (entry->policy == NULL))
2267c478bd9Sstevel@tonic-gate return EINVAL;
2277c478bd9Sstevel@tonic-gate if(strlen(entry->policy) == 0)
2287c478bd9Sstevel@tonic-gate return KADM5_BAD_POLICY;
2297c478bd9Sstevel@tonic-gate if((mask & KADM5_POLICY))
2307c478bd9Sstevel@tonic-gate return KADM5_BAD_MASK;
231*55fea89dSDan Cross
232159d09a2SMark Phalan if ((ret = krb5_db_get_policy(handle->context, entry->policy, &p, &cnt)))
23354925bf6Swillf return ret;
234159d09a2SMark Phalan if (cnt != 1)
2357c478bd9Sstevel@tonic-gate return KADM5_UNK_POLICY;
23654925bf6Swillf
2377c478bd9Sstevel@tonic-gate if ((mask & KADM5_PW_MAX_LIFE))
2387c478bd9Sstevel@tonic-gate p->pw_max_life = entry->pw_max_life;
2397c478bd9Sstevel@tonic-gate if ((mask & KADM5_PW_MIN_LIFE)) {
2407c478bd9Sstevel@tonic-gate if(entry->pw_min_life > p->pw_max_life && p->pw_max_life != 0) {
24154925bf6Swillf krb5_db_free_policy(handle->context, p);
2427c478bd9Sstevel@tonic-gate return KADM5_BAD_MIN_PASS_LIFE;
2437c478bd9Sstevel@tonic-gate }
2447c478bd9Sstevel@tonic-gate p->pw_min_life = entry->pw_min_life;
2457c478bd9Sstevel@tonic-gate }
2467c478bd9Sstevel@tonic-gate if ((mask & KADM5_PW_MIN_LENGTH)) {
2477c478bd9Sstevel@tonic-gate if(entry->pw_min_length < MIN_PW_LENGTH) {
24854925bf6Swillf krb5_db_free_policy(handle->context, p);
2497c478bd9Sstevel@tonic-gate return KADM5_BAD_LENGTH;
2507c478bd9Sstevel@tonic-gate }
2517c478bd9Sstevel@tonic-gate p->pw_min_length = entry->pw_min_length;
2527c478bd9Sstevel@tonic-gate }
2537c478bd9Sstevel@tonic-gate if ((mask & KADM5_PW_MIN_CLASSES)) {
2547c478bd9Sstevel@tonic-gate if(entry->pw_min_classes > MAX_PW_CLASSES ||
2557c478bd9Sstevel@tonic-gate entry->pw_min_classes < MIN_PW_CLASSES) {
25654925bf6Swillf krb5_db_free_policy(handle->context, p);
2577c478bd9Sstevel@tonic-gate return KADM5_BAD_CLASS;
2587c478bd9Sstevel@tonic-gate }
2597c478bd9Sstevel@tonic-gate p->pw_min_classes = entry->pw_min_classes;
2607c478bd9Sstevel@tonic-gate }
2617c478bd9Sstevel@tonic-gate if ((mask & KADM5_PW_HISTORY_NUM)) {
2627c478bd9Sstevel@tonic-gate if(entry->pw_history_num < MIN_PW_HISTORY ||
2637c478bd9Sstevel@tonic-gate entry->pw_history_num > MAX_PW_HISTORY) {
26454925bf6Swillf krb5_db_free_policy(handle->context, p);
2657c478bd9Sstevel@tonic-gate return KADM5_BAD_HISTORY;
2667c478bd9Sstevel@tonic-gate }
2677c478bd9Sstevel@tonic-gate p->pw_history_num = entry->pw_history_num;
2687c478bd9Sstevel@tonic-gate }
2697c478bd9Sstevel@tonic-gate if ((mask & KADM5_REF_COUNT))
2707c478bd9Sstevel@tonic-gate p->policy_refcnt = entry->policy_refcnt;
27154925bf6Swillf ret = krb5_db_put_policy(handle->context, p);
27254925bf6Swillf krb5_db_free_policy(handle->context, p);
2737c478bd9Sstevel@tonic-gate return ret;
2747c478bd9Sstevel@tonic-gate }
2757c478bd9Sstevel@tonic-gate
2767c478bd9Sstevel@tonic-gate kadm5_ret_t
kadm5_get_policy(void * server_handle,kadm5_policy_t name,kadm5_policy_ent_t entry)2777c478bd9Sstevel@tonic-gate kadm5_get_policy(void *server_handle, kadm5_policy_t name,
278*55fea89dSDan Cross kadm5_policy_ent_t entry)
2797c478bd9Sstevel@tonic-gate {
2807c478bd9Sstevel@tonic-gate osa_policy_ent_t t;
2817c478bd9Sstevel@tonic-gate kadm5_policy_ent_rec entry_local, **entry_orig, *new;
2827c478bd9Sstevel@tonic-gate int ret;
2837c478bd9Sstevel@tonic-gate kadm5_server_handle_t handle = server_handle;
28454925bf6Swillf int cnt=1;
2857c478bd9Sstevel@tonic-gate
2867c478bd9Sstevel@tonic-gate CHECK_HANDLE(server_handle);
2877c478bd9Sstevel@tonic-gate
28854925bf6Swillf krb5_clear_error_message(handle->context);
28954925bf6Swillf
2907c478bd9Sstevel@tonic-gate /*
2917c478bd9Sstevel@tonic-gate * In version 1, entry is a pointer to a kadm5_policy_ent_t that
2927c478bd9Sstevel@tonic-gate * should be filled with allocated memory.
2937c478bd9Sstevel@tonic-gate */
2947c478bd9Sstevel@tonic-gate if (handle->api_version == KADM5_API_VERSION_1) {
2957c478bd9Sstevel@tonic-gate entry_orig = (kadm5_policy_ent_rec **) entry;
2967c478bd9Sstevel@tonic-gate *entry_orig = NULL;
2977c478bd9Sstevel@tonic-gate entry = &entry_local;
2987c478bd9Sstevel@tonic-gate }
299*55fea89dSDan Cross
3007c478bd9Sstevel@tonic-gate if (name == (kadm5_policy_t) NULL)
3017c478bd9Sstevel@tonic-gate return EINVAL;
3027c478bd9Sstevel@tonic-gate if(strlen(name) == 0)
3037c478bd9Sstevel@tonic-gate return KADM5_BAD_POLICY;
30454925bf6Swillf if((ret = krb5_db_get_policy(handle->context, name, &t, &cnt)))
3057c478bd9Sstevel@tonic-gate return ret;
30654925bf6Swillf
30754925bf6Swillf if( cnt != 1 )
30854925bf6Swillf return KADM5_UNK_POLICY;
30954925bf6Swillf
3107c478bd9Sstevel@tonic-gate if ((entry->policy = (char *) malloc(strlen(t->name) + 1)) == NULL) {
31154925bf6Swillf krb5_db_free_policy(handle->context, t);
3127c478bd9Sstevel@tonic-gate return ENOMEM;
3137c478bd9Sstevel@tonic-gate }
3147c478bd9Sstevel@tonic-gate strcpy(entry->policy, t->name);
3157c478bd9Sstevel@tonic-gate entry->pw_min_life = t->pw_min_life;
3167c478bd9Sstevel@tonic-gate entry->pw_max_life = t->pw_max_life;
3177c478bd9Sstevel@tonic-gate entry->pw_min_length = t->pw_min_length;
3187c478bd9Sstevel@tonic-gate entry->pw_min_classes = t->pw_min_classes;
3197c478bd9Sstevel@tonic-gate entry->pw_history_num = t->pw_history_num;
3207c478bd9Sstevel@tonic-gate entry->policy_refcnt = t->policy_refcnt;
32154925bf6Swillf krb5_db_free_policy(handle->context, t);
3227c478bd9Sstevel@tonic-gate
3237c478bd9Sstevel@tonic-gate if (handle->api_version == KADM5_API_VERSION_1) {
3247c478bd9Sstevel@tonic-gate new = (kadm5_policy_ent_t) malloc(sizeof(kadm5_policy_ent_rec));
3257c478bd9Sstevel@tonic-gate if (new == NULL) {
3267c478bd9Sstevel@tonic-gate free(entry->policy);
32754925bf6Swillf krb5_db_free_policy(handle->context, t);
3287c478bd9Sstevel@tonic-gate return ENOMEM;
3297c478bd9Sstevel@tonic-gate }
3307c478bd9Sstevel@tonic-gate *new = *entry;
3317c478bd9Sstevel@tonic-gate *entry_orig = new;
3327c478bd9Sstevel@tonic-gate }
333*55fea89dSDan Cross
3347c478bd9Sstevel@tonic-gate return KADM5_OK;
3357c478bd9Sstevel@tonic-gate }
336