/* * Unix longhand authenticator */ enum auth_stat _svcauth_unix( register struct svc_req *rqst, register struct rpc_msg *msg) { register enum auth_stat stat; XDR xdrs; register struct authunix_parms *aup; register uint32_t *buf; struct area { struct authunix_parms area_aup; char area_machname[MAX_MACHINE_NAME+1]; int area_gids[NGRPS]; } *area; unsigned auth_len; int str_len, gid_len; register int i; area = (struct area *) rqst->rq_clntcred; aup = &area->area_aup; aup->aup_machname = area->area_machname; aup->aup_gids = area->area_gids; auth_len = (unsigned)msg->rm_call.cb_cred.oa_length; xdrmem_create(&xdrs, msg->rm_call.cb_cred.oa_base, auth_len,XDR_DECODE); buf = XDR_INLINE(&xdrs, (int)auth_len); if (buf != NULL) { aup->aup_time = IXDR_GET_LONG(buf); str_len = IXDR_GET_U_LONG(buf); if (str_len > MAX_MACHINE_NAME) { stat = AUTH_BADCRED; goto done; } bcopy((char*)buf, aup->aup_machname, (unsigned)str_len); aup->aup_machname[str_len] = 0; str_len = RNDUP(str_len); buf += str_len / sizeof (*buf); aup->aup_uid = IXDR_GET_LONG(buf); aup->aup_gid = IXDR_GET_LONG(buf); gid_len = IXDR_GET_U_LONG(buf); if (gid_len > NGRPS) { stat = AUTH_BADCRED; goto done; } aup->aup_len = gid_len; for (i = 0; i < gid_len; i++) { aup->aup_gids[i] = IXDR_GET_LONG(buf); } /* * five is the smallest unix credentials structure - * timestamp, hostname len (0), uid, gid, and gids len (0). */ if ((5 + gid_len) * BYTES_PER_XDR_UNIT + str_len > auth_len) { (void) printf("bad auth_len gid %d str %d auth %d\n", gid_len, str_len, auth_len); stat = AUTH_BADCRED; goto done; } } else if (! xdr_authunix_parms(&xdrs, aup)) { xdrs.x_op = XDR_FREE; (void)xdr_authunix_parms(&xdrs, aup); stat = AUTH_BADCRED; goto done; } rqst->rq_xprt->xp_verf.oa_flavor = AUTH_NULL; rqst->rq_xprt->xp_verf.oa_length = 0; stat = AUTH_OK; done: XDR_DESTROY(&xdrs); return (stat); }
bool_t xdr_fattr (XDR *xdrs, fattr *objp) { register int32_t *buf; if (xdrs->x_op == XDR_ENCODE) { if (!xdr_ftype (xdrs, &objp->type)) return FALSE; buf = XDR_INLINE (xdrs, 10 * BYTES_PER_XDR_UNIT); if (buf == NULL) { if (!xdr_u_int (xdrs, &objp->mode)) return FALSE; if (!xdr_u_int (xdrs, &objp->nlink)) return FALSE; if (!xdr_u_int (xdrs, &objp->uid)) return FALSE; if (!xdr_u_int (xdrs, &objp->gid)) return FALSE; if (!xdr_u_int (xdrs, &objp->size)) return FALSE; if (!xdr_u_int (xdrs, &objp->blocksize)) return FALSE; if (!xdr_u_int (xdrs, &objp->rdev)) return FALSE; if (!xdr_u_int (xdrs, &objp->blocks)) return FALSE; if (!xdr_u_int (xdrs, &objp->fsid)) return FALSE; if (!xdr_u_int (xdrs, &objp->fileid)) return FALSE; } else { IXDR_PUT_U_LONG(buf, objp->mode); IXDR_PUT_U_LONG(buf, objp->nlink); IXDR_PUT_U_LONG(buf, objp->uid); IXDR_PUT_U_LONG(buf, objp->gid); IXDR_PUT_U_LONG(buf, objp->size); IXDR_PUT_U_LONG(buf, objp->blocksize); IXDR_PUT_U_LONG(buf, objp->rdev); IXDR_PUT_U_LONG(buf, objp->blocks); IXDR_PUT_U_LONG(buf, objp->fsid); IXDR_PUT_U_LONG(buf, objp->fileid); } if (!xdr_nfstime (xdrs, &objp->atime)) return FALSE; if (!xdr_nfstime (xdrs, &objp->mtime)) return FALSE; if (!xdr_nfstime (xdrs, &objp->ctime)) return FALSE; return TRUE; } else if (xdrs->x_op == XDR_DECODE) { if (!xdr_ftype (xdrs, &objp->type)) return FALSE; buf = XDR_INLINE (xdrs, 10 * BYTES_PER_XDR_UNIT); if (buf == NULL) { if (!xdr_u_int (xdrs, &objp->mode)) return FALSE; if (!xdr_u_int (xdrs, &objp->nlink)) return FALSE; if (!xdr_u_int (xdrs, &objp->uid)) return FALSE; if (!xdr_u_int (xdrs, &objp->gid)) return FALSE; if (!xdr_u_int (xdrs, &objp->size)) return FALSE; if (!xdr_u_int (xdrs, &objp->blocksize)) return FALSE; if (!xdr_u_int (xdrs, &objp->rdev)) return FALSE; if (!xdr_u_int (xdrs, &objp->blocks)) return FALSE; if (!xdr_u_int (xdrs, &objp->fsid)) return FALSE; if (!xdr_u_int (xdrs, &objp->fileid)) return FALSE; } else { objp->mode = IXDR_GET_U_LONG(buf); objp->nlink = IXDR_GET_U_LONG(buf); objp->uid = IXDR_GET_U_LONG(buf); objp->gid = IXDR_GET_U_LONG(buf); objp->size = IXDR_GET_U_LONG(buf); objp->blocksize = IXDR_GET_U_LONG(buf); objp->rdev = IXDR_GET_U_LONG(buf); objp->blocks = IXDR_GET_U_LONG(buf); objp->fsid = IXDR_GET_U_LONG(buf); objp->fileid = IXDR_GET_U_LONG(buf); } if (!xdr_nfstime (xdrs, &objp->atime)) return FALSE; if (!xdr_nfstime (xdrs, &objp->mtime)) return FALSE; if (!xdr_nfstime (xdrs, &objp->ctime)) return FALSE; return TRUE; } if (!xdr_ftype (xdrs, &objp->type)) return FALSE; if (!xdr_u_int (xdrs, &objp->mode)) return FALSE; if (!xdr_u_int (xdrs, &objp->nlink)) return FALSE; if (!xdr_u_int (xdrs, &objp->uid)) return FALSE; if (!xdr_u_int (xdrs, &objp->gid)) return FALSE; if (!xdr_u_int (xdrs, &objp->size)) return FALSE; if (!xdr_u_int (xdrs, &objp->blocksize)) return FALSE; if (!xdr_u_int (xdrs, &objp->rdev)) return FALSE; if (!xdr_u_int (xdrs, &objp->blocks)) return FALSE; if (!xdr_u_int (xdrs, &objp->fsid)) return FALSE; if (!xdr_u_int (xdrs, &objp->fileid)) return FALSE; if (!xdr_nfstime (xdrs, &objp->atime)) return FALSE; if (!xdr_nfstime (xdrs, &objp->mtime)) return FALSE; if (!xdr_nfstime (xdrs, &objp->ctime)) return FALSE; return TRUE; }
bool_t xdr_statfsokres (XDR *xdrs, statfsokres *objp) { register int32_t *buf; if (xdrs->x_op == XDR_ENCODE) { buf = XDR_INLINE (xdrs, 5 * BYTES_PER_XDR_UNIT); if (buf == NULL) { if (!xdr_u_int (xdrs, &objp->tsize)) return FALSE; if (!xdr_u_int (xdrs, &objp->bsize)) return FALSE; if (!xdr_u_int (xdrs, &objp->blocks)) return FALSE; if (!xdr_u_int (xdrs, &objp->bfree)) return FALSE; if (!xdr_u_int (xdrs, &objp->bavail)) return FALSE; } else { IXDR_PUT_U_LONG(buf, objp->tsize); IXDR_PUT_U_LONG(buf, objp->bsize); IXDR_PUT_U_LONG(buf, objp->blocks); IXDR_PUT_U_LONG(buf, objp->bfree); IXDR_PUT_U_LONG(buf, objp->bavail); } return TRUE; } else if (xdrs->x_op == XDR_DECODE) { buf = XDR_INLINE (xdrs, 5 * BYTES_PER_XDR_UNIT); if (buf == NULL) { if (!xdr_u_int (xdrs, &objp->tsize)) return FALSE; if (!xdr_u_int (xdrs, &objp->bsize)) return FALSE; if (!xdr_u_int (xdrs, &objp->blocks)) return FALSE; if (!xdr_u_int (xdrs, &objp->bfree)) return FALSE; if (!xdr_u_int (xdrs, &objp->bavail)) return FALSE; } else { objp->tsize = IXDR_GET_U_LONG(buf); objp->bsize = IXDR_GET_U_LONG(buf); objp->blocks = IXDR_GET_U_LONG(buf); objp->bfree = IXDR_GET_U_LONG(buf); objp->bavail = IXDR_GET_U_LONG(buf); } return TRUE; } if (!xdr_u_int (xdrs, &objp->tsize)) return FALSE; if (!xdr_u_int (xdrs, &objp->bsize)) return FALSE; if (!xdr_u_int (xdrs, &objp->blocks)) return FALSE; if (!xdr_u_int (xdrs, &objp->bfree)) return FALSE; if (!xdr_u_int (xdrs, &objp->bavail)) return FALSE; return TRUE; }
bool_t xdr_sattr (XDR *xdrs, sattr *objp) { register int32_t *buf; if (xdrs->x_op == XDR_ENCODE) { buf = XDR_INLINE (xdrs, 4 * BYTES_PER_XDR_UNIT); if (buf == NULL) { if (!xdr_u_int (xdrs, &objp->mode)) return FALSE; if (!xdr_u_int (xdrs, &objp->uid)) return FALSE; if (!xdr_u_int (xdrs, &objp->gid)) return FALSE; if (!xdr_u_int (xdrs, &objp->size)) return FALSE; } else { IXDR_PUT_U_LONG(buf, objp->mode); IXDR_PUT_U_LONG(buf, objp->uid); IXDR_PUT_U_LONG(buf, objp->gid); IXDR_PUT_U_LONG(buf, objp->size); } if (!xdr_nfstime (xdrs, &objp->atime)) return FALSE; if (!xdr_nfstime (xdrs, &objp->mtime)) return FALSE; return TRUE; } else if (xdrs->x_op == XDR_DECODE) { buf = XDR_INLINE (xdrs, 4 * BYTES_PER_XDR_UNIT); if (buf == NULL) { if (!xdr_u_int (xdrs, &objp->mode)) return FALSE; if (!xdr_u_int (xdrs, &objp->uid)) return FALSE; if (!xdr_u_int (xdrs, &objp->gid)) return FALSE; if (!xdr_u_int (xdrs, &objp->size)) return FALSE; } else { objp->mode = IXDR_GET_U_LONG(buf); objp->uid = IXDR_GET_U_LONG(buf); objp->gid = IXDR_GET_U_LONG(buf); objp->size = IXDR_GET_U_LONG(buf); } if (!xdr_nfstime (xdrs, &objp->atime)) return FALSE; if (!xdr_nfstime (xdrs, &objp->mtime)) return FALSE; return TRUE; } if (!xdr_u_int (xdrs, &objp->mode)) return FALSE; if (!xdr_u_int (xdrs, &objp->uid)) return FALSE; if (!xdr_u_int (xdrs, &objp->gid)) return FALSE; if (!xdr_u_int (xdrs, &objp->size)) return FALSE; if (!xdr_nfstime (xdrs, &objp->atime)) return FALSE; if (!xdr_nfstime (xdrs, &objp->mtime)) return FALSE; return TRUE; }
bool_t xdr_auth_glusterfs_parms_v2 (XDR *xdrs, auth_glusterfs_parms_v2 *objp) { register int32_t *buf; buf = NULL; if (xdrs->x_op == XDR_ENCODE) { buf = XDR_INLINE (xdrs, 3 * BYTES_PER_XDR_UNIT); if (buf == NULL) { if (!xdr_int (xdrs, &objp->pid)) return FALSE; if (!xdr_u_int (xdrs, &objp->uid)) return FALSE; if (!xdr_u_int (xdrs, &objp->gid)) return FALSE; } else { IXDR_PUT_LONG(buf, objp->pid); IXDR_PUT_U_LONG(buf, objp->uid); IXDR_PUT_U_LONG(buf, objp->gid); } if (!xdr_array (xdrs, (char **)&objp->groups.groups_val, (u_int *) &objp->groups.groups_len, ~0, sizeof (u_int), (xdrproc_t) xdr_u_int)) return FALSE; if (!xdr_bytes (xdrs, (char **)&objp->lk_owner.lk_owner_val, (u_int *) &objp->lk_owner.lk_owner_len, ~0)) return FALSE; return TRUE; } else if (xdrs->x_op == XDR_DECODE) { buf = XDR_INLINE (xdrs, 3 * BYTES_PER_XDR_UNIT); if (buf == NULL) { if (!xdr_int (xdrs, &objp->pid)) return FALSE; if (!xdr_u_int (xdrs, &objp->uid)) return FALSE; if (!xdr_u_int (xdrs, &objp->gid)) return FALSE; } else { objp->pid = IXDR_GET_LONG(buf); objp->uid = IXDR_GET_U_LONG(buf); objp->gid = IXDR_GET_U_LONG(buf); } if (!xdr_array (xdrs, (char **)&objp->groups.groups_val, (u_int *) &objp->groups.groups_len, ~0, sizeof (u_int), (xdrproc_t) xdr_u_int)) return FALSE; if (!xdr_bytes (xdrs, (char **)&objp->lk_owner.lk_owner_val, (u_int *) &objp->lk_owner.lk_owner_len, ~0)) return FALSE; return TRUE; } if (!xdr_int (xdrs, &objp->pid)) return FALSE; if (!xdr_u_int (xdrs, &objp->uid)) return FALSE; if (!xdr_u_int (xdrs, &objp->gid)) return FALSE; if (!xdr_array (xdrs, (char **)&objp->groups.groups_val, (u_int *) &objp->groups.groups_len, ~0, sizeof (u_int), (xdrproc_t) xdr_u_int)) return FALSE; if (!xdr_bytes (xdrs, (char **)&objp->lk_owner.lk_owner_val, (u_int *) &objp->lk_owner.lk_owner_len, ~0)) return FALSE; return TRUE; }
bool_t xdr_auth_glusterfs_parms (XDR *xdrs, auth_glusterfs_parms *objp) { register int32_t *buf; int i; buf = NULL; if (xdrs->x_op == XDR_ENCODE) { if (!xdr_u_quad_t (xdrs, &objp->lk_owner)) return FALSE; buf = XDR_INLINE (xdrs, (4 + 16 )* BYTES_PER_XDR_UNIT); if (buf == NULL) { if (!xdr_u_int (xdrs, &objp->pid)) return FALSE; if (!xdr_u_int (xdrs, &objp->uid)) return FALSE; if (!xdr_u_int (xdrs, &objp->gid)) return FALSE; if (!xdr_u_int (xdrs, &objp->ngrps)) return FALSE; if (!xdr_vector (xdrs, (char *)objp->groups, 16, sizeof (u_int), (xdrproc_t) xdr_u_int)) return FALSE; } else { IXDR_PUT_U_LONG(buf, objp->pid); IXDR_PUT_U_LONG(buf, objp->uid); IXDR_PUT_U_LONG(buf, objp->gid); IXDR_PUT_U_LONG(buf, objp->ngrps); { register u_int *genp; for (i = 0, genp = objp->groups; i < 16; ++i) { IXDR_PUT_U_LONG(buf, *genp++); } } } return TRUE; } else if (xdrs->x_op == XDR_DECODE) { if (!xdr_u_quad_t (xdrs, &objp->lk_owner)) return FALSE; buf = XDR_INLINE (xdrs, (4 + 16 )* BYTES_PER_XDR_UNIT); if (buf == NULL) { if (!xdr_u_int (xdrs, &objp->pid)) return FALSE; if (!xdr_u_int (xdrs, &objp->uid)) return FALSE; if (!xdr_u_int (xdrs, &objp->gid)) return FALSE; if (!xdr_u_int (xdrs, &objp->ngrps)) return FALSE; if (!xdr_vector (xdrs, (char *)objp->groups, 16, sizeof (u_int), (xdrproc_t) xdr_u_int)) return FALSE; } else { objp->pid = IXDR_GET_U_LONG(buf); objp->uid = IXDR_GET_U_LONG(buf); objp->gid = IXDR_GET_U_LONG(buf); objp->ngrps = IXDR_GET_U_LONG(buf); { register u_int *genp; for (i = 0, genp = objp->groups; i < 16; ++i) { *genp++ = IXDR_GET_U_LONG(buf); } } } return TRUE; } if (!xdr_u_quad_t (xdrs, &objp->lk_owner)) return FALSE; if (!xdr_u_int (xdrs, &objp->pid)) return FALSE; if (!xdr_u_int (xdrs, &objp->uid)) return FALSE; if (!xdr_u_int (xdrs, &objp->gid)) return FALSE; if (!xdr_u_int (xdrs, &objp->ngrps)) return FALSE; if (!xdr_vector (xdrs, (char *)objp->groups, 16, sizeof (u_int), (xdrproc_t) xdr_u_int)) return FALSE; return TRUE; }