add.c

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

C
331
字号
/* add.c - */#ifndef	lintstatic char *rcsid = "$Header: /xtel/isode/isode/quipu/dish/RCS/add.c,v 9.0 1992/06/16 12:35:39 isode Rel $";#endif/*  * $Header: /xtel/isode/isode/quipu/dish/RCS/add.c,v 9.0 1992/06/16 12:35:39 isode Rel $ * * * $Log: add.c,v $ * Revision 9.0  1992/06/16  12:35: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/dua.h"#include "quipu/add.h"#include "quipu/entry.h"#include "pepsy.h"#include "quipu/DAS-types.h"#include "osisec-stub.h"#define ORG_PERSON "newPilotPerson & 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;extern	char	dad_flag;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;#ifdef TURBO_DISK	Attr_Sequence   fget_attributes();#else	Attr_Sequence   get_attributes();#endif	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 (dad_flag) {		(void) strcpy (fname, "/tmp/dishXXXXXX");		(void) unlink (mktemp (fname));	    }	    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 (dad_flag && (draft_flag || noedit_flag)) {	    ps_printf (OPT,		       "operation not allowed when using directory assistance server!\n");	    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);#ifdef TURBO_DISK	entry_ptr->e_attributes = fget_attributes (fd);#else	entry_ptr->e_attributes = get_attributes (fd);#endif	(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)	{	extern struct SecurityServices *dsap_security;	add_arg.ada_common.ca_sig =		(dsap_security->serv_sign)((caddr_t)&add_arg, _ZAddEntryArgumentDataDAS, &_ZDAS_mod);	}	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 (dad_flag) {	    (void) unlink (file);	    return;	}	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  = 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 = 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);			if (!yesno ("Use existing draft file ? "))				return OK;			else				make_old (fname,FALSE);		}	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);}

⌨️ 快捷键说明

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