DataMuseum.dk

Presents historical artifacts from the history of:

DKUUG/EUUG Conference tapes

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about DKUUG/EUUG Conference tapes

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - metrics - download
Index: T a

⟦3bb79c1a9⟧ TextFile

    Length: 6918 (0x1b06)
    Types: TextFile
    Names: »add.c«

Derivation

└─⟦2d1937cfd⟧ Bits:30007241 EUUGD22: P.P 5.0
    └─⟦35176feda⟧ »EurOpenD22/isode/isode-6.tar.Z« 
        └─⟦de7628f85⟧ 
            └─⟦this⟧ »isode-6.0/quipu/dish/add.c« 

TextFile

/* add.c - */

#ifndef	lint
static char *rcsid = "$Header: /f/osi/quipu/dish/RCS/add.c,v 7.1 90/01/11 18:37:30 mrose Exp $";
#endif

/* 
 * $Header: /f/osi/quipu/dish/RCS/add.c,v 7.1 90/01/11 18:37:30 mrose Exp $
 *
 *
 * $Log:	add.c,v $
 * Revision 7.1  90/01/11  18:37:30  mrose
 * real-sync
 * 
 * Revision 7.0  89/11/23  22:19:55  mrose
 * Release 6.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/dua.h"
#include "quipu/add.h"
#include "quipu/entry.h"

#define ORG_PERSON "thornPerson & quipuObject"
	/* this should probably go elsewhere !!! */

extern DN       dn;

#define	OPT	(!frompipe || rps -> ps_byteno == 0 ? opt : rps)
#define	RPS	(!frompipe || opt -> ps_byteno == 0 ? rps : opt)
extern	char	frompipe;
extern	PS	opt, rps;

char            fname[128];
static char	new_draft;

call_add (argc, argv)
int             argc;
char          **argv;
{

	Entry           entry_ptr;
	FILE           *fd;
	struct ds_addentry_arg add_arg;
	struct DSError  error;
	Attr_Sequence   get_attributes();
	extern int	parse_status;

	int             x;
	int             draft_flag = 0;
	char           *O_class = NULLCP;
	char		noedit_flag = FALSE;
	DN		moddn;
	char	       *home;

	if (home = getenv ("DISHDRAFT"))
	    (void) strcpy (fname, home);
	else
	    if (home = getenv ("HOME"))
		(void) sprintf (fname, "%s/.dishdraft", home);
	    else
		(void) strcpy (fname, "./.dishdraft");
	new_draft = FALSE;

	if ((argc = service_control (OPT, argc, argv, &add_arg.ada_common)) == -1)
		return;

	for (x = 1; x < argc; x++) {
		if (test_arg (argv[x], "-template", 1)) {
		        int	i;
		        FILE *in, *out;
			extern int errno;

			draft_flag = 1;
			if (++x == argc) {
				ps_printf (OPT, "template file name missing\n");
				Usage (argv[0]);
				return;
			}
			if ((in = fopen (argv[x], "r")) == NULL) {
			    ps_printf (OPT, "unable to open template %s: %s\n",
				       argv[x], sys_errname (errno));
			    return;
			}
			i = umask (0177);
			out = fopen (fname, "w");
			(void) umask (i);
			if (out == NULL) {
			    ps_printf (OPT, "unable to write draft %s: %s\n",
				       fname, sys_errname (errno));
			    (void) fclose (in);
			    return;
			}
			while ((i = getc (in)) != EOF)
			    if (putc (i, out) == EOF) {
				ps_printf (OPT, "error writing draft %s: %s\n",
					   fname, sys_errname (errno));
				(void) fclose (in);
				(void) fclose (out);
				return;
			    }
			(void) fclose (in);
			(void) fclose (out);
		} else if (test_arg (argv[x], "-draft", 1)) {
			draft_flag = 1;
			if (++x == argc) {
				ps_printf (OPT, "Draft file name missing\n");
				Usage (argv[0]);
				return;
			}
			(void) strcpy (fname, argv[x]);
		} else if (test_arg (argv[x], "-objectclass",1)) {
			if (++x == argc) {
				ps_printf (OPT, "Object Class missing\n");
				Usage (argv[0]);
				return;
			}
			O_class = argv[x];
		} else if (test_arg(argv[x], "-newdraft", 2)) 
			new_draft = TRUE;
		else if (test_arg(argv[x], "-noedit", 3)) 
			noedit_flag = TRUE;
		else if (move (argv[x]) == OK) 
			continue;
		else {
			ps_printf (OPT,"Unknown option %s\n",argv[x]);
			Usage (argv[0]);
			return;
		}
	}

	if ((!noedit_flag) && (draft_flag != 1)) { /* if no draft - create a template */
		if (add_template (fname, O_class) != OK)
			return;
	}

	if ( ! noedit_flag)
		if (editentry (1, argv) != OK) {
			make_old (fname,draft_flag);
			return;
		}

	/* now parse the files */

	if ((fd = fopen (fname, "r")) == (FILE *) NULL) {
		ps_printf (OPT, "Can't open draft entry %s\n", fname);
		return;
	}

	entry_ptr = get_default_entry (NULLENTRY);
	entry_ptr->e_attributes = get_attributes (fd);

	(void) fclose (fd);
	if (parse_status != 0)
		return ;
		
	add_arg.ada_object = dn;

	for (moddn = dn ; moddn->dn_parent != NULLDN; moddn=moddn->dn_parent)
		;
	entry_ptr->e_name = rdn_cpy (moddn->dn_rdn);

	add_arg.ada_entry = entry_ptr->e_attributes;

	if (rebind () != OK) {
		entry_free (entry_ptr);
		return;
	}

	/* Strong authentication */
	if (add_arg.ada_common.ca_security != (struct security_parms *) 0)
	{
	struct signature *sign_operation();
	int encode_DAS_AddEntryArgumentData();

	add_arg.ada_common.ca_sig =
		sign_operation((caddr_t)&add_arg, encode_DAS_AddEntryArgumentData);
	}

	while (ds_addentry (&add_arg, &error) != DS_OK) {
		if (dish_error (OPT, &error) == 0) {
			entry_free (entry_ptr);
			return;
		}
		add_arg.ada_object = error.ERR_REFERRAL.DSE_ref_candidates->cr_name;
	} 
	ps_print (RPS, "Added ");
	dn_print (RPS, dn, EDBOUT);
	ps_print (RPS, "\n");

	delete_list_cache (dn);
	entry_free (entry_ptr);

	make_old (fname,draft_flag);
	
}

make_old (file, commit)
char * file;
char commit;
{
char newname[LINESIZE];

	if (commit == 0) {
		(void) sprintf (newname, "%s.old", file);
		(void) rename (file, newname);
	}
}


Attr_Sequence make_template_as (oc)
AV_Sequence oc;
{
AV_Sequence avs;
Attr_Sequence newas;
Attr_Sequence as = NULLATTR;
table_seq optr;
AttributeType at;
objectclass * ocp;

	for (avs = oc; avs != NULLAV; avs = avs->avseq_next) {
		ocp = (objectclass *) avs->avseq_av.av_struct;
		for (optr=ocp->oc_must; optr!=NULLTABLE_SEQ;  optr=optr->ts_next) {
			at = (AttributeType) smalloc (sizeof (attrType));
			at-> at_oid = NULLOID;
			at-> at_table = optr->ts_oa;
			newas = as_comp_new (at,NULLAV,NULLACL_INFO);
			as = as_merge (as,newas);
		}
	}
	
	for (avs = oc; avs != NULLAV; avs = avs->avseq_next) {
		ocp = (objectclass *) avs->avseq_av.av_struct;
		for (optr=ocp->oc_may; optr!=NULLTABLE_SEQ;  optr=optr->ts_next) {
			at = (AttributeType) smalloc (sizeof (attrType));
			at-> at_oid = NULLOID;
			at-> at_table = optr->ts_oa;
			newas = as_comp_new (at,NULLAV,NULLACL_INFO);
			as = as_merge (as,newas);
		}
	}

	return (as);
}

add_template (name, objclass)
char           *name;
char           *objclass;
{
	FILE           *fptr;
	PS              ps;
	char            obuf[LINESIZE];
	Attr_Sequence   as;
	Attr_Sequence   ocas;
	int		um;

	if (objclass == NULLCP)
		objclass = ORG_PERSON;

	if (!new_draft)
		if ((fptr = fopen (name, "r")) != NULL) {
			(void) fclose (fptr);
			return (OK);	/* template already exists ! */
		}
	um = umask (0177);
	if ((fptr = fopen (name, "w")) == NULL) {
		ps_printf (OPT, "Can't open template entry %s\n", name);
		return (-1);
	}
	(void) umask (um);
	if ((ps = ps_alloc (std_open)) == NULLPS) {
		return (-1);
	}
	if (std_setup (ps, fptr) == NOTOK) {
		return (-1);
	}

	(void) sprintf (obuf, "objectClass=%s", objclass);
	if ((ocas = str2as (obuf)) == NULLATTR) 
		return (-1);

	as = make_template_as (ocas->attr_value);
	as = as_merge (as,ocas);

	as_print (ps,as,EDBOUT);
	
	as_free (as);
	ps_free (ps);
	(void) fclose (fptr);

	return (OK);

}