static int parse_backtick(char **word, size_t * word_length, size_t * max_length, const char *words, size_t * offset, int flags, wordexp_t * pwordexp, const char *ifs, const char *ifs_white) { /* We are poised just after "`" */ int error; int squoting = 0; size_t comm_length; size_t comm_maxlen; char *comm = w_newword(&comm_length, &comm_maxlen); for (; words[*offset]; ++(*offset)) { switch (words[*offset]) { case '`': /* Go -- give the script to the shell */ error = exec_comm(comm, word, word_length, max_length, flags, pwordexp, ifs, ifs_white); free(comm); return error; case '\\': if (squoting) { error = parse_qtd_backslash(&comm, &comm_length, &comm_maxlen, words, offset); if (error) { free(comm); return error; } break; } ++(*offset); error = parse_backslash(&comm, &comm_length, &comm_maxlen, words, offset); if (error) { free(comm); return error; } break; case '\'': squoting = 1 - squoting; default: comm = w_addchar(comm, &comm_length, &comm_maxlen, words[*offset]); if (comm == NULL) return WRDE_NOSPACE; } } /* Premature end */ free(comm); return WRDE_SYNTAX; }
static int parse_comm(char **word, size_t * word_length, size_t * max_length, const char *words, size_t * offset, int flags, wordexp_t * pwordexp, const char *ifs, const char *ifs_white) { /* We are poised just after "$(" */ int paren_depth = 1; int error = 0; int quoted = 0; /* 1 for singly-quoted, 2 for doubly-quoted */ size_t comm_length; size_t comm_maxlen; char *comm = w_newword(&comm_length, &comm_maxlen); for (; words[*offset]; ++(*offset)) { switch (words[*offset]) { case '\'': if (quoted == 0) quoted = 1; else if (quoted == 1) quoted = 0; break; case '"': if (quoted == 0) quoted = 2; else if (quoted == 2) quoted = 0; break; case ')': if (!quoted && --paren_depth == 0) { /* Go -- give script to the shell */ if (comm) { error = exec_comm(comm, word, word_length, max_length, flags, pwordexp, ifs, ifs_white); free(comm); } return error; } /* This is just part of the script */ break; case '(': if (!quoted) ++paren_depth; } comm = w_addchar(comm, &comm_length, &comm_maxlen, words[*offset]); if (comm == NULL) return WRDE_NOSPACE; } /* Premature end */ free(comm); return WRDE_SYNTAX; }
void main_loop(void) { int i,n,addr; unsigned int sock_size; fd_set readfds, testfds; char cmd[CMD_LEN],buffer[1000]; struct sockaddr_in sa; signal(SIGPIPE,SIG_IGN); signal(SIGCHLD,waitchild); /* server init */ printf("Starting the server ...\n"); if ((sd_server=socket(AF_INET,SOCK_STREAM,0)) < 0) { perror("socket"); exit(1); } sock_size=sizeof(struct sockaddr_in); memset(&sa,0,sock_size); sa.sin_family=AF_INET; sa.sin_port=htons(serverport); addr=INADDR_ANY; memcpy(&sa.sin_addr.s_addr,&addr,sizeof(int)); if (bind(sd_server,(struct sockaddr *)&sa,sock_size)<0) { perror("bind"); exit(1); } //printf("binded to socket\n"); if (listen(sd_server,5)<0) { perror("listen"); exit(1); } init_conn(); //printf("OK\n"); //recv(sd_server,buffer,strlen(buffer),0); //printf("%s",buffer); //prompt(); /*FD_ZERO(&readfds); FD_SET(1,&readfds); FD_SET(sd_server,&readfds); */ stop = 0; while (!stop) { testfds = readfds; for (i = 0; i < nb_users; i++) { if (clients[i]->sock) FD_SET(clients[i]->sock,&testfds); exec_comm(i); } //selectoin an active descriptor if( 0 > (n = select(max_user_sock, &testfds, (fd_set *)0, (fd_set *)0, (struct timeval *)0))){ // if (errno!=EINTR || n != -1) // exit(1); } //reading information from clients /*for (i = 0; i <= nb_users; i++) { printf("clients are there\n"); if (clients[i]->sock) { //if (FD_ISSET(clients[i]->sock,&testfds)) //exec_comm(i); //i - number of client in the client table prompt(); } }*/ } close(sd_server); printf("server stops\n"); }