Beispiel #1
0
void
doregexp(const char *argv[], int argc)
{
	int error;
	regex_t re;
	regmatch_t *pmatch;
	const char *source;

	if (argc <= 3) {
		warnx("Too few arguments to regexp");
		return;
	}
	/* special gnu case */
	if (argv[3][0] == '\0' && mimic_gnu) {
		if (argc == 4 || argv[4] == NULL)
			return;
		else
			pbstr(argv[4]);
	}
	source = mimic_gnu ? twiddle(argv[3]) : argv[3];
	error = regcomp(&re, source, REG_EXTENDED|REG_NEWLINE);
	if (error != 0)
		exit_regerror(error, &re, source);

	pmatch = xreallocarray(NULL, re.re_nsub+1, sizeof(regmatch_t), NULL);
	if (argc == 4 || argv[4] == NULL)
		do_regexpindex(argv[2], &re, source, pmatch);
	else
		do_regexp(argv[2], &re, source, argv[4], pmatch);
	free(pmatch);
	regfree(&re);
}
Beispiel #2
0
void
doregexp(const char *argv[], int argc)
{
	int error;
	regex_t re;
	regmatch_t *pmatch;

	if (argc <= 3) {
		warnx("Too few arguments to regexp");
		return;
	}
	error = regcomp(&re, mimic_gnu ? twiddle(argv[3]) : argv[3], 
	    REG_EXTENDED);
	if (error != 0)
		exit_regerror(error, &re);
	
	pmatch = xalloc(sizeof(regmatch_t) * (re.re_nsub+1), NULL);
	if (argv[4] == NULL || argc == 4)
		do_regexpindex(argv[2], &re, pmatch);
	else
		do_regexp(argv[2], &re, argv[4], pmatch);
	free(pmatch);
	regfree(&re);
}
int Snapp_control_worker::handle_connection(){
   char recv_buf[CONTROL_BUF_SIZE];
   char send_buf[CONTROL_BUF_SIZE];
   int done=0;
   int rvalue;   
   int command;
   char *arg;
   int i;   


   //set conn state
   connection_state=CONTROL_CONNECTION_STATE_CONNECTED;

   //send hello!
   snprintf(send_buf,CONTROL_BUF_SIZE-1,"220 SNAPP server (%s) ready\r\n",VERSION);
   rvalue=send(fd,send_buf,strlen(send_buf),0);
   if(rvalue!=strlen(send_buf)){
      return 0;
   }
   while(0==done){
       //write snapp shell line:
       snprintf(send_buf,CONTROL_BUF_SIZE-1,"snapp> ");
       rvalue=send(fd,send_buf,strlen(send_buf),0);
       if(rvalue!=strlen(send_buf)){
           return 0;
       } 

       //read command
       command=-1;
       memset(recv_buf,0x00,CONTROL_BUF_SIZE);
       rvalue=recv(fd,recv_buf,CONTROL_BUF_SIZE-1,0);
       if(rvalue<=0){
          return 0;
       }
       //remove trailing chars(\n and \r)?
       for(i=0;i<rvalue;i++){
         if (recv_buf[i]=='\n' || recv_buf[i]=='\r' ){
            recv_buf[i]=0x00;
         }
       }    

       //do a 'switch like' on the command.
       if(recv_buf==strcasestr(recv_buf,"quit")){
         command=CONTROL_COMMAND_QUIT;
       }
       else if(0==strcasecmp(recv_buf,"reload")) {
         command=CONTROL_COMMAND_RELOAD;
       }
       else if(recv_buf==strcasestr(recv_buf,"status")){
         command=CONTROL_COMMAND_STATUS;
       }
       else if(recv_buf==strcasestr(recv_buf,"help")){
         command=CONTROL_COMMAND_HELP;
       }
       else if(recv_buf==strcasestr(recv_buf,"user ")){
         if(strlen(recv_buf)>=8){
           command=CONTROL_COMMAND_USER;
           arg=&recv_buf[5];   
         }
       }
       else if(recv_buf==strcasestr(recv_buf,"pass ")){
         if(strlen(recv_buf)>=8){
           command=CONTROL_COMMAND_PASS;
           arg=&recv_buf[5];
         }
       }
       else if(recv_buf==strcasestr(recv_buf,"logregexp ")){
         if(strlen(recv_buf)>=10){
           command=CONTROL_COMMAND_LOGREGEXP;
           arg=&recv_buf[10];
         }
       }
       // now actually do work
       switch(command <<8 |connection_state){
          case CONTROL_COMMAND_QUIT<<8 | CONTROL_CONNECTION_STATE_CONNECTED:
          case CONTROL_COMMAND_QUIT<<8 | CONTROL_CONNECTION_STATE_USERNAME_RECEIVED:
          case CONTROL_COMMAND_QUIT<<8 | CONTROL_CONNECTION_STATE_AUTHENTICATED:
              snprintf(send_buf,CONTROL_BUF_SIZE-1,"200 Goodbye\r\n");
              rvalue=send(fd,send_buf,strlen(send_buf),0);
              return 0;
              break;
          case CONTROL_COMMAND_USER<<8 | CONTROL_CONNECTION_STATE_CONNECTED:
              connection_state=CONTROL_CONNECTION_STATE_USERNAME_RECEIVED;
              snprintf(send_buf,CONTROL_BUF_SIZE-1,"331 Please specify the password\r\n");
              rvalue=send(fd,send_buf,strlen(send_buf),0);
              break;
          case CONTROL_COMMAND_PASS<<8 | CONTROL_CONNECTION_STATE_USERNAME_RECEIVED:
              if(0==parent->enable_password.compare(arg)){
                 connection_state=CONTROL_CONNECTION_STATE_AUTHENTICATED;
                 snprintf(send_buf,CONTROL_BUF_SIZE-1,"230 Login Sucessful\r\n");
                 rvalue=send(fd,send_buf,strlen(send_buf),0);
              }
              else{
                 snprintf(send_buf,CONTROL_BUF_SIZE-1,"530 Login Failure\r\n");
                 rvalue=send(fd,send_buf,strlen(send_buf),0);
              }
              break;
          
          case CONTROL_COMMAND_RELOAD<<8 | CONTROL_CONNECTION_STATE_AUTHENTICATED:
              rvalue=do_reload();
              if(rvalue<0){
                 return 0;
              }
              break;
          case CONTROL_COMMAND_LOGREGEXP<<8 | CONTROL_CONNECTION_STATE_AUTHENTICATED:
              rvalue=do_regexp(arg);
              if(rvalue<0){
                 return 0;
              }
              else{
                 //send failure!
              }

              break;

          case CONTROL_COMMAND_STATUS<<8 | CONTROL_CONNECTION_STATE_CONNECTED:
          case CONTROL_COMMAND_STATUS<<8 | CONTROL_CONNECTION_STATE_USERNAME_RECEIVED:
          case CONTROL_COMMAND_STATUS<<8 | CONTROL_CONNECTION_STATE_AUTHENTICATED:
              rvalue=send_status();
              if(rvalue<0){
                 return 0;
              }
              break;
          case CONTROL_COMMAND_HELP<<8 | CONTROL_CONNECTION_STATE_CONNECTED:
          case CONTROL_COMMAND_HELP<<8 | CONTROL_CONNECTION_STATE_USERNAME_RECEIVED:
          case CONTROL_COMMAND_HELP<<8 | CONTROL_CONNECTION_STATE_AUTHENTICATED:
              rvalue=send_help();
              if(rvalue<0){
                 return 0;
              }
              break;


          case CONTROL_COMMAND_RELOAD<<8 | CONTROL_CONNECTION_STATE_CONNECTED:
          case CONTROL_COMMAND_RELOAD<<8 | CONTROL_CONNECTION_STATE_USERNAME_RECEIVED:
              snprintf(send_buf,CONTROL_BUF_SIZE-1,"530 Not logged in\r\n");
              rvalue=send(fd,send_buf,strlen(send_buf),0);
              break;


          default:
              snprintf(send_buf,CONTROL_BUF_SIZE-1,"500 Command not recognized\r\n");
              rvalue=send(fd,send_buf,strlen(send_buf),0);
              if(rvalue!=strlen(send_buf)){
                 return 0;
              }

       }
       
    }

   
   return 0;
};