⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ospfh_command.c

📁 实现禁位自动排列在禁位中具体实现了此方法所以这是一个创新很有应用价值在VC平台上调试通过
💻 C
字号:
/*  The ospfh command.c */


#include "ospfh.h"
#include "ospfh_patch.h"


int router_id_set(int argc, char** argv , void * top)
{
	struct ospf * ospf_top;
	char * router_id;
	if(argc!=1){
		printf("router id set failed for incorrect argument!\n");
		return 1;
	}
	router_id=argv[0];
	ospf_top=(struct ospf *)top;
	ospf_top->self_rc_id.s_addr = inet_addr(router_id);
	return 0;
}


char* ip_addr_set(int argc, char** argv , void * top)
{
	struct ospf * ospf_top;
	char * ip_addr;
	if(argc!=1){
		printf("ip address set failed for incorrect argument!\n");
	//	return 1;
	}
	ip_addr=argv[0];
	ospf_top=(struct ospf *)top;
	ospf_top->ip_address.s_addr = inet_addr(ip_addr);
	return ip_addr;
}


int nbr_id_set(int argc, char** argv , void * top)
{
	struct ospf * ospf_top;
	char * nbr_id;
    struct ospf_neighbor *nbrtemp;
	if(argc!=1)
	{
		printf("nbr id set failed for incorrect argument!\n");
		return 1;
	}
	nbr_id=argv[0];
	ospf_top=(struct ospf *)top;

    nbrtemp=ospf_nbr_new(ospf_top);
	nbrtemp->nbr_id.s_addr=inet_addr(nbr_id);
    listnode_add (ospf_top->nbrlist, nbrtemp);

	

	return 0;
}

int speaker_rc_id_set(int argc, char** argv , void * top)
{
	struct ospf * ospf_top;
	char * speaker_rc_id;
	if(argc!=1){
		printf("speaker rc id set failed for incorrect argument!\n");
		return 1;
	}
	speaker_rc_id=argv[0];
	ospf_top=(struct ospf *)top;
	ospf_top->speaker_rc_id.s_addr = inet_addr(speaker_rc_id);
	return 0;
}


int uplayer_rc_id_set(int argc, char** argv , void * top)
{
	struct ospf * ospf_top;
	char * uplayer_rc_id;
	if(argc!=1){
		printf("uplayer rc id set failed for incorrect argument!\n");
		return 1;
	}
	uplayer_rc_id=argv[0];
	ospf_top=(struct ospf *)top;
	ospf_top->uplayer_rc_id.s_addr = inet_addr(uplayer_rc_id);
	return 0;
}



int downlayer_rc_id_set(int argc, char** argv , void * top)
{
	struct ospf * ospf_top;
	char * downlayer_rc_id;
	if(argc!=1){
		printf("downlayer rc id set failed for incorrect argument!\n");
		return 1;
	}
	downlayer_rc_id=argv[0];
	ospf_top=(struct ospf *)top;
	ospf_top->downlayer_rc_id.s_addr = inet_addr(downlayer_rc_id);
	return 0;
}



struct cmd_element *
cmd_filter_by_string (char *command, struct ospf * top)
{
	int i,ret;
	struct cmd_element * matched_cmd;
    matched_cmd=NULL;

	//query the configuration command first
	for(i=0;i<CONF_CMD_NUM;i++)
	{
		ret=strcmp(top->conf_cmd[i].string, command);
		if(ret==0)
		{
			matched_cmd=&(top->conf_cmd[i]);
			break;
		}
	}


	return matched_cmd;
}

/* Execute command by argument readline. */
int
cmd_execute_command_strict (struct vector* vline,  
			    struct cmd_element **cmd , struct ospf * top)
{
  u_char index;
  struct vector* cmd_vector;
  struct cmd_element *cmd_element;
  int argc;
  char *argv[CMD_ARGC_MAX];
  char *command;
  char *temp;
  char* argval;
  int a,b,c;

  argc=0;
  cmd_vector=vline;

  for (index = 0; index < vector_max (cmd_vector); index++) 
  {
      
      command = vector_slot (vline, index);

      if(index==0)
	  {
	       cmd_element = cmd_filter_by_string (command, top);
	  }
	  else
	  {
		  argval=vector_slot (vline, index);
		  if(strlen(argval)==1)  //个位整数
		  {
			  temp=(char *)XMALLOC(1,sizeof(char)*2);
			  a=argval[0]-48;
			  temp[0]=a;
			  temp[1]='\0';
              argv[argc]=temp;
		  }
		  if(strlen(argval)==2) //十位整数
		  {
			  temp=(char *)XMALLOC(1,sizeof(char)*2);
			  a=argval[0]-48;
			  b=argval[1]-48;
			  c=a*10+b;
			  temp[0]=c;
			  temp[1]='\0';
              argv[argc]=temp;
		  }
		  if(strlen(argval)>2)
		  {
			  argv[argc]=argval;  //字符串
		  }
		  argc++;
              
		  
	  }
  }

  /* Now execute matched command */
  return (*cmd_element->func) (argc, argv , top);
}


struct vector *
cmd_make_strvec (char *string)
{
  char *cp, *start, *token;
  int strlen;
  struct vector * strvec;
  
  if (string == NULL)
     return NULL;
  
  cp = string;

  /* Skip white spaces. */
  while (isspace ((int) *cp) && *cp != '\0')
    cp++;

  /* Return if there is only white spaces */
  if (*cp == '\0')
    return NULL;

  if (*cp == '!' || *cp == '#')
    return NULL;

  /* Prepare return vector. */
  strvec = vector_init (VECTOR_MIN_SIZE);

  /* Copy each command piece and set into vector. */
  start = cp;
  
  /*copy the command string to the strvec*/
  while (*cp != '$' && *cp != '\0' && *cp !='\n')
      cp++;
  strlen = cp - start;
  token = XMALLOC (1, strlen + 1);
  memcpy (token, start, strlen);
  *(token + strlen) = '\0';
  vector_set(strvec, token);

  while ((* cp == '$'|| * cp ==' ')&& (*cp != '\0'))
	cp++;
  if(*cp =='\0'||*cp =='\n')               //command no parameter
	  return strvec;
  
  
  do
  {
      start=cp;
	  while ((*cp) !=' '&&(*cp)!='\n'&& (*cp )!= '\0')
	      cp++;
	  strlen = cp - start;
	  token=XMALLOC (1, strlen + 1);
	  memcpy (token, start, strlen);
	  *(token + strlen) = '\0';
      vector_set(strvec, token);
	  while (*cp ==' '||*cp =='\n')
		  cp++;
 
	  
  }while(* cp!='\0');


  if ((*cp )== '\0')
       return strvec;
  else
  {
	  printf("read config file line error!");
	  return NULL;
  }
}


/* Free allocated string vector. */
void
cmd_free_strvec (struct vector *v)
{
  u_char i;
  char *cp;

  if (!v)
    return;

  for (i = 0; i < vector_max (v); i++)
    if ((cp = vector_slot (v, i)) != NULL)
      XFREE (1, cp);

  vector_free (v);
}

⌨️ 快捷键说明

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