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;
}
Example #3
0
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");
}