freebsd-skq/eBones/krb/rd_err.c
csgr 105186eeee Initial import of eBones.
(Including all changes for FreeBSD - importing the original eBones distribution
would be too complex at this stage, since I don't have access to Piero's 
CVS.)
(If you want to include eBones in your system, don't forget to include
MAKE_EBONES in /etc/make.conf.)
(This stuff is now also suppable from braae.ru.ac.za.)

Bones originally from MIT SIPB.
Original port to FreeBSD 1.x  by Piero Serini.
Moved to FreeBSD 2.0 by Doug Rabson and Geoff Rehmet.
Nice bug fixes from Doug Rabson.
1994-09-30 14:50:09 +00:00

80 lines
2.3 KiB
C

/*
* Copyright 1986, 1987, 1988 by the Massachusetts Institute
* of Technology.
* For copying and distribution information, please see the file
* <Copyright.MIT>.
*
* This routine dissects a a Kerberos 'safe msg',
* checking its integrity, and returning a pointer to the application
* data contained and its length.
*
* Returns 0 (RD_AP_OK) for success or an error code (RD_AP_...)
*
* Steve Miller Project Athena MIT/DEC
*
* from: rd_err.c,v 4.5 89/01/13 17:26:38 steiner Exp $
* $Id: rd_err.c,v 1.2 1994/07/19 19:26:10 g89r4222 Exp $
*/
#ifndef lint
static char rcsid[] =
"$Id: rd_err.c,v 1.2 1994/07/19 19:26:10 g89r4222 Exp $";
#endif /* lint */
/* system include files */
#include <stdio.h>
#include <errno.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/time.h>
/* application include files */
#include <krb.h>
#include <prot.h>
/*
* Given an AUTH_MSG_APPL_ERR message, "in" and its length "in_length",
* return the error code from the message in "code" and the text in
* "m_data" as follows:
*
* m_data->app_data points to the error text
* m_data->app_length points to the length of the error text
*
* If all goes well, return RD_AP_OK. If the version number
* is wrong, return RD_AP_VERSION, and if it's not an AUTH_MSG_APPL_ERR
* type message, return RD_AP_MSG_TYPE.
*
* The AUTH_MSG_APPL_ERR message format can be found in mk_err.c
*/
int
krb_rd_err(in,in_length,code,m_data)
u_char *in; /* pointer to the msg received */
u_long in_length; /* of in msg */
long *code; /* received error code */
MSG_DAT *m_data;
{
register u_char *p;
int swap_bytes = 0;
p = in; /* beginning of message */
if (*p++ != KRB_PROT_VERSION)
return(RD_AP_VERSION);
if (((*p) & ~1) != AUTH_MSG_APPL_ERR)
return(RD_AP_MSG_TYPE);
if ((*p++ & 1) != HOST_BYTE_ORDER)
swap_bytes++;
/* safely get code */
bcopy((char *)p,(char *)code,sizeof(*code));
if (swap_bytes)
swap_u_long(*code);
p += sizeof(*code); /* skip over */
m_data->app_data = p; /* we're now at the error text
* message */
m_data->app_length = in_length;
return(RD_AP_OK); /* OK == 0 */
}