modify.c

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

C
804
字号
	for (x=b; x != NULLAV; x=x->avseq_next) {		emnew = NULLMOD;		for (y=a; y != NULLAV; y=y->avseq_next) 			if (AttrV_cmp (&x->avseq_av,&y->avseq_av) == 0)				break;		if (y == NULLAV) {			emnew = em_alloc ();			emnew->em_type = EM_REMOVEVALUES;			emnew->em_what = as_comp_new (at,avs_comp_new(AttrV_cpy(&x->avseq_av)),NULLACL_INFO);			emnew->em_next = NULLMOD;		} else			removed_all = FALSE;		if (emnew != NULLMOD)			em = ems_append (em,emnew);	}	if (removed_all) {		ems_part_free (em);		emnew = em_alloc ();		emnew->em_type = EM_REMOVEATTRIBUTE;		emnew->em_what = as_comp_new (at,b,NULLACL_INFO);		emnew->em_next = em_alloc();		emnew->em_next->em_type = EM_ADDATTRIBUTE;		emnew->em_next->em_what = as_comp_new (at,avs_cpy(a),NULLACL_INFO);		emnew->em_next->em_next = NULLMOD;		return (emnew);	}	for (x=a; x != NULLAV; x=x->avseq_next) {		emnew = NULLMOD;		for (y=b; y != NULLAV; y=y->avseq_next) 			if (AttrV_cmp (&x->avseq_av,&y->avseq_av) == 0)				break;		if (y == NULLAV) {			if (at->oa_syntax == oc_sntx) {				/* Don't add 'top' if missing */				objectclass * oc;				if (!top)					top = oid_cpy(str2oid (TOP_OC));				if (oc = (objectclass *) x->avseq_av.av_struct) 	/* assign */					if (oid_cmp(oc->oc_ot.ot_oid, top) == 0)						continue;			}			emnew = em_alloc ();			emnew->em_type = EM_ADDVALUES;			emnew->em_what = as_comp_new (at,avs_comp_new(AttrV_cpy(&x->avseq_av)),NULLACL_INFO);			emnew->em_next = NULLMOD;		}		if (emnew != NULLMOD)			em = ems_append (em,emnew);	}			return (em);}ems_part_free(emp)struct entrymod *emp;{	if(emp == NULLMOD)		return;	ems_part_free(emp->em_next);	free((char *)emp);}static	int	raboof = 0;static char *foobar (string)char   *string;{    DN	    fb;    PS	    ps;    static char    buffer[BUFSIZ];    DN	    sequence_dn ();    if (!isdigit (*string))	return string;    if ((fb = sequence_dn (atoi (string))) == NULLDN) {	ps_printf (OPT, "Invalid sequence in directive %s\n", string);you_lose: ;	raboof = 1;	return string;    }    if ((ps = ps_alloc (str_open)) == NULLPS) {	ps_printf (OPT, "ps_alloc: failed");	goto you_lose;    }    if (str_setup (ps, buffer, sizeof buffer - 2, 1) == NOTOK) {	ps_printf (OPT, "str_setup: %s", ps_error (ps -> ps_errno));	ps_free (ps);	goto you_lose;    }    dn_print (ps, fb, EDBOUT);    ps_print (ps, " ");    *--ps -> ps_ptr = NULL, ps -> ps_cnt++;    ps_free (ps);    return buffer;    }dsa_control (argc, argv)int             argc;char          **argv;{	static struct entrymod mod = {				      EM_ADDATTRIBUTE,				      NULLATTR,				      NULLMOD	};	static struct ds_modifyentry_arg mod_arg =	{	 default_common_args,	 NULLDN,	 &mod	};	AttributeType at;	struct DSError  error;	char            buffer[100];	char * 		msg = "Done\n";	char 		do_unbind = FALSE;	if (argc < 2) {		Usage(argv[0]);		return;	}	if (test_arg (argv[1], "-dump",1))		if (argc != 3) goto out; else		(void) sprintf (buffer, "d %s", argv[2]);	else if (test_arg (argv[1], "-tailor",1))		if (argc != 3) goto out; else		(void) sprintf (buffer, "t %s", argv[2]);	else if (test_arg (argv[1], "-abort",1)) {		(void) strcpy (buffer,"a");		argc++;		/* to get through if (argc != 3) */		do_unbind = TRUE;	}	else if (test_arg (argv[1], "-restart",1)) {		(void) strcpy (buffer,"b");		argc++;		/* to get through if (argc != 3) */		do_unbind = TRUE;	}	else if (test_arg (argv[1], "-refresh",3))		if (argc != 3) goto out; else		(void) sprintf (buffer, "r %s", foobar (argv[2]));	else if (test_arg (argv[1], "-resync",2))		if (argc != 3) goto out; else		(void) sprintf (buffer, "f %s", foobar (argv[2]));	else if (test_arg (argv[1], "-lock",1))		if (argc != 3) goto out; else		(void) sprintf (buffer, "l %s", foobar (argv[2]));	else if (test_arg (argv[1], "-unlock",1))		if (argc != 3) goto out; else		(void) sprintf (buffer, "u %s", foobar (argv[2]));	else if (test_arg (argv[1], "-info",1)) {		dsa_control_info();		return;	} else if (test_arg (argv[1], "-slave",1)) {		msg = "Scheduled\n";		if (argc == 2) {		    (void) strcpy (buffer,"s");		    argc++;		/* to get through if (argc != 3) */		}		else		    if (argc != 3) goto out; else		    (void) sprintf (buffer, "s %s", foobar (argv[2]));	}	else		argc = 1;	/* to force error */	if (raboof) {	    raboof = 0;	    return;	}	if (argc != 3) {out:;		Usage (argv[0]);		return;	}	mod_arg.mea_object = dn;	at = AttrT_new (CONTROL_OID);	mod_arg.mea_changes->em_what = as_comp_new (at, avs_comp_new (str_at2AttrV (buffer, at)), NULLACL_INFO);	if (rebind () != OK) 		return;	if (ds_modifyentry (&mod_arg, &error) != DS_OK) {		/* deal with error */		(void) dish_error (OPT, &error);	} else {		ps_print (RPS, msg);	}	if (do_unbind) 	    unbind_from_dsa();	    	/* as_free (mod_arg.mea_changes->em_what); */}dsa_control_info (){struct ds_read_arg read_arg;struct DSError  error;struct ds_read_result result;static CommonArgs      ca = default_common_args;	read_arg.rda_eis.eis_infotypes = EIS_ATTRIBUTESANDVALUES;	read_arg.rda_eis.eis_allattributes = FALSE;	read_arg.rda_eis.eis_select = as_comp_new (AttrT_new (CONTROL_OID), NULLAV, NULLACL_INFO);	read_arg.rda_common = ca;	/* struct copy */	read_arg.rda_object = NULLDN;	if (rebind () != OK)		return;	if (ds_read (&read_arg, &error, &result) != DS_OK) {		(void) dish_error (OPT, &error);		return;	}	if (result.rdr_entry.ent_attr) {		avs_print (RPS,result.rdr_entry.ent_attr->attr_value,READOUT);	} else		ps_printf (OPT, "No information !!!\n");}mod_template (name,noedit)char           *name;char 		noedit;{	FILE           *fptr;	PS              ps;	extern AttributeType at_objectclass;	Attr_Sequence   as;	Attr_Sequence   nas, tas, make_template_as ();	int		um;	if (! new_draft)		if ((fptr = fopen (name, "r")) != NULL) {			(void) fclose (fptr);			if (!noedit) {				if (!yesno ("Use existing draft file ? "))					return OK;				else					make_old (fname,FALSE);			} else				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);	}	for (as = current_entry->e_attributes; as != NULLATTR; as = as->attr_link) 		if (as->attr_type == at_objectclass)			break;	tas = make_template_as (as->attr_value);	nas = as_cpy(current_entry->e_attributes);		tas = as_merge (tas,nas);	as_print (ps,tas,EDBOUT);	as_free (tas);	ps_free (ps);	(void) fclose (fptr);	return (OK);}build_modify(start, mod_arg)struct	list_element	*start ;struct  ds_modifyentry_arg      *mod_arg ;{struct	list_element	*temp_elem ;struct	entrymod	*emnew ;	AttributeType	a_t ;	AV_Sequence	tmp_avs ;	Attr_Sequence	eptr ;	char   *ptr ;	int    num_attr_vals = 0 ;	int    attr_val_match = 0 ;	while (start)	{		emnew = em_alloc() ;		ptr = start->mod;		while (*ptr != 0)			if (*ptr == '=')				break;			else				ptr++;		if (*ptr == 0) {			if ((a_t = AttrT_new (start->mod)) == NULLAttrT) {				ps_printf(OPT, "invalid attribute type '%s'",					  start->mod) ;				return (NOTOK) ;			}			emnew->em_what = as_comp_new (a_t, NULLAV, 						      NULLACL_INFO);					} else 	if ((emnew->em_what = str2as (start->mod)) == 			    					NULLATTR) {			  ps_printf(OPT, "invalid attribute '%s' ",				    start->mod) ;			  return (NOTOK) ;		}					emnew->em_type = -1 ;	        a_t = emnew->em_what->attr_type;		for (eptr = current_entry->e_attributes; eptr != NULLATTR; 		     				eptr = eptr->attr_link)		{		   if ( AttrT_cmp (eptr->attr_type, a_t) == 0 )		   {		      if (emnew->em_type == -1)   		      {			 if (start->add == 0) /* Removing... */			 {			    if (emnew->em_what->attr_value == NULLAV)			    {			       emnew->em_type = EM_REMOVEATTRIBUTE ;			    }			    else			    {			       num_attr_vals = 0 ;			       attr_val_match = 0 ;			       for (tmp_avs = eptr->attr_value; 				    tmp_avs != NULLAV; 				    tmp_avs = tmp_avs->avseq_next)			       {			       				  if (AttrV_cmp(&(tmp_avs->avseq_av),				      &emnew->em_what->attr_value->avseq_av) 				      == OK)			          {				     attr_val_match = 1 ;				  }				  num_attr_vals++ ;			       }			       if (num_attr_vals == 1)			          emnew->em_type = EM_REMOVEATTRIBUTE ;			       else				   emnew->em_type = EM_REMOVEVALUES ;			       if (attr_val_match == 0)			       {				  ps_printf(OPT,"Can't remove value that is not present.\n") ;				  return (NOTOK) ;			       }			    }			 }			 else 			    emnew->em_type = EM_ADDVALUES ;		      }		   }		}		if (emnew->em_type == -1) /* No matches, so attrType is a new one */		{			if (start->add == 0) /* Remove */			{				ps_print(OPT, "Removing attribute that is not present.\n") ;				return (NOTOK) ;			}			emnew->em_type = EM_ADDATTRIBUTE ;		}		temp_elem = start ;		start = start->next ;		free (temp_elem->mod) ;		free ((char *)temp_elem) ;		emnew->em_next = NULLMOD ;		mod_arg->mea_changes = ems_append (mod_arg->mea_changes, emnew) ;	}	mod_arg->mea_object = dn;	return (OK) ;}

⌨️ 快捷键说明

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