1 #include <sys/types.h>
2 /* Solaris Kerberos: gssrpc not supported */
3 #if 0 /************** Begin IFDEF'ed OUT *******************************/
4 #include <gssrpc/rpc.h>
5 #else
6 #include <rpc/rpc.h>
7 #include <kadm5/kadm_rpc.h>
8 #endif /**************** END IFDEF'ed OUT *******************************/
9 #include <kdb.h>
10 #include "policy_db.h"
11 #ifdef HAVE_MEMORY_H
12 #include <memory.h>
13 #endif
14 #include <krb5.h>
15 #include <strings.h>
16
17 /* Solaris Kerberos: this function taken from MIT's src/lib/rpc/xdr.c */
18 bool_t
xdr_u_int32(XDR * xdrs,uint32_t * up)19 xdr_u_int32(XDR *xdrs, uint32_t *up)
20 {
21 u_long ul;
22
23 switch (xdrs->x_op) {
24
25 case XDR_ENCODE:
26 ul = *up;
27 return (xdr_u_long(xdrs, &ul));
28
29 case XDR_DECODE:
30 if (!xdr_u_long(xdrs, &ul)) {
31 return (FALSE);
32 }
33 *up = ul;
34 return (TRUE);
35
36 case XDR_FREE:
37 return (TRUE);
38 }
39 return (FALSE);
40 }
41
42 static
xdr_nullstring(XDR * xdrs,char ** objp)43 bool_t xdr_nullstring(XDR *xdrs, char **objp)
44 {
45 u_int size;
46
47 if (xdrs->x_op == XDR_ENCODE) {
48 if (*objp == NULL)
49 size = 0;
50 else
51 size = strlen(*objp) + 1;
52 }
53 if (! xdr_u_int(xdrs, &size)) {
54 return FALSE;
55 }
56 switch (xdrs->x_op) {
57 case XDR_DECODE:
58 if (size == 0) {
59 *objp = NULL;
60 return TRUE;
61 } else if (*objp == NULL) {
62 *objp = (char *) mem_alloc(size);
63 if (*objp == NULL) {
64 errno = ENOMEM;
65 return FALSE;
66 }
67 }
68 return (xdr_opaque(xdrs, *objp, size));
69
70 case XDR_ENCODE:
71 if (size != 0)
72 return (xdr_opaque(xdrs, *objp, size));
73 return TRUE;
74
75 case XDR_FREE:
76 if (*objp != NULL)
77 mem_free(*objp, size);
78 *objp = NULL;
79 return TRUE;
80 }
81
82 return FALSE;
83 }
84
85
86
87 bool_t
xdr_osa_policy_ent_rec(XDR * xdrs,osa_policy_ent_t objp)88 xdr_osa_policy_ent_rec(XDR *xdrs, osa_policy_ent_t objp)
89 {
90 switch (xdrs->x_op) {
91 case XDR_ENCODE:
92 objp->version = OSA_ADB_POLICY_VERSION_1;
93 /* fall through */
94 case XDR_FREE:
95 if (!xdr_int(xdrs, &objp->version))
96 return FALSE;
97 break;
98 case XDR_DECODE:
99 if (!xdr_int(xdrs, &objp->version))
100 return FALSE;
101 if (objp->version != OSA_ADB_POLICY_VERSION_1)
102 return FALSE;
103 break;
104 }
105
106 if(!xdr_nullstring(xdrs, &objp->name))
107 return (FALSE);
108 if (!xdr_u_int32(xdrs, &objp->pw_min_life))
109 return (FALSE);
110 if (!xdr_u_int32(xdrs, &objp->pw_max_life))
111 return (FALSE);
112 if (!xdr_u_int32(xdrs, &objp->pw_min_length))
113 return (FALSE);
114 if (!xdr_u_int32(xdrs, &objp->pw_min_classes))
115 return (FALSE);
116 if (!xdr_u_int32(xdrs, &objp->pw_history_num))
117 return (FALSE);
118 if (!xdr_u_int32(xdrs, &objp->policy_refcnt))
119 return (FALSE);
120 return (TRUE);
121 }
122