file_enc.c

来自「ftam等标准协议服务器和客户端的源代码。」· C语言 代码 · 共 169 行

C
169
字号
#ifndef lintstatic char *rcsid = "$Header: /xtel/isode/isode/dsap/common/RCS/file_enc.c,v 9.0 1992/06/16 12:12:39 isode Rel $";#endif/* * $Header: /xtel/isode/isode/dsap/common/RCS/file_enc.c,v 9.0 1992/06/16 12:12:39 isode Rel $ * * * $Log: file_enc.c,v $ * Revision 9.0  1992/06/16  12:12:39  isode * Release 8.0 * *//* *                                NOTICE * *    Acquisition, use, and distribution of this module and related *    materials are subject to the restrictions of a license agreement. *    Consult the Preface in the User's Manual for the full terms of *    this agreement. * */#include "quipu/util.h"#include "quipu/attrvalue.h"extern LLog * log_dsap;extern char dsa_mode;int file_attr_length;static char *readfile (file)FILE * file;{char *parse_buffer;int parse_len;char	*buf;int	buflen;int	curlen;int	size;	    curlen = 0;    buflen = parse_len = LINESIZE;    buf = parse_buffer = smalloc(LINESIZE);    for (;;) {	if ( buflen <= 100) {		parse_len += LINESIZE;		buflen += LINESIZE;		if ((parse_buffer = realloc(parse_buffer, (unsigned)parse_len)) == NULLCP)		    exit (2);	/* ??? */		buf = parse_buffer + curlen;	}	if (fgets (buf, buflen,file) == NULLCP) {	    file_attr_length = curlen;	    return (parse_buffer);        }	size = strlen(buf);	if (buf[size - 1] == '\n') {	    buf[--size] = '\0';	}	buf += size;	buflen -= size;	curlen += size;    }    /* NOTREACHED */}PE grab_filepe (av)AttributeValue av;{FILE * fptr;struct file_syntax * fs;sntx_table *tbl, * get_syntax_table();PE ret_pe = NULLPE, grab_pe();	fs = (struct file_syntax *) av->av_struct;	if (fs->fs_attr != NULLAttrV)		return (grab_pe (fs->fs_attr));	if (fs->fs_name == NULLCP) 		goto out;	/* should never happen */	if ((fptr = fopen (fs->fs_name,"r")) != NULL) {		tbl = get_syntax_table (fs->fs_real_syntax);		if (tbl->s_parse == NULLIFP) { /* treat as pure asn */			PS fps;			fps = ps_alloc (std_open);			if ((std_setup (fps,fptr)) == NOTOK) {				(void) fclose (fptr);				ps_free (fps);				goto out;			}			ret_pe = ps2pe (fps);			if (fps->ps_errno != PS_ERR_NONE) {				LLOG (log_dsap,LLOG_EXCEPTIONS,("%s in attribute file '%s'",ps_error(fps->ps_errno),fs->fs_name));				if (ret_pe) {					pe_free (ret_pe);					ret_pe = NULLPE;				}			} else if (ret_pe == NULLPE)				LLOG (log_dsap,LLOG_EXCEPTIONS,("invalid ASN in file '%s'",fs->fs_name));			ps_free (fps);		} else {			char * buffer;			AttributeValue newav;			buffer = readfile (fptr);				if ((newav = str2AttrV (buffer,fs->fs_real_syntax)) == NULLAttrV){				LLOG (log_dsap,LLOG_EXCEPTIONS,("invalid format in file %s",fs->fs_name));			} else {				ret_pe = grab_pe (newav);				AttrV_free (newav);			}			file_attr_length = 0;			free (buffer);		}		(void) fclose (fptr);	} else 		LLOG (log_dsap, LLOG_EXCEPTIONS, ("Attribute file '%s' not found",fs->fs_name));out:;	if ((ret_pe == NULLPE) && dsa_mode) {		LLOG(log_dsap,LLOG_NOTICE,("Error with file attribute '%s'",fs->fs_name));		/* As we are a DSA, return the PE containing NULL 		/* a NULLPE will cause the encode to fail, thus make the		/* operation fail.		/* Real solution is to remove the attribute at the encode 		/* stage - but that is tricky...  		/* DUAs should fail.		*/		return (pe_alloc (PE_CLASS_UNIV, PE_FORM_PRIM, PE_PRIM_NULL));	}	return (ret_pe);}file_decode (x)AttributeValue x;{struct file_syntax * fs;	fs = (struct file_syntax *) smalloc (sizeof(struct file_syntax));	fs->fs_ref = 1;	fs->fs_real_syntax = x->av_syntax;	if (x->av_syntax >= AV_WRITE_FILE)		fs->fs_real_syntax -= AV_WRITE_FILE;	fs->fs_name = NULLCP;	fs->fs_mode = FS_DEFAULT;	fs->fs_attr = AttrV_alloc ();	fs->fs_attr->av_syntax = fs->fs_real_syntax;	fs->fs_attr->av_struct = x->av_struct;			x->av_syntax = AV_FILE;	x->av_struct = (caddr_t)fs;}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?