Net2/usr/src/contrib/isode/dsap/common/file_print.c

#include "quipu/util.h"
#include "quipu/attrvalue.h"
#include "quipu/malloc.h"

char * parse_file = NULLCP;
RDN parse_rdn = NULLRDN;
extern LLog * log_dsap;
extern AttributeType last_at;
extern int avs_count;
extern char dsa_mode;

static char used_temp;

#ifndef SYS5
/* ARGSUSED */
#endif

int dflt_attr_file (at,x,full)
AttributeType  at;
AttributeValue x;
char full;
{
	/* make default file name */
char buffer [LINESIZE];
PS sps;
char *pathend = NULLCP;
char val, *_isodefile();
char *path = NULLCP;
struct file_syntax * fs;
unsigned last_heap;

	used_temp = FALSE;

	fs = (struct file_syntax *) x->av_struct;

	if ((parse_file != NULLCP) && ((pathend = rindex (parse_file,'/')) != NULLCP)) {
		val = *++pathend;
		*pathend = 0;
		path = parse_file;
	}

	last_heap = mem_heap;	/* put PS on general heap */
	mem_heap = 0;

	sps = ps_alloc (str_open);
	if (str_setup (sps,buffer,LINESIZE,1) == NOTOK) {
		mem_heap = last_heap;
		ps_free (sps);
		return (NOTOK);
	}
	mem_heap = last_heap;

	if (parse_rdn == NULLRDN) {
		ps_printf (sps,"/tmp/%s_%d",at->oa_ot.ot_name,getpid());
		used_temp = TRUE;
	} else {
		rdn_print (sps,parse_rdn,EDBOUT);
		ps_printf (sps,".%s",at->oa_ot.ot_name);
	}
	*sps->ps_ptr = 0;
	ps_free (sps);

#ifdef SYS5
	if ((avs_count > 1)
	   || ((full) && (strlen(buffer) > MAXFILENAMELEN))) {
#else
	if (avs_count > 1) {
		/* Multi valued file attribute - can only default 1st case */
		/* Would be much nicer if the file names were consistent.  */
		/* At the moment unreferenced files will be left undeleted */
		/* (Unless management tools clean up ) */
#endif
		char *nptr, *mptr;
		char nbuf [LINESIZE];
		int i;

		nptr = buffer;
		mptr = nbuf;		
		used_temp = TRUE;

		for (i=0 ; (*nptr!=0) && (i < MAXFILENAMELEN-6) ; nptr++)
			if (isalpha(*nptr))
				*mptr++ = *nptr, i++;

		(void) strcpy (mptr,"XXXXXX");
		if (path != NULLCP)
			fs->fs_name = mktemp(strdup (_isodefile(path,nbuf)));
		else
			fs->fs_name = mktemp(strdup (nbuf));
		if (pathend != NULLCP)
			*pathend = val;

		fs->fs_mode = 0;
		return (OK);
	} 

	if (path != NULLCP)
		fs->fs_name = strdup (_isodefile(path,buffer));
	else
		fs->fs_name = strdup (buffer);
	if (pathend != NULLCP)
		*pathend = val;

	return (OK);
}



fileattr_print (ps,y,format)
PS ps;
AttributeValue y;
int format;
{
struct file_syntax * fs;
int um;

	fs = (struct file_syntax *) y->av_struct;

	if (format != EDBOUT) {
		if (fs->fs_attr) 
			AttrV_print (ps,fs->fs_attr,format);
		else 
			ps_print (ps,"Internal error, need to load the file!!!");
	} else {
		FILE * fptr;
		PS fps;

		ps_print (ps,"{FILE}");

		if (fs->fs_name == NULLCP) {
			if (dflt_attr_file (last_at,y,0) == NOTOK) {
				LLOG (log_dsap,LLOG_EXCEPTIONS,("Could not make default attribute file"));
				return;
			}
			if (used_temp)
				ps_print (ps,fs->fs_name);
		} else if ( ! (fs->fs_mode & FS_DEFAULT))
			ps_print (ps,fs->fs_name);

		if (fs->fs_attr == NULLAttrV)	/* already exists */
			return;

		if (fs->fs_mode & FS_CREATE)	/* already written */
			return;	

	        um = umask (0177);
		if ((fptr = fopen (fs->fs_name,"w")) != NULL) {
		        (void) umask (um);
			if ((fps = ps_alloc (std_open)) == NULLPS) {
				(void) fclose (fptr);
				LLOG (log_dsap,LLOG_EXCEPTIONS,("Could not alloc PS file '%s'",fs->fs_name));
				return;
			}				
			if ((std_setup (fps,fptr)) == NOTOK) {
				(void) fclose (fptr);
				ps_free (fps);
				LLOG (log_dsap,LLOG_EXCEPTIONS,("Could not open PS file '%s'",fs->fs_name));
				return;
			}
		} else {
		        (void) umask (um);
			LLOG ( log_dsap,LLOG_EXCEPTIONS,("Could not open attribute file '%s'",fs->fs_name));
			return;
		}
		AttrV_print (fps,fs->fs_attr,FILEOUT);
		if (dsa_mode) {
			AttrV_free (fs->fs_attr);
			fs->fs_attr = NULLAttrV;
		}
		(void) fclose (fptr);
		ps_free (fps);
		fs->fs_mode |= FS_CREATE;

		DLOG (log_dsap,LLOG_DEBUG,("Written photo file '%s'",fs->fs_name));
	}
	return;

}