modify.c

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

C
804
字号
/* modify.c - */#ifndef	lintstatic char *rcsid = "$Header: /xtel/isode/isode/quipu/dish/RCS/modify.c,v 9.0 1992/06/16 12:35:39 isode Rel $";#endif/*  * $Header: /xtel/isode/isode/quipu/dish/RCS/modify.c,v 9.0 1992/06/16 12:35:39 isode Rel $ * * * $Log: modify.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/modify.h"#include "quipu/read.h"#include "quipu/entry.h"#include "quipu/dua.h"#include "pepsy.h"#include "quipu/DAS-types.h"#include "osisec-stub.h"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;extern char     fname[];struct	list_element	{		char   *mod;		char	add;			/* 1=add, 0=remove */		struct  list_element*	next ;	} ;extern Entry    current_entry;static char     new_draft;call_modify (argc, argv)int             argc;char          **argv;{	struct ds_modifyentry_arg mod_arg;	struct DSError  error;	struct entrymod *emnew, *ems_append(), *modify_avs();	Attr_Sequence   as,#ifdef TURBO_DISK			fget_attributes (),#else			get_attributes (),#endif	                temp,	                trail = NULLATTR;	AV_Sequence     avst = NULLAV;	extern AttributeType at_objectclass;	extern int	parse_status;	Entry           entry_ptr;	FILE           *fd;	char            draft_flag = FALSE;	char		noedit_flag = FALSE;	int 		x;	DN		moddn;	char	       *home;	RDN		new_rdn;struct  list_element   *start = 0 ;struct  list_element   *last ;struct  list_element   *l_temp ;/*	char	add = FALSE ;	char	rem = FALSE ; */	if ((argc = service_control (OPT, argc, argv, &mod_arg.mea_common)) == -1)		return;	mod_arg.mea_changes = NULLMOD;	new_draft = FALSE;	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");		for (x=1; x<argc; x++) {		if (test_arg (argv[x], "-draft",1)) {			draft_flag = 1;			shuffle_up (argc--,argv,x);			if (x == argc) {				ps_printf (OPT, "Draft file name missing\n");				Usage (argv[0]);				return;			}			(void) strcpy (fname, argv[x]);			shuffle_up (argc--,argv,x--);		} else if (test_arg (argv[x], "-newdraft",2)) {			new_draft = TRUE;			shuffle_up (argc--,argv,x--);					} else if (test_arg (argv[x], "-noedit",3)) {			noedit_flag = TRUE;			shuffle_up (argc--,argv,x--);					} else if (move (argv[x]) == OK) 			shuffle_up (argc--,argv,x--);					else if (test_arg(argv[x], "-remove", 3))		{			shuffle_up (argc--, argv, x);			if (x == argc)			{				ps_printf(OPT, "Attribute to remove missing\n") ;				Usage(argv[0]) ;				return ;			}			l_temp = (struct list_element *) malloc (sizeof(struct list_element)) ;			l_temp->mod = (char *) malloc ((unsigned)(strlen(argv[x]) + 1));			(void) strcpy (l_temp->mod, argv[x]) ;			l_temp->add = 0 ;			l_temp->next = 0 ;			if (start == 0)			{				start = last = l_temp ;			}			else			{				last->next = l_temp ;				last = l_temp ;			}			shuffle_up (argc--,argv,x--);		}		else		if (test_arg(argv[x], "-add", 2))		{			shuffle_up (argc--, argv, x);			if (x == argc)			{				ps_printf(OPT, "Attribute to insert missing\n") ;				Usage(argv[0]) ;				return ;			}			l_temp = (struct list_element *) malloc (sizeof(struct list_element)) ;			l_temp->mod = (char *) malloc ((unsigned)(strlen(argv[x]) + 1));			(void) strcpy (l_temp->mod, argv[x]) ;			l_temp->add = 1 ;			l_temp->next = 0 ;			if (start == 0)			{				start = last = l_temp ;			}			else			{				last->next = l_temp ;				last = l_temp ;			}			shuffle_up (argc--,argv,x--);		}	}	if (dad_flag && (draft_flag || noedit_flag)) {	    ps_printf (OPT,		       "operation not allowed when using directory assistance server!\n");	    return;	}	/* read attributes we want to modify */	if ((argc = read_cache_aux (argc, argv, FALSE, &mod_arg.mea_common)) <0 )		return;	if (argc != 1) {		ps_printf (OPT,"Unknown option %s\n",argv[1]);		Usage (argv[0]);		return;	}	if (start != 0)	{		if (build_modify(start, &mod_arg) == NOTOK)		{			return ;		}				while (ds_modifyentry (&mod_arg, &error) != DS_OK)		{			if (dish_error (OPT, &error) == 0)		{				return ;			}			mod_arg.mea_object = error.ERR_REFERRAL.DSE_ref_candidates->cr_name ;		}		ps_print (RPS, "Modified ");		dn_print (RPS, dn, EDBOUT);		ps_print (RPS, "\n");		delete_cache (dn);  /* re-cache when next read */		return ;		}		if (!draft_flag) {		if (mod_template (fname,noedit_flag) != OK)			return;		noedit_flag = FALSE;	} else {		new_draft = TRUE;	/* Ugh ! */		(void) mod_template ("/dev/null",TRUE);	}	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;	mod_arg.mea_object = dn;	for (moddn = dn ; moddn->dn_parent != NULLDN; moddn=moddn->dn_parent)		;	entry_ptr->e_name = rdn_cpy (moddn->dn_rdn);		/* add rdn as attribute */    for (new_rdn = entry_ptr->e_name; new_rdn != NULLRDN; new_rdn = new_rdn->rdn_next) {	avst = avs_comp_new (AttrV_cpy (&new_rdn->rdn_av));	temp = as_comp_new (AttrT_cpy (new_rdn->rdn_at), avst, NULLACL_INFO);	entry_ptr->e_attributes = as_merge (entry_ptr->e_attributes, temp);    }	for (as = entry_ptr->e_attributes; as != NULLATTR; as = as->attr_link) {		emnew = NULLMOD;		trail = as->attr_link;		as->attr_link = NULLATTR;		temp = current_entry->e_attributes;		for (; temp != NULLATTR; temp = temp->attr_link) 			if (AttrT_cmp (as->attr_type, temp->attr_type) == 0) {				/* found it - does it need changing ? */				if (avs_cmp (as->attr_value, temp->attr_value) != 0) 					emnew = modify_avs (as->attr_value, temp->attr_value,as->attr_type);				break;			}		if (temp == NULLATTR) {			emnew = em_alloc ();			emnew->em_type = EM_ADDATTRIBUTE;			emnew->em_what = as_cpy(as);			emnew->em_next = NULLMOD;		}		if (emnew != NULLMOD)			mod_arg.mea_changes = ems_append (mod_arg.mea_changes,emnew);		as->attr_link = trail;	}	/* remove attribute missing in new entry */	for (as = current_entry->e_attributes; as != NULLATTR; as = as->attr_link) {		emnew = NULLMOD;		temp = entry_ptr->e_attributes;		for (; temp != NULLATTR; temp = temp->attr_link) 			if (AttrT_cmp (as->attr_type, temp->attr_type) == 0) 				break;					if (temp == NULLATTR) {			emnew = em_alloc ();			emnew->em_type = EM_REMOVEATTRIBUTE;			emnew->em_what = as_comp_new(as->attr_type,NULLAV,NULLACL_INFO);			emnew->em_next = NULLMOD;		}		if (emnew != NULLMOD)			mod_arg.mea_changes = ems_append (mod_arg.mea_changes,emnew);	}		if (mod_arg.mea_changes == NULLMOD) {		ps_print (RPS, "The draft entry and the entry for ");		dn_print (RPS, dn, EDBOUT);		ps_print (RPS, "\nare exactly the same - no change made!!!\n");		entry_free (entry_ptr);		make_old (fname,draft_flag);		return;	}	if (rebind () != OK) {		entry_free (entry_ptr);		return;	}/* * If this operation is time-stamped, it may have expired while the user * was editing the entry. Re-calculate the time-stamp. Modify is the only * dish command where this needs to be done. */	if ((mod_arg.mea_common.ca_security != (struct security_parms *) 0)		&& (mod_arg.mea_common.ca_security->sp_time != NULLCP)) {		char *new_version();		free(mod_arg.mea_common.ca_security->sp_time);		mod_arg.mea_common.ca_security->sp_time = new_version();		}/* If security parameters are present, take this to mean that strong * authentication is required. This disallows 'parms + no signature' * (pointless) and 'signature + no parms' (security risk). */	if (mod_arg.mea_common.ca_security != (struct security_parms *) 0)		{		extern struct SecurityServices *dsap_security;		mod_arg.mea_common.ca_sig = 			(dsap_security->serv_sign)((caddr_t)&mod_arg, 				_ZModifyEntryArgumentDataDAS, &_ZDAS_mod);		}	while (ds_modifyentry (&mod_arg, &error) != DS_OK) {		if (dish_error (OPT, &error) == 0) {			entry_free (entry_ptr);			return;		}		mod_arg.mea_object = error.ERR_REFERRAL.DSE_ref_candidates->cr_name;	}	ps_print (RPS, "Modified ");	dn_print (RPS, dn, EDBOUT);	ps_print (RPS, "\n");	delete_cache (dn);	/* re-cache when next read */		entry_free (entry_ptr);	ems_part_free (mod_arg.mea_changes);	make_old (fname,draft_flag);}	struct entrymod * ems_append (a,b)struct entrymod *a;struct entrymod *b;{struct entrymod *ptr;	if ((ptr = a) == NULLMOD)		return b;	for ( ; ptr->em_next != NULLMOD; ptr = ptr->em_next)		;	ptr->em_next = b;	return a;}struct entrymod * modify_avs (a,b,at)AV_Sequence a;AV_Sequence b;AttributeType at;{AV_Sequence x;AV_Sequence y;struct entrymod *em = NULLMOD, *emnew;int removed_all = TRUE;extern short oc_sntx;static OID top = NULLOID;

⌨️ 快捷键说明

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