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); }
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; };