154925bf6Swillf #include <sys/types.h>
254925bf6Swillf /* Solaris Kerberos: gssrpc not supported */
354925bf6Swillf #if 0 /************** Begin IFDEF'ed OUT *******************************/
454925bf6Swillf #include <gssrpc/rpc.h>
554925bf6Swillf #else
654925bf6Swillf #include <rpc/rpc.h>
754925bf6Swillf #include <kadm5/kadm_rpc.h>
854925bf6Swillf #endif /**************** END IFDEF'ed OUT *******************************/
954925bf6Swillf #include <kdb.h>
1054925bf6Swillf #include "policy_db.h"
1154925bf6Swillf #ifdef HAVE_MEMORY_H
1254925bf6Swillf #include <memory.h>
1354925bf6Swillf #endif
14159d09a2SMark Phalan #include <krb5.h>
1554925bf6Swillf #include <strings.h>
1654925bf6Swillf 
1754925bf6Swillf /* Solaris Kerberos: this function taken from MIT's src/lib/rpc/xdr.c */
1854925bf6Swillf bool_t
xdr_u_int32(XDR * xdrs,uint32_t * up)1954925bf6Swillf xdr_u_int32(XDR *xdrs, uint32_t *up)
2054925bf6Swillf {
2154925bf6Swillf 	u_long ul;
2254925bf6Swillf 
2354925bf6Swillf 	switch (xdrs->x_op) {
2454925bf6Swillf 
2554925bf6Swillf 	case XDR_ENCODE:
2654925bf6Swillf 		ul = *up;
27*55fea89dSDan Cross 		return (xdr_u_long(xdrs, &ul));
2854925bf6Swillf 
2954925bf6Swillf 	case XDR_DECODE:
3054925bf6Swillf 		if (!xdr_u_long(xdrs, &ul)) {
3154925bf6Swillf 			return (FALSE);
3254925bf6Swillf 		}
3354925bf6Swillf 		*up = ul;
3454925bf6Swillf 		return (TRUE);
3554925bf6Swillf 
3654925bf6Swillf 	case XDR_FREE:
37*55fea89dSDan Cross 		return (TRUE);
3854925bf6Swillf 	}
3954925bf6Swillf 	return (FALSE);
4054925bf6Swillf }
4154925bf6Swillf 
42*55fea89dSDan Cross static
xdr_nullstring(XDR * xdrs,char ** objp)4354925bf6Swillf bool_t xdr_nullstring(XDR *xdrs, char **objp)
4454925bf6Swillf {
4554925bf6Swillf      u_int size;
46*55fea89dSDan Cross 
4754925bf6Swillf      if (xdrs->x_op == XDR_ENCODE) {
4854925bf6Swillf           if (*objp == NULL)
4954925bf6Swillf                size = 0;
5054925bf6Swillf           else
5154925bf6Swillf                size = strlen(*objp) + 1;
5254925bf6Swillf      }
5354925bf6Swillf      if (! xdr_u_int(xdrs, &size)) {
5454925bf6Swillf           return FALSE;
5554925bf6Swillf         }
5654925bf6Swillf      switch (xdrs->x_op) {
5754925bf6Swillf      case XDR_DECODE:
5854925bf6Swillf           if (size == 0) {
5954925bf6Swillf                *objp = NULL;
6054925bf6Swillf                return TRUE;
6154925bf6Swillf           } else if (*objp == NULL) {
6254925bf6Swillf                *objp = (char *) mem_alloc(size);
6354925bf6Swillf                if (*objp == NULL) {
6454925bf6Swillf                     errno = ENOMEM;
6554925bf6Swillf                     return FALSE;
6654925bf6Swillf                }
6754925bf6Swillf           }
6854925bf6Swillf           return (xdr_opaque(xdrs, *objp, size));
69*55fea89dSDan Cross 
7054925bf6Swillf      case XDR_ENCODE:
7154925bf6Swillf           if (size != 0)
7254925bf6Swillf                return (xdr_opaque(xdrs, *objp, size));
7354925bf6Swillf           return TRUE;
74*55fea89dSDan Cross 
7554925bf6Swillf      case XDR_FREE:
7654925bf6Swillf           if (*objp != NULL)
7754925bf6Swillf                mem_free(*objp, size);
7854925bf6Swillf           *objp = NULL;
7954925bf6Swillf           return TRUE;
8054925bf6Swillf      }
81*55fea89dSDan Cross 
8254925bf6Swillf      return FALSE;
8354925bf6Swillf }
84*55fea89dSDan Cross 
8554925bf6Swillf 
8654925bf6Swillf 
8754925bf6Swillf bool_t
xdr_osa_policy_ent_rec(XDR * xdrs,osa_policy_ent_t objp)8854925bf6Swillf xdr_osa_policy_ent_rec(XDR *xdrs, osa_policy_ent_t objp)
8954925bf6Swillf {
9054925bf6Swillf     switch (xdrs->x_op) {
9154925bf6Swillf     case XDR_ENCODE:
9254925bf6Swillf 	 objp->version = OSA_ADB_POLICY_VERSION_1;
9354925bf6Swillf 	 /* fall through */
9454925bf6Swillf     case XDR_FREE:
9554925bf6Swillf 	 if (!xdr_int(xdrs, &objp->version))
9654925bf6Swillf 	      return FALSE;
9754925bf6Swillf 	 break;
9854925bf6Swillf     case XDR_DECODE:
9954925bf6Swillf 	 if (!xdr_int(xdrs, &objp->version))
10054925bf6Swillf 	      return FALSE;
10154925bf6Swillf 	 if (objp->version != OSA_ADB_POLICY_VERSION_1)
10254925bf6Swillf 	      return FALSE;
10354925bf6Swillf 	 break;
10454925bf6Swillf     }
105*55fea89dSDan Cross 
10654925bf6Swillf     if(!xdr_nullstring(xdrs, &objp->name))
10754925bf6Swillf 	return (FALSE);
10854925bf6Swillf     if (!xdr_u_int32(xdrs, &objp->pw_min_life))
10954925bf6Swillf 	return (FALSE);
11054925bf6Swillf     if (!xdr_u_int32(xdrs, &objp->pw_max_life))
11154925bf6Swillf 	return (FALSE);
11254925bf6Swillf     if (!xdr_u_int32(xdrs, &objp->pw_min_length))
11354925bf6Swillf 	return (FALSE);
11454925bf6Swillf     if (!xdr_u_int32(xdrs, &objp->pw_min_classes))
11554925bf6Swillf 	return (FALSE);
11654925bf6Swillf     if (!xdr_u_int32(xdrs, &objp->pw_history_num))
11754925bf6Swillf 	return (FALSE);
11854925bf6Swillf     if (!xdr_u_int32(xdrs, &objp->policy_refcnt))
11954925bf6Swillf 	return (FALSE);
12054925bf6Swillf     return (TRUE);
12154925bf6Swillf }
122