From d8a63f6d7d6a6b583edf8eaaf9fa8c133206a94b Mon Sep 17 00:00:00 2001 From: Paul Park Date: Tue, 29 Aug 1995 18:32:58 +0000 Subject: [PATCH] Add ccache serialization support git-svn-id: svn://anonsvn.mit.edu/krb5/trunk@6614 dc483132-0cff-0310-8789-dd5450dbe970 --- src/lib/krb5/ccache/.Sanitize | 1 + src/lib/krb5/ccache/ChangeLog | 5 + src/lib/krb5/ccache/Makefile.in | 6 +- src/lib/krb5/ccache/file/ChangeLog | 4 + src/lib/krb5/ccache/file/fcc_reslv.c | 2 + src/lib/krb5/ccache/ser_cc.c | 211 ++++++++++++++++++++++++++ src/lib/krb5/ccache/stdio/ChangeLog | 4 + src/lib/krb5/ccache/stdio/scc_reslv.c | 2 + 8 files changed, 233 insertions(+), 2 deletions(-) create mode 100644 src/lib/krb5/ccache/ser_cc.c diff --git a/src/lib/krb5/ccache/.Sanitize b/src/lib/krb5/ccache/.Sanitize index a1481d1e7..2b570fba0 100644 --- a/src/lib/krb5/ccache/.Sanitize +++ b/src/lib/krb5/ccache/.Sanitize @@ -32,6 +32,7 @@ ccdefops.c configure configure.in file +ser_cc.c stdio Things-to-lose: diff --git a/src/lib/krb5/ccache/ChangeLog b/src/lib/krb5/ccache/ChangeLog index d8ac12f6c..62b1faf97 100644 --- a/src/lib/krb5/ccache/ChangeLog +++ b/src/lib/krb5/ccache/ChangeLog @@ -1,3 +1,8 @@ + +Tue Aug 29 13:35:23 EDT 1995 Paul Park (pjpark@mit.edu) + * Makefile.in, .Sanitize, ser_cc.c - Add new ccache handle serialization + routines. + Fri Jun 9 19:31:13 1995 * configure.in: Remove standardized set of autoconf macros, which diff --git a/src/lib/krb5/ccache/Makefile.in b/src/lib/krb5/ccache/Makefile.in index 4ac77d566..296be983e 100644 --- a/src/lib/krb5/ccache/Makefile.in +++ b/src/lib/krb5/ccache/Makefile.in @@ -10,11 +10,13 @@ CFLAGS = $(CCOPTS) $(DEFS) -I$(srcdir)$(S)file -I$(srcdir)$(S)stdio OBJS= ccbase.$(OBJEXT) \ ccdefault.$(OBJEXT) \ - ccdefops.$(OBJEXT) + ccdefops.$(OBJEXT) \ + ser_cc.$(OBJEXT) SRCS= $(srcdir)/ccbase.c \ $(srcdir)/ccdefault.c \ - $(srcdir)/ccdefops.c + $(srcdir)/ccdefops.c \ + $(srcdir)/ser_cc.c all:: all-$(WHAT) diff --git a/src/lib/krb5/ccache/file/ChangeLog b/src/lib/krb5/ccache/file/ChangeLog index a49e4b450..4ec1d6eab 100644 --- a/src/lib/krb5/ccache/file/ChangeLog +++ b/src/lib/krb5/ccache/file/ChangeLog @@ -1,3 +1,7 @@ + +Tue Aug 29 13:36:00 EDT 1995 Paul Park (pjpark@mit.edu) + * fcc_reslv.c - Set magic number in successfully resolved ccache. + Tue Jul 11 19:26:47 1995 Ezra Peisach * fcc-proto.h: Add prototype for krb5_fcc_read. Indicate that diff --git a/src/lib/krb5/ccache/file/fcc_reslv.c b/src/lib/krb5/ccache/file/fcc_reslv.c index c352c0c0b..4b6d381c9 100644 --- a/src/lib/krb5/ccache/file/fcc_reslv.c +++ b/src/lib/krb5/ccache/file/fcc_reslv.c @@ -85,6 +85,8 @@ krb5_fcc_resolve (context, id, residual) /* Set up the filename */ strcpy(((krb5_fcc_data *) lid->data)->filename, residual); + lid->magic = KV5M_CCACHE; + /* other routines will get errors on open, and callers must expect them, if cache is non-existent/unusable */ *id = lid; diff --git a/src/lib/krb5/ccache/ser_cc.c b/src/lib/krb5/ccache/ser_cc.c new file mode 100644 index 000000000..384e8ebb2 --- /dev/null +++ b/src/lib/krb5/ccache/ser_cc.c @@ -0,0 +1,211 @@ +/* + * lib/krb5/ccache/ser_rc.c + * + * Copyright 1995 by the Massachusetts Institute of Technology. + * All Rights Reserved. + * + * Export of this software from the United States of America may + * require a specific license from the United States Government. + * It is the responsibility of any person or organization contemplating + * export to obtain such a license before exporting. + * + * WITHIN THAT CONSTRAINT, permission to use, copy, modify, and + * distribute this software and its documentation for any purpose and + * without fee is hereby granted, provided that the above copyright + * notice appear in all copies and that both that copyright notice and + * this permission notice appear in supporting documentation, and that + * the name of M.I.T. not be used in advertising or publicity pertaining + * to distribution of the software without specific, written prior + * permission. M.I.T. makes no representations about the suitability of + * this software for any purpose. It is provided "as is" without express + * or implied warranty. + * + */ + +/* + * ser_rcdfl.c - Serialize replay cache context. + */ +#include "k5-int.h" + +/* + * Routines to deal with externalizing krb5_ccache. + * krb5_ccache_size(); + * krb5_ccache_externalize(); + * krb5_ccache_internalize(); + */ +static krb5_error_code krb5_ccache_size + KRB5_PROTOTYPE((krb5_context, krb5_pointer, size_t *)); +static krb5_error_code krb5_ccache_externalize + KRB5_PROTOTYPE((krb5_context, krb5_pointer, krb5_octet **, size_t *)); +static krb5_error_code krb5_ccache_internalize + KRB5_PROTOTYPE((krb5_context,krb5_pointer *, krb5_octet **, size_t *)); + +/* + * Serialization entry for this type. + */ +static const krb5_ser_entry krb5_ccache_ser_entry = { + KV5M_CCACHE, /* Type */ + krb5_ccache_size, /* Sizer routine */ + krb5_ccache_externalize, /* Externalize routine */ + krb5_ccache_internalize /* Internalize routine */ +}; + +/* + * krb5_ccache_size() - Determine the size required to externalize + * this krb5_ccache variant. + */ +static krb5_error_code +krb5_ccache_size(kcontext, arg, sizep) + krb5_context kcontext; + krb5_pointer arg; + size_t *sizep; +{ + krb5_error_code kret; + krb5_ccache ccache; + size_t required; + + kret = EINVAL; + if ((ccache = (krb5_ccache) arg)) { + /* + * Saving FILE: variants of krb5_ccache requires at minimum: + * krb5_int32 for KV5M_CCACHE + * krb5_int32 for length of ccache name. + * krb5_int32 for KV5M_CCACHE + */ + required = sizeof(krb5_int32) * 3; + if (ccache->ops && ccache->ops->prefix) + required += (strlen(ccache->ops->prefix)+1); + + /* + * The ccache name is formed as follows: + * : + */ + required += strlen(krb5_rc_get_name(kcontext, ccache)); + + kret = 0; + *sizep += required; + } + return(kret); +} + +/* + * krb5_ccache_externalize() - Externalize the krb5_ccache. + */ +static krb5_error_code +krb5_ccache_externalize(kcontext, arg, buffer, lenremain) + krb5_context kcontext; + krb5_pointer arg; + krb5_octet **buffer; + size_t *lenremain; +{ + krb5_error_code kret; + krb5_ccache ccache; + size_t required; + krb5_octet *bp; + size_t remain; + char *ccname; + size_t namelen; + char *fnamep; + + required = 0; + bp = *buffer; + remain = *lenremain; + kret = EINVAL; + if ((ccache = (krb5_ccache) arg)) { + kret = ENOMEM; + if (!krb5_ccache_size(kcontext, arg, &required) && + (required <= remain)) { + /* Our identifier */ + (void) krb5_ser_pack_int32(KV5M_CCACHE, &bp, &remain); + + /* Calculate the length of the name */ + namelen = (ccache->ops && ccache->ops->prefix) ? + strlen(ccache->ops->prefix)+1 : 0; + fnamep = krb5_rc_get_name(kcontext, ccache); + namelen += (strlen(fnamep)+1); + + if ((ccname = (char *) malloc(namelen))) { + /* Format the ccache name. */ + if (ccache->ops && ccache->ops->prefix) + sprintf(ccname, "%s:%s", ccache->ops->prefix, fnamep); + else + strcpy(ccname, fnamep); + + /* Put the length of the file name */ + (void) krb5_ser_pack_int32((krb5_int32) strlen(ccname), + &bp, &remain); + + /* Put the name */ + (void) krb5_ser_pack_bytes((krb5_octet *) ccname, + strlen(ccname), + &bp, &remain); + + /* Put the trailer */ + (void) krb5_ser_pack_int32(KV5M_CCACHE, &bp, &remain); + kret = 0; + *buffer = bp; + *lenremain = remain; + free(ccname); + } + } + } + return(kret); +} + +/* + * krb5_ccache_internalize() - Internalize the krb5_ccache. + */ +static krb5_error_code +krb5_ccache_internalize(kcontext, argp, buffer, lenremain) + krb5_context kcontext; + krb5_pointer *argp; + krb5_octet **buffer; + size_t *lenremain; +{ + krb5_error_code kret; + krb5_ccache ccache; + krb5_int32 ibuf; + krb5_octet *bp; + size_t remain; + char *ccname; + + bp = *buffer; + remain = *lenremain; + kret = EINVAL; + /* Read our magic number */ + if (krb5_ser_unpack_int32(&ibuf, &bp, &remain)) + ibuf = 0; + if (ibuf == KV5M_CCACHE) { + kret = ENOMEM; + + /* Get the length of the ccache name */ + kret = krb5_ser_unpack_int32(&ibuf, &bp, &remain); + + if (!kret && + (ccname = (char *) malloc((size_t) (ibuf+1))) && + !(kret = krb5_ser_unpack_bytes((krb5_octet *) ccname, + (size_t) ibuf, + &bp, &remain))) { + ccname[ibuf] = '\0'; + if (!(kret = krb5_cc_resolve(kcontext, ccname, &ccache)) && + !(kret = krb5_ser_unpack_int32(&ibuf, &bp, &remain)) && + (ibuf == KV5M_CCACHE)) { + *buffer = bp; + *lenremain = remain; + *argp = (krb5_pointer) ccache; + } + free(ccname); + } + } + return(kret); +} + +/* + * Register the ccache serializer. + */ +krb5_error_code +krb5_ser_ccache_init(kcontext) + krb5_context kcontext; +{ + return(krb5_register_serializer(kcontext, &krb5_ccache_ser_entry)); +} diff --git a/src/lib/krb5/ccache/stdio/ChangeLog b/src/lib/krb5/ccache/stdio/ChangeLog index 64544d2b6..e49515ffc 100644 --- a/src/lib/krb5/ccache/stdio/ChangeLog +++ b/src/lib/krb5/ccache/stdio/ChangeLog @@ -1,3 +1,7 @@ + +Tue Aug 29 13:36:39 EDT 1995 Paul Park (pjpark@mit.edu) + * scc_reslv.c - Set magic number in successfully resolved ccache. + Wed Aug 16 02:45:19 1995 Chris Provenzano * scc_maybe.c: Pass fds to krb5_lock_file() and krb5_unlock_file() diff --git a/src/lib/krb5/ccache/stdio/scc_reslv.c b/src/lib/krb5/ccache/stdio/scc_reslv.c index 1add343e6..e26354fd6 100644 --- a/src/lib/krb5/ccache/stdio/scc_reslv.c +++ b/src/lib/krb5/ccache/stdio/scc_reslv.c @@ -85,6 +85,8 @@ krb5_scc_resolve (context, id, residual) /* Set up the filename */ strcpy(((krb5_scc_data *) lid->data)->filename, residual); + lid->magic = KV5M_CCACHE; + /* other routines will get errors on open, and callers must expect them, if cache is non-existent/unusable */ *id = lid; -- 2.26.2