14960Swillf #include <sys/types.h>
24960Swillf /* Solaris Kerberos: gssrpc not supported */
34960Swillf #if 0 /************** Begin IFDEF'ed OUT *******************************/
44960Swillf #include <gssrpc/rpc.h>
54960Swillf #else
64960Swillf #include <rpc/rpc.h>
74960Swillf #include <kadm5/kadm_rpc.h>
84960Swillf #endif /**************** END IFDEF'ed OUT *******************************/
94960Swillf #include <kdb.h>
104960Swillf #include "policy_db.h"
114960Swillf #ifdef HAVE_MEMORY_H
124960Swillf #include <memory.h>
134960Swillf #endif
14*7934SMark.Phalan@Sun.COM #include <krb5.h>
154960Swillf #include <strings.h>
164960Swillf
174960Swillf /* Solaris Kerberos: this function taken from MIT's src/lib/rpc/xdr.c */
184960Swillf bool_t
xdr_u_int32(XDR * xdrs,uint32_t * up)194960Swillf xdr_u_int32(XDR *xdrs, uint32_t *up)
204960Swillf {
214960Swillf u_long ul;
224960Swillf
234960Swillf switch (xdrs->x_op) {
244960Swillf
254960Swillf case XDR_ENCODE:
264960Swillf ul = *up;
274960Swillf return (xdr_u_long(xdrs, &ul));
284960Swillf
294960Swillf case XDR_DECODE:
304960Swillf if (!xdr_u_long(xdrs, &ul)) {
314960Swillf return (FALSE);
324960Swillf }
334960Swillf *up = ul;
344960Swillf return (TRUE);
354960Swillf
364960Swillf case XDR_FREE:
374960Swillf return (TRUE);
384960Swillf }
394960Swillf return (FALSE);
404960Swillf }
414960Swillf
424960Swillf static
xdr_nullstring(XDR * xdrs,char ** objp)434960Swillf bool_t xdr_nullstring(XDR *xdrs, char **objp)
444960Swillf {
454960Swillf u_int size;
464960Swillf
474960Swillf if (xdrs->x_op == XDR_ENCODE) {
484960Swillf if (*objp == NULL)
494960Swillf size = 0;
504960Swillf else
514960Swillf size = strlen(*objp) + 1;
524960Swillf }
534960Swillf if (! xdr_u_int(xdrs, &size)) {
544960Swillf return FALSE;
554960Swillf }
564960Swillf switch (xdrs->x_op) {
574960Swillf case XDR_DECODE:
584960Swillf if (size == 0) {
594960Swillf *objp = NULL;
604960Swillf return TRUE;
614960Swillf } else if (*objp == NULL) {
624960Swillf *objp = (char *) mem_alloc(size);
634960Swillf if (*objp == NULL) {
644960Swillf errno = ENOMEM;
654960Swillf return FALSE;
664960Swillf }
674960Swillf }
684960Swillf return (xdr_opaque(xdrs, *objp, size));
694960Swillf
704960Swillf case XDR_ENCODE:
714960Swillf if (size != 0)
724960Swillf return (xdr_opaque(xdrs, *objp, size));
734960Swillf return TRUE;
744960Swillf
754960Swillf case XDR_FREE:
764960Swillf if (*objp != NULL)
774960Swillf mem_free(*objp, size);
784960Swillf *objp = NULL;
794960Swillf return TRUE;
804960Swillf }
814960Swillf
824960Swillf return FALSE;
834960Swillf }
844960Swillf
854960Swillf
864960Swillf
874960Swillf bool_t
xdr_osa_policy_ent_rec(XDR * xdrs,osa_policy_ent_t objp)884960Swillf xdr_osa_policy_ent_rec(XDR *xdrs, osa_policy_ent_t objp)
894960Swillf {
904960Swillf switch (xdrs->x_op) {
914960Swillf case XDR_ENCODE:
924960Swillf objp->version = OSA_ADB_POLICY_VERSION_1;
934960Swillf /* fall through */
944960Swillf case XDR_FREE:
954960Swillf if (!xdr_int(xdrs, &objp->version))
964960Swillf return FALSE;
974960Swillf break;
984960Swillf case XDR_DECODE:
994960Swillf if (!xdr_int(xdrs, &objp->version))
1004960Swillf return FALSE;
1014960Swillf if (objp->version != OSA_ADB_POLICY_VERSION_1)
1024960Swillf return FALSE;
1034960Swillf break;
1044960Swillf }
1054960Swillf
1064960Swillf if(!xdr_nullstring(xdrs, &objp->name))
1074960Swillf return (FALSE);
1084960Swillf if (!xdr_u_int32(xdrs, &objp->pw_min_life))
1094960Swillf return (FALSE);
1104960Swillf if (!xdr_u_int32(xdrs, &objp->pw_max_life))
1114960Swillf return (FALSE);
1124960Swillf if (!xdr_u_int32(xdrs, &objp->pw_min_length))
1134960Swillf return (FALSE);
1144960Swillf if (!xdr_u_int32(xdrs, &objp->pw_min_classes))
1154960Swillf return (FALSE);
1164960Swillf if (!xdr_u_int32(xdrs, &objp->pw_history_num))
1174960Swillf return (FALSE);
1184960Swillf if (!xdr_u_int32(xdrs, &objp->policy_refcnt))
1194960Swillf return (FALSE);
1204960Swillf return (TRUE);
1214960Swillf }
122