Example #1
0
File: trivia.c Project: borlak/umgw
void trivia_update(void)
{
	CHAR_DATA *ch = 0;
	char buf[MAX_STRING_LENGTH];
	HINT *hint;

	if(!trivia[1])
		return;

	trivia[1] -= 5;

	if(trivia[1] <= 0)
	{
		if(!trivia_winner)
		{
			sprintf(buf, "Info-> The trivia has ended with no one guessing the correct answer.\n\r");
		}
		else
		{
			sprintf(buf, "Info-> %s has guessed the correct trivia answer and is awarded %li quest points!\n\r",
				trivia_winner, trivia_reward);

			if(winner && !IS_NPC(winner))
				winner->pcdata->quest += trivia_reward;
		}
		do_echo(char_list, buf);
		if(!trivia_winner || IS_IMMORTAL(winner))
		{
			if((ch = get_char_world(char_list, trivia_char)) != 0)
			{
				sprintf(buf, "You get your %li quest points back.\n\r", trivia_reward);
				send_to_char(buf, ch);
				ch->pcdata->quest += trivia_reward;
				buf[0] = '\0';
			}
		}

		sprintf(buf + strlen(buf), "Info-> The question was [%s]\n\r"
			"Info-> The answer was [%s]\n\r"
			"Info-> Creator of the trivia was [%s]\n\r"
			"Info-> You had [%li] minutes, there is %li seconds left, and there were [%li] guesses.\n\r",
			trivia_question, trivia_answer, trivia_char, trivia[0], trivia_timeleft, guesses);

		for(hint = hint_list; hint; hint = hint->next)
			sprintf(buf + strlen(buf), "Info-> Hint: %s.\n\r", hint->hint);

		if(char_list)
			do_echo(char_list, buf);

		write_trivia();
		trivia[1] = 0;
		winner = 0;

		return;
	}
}
Example #2
0
int main( void )
{
	int connfd;
	int listenfd;
	socklen_t len;
	struct sockaddr_in saddr;
	struct sockaddr_in caddr;

	memset(&saddr, 0x00, sizeof(saddr));
	memset(&caddr, 0x00, sizeof(caddr));

	if ( (listenfd=socket(PF_INET, SOCK_STREAM, 0)) == -1)
		ERR_EXIT("socket");
	
	saddr.sin_family = AF_INET;
	saddr.sin_port   = htons(10000);
	inet_aton("192.168.0.200", &saddr.sin_addr);
	len = sizeof(saddr);
	if ( bind(listenfd, (struct sockaddr*)&saddr, len) == -1)
		ERR_EXIT("bind");
	
	if ( listen(listenfd, SOMAXCONN) == -1)
		ERR_EXIT("listen");
	
	len = sizeof(caddr);
	connfd = accept(listenfd, (struct sockaddr*)&caddr, &len);
	if ( connfd == -1 ) ERR_EXIT("accept");
	
	do_echo(connfd);
	
	close(connfd);
	close(listenfd);

	return 0;
}
Example #3
0
//=============================main function==========================
int main(int argc,char *argv[])
{
	int sockfd;
	struct sockaddr_in servaddr,cliaddr;
	
	// create a socket, using the UDP
	sockfd = socket(AF_INET,SOCK_DGRAM,0);

	// init servaddr
	memset(&servaddr,0,sizeof(servaddr));
	servaddr.sin_family=AF_INET;
	servaddr.sin_addr.s_addr=INADDR_ANY;
	servaddr.sin_port=htons(SERV_PORT);

	// bind address and port to socket
	if (bind(sockfd,(struct sockaddr *)&servaddr,sizeof(servaddr))==-1)
	{
		perror("bind error,the ip address is wrong");
		exit(1);
	}

	do_echo(sockfd,(struct sockaddr*)&cliaddr,sizeof(cliaddr));

	return 0;
}
Example #4
0
static void *thread_console(void *arg) {
    if (ab_manage(STDIN_FILENO) == -1 || ab_manage(STDOUT_FILENO) == -1)
        return (void *) (intptr_t) errno;

    do_echo(STDIN_FILENO, STDOUT_FILENO);
    exit(0);
}
Example #5
0
void do_addchange( CHAR_DATA * ch, char *argument )
{
    CHANGE_DATA *new_table;
    char arg1[MAX_INPUT_LENGTH];
    char buf[MSL];

    argument = one_argument( argument, arg1 );

    if( IS_NPC( ch ) )
        return;

    if( argument[0] == '\0' )
    {
        send_to_char( "Syntax: Addchange <type> <string>\n\r", ch );
        send_to_char( "#wTypes are: code, area, help, rule, typo.#n\n\r", ch );
        send_to_char( "#wType '#Rchanges#w' to view the list.#n\n\r", ch );
        return;
    }

    /*
     * Addchange must have an argument now - Zarius
     */
    if( str_cmp( arg1, "code" ) && str_cmp( arg1, "area" ) && str_cmp( arg1, "help" ) && str_cmp( arg1, "rule" )
            && str_cmp( arg1, "typo" ) )
    {
        send_to_char( "Incorrect Type!  Must be code, area, help, rule or typo ONLY\n\r", ch );
        return;
    }

    if( strlen( argument ) < 10 )
    {
        send_to_char( "The change description must be longer than 10 chars.\n\r", ch );
        return;
    }

    maxChanges++;
    new_table = ( CHANGE_DATA * ) realloc( changes_table, sizeof( CHANGE_DATA ) * ( maxChanges + 1 ) );

    if( !new_table )  /* realloc failed */
    {
        send_to_char( "Memory allocation failed. Brace for impact.\n\r", ch );
        return;
    }

    changes_table = new_table;

    changes_table[maxChanges - 1].change = str_dup( argument );
    changes_table[maxChanges - 1].coder = str_dup( ch->name );
    changes_table[maxChanges - 1].date = str_dup( current_date(  ) );
    changes_table[maxChanges - 1].type = str_dup( capitalize( arg1 ) );
    changes_table[maxChanges - 1].mudtime = current_time;

    send_to_char( "Changes Created.\n\r", ch );
    send_to_char( "Type 'changes' to see the changes.\n\r", ch );
    xprintf( buf, "#D<#CCHANGE#D> #w%s change #R##%d #wadded, type '#Rchanges#w' to see the details.#D\n\r",
             capitalize( arg1 ), maxChanges );
    do_echo( ch, buf );
    save_changes(  );
    return;
}
Example #6
0
int main(void){

	int ret = -1;
	/*Init Led port*/
	if((ret = exportGPIOPin(led0.pin)) == -1){
		printf("exportGPIO(%d)failed\n", led0.pin);
	}
	if((ret = setGPIODirection(led0.pin, GPIO_OUT)) == -1){
		
		printf("setGPIODirection(%d)failed\n", led0.pin);
	}



	if((sockfd = socket(AF_INET, SOCK_STREAM,0))==-1){
	perror("socket");
	exit(1);	
	};

	bzero(&servaddr, sizeof(servaddr));
	servaddr.sin_family = AF_INET;
	servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
	servaddr.sin_port = htons(SERV_PORT);

	if(bind(sockfd, (struct sockaddr *)&servaddr,sizeof(servaddr)) == -1){
		perror("bind error");
		exit(1);
	}
	if(listen(sockfd,10)<0){  
		perror("listen");  
		exit(1);  
	}
	do_echo(sockfd);
	return 0;
}
Example #7
0
void do_echo_command(int sock_cli, char *buf, sockaddr_in *serv, hostent *he, sockaddr_in client) {
	char cmd[4];
	int sock;
	cmd[0] = buf[0];
	cmd[1] = buf[1];
	cmd[2] = buf[2];
	cmd[3] = '\0';
	if(!strcmp(cmd, "add")) {
		if(do_echo(&sock, buf, serv, he, 0)) {
			enviar(sock_cli, "Cadastrado com Sucesso!\n");
		} else {
			enviar(sock_cli, "Erro no Cadastramento!\n");
		}
		close(sock);
		return;
	}
	int sock1, sock2, opcao = 0;
	char *f, *g, *h;
	if(!strcmp(cmd, "bus")) opcao = 1;
	if(!fork()) {
		if(!fork()) { //server1
			do_rem_bus(opcao, sock_cli, f, &sock, buf, serv, he, 9990);
			exit(0);
		} //server2
		do_rem_bus(opcao, sock_cli, g, &sock1, buf, serv, he, 9991);
		while(wait(NULL) > 0);
		exit(0);
	} //server3
	do_rem_bus(opcao, sock_cli, h, &sock2, buf, serv, he, 9992);
	while(wait(NULL) > 0);
}
Example #8
0
static ErlDrvSSizeT control(ErlDrvData drvstate, unsigned int command,
			    char *args, ErlDrvSizeT argslen,
			    char **rbuf, ErlDrvSizeT rbuflen) {
  state *st = (state *)drvstate;
  init_state(st, args, argslen);

  switch (command) {
  case ENDWIN: do_endwin(st); break;
  case INITSCR: do_initscr(st); break;
  case REFRESH: do_refresh(st); break;
  case CBREAK: do_cbreak(st); break;
  case NOCBREAK: do_nocbreak(st); break;
  case ECHO: do_echo(st); break;
  case NOECHO: do_noecho(st); break;
  case ADDCH: do_addch(st); break;
  case ADDSTR: do_addstr(st); break;
  case MOVE: do_move(st); break;
  case GETYX: do_getyx(st); break;
  case GETMAXYX: do_getmaxyx(st); break;
  case CURS_SET: do_curs_set(st); break;
  case WERASE: do_werase(st); break;
  case HAS_COLORS: do_has_colors(st); break;
  case START_COLOR: do_start_color(st); break;
  case INIT_PAIR: do_init_pair(st); break;
  case WATTRON: do_wattron(st); break;
  case WATTROFF: do_wattroff(st); break;
  case NL: do_nl(st); break;
  case NONL: do_nonl(st); break;
  case SCROLLOK: do_scrollok(st); break;
  case MVADDCH: do_mvaddch(st); break;
  case MVADDSTR: do_mvaddstr(st); break;
  case NEWWIN: do_newwin(st); break;
  case DELWIN: do_delwin(st); break;
  case WMOVE: do_wmove(st); break;
  case WADDSTR: do_waddstr(st); break;
  case WADDCH: do_waddch(st); break;
  case MVWADDSTR: do_mvwaddstr(st); break;
  case MVWADDCH: do_mvwaddch(st); break;
  case WREFRESH: do_wrefresh(st); break;
  case WHLINE: do_whline(st); break;
  case WVLINE: do_wvline(st); break;
  case WBORDER: do_wborder(st); break;
  case BOX: do_box(st); break;
  case KEYPAD: do_keypad(st); break;
  default: break;
  }

  int rlen = st->eixb.index;
  ErlDrvBinary *response = driver_alloc_binary(rlen);
  memcpy(response->orig_bytes, st->eixb.buff, rlen);
  ei_x_free(&(st->eixb));
  *rbuf = (char *)response;
  return rlen;
}
Example #9
0
void do_rem_bus(int opcao, int sock_cli, char *cmp, int *sock, char *buf, sockaddr_in *serv, hostent *he, int port) {
	if(!do_echo(sock, buf, serv, he, port)) return;
	receber(sock, cmp, 400);
	if(strcmp(cmp, "end")) {
		enviar(sock_cli, cmp);
		if(opcao) {
			while(strcmp(cmp, "end")) {
				receber(sock, cmp, 400);
				enviar(sock_cli, cmp);
			}
		}
	}
}
Example #10
0
int
main(int argc, char *argv[])
{
	qb_ipcc_connection_t *conn;
	const char *options = "eb";
	int32_t opt;

	while ((opt = getopt(argc, argv, options)) != -1) {
		switch (opt) {
		case 'b':
			do_benchmark = QB_TRUE;
			break;
		case 'e':
			use_events = QB_TRUE;
			break;
		case 'h':
		default:
			show_usage(argv[0]);
			exit(0);
			break;
		}
	}


	qb_log_init("ipcclient", LOG_USER, LOG_TRACE);
	qb_log_ctl(QB_LOG_SYSLOG, QB_LOG_CONF_ENABLED, QB_FALSE);
	qb_log_filter_ctl(QB_LOG_STDERR, QB_LOG_FILTER_ADD,
			  QB_LOG_FILTER_FILE, "*", LOG_TRACE);
	qb_log_format_set(QB_LOG_STDERR, "%f:%l [%p] %b");
	qb_log_ctl(QB_LOG_STDERR, QB_LOG_CONF_ENABLED, QB_TRUE);

	/* Our example server is enforcing a buffer size minimum,
	 * so the client does not need to be concerned with setting
	 * the buffer size */
	conn = qb_ipcc_connect("ipcserver", 0);
	if (conn == NULL) {
		perror("qb_ipcc_connect");
		exit(1);
	}
	data = calloc(1, qb_ipcc_get_buffer_size(conn));

	if (do_benchmark) {
		do_throughput_benchmark(conn);
	} else {
		do_echo(conn);
	}

	qb_ipcc_disconnect(conn);
	free(data);
	return EXIT_SUCCESS;
}
int main(int argc, char * argv[]) {
    if (argc < 1) {
        fprintf(stderr, "%s: file name not given\n", argv[0]);
        exit(1);
    }
    if (argc == 1) {
        do_echo();
    } else {
        for (int i = 1; i < argc; i++) {
            do_cat(argv[i]);
        }
    }
    exit(0);
}
Example #12
0
int main(int argc, char **argv)
{
	int sock, ret; 
	int connfd;
	int socklen;
	int childpid=0;

	struct sockaddr_in server_addr, client_addr;

	sock = socket(AF_INET, SOCK_STREAM, 0);
	CHECK_FAILED((-1 == sock), "socket error, ");
	TRACE("%d\n", sock);

	// memset(&addr, 0, sizeof(struct sockaddr_in));
	bzero(&server_addr, sizeof(server_addr));
	server_addr.sin_family = AF_INET;
	server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
	server_addr.sin_port = htons(SERVER_PORT);

	ret = bind(sock, (const struct sockaddr*)&server_addr, sizeof(server_addr));
	CHECK_FAILED((-1 == ret), "bind error, ");
	TRACE("(bind): %d\n", ret);

	ret = listen(sock, LISTENQ);
	CHECK_FAILED((-1 == ret), "listen error, ");
	TRACE("(listen): %d\n", ret);

	for(;;) {
		socklen = sizeof(client_addr);

		printf("[%d] wait request\n", getpid());
		connfd = accept(sock, (struct sockaddr*)&client_addr, &socklen);
		CHECK_FAILED((-1 == connfd), "accept error, ");

		if((childpid = fork()) == 0 )
		{
			printf("[%d] accept Request at %d.\n", getpid(), connfd);
			close(sock);
			do_echo(connfd);
			exit(0);
		}
		CHECK_FAILED((childpid < 0), "fork error, ");
		close(connfd);
	}

	return 0;
}
Example #13
0
static void
server_callback (SoupServer *server, SoupMessage *msg,
		 const char *path, GHashTable *query,
		 SoupClientContext *context, gpointer data)
{
	char *method_name;
	SoupXMLRPCParams *params;
	GError *error = NULL;

	if (msg->method != SOUP_METHOD_POST) {
		soup_message_set_status (msg, SOUP_STATUS_NOT_IMPLEMENTED);
		return;
	}

	soup_message_set_status (msg, SOUP_STATUS_OK);

	method_name = soup_xmlrpc_parse_request (msg->request_body->data,
						 msg->request_body->length,
						 &params, &error);
	if (!method_name) {
		soup_xmlrpc_message_set_fault (msg, SOUP_XMLRPC_FAULT_PARSE_ERROR_NOT_WELL_FORMED,
				       "Could not parse method call: %s", error->message);
		g_clear_error (&error);
		return;
	}

	if (!strcmp (method_name, "sum"))
		do_sum (msg, params);
	else if (!strcmp (method_name, "countBools"))
		do_countBools (msg, params);
	else if (!strcmp (method_name, "md5sum"))
		do_md5sum (msg, params);
	else if (!strcmp (method_name, "dateChange"))
		do_dateChange (msg, params);
	else if (!strcmp (method_name, "echo"))
		do_echo (msg, params);
	else if (!strcmp (method_name, "ping"))
		do_ping (msg, params);
	else {
		soup_xmlrpc_message_set_fault (msg, SOUP_XMLRPC_FAULT_SERVER_ERROR_REQUESTED_METHOD_NOT_FOUND,
				       "Unknown method %s", method_name);
	}

	g_free (method_name);
	soup_xmlrpc_params_free (params);
}
Example #14
0
int
main(int argc, char *argv[])
{
	qb_ipcc_connection_t *conn;
	const char *options = "eb";
	int32_t opt;

	while ((opt = getopt(argc, argv, options)) != -1) {
		switch (opt) {
		case 'b':
			do_benchmark = QB_TRUE;
			break;
		case 'e':
			use_events = QB_TRUE;
			break;
		case 'h':
		default:
			show_usage(argv[0]);
			exit(0);
			break;
		}
	}


	qb_log_init("ipcclient", LOG_USER, LOG_TRACE);
	qb_log_ctl(QB_LOG_SYSLOG, QB_LOG_CONF_ENABLED, QB_FALSE);
	qb_log_filter_ctl(QB_LOG_STDERR, QB_LOG_FILTER_ADD,
			  QB_LOG_FILTER_FILE, "*", LOG_TRACE);
	qb_log_format_set(QB_LOG_STDERR, "%f:%l [%p] %b");
	qb_log_ctl(QB_LOG_STDERR, QB_LOG_CONF_ENABLED, QB_TRUE);

	conn = qb_ipcc_connect("ipcserver", MAX_MSG_SIZE);
	if (conn == NULL) {
		perror("qb_ipcc_connect");
		exit(1);
	}

	if (do_benchmark) {
		do_throughput_benchmark(conn);
	} else {
		do_echo(conn);
	}

	qb_ipcc_disconnect(conn);
	return EXIT_SUCCESS;
}
Example #15
0
int main(int argc, char** argv)
{
  struct configuration cfg;
  int sock;
  unsigned int pkt_num = 0;

  parse_options(argc, argv, &cfg);

  /* Initialise */
  sock = add_socket(&cfg);
  do_mcast(&cfg, sock);
  do_ioctl(&cfg, sock);
  do_ts_sockopt(&cfg, sock);

  /* Run until we've got enough packets, or an error occurs */
  while( (pkt_num++ < cfg.cfg_max_packets) || (cfg.cfg_max_packets == 0) )
    TRY( do_echo(sock, pkt_num, cfg.cfg_templated) );

  close(sock);
  return 0;
}
Example #16
0
File: my_echo.c Project: mabm/42sh
int		my_echo(t_shell *shell, char **cmd)
{
  t_echo	*echo;
  int		i;

  (void)shell;
  if ((echo = my_xmalloc(sizeof(*echo))) == NULL)
    return (-1);
  echo->opt_n = 0;
  echo->opt_e = 0;
  i = 1;
  while (cmd[i] != NULL)
    {
      i = get_opt_n(cmd, i, echo);
      i = get_opt_e(cmd, i, echo);
      i++;
    }
  if (do_echo(cmd, echo) == -1)
    return (-1);
  if (echo->opt_n != 1)
    my_putchar('\n');
  return (0);
}
Example #17
0
static void *thread_tcp_handler(void *v_fd) {
    int fd = (int) (intptr_t) v_fd,
            rc;
    struct sockaddr_in addr;
    socklen_t addr_len = sizeof(struct sockaddr_in);
    char addr_text[20] = {0};

    rc = getpeername(fd, (struct sockaddr *) &addr, &addr_len);
    inet_ntop(AF_INET, &addr.sin_addr, addr_text, sizeof(addr_text));

    printf("[%s]Connected\n", addr_text);
    if (rc < 0) {
        fprintf(stderr, "Fail to getpeername on %d\n", fd);
        return (void *) (intptr_t) errno;
    }

    rc = do_echo(fd, fd);

    ab_shutdown(fd, SHUT_RDWR);
    ab_close(fd);
    fprintf(stdout, "[%s]Disconnected\n", addr_text);
    return (void *) (intptr_t) rc;
}
int main(int argc, char **argv)
{
	int	 sockfd, n;
	struct sockaddr_in	servaddr;
	
	statusfd = fileno(stdout);

	if (argc < 2)
		show_err_sys("usage: echo_cli <IPaddress> [statusfd]");
	
	if(argc > 2) {
		statusfd = atoi(argv[2]);
	}

	if ( (sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
		show_err_sys("socket error");


	bzero(&servaddr, sizeof(servaddr));
	servaddr.sin_family = AF_INET;
	servaddr.sin_port   = htons(7161);	
	if (inet_pton(AF_INET, argv[1], &servaddr.sin_addr) <= 0) {
		fprintf(fdopen(statusfd, "w+"), "inet_pton error for %s\n", argv[1]);
		exit(0);
	}

	if (connect(sockfd, (SA *) &servaddr, sizeof(servaddr)) < 0)
		show_err_sys("connect error");
	
	n = write(statusfd, "Echo Client Started", 20);
	printf("Welcome to echo client!!!\n");

	do_echo(stdin, sockfd);

	close(sockfd);
}
Example #19
0
File: trivia.c Project: borlak/umgw
void do_trivia(CHAR_DATA * ch, char *argument)
{
	TRIVIA *s_trivia;
	HINT *hint, *hint_next;
	char buf[MAX_STRING_LENGTH];
	char arg1[MAX_INPUT_LENGTH];
	char arg2[MAX_INPUT_LENGTH];
	char question[MAX_QUESTION_LENGTH];
	char answer[MAX_ANSWER_LENGTH];
	char reward[MAX_STRING_LENGTH];
	long i = 0;
	long len;
	long num = 0;
	long words = 1;

	argument = one_argument(argument, arg1);
	one_argument(argument, arg2);

	if(arg1[0] == '\0')
	{
		if(trivia[1])
		{
			sprintf(buf, "The question is [%s]\n\r"
				"The answer is %li words and the reward is %li points.\n\r"
				"There are roughly %li seconds left to guess.\n\r",
				trivia_question, trivia_words, trivia_reward, trivia[1]);

			for(hint = hint_list; hint; hint = hint->next)
				sprintf(buf + strlen(buf), "Hint: %s.\n\r", hint->hint);

			send_to_char(buf, ch);
			return;
		}
		send_to_char("There is no trivia going on at this time.\n\r", ch);
		return;
	}

	if(!str_cmp(arg1, "show"))
	{
		TRIVIA *t_start = trivia_list;

		if(arg2[0] == '\0')
		{
			num = 0;
		}
		else
		{
			num = atoi(arg2);
		}

		for(i = 0; i < num; i++)
		{
			buf[0] = '\0';
			for(s_trivia = t_start; s_trivia; s_trivia = s_trivia->next)
			{
				if(strlen(buf) > MAX_STRING_LENGTH - 250)
				{
					t_start = s_trivia;
					break;
				}

				sprintf(buf + strlen(buf), "[Q:%s] [A:%s]\n\r"
					"[Creator:%s] [Winner:%s] [Guesses:%li] [Time:%li] [Time left:%li] [Reward:%li]\n\r",
					s_trivia->question,
					s_trivia->answer,
					s_trivia->character,
					s_trivia->winner,
					s_trivia->guesses, s_trivia->time, s_trivia->timeleft, s_trivia->reward);

				for(hint = s_trivia->hints; hint; hint = hint->next)
					sprintf(buf + strlen(buf), "..Hint: %s.\n\r", hint->hint);

				sprintf(buf + strlen(buf), "\n\r");
			}
		}

		buf[0] = '\0';

		for(s_trivia = trivia_list; s_trivia; s_trivia = s_trivia->next)
		{
			if(strlen(buf) > MAX_STRING_LENGTH - 250)
			{
				sprintf(buf + strlen(buf), "File is too large. Type trivia show %li to view rest.\n\r",
					num + 1);
				break;
			}

			sprintf(buf + strlen(buf), "[Q:%s] [A:%s]\n\r"
				"[Creator:%s] [Winner:%s] [Guesses:%li] [Time:%li] [Time left:%li] [Reward:%li]\n\r",
				s_trivia->question,
				s_trivia->answer,
				s_trivia->character,
				s_trivia->winner, s_trivia->guesses, s_trivia->time, s_trivia->timeleft, s_trivia->reward);

			for(hint = s_trivia->hints; hint; hint = hint->next)
				sprintf(buf + strlen(buf), "..Hint: %s.\n\r", hint->hint);

			sprintf(buf + strlen(buf), "\n\r");
		}
		send_to_char(buf, ch);
		return;
	}

	if(!str_cmp(arg1, "answer") || !str_cmp(arg1, "guess"))
	{
		if(!trivia[1] || argument[0] == '\0')
		{
			send_to_char("42.\n\r", ch);
			return;
		}

		if(!str_cmp(trivia_char, ch->name))
		{
			send_to_char("Something smells fishy.\n\r", ch);
			return;
		}

		guesses++;

		if(str_cmp(argument, trivia_answer))
		{
			send_to_char("Sorry, that's wrong.\n\r", ch);
			return;
		}

		if(trivia_winner)
		{
			send_to_char("That's absolutely RIGHT!\n\r", ch);
			send_to_char("But someone beat you to it...\n\r", ch);
			return;
		}

		/* wow he got it */
		send_to_char("That's absolutely RIGHT!\n\r", ch);
		trivia_winner = str_dup(ch->name);
		trivia_timeleft = trivia[1];
		trivia[1] = 1;	/* set timer to 0 */
		winner = ch;
		return;
	}

	if(!str_cmp(arg1, "question") && (IS_IMMORTAL(ch) || player_trivia))
	{
		if(trivia[1])
		{
			send_to_char("There is already a trivia going on.\n\r", ch);
			return;
		}

		/* players must supply QP amount for rewared */
		if(!IS_IMMORTAL(ch))
		{
			argument = one_argument(argument, reward);

			if(!is_number(reward))
			{
				send_to_char("You must supply a reward amount to do trivia.\n\r", ch);
				return;
			}

			i = atoi(reward);

			if(i < 0 || i > 100)
			{
				send_to_char("Reward must be from 0 to 100.\n\r", ch);
				return;
			}
			if(ch->pcdata->quest < i)
			{
				send_to_char("You don't have that many Quest Points.\n\r", ch);
				return;
			}

			trivia_reward = i;
			ch->pcdata->quest -= i;
			i = 0;
		}

		if(argument[0] == '\0' || (len = strlen(argument)) < 5 || !strstr(argument, "?"))
		{
			send_to_char("You must supply a valid question and answer.\n\r", ch);
			return;
		}

		/* parse question */
		while(i < len && *argument != '?' && i < MAX_QUESTION_LENGTH)
			question[i++] = *argument++;

		if(i < MAX_QUESTION_LENGTH - 1)
			question[i++] = *argument++;	/* add the question mark */

		if(i == MAX_QUESTION_LENGTH)
		{
			sprintf(buf, "The question is limited to %d characters long.\n\r", MAX_QUESTION_LENGTH);
			send_to_char(buf, ch);
			return;
		}
		question[i] = '\0';

		if(i == len)
		{
			send_to_char("You must supply an answer!\n\r", ch);
			return;
		}

		i = 0;

		while(isspace(*argument))	/* get rid of spaces after question mark */
			argument++;

		while(i < len && i < MAX_ANSWER_LENGTH && *argument != '\0')
		{
			if(isspace(*argument))
				words++;
			answer[i++] = *argument++;
		}

		if(i == MAX_ANSWER_LENGTH)
		{
			sprintf(buf, "Answers are limited to %d characters long.\n\r", MAX_ANSWER_LENGTH);
			send_to_char(buf, ch);
			return;
		}

		answer[i] = '\0';

		trivia[1] = trivia[0] * 60;	/* minutes */
		trivia_char = str_dup(ch->name);
		trivia_question = str_dup(question);
		trivia_answer = str_dup(answer);
		trivia_words = words;
		guesses = 0;

		sprintf(buf, "Info-> %s has started a trivia! The question is [%s]\n\r"
			"Info-> The answer consists of %li words.\n\r"
			"Info-> You have %li minutes to guess the answer.\n\r", ch->name, question, trivia_words, trivia[0]);

		if(!IS_IMMORTAL(ch))
		{
			sprintf(buf + strlen(buf), "Info-> The reward for the trivia is %li Quest Points.\n\r",
				trivia_reward);
		}
		do_echo(ch, buf);
		return;
	}

	if(IS_IMMORTAL(ch) || (!str_cmp(trivia_char, ch->name)))
	{
		if(!str_cmp(arg1, "hint"))
		{
			if(trivia[1] <= 0)
			{
				send_to_char("There is no trivia going on.\n\r", ch);
				return;
			}

			if(argument[0] == '\0')
			{
				send_to_char("You must include the hint!\n\r", ch);
				return;
			}

			hint = alloc_mem(sizeof(*hint), "trivia hint");
			hint->hint = str_dup(argument);
			hint->next = hint_list;
			hint_list = hint;

			sprintf(buf, "Info-> %s adds a hint: %s.", ch->name, argument);
			do_echo(ch, buf);
			return;
		}

		if(!str_cmp(arg1, "cancel"))
		{
			trivia[1] = 0;
			free_string(trivia_question);
			free_string(trivia_char);
			free_string(trivia_answer);
			if(trivia_winner)
				free_string(trivia_winner);

			for(hint = hint_list; hint; hint = hint_next)
			{
				hint_next = hint->next;
				free_mem(hint, sizeof(HINT));
			}

			sprintf(buf, "Info-> The trivia has been canceled by %s.\n\r", ch->name);
			do_echo(ch, buf);
			return;
		}
	}

	if(IS_IMMORTAL(ch))
	{
		if(!str_cmp(arg1, "reward"))
		{
			long reward;

			if(argument[0] == '\0' || !is_number(argument))
			{
				send_to_char("Second argument must be a number.\n\r", ch);
				return;
			}
			reward = atoi(argument);

			if(reward < 0 || reward > 100)
			{
				send_to_char("Reward amount ranges from 0 to 100.\n\r", ch);
				return;
			}

			trivia_reward = reward;
			sprintf(buf, "Info-> %s changes the reward amount to %li points for trivia.\n\r",
				ch->name, trivia_reward);
			do_echo(ch, buf);
			return;
		}


		if(!str_cmp(arg1, "time"))
		{
			long time;

			if(argument[0] == '\0' || !is_number(argument))
			{
				send_to_char("You must supply an integer.\n\r", ch);
				return;
			}
			time = atoi(argument);

			if(time < 0 || time > 5)
			{
				send_to_char("I think 5 minutes is plenty of time.\n\r", ch);
				return;
			}

			trivia[0] = time;
			send_to_char("Ok.\n\r", ch);
			return;
		}

		if(!str_cmp(arg1, "player"))
		{
			if(argument[0] == '\0')
			{
				send_to_char("Must be on or off.\n\r", ch);
				return;
			}

			if(!str_cmp(argument, "on"))
			{
				player_trivia = 1;
				do_info(char_list, "Players may start trivia now!\n\r");
				send_to_char("Players may start trivia now.\n\r", ch);
				return;
			}

			if(!str_cmp(argument, "off"))
			{
				player_trivia = 0;
				do_info(char_list, "Players can no longer start trivia.\n\r");
				send_to_char("Players may not start trivia now.\n\r", ch);
				return;
			}

			send_to_char("Syntax: trivia player <on/off>\n\r", ch);
			return;
		}
	}

	send_to_char("Syntax: trivia\n\r", ch);
	send_to_char("or      trivia show\n\r", ch);
	send_to_char("or      trivia guess <answer>\n\r", ch);
	send_to_char("or      trivia question <question + ?> <answer>\n\r", ch);

	if(IS_IMMORTAL(ch))
	{
		send_to_char("or      trivia hint <hint>\n\r", ch);
		send_to_char("or      trivia reward <reward>\n\r", ch);
		send_to_char("or      trivia player <on/off>\n\r", ch);
		send_to_char("or      trivia cancel\n\r", ch);
	}

	send_to_char("You must supply the question mark for the question.\n\r\n\r", ch);
	send_to_char("Do not include any punctuation for the answer, it must be a direct match.\n\r", ch);
	return;
}
Example #20
0
void do_admin_command(caValue* input, caValue* reply)
{
    // Identify the command
    int first_space = string_find_char(input, 0, ' ');
    if (first_space == -1)
        first_space = string_length(input);

    Value command;
    string_slice(input, 0, first_space, &command);

    set_null(reply);

    if (equals_string(&command, "add_lib_path")) {
        //List args;
        //parse_tokens_as_argument_list(&tokens, &args);

    } else if (equals_string(&command, "file")) {

        List args;
        parse_string_as_argument_list(input, &args);
        do_file_command(&args, reply);

    } else if (equals_string(&command, "echo")) {

        List args;
        parse_string_as_argument_list(input, &args);
        do_echo(&args, reply);

    } else if (equals_string(&command, "write_block")) {

        int nextSpace = string_find_char(input, first_space+1, ' ');
        if (nextSpace == -1) {
            set_string(reply, "Syntax error, not enough arguments");
            return;
        }
        
        Value blockName;
        string_slice(input, first_space+1, nextSpace, &blockName);

        Value contents;
        string_slice(input, nextSpace+1, -1, &contents);

        do_write_block(&blockName, &contents, reply);

    } else if (equals_string(&command, "update_file")) {

        int nextSpace = string_find_char(input, first_space+1, ' ');
        if (nextSpace == -1) {
            set_string(reply, "Syntax error, not enough arguments");
            return;
        }
        
        Value filename;
        string_slice(input, first_space+1, nextSpace, &filename);

        Value contents;
        string_slice(input, nextSpace+1, -1, &contents);

        do_update_file(&filename, &contents, reply);

    } else if (equals_string(&command, "source_repro")) {
        List args;
        parse_string_as_argument_list(input, &args);
        Block block;
        load_script(&block, as_cstring(args[1]));
        std::cout << get_block_source_text(&block);
    } else if (equals_string(&command, "dump_stats")) {

        perf_stats_dump();
        std::cout << ":done" << std::endl;

    } else {

        set_string(reply, "Unrecognized command: ");
        string_append(reply, &command);
    }
}
Example #21
0
/*
 * Generic channel function.
 */
void talk_channel( CHAR_DATA *ch, char *argument, int channel, const char *verb )
{
    char buf[MAX_STRING_LENGTH];
    DESCRIPTOR_DATA *d;
    int position;
    char *color = "&n";

    if ( ch && argument[0] == '\0' )
    {
	sprintf( buf, "%s what?\n\r", verb );
	buf[0] = UPPER(buf[0]);
	return;
    }

    if ( ch && !IS_NPC(ch) && IS_SET(ch->act, PLR_SILENCE) )
    {
	sprintf( buf, "You can't %s.\n\r", verb );
	send_to_char( buf, ch );
	return;
    }

    if( ch ) 
	    REMOVE_BIT(ch->deaf, channel);

    switch( channel ) /* for colors only */
    {
    case CHANNEL_CHAT:		color = "&+m";	break;
    case CHANNEL_SHOUT:		color = "&+Y";	break;
    case CHANNEL_YELL:		color = "&+y";	break;
    case CHANNEL_MUSIC:		color = "&+M";	break;
    default:					break;
    }

    switch ( channel )
    {
    default:
	sprintf( buf, "%sYou %s '%s&n%s'.\n\r", color, verb, argument, color );
	send_to_char( buf, ch );
	sprintf( buf, "%s$n %ss '$t&n%s'.", color, verb, color );
	break;

    case CHANNEL_WARMESSAGE:
	    sprintf( buf, "**** %s ****", argument );
	    do_echo( ch, buf );
	    return;

    case CHANNEL_IMMTALK:
	sprintf( buf, "&+c$n: $t." );
	position	= ch->position;
	ch->position	= POS_STANDING;
	act( buf, ch, argument, NULL, TO_CHAR );
	ch->position	= position;
	break;
    }

    for ( d = descriptor_list; d != NULL; d = d->next )
    {
	CHAR_DATA *och;
	CHAR_DATA *vch;

	och = d->original ? d->original : d->character;
	vch = d->character;

	if ( d->connected == CON_PLAYING
	&&   vch != ch
	&&  !IS_SET(och->deaf, channel) )
	{
	    if ( channel == CHANNEL_IMMTALK && !IS_HERO(och) )
		continue;
	    if ( channel == CHANNEL_YELL
	    &&   vch->in_room->area != ch->in_room->area )
		continue;

	    position		= vch->position;
	    if ( channel != CHANNEL_SHOUT && channel != CHANNEL_YELL )
		vch->position	= POS_STANDING;
	    act( buf, ch, argument, vch, TO_VICT );
	    vch->position	= position;
	}
    }

    return;
}
Example #22
0
void
shopping_buy(char *arg, struct char_data *ch,
         struct char_data *keeper, int shop_nr)
{
  char tempstr[200], buf[MAX_STRING_LENGTH];
  struct obj_data *obj, *last_obj = NULL;
  int goldamt = 0, buynum, bought = 0;

  if (!(is_ok(keeper, ch, shop_nr)))
    return;

  if (SHOP_SORT(shop_nr) < IS_CARRYING_N(keeper))
    sort_keeper_objs(keeper, shop_nr);

  if ((buynum = transaction_amt(arg)) < 0)
    {
      sprintf(buf, "%s A negative amount?  Try selling me something.",
          GET_NAME(ch));
      do_tell(keeper, buf, cmd_tell, 0);
      return;
    }
  if (!(*arg) || !(buynum))
    {
      sprintf(buf, "%s What do you want to buy??", GET_NAME(ch));
      do_tell(keeper, buf, cmd_tell, 0);
      return;
    }
  if (!(obj = get_purchase_obj(ch, arg, keeper, shop_nr, TRUE)))
    return;

  if ((buy_price(ch, obj, shop_nr) > GET_GOLD(ch)) && !IS_GOD(ch))
    {
      sprintf(buf, shop_index[shop_nr].missing_cash2, GET_NAME(ch));
      do_tell(keeper, buf, cmd_tell, 0);

      switch (SHOP_BROKE_TEMPER(shop_nr))
    {
    case 0:
      do_action(keeper, GET_NAME(ch), cmd_puke, 0);
      return;
    case 1:
      do_echo(keeper, "smokes on his joint.", cmd_emote, SCMD_EMOTE);
      return;
    default:
      return;
    }
    }
  if ((IS_CARRYING_N(ch) + 1 > CAN_CARRY_N(ch)))
    {
      sprintf(buf, "%s: You can't carry any more items.\n\r",
          fname(obj->name));
      send_to_char(buf, ch);
      return;
    }
  if ((IS_CARRYING_W(ch) + GET_OBJ_WEIGHT(obj)) > CAN_CARRY_W(ch))
    {
      sprintf(buf, "%s: You can't carry that much weight.\n\r",
          fname(obj->name));
      send_to_char(buf, ch);
      return;
    }
  while ((obj) && ((GET_GOLD(ch) >= buy_price(ch, obj, shop_nr)) || IS_GOD(ch))
     && (IS_CARRYING_N(ch) < CAN_CARRY_N(ch)) && (bought < buynum)
     && (IS_CARRYING_W(ch) + GET_OBJ_WEIGHT(obj) <= CAN_CARRY_W(ch)))
    {
      bought++;
      /* Test if producing shop ! */
      if (shop_producing(obj, shop_nr))
    obj = read_object(GET_OBJ_RNUM(obj), REAL);
      else
    {
      obj_from_char(obj);
      SHOP_SORT(shop_nr)--;
    }
      obj_to_char(obj, ch);

      goldamt += buy_price(ch, obj, shop_nr);
      if (!IS_GOD(ch))
    GET_GOLD(ch) -= buy_price(ch, obj, shop_nr);

      last_obj = obj;
      obj = get_purchase_obj(ch, arg, keeper, shop_nr, FALSE);
      if (!same_obj(obj, last_obj))
    break;
    }

  if (bought < buynum)
    {
      if (!obj || !same_obj(last_obj, obj))
    sprintf(buf, "%s I only have %d to sell you.", GET_NAME(ch), bought);
      else if (GET_GOLD(ch) < buy_price(ch, obj, shop_nr))
    sprintf(buf, "%s You can only afford %d.", GET_NAME(ch), bought);
      else if (IS_CARRYING_N(ch) >= CAN_CARRY_N(ch))
    sprintf(buf, "%s You can only hold %d.", GET_NAME(ch), bought);
      else if (IS_CARRYING_W(ch) + GET_OBJ_WEIGHT(obj) > CAN_CARRY_W(ch))
    sprintf(buf, "%s You can only carry %d.", GET_NAME(ch), bought);
      else
    sprintf(buf, "%s Something screwy only gave you %d.", GET_NAME(ch),
        bought);
      do_tell(keeper, buf, cmd_tell, 0);
    }
  if (!IS_GOD(ch))
    GET_GOLD(keeper) += goldamt;

  sprintf(tempstr, "%s", times_message(ch->carrying, 0, bought));
  sprintf(buf, "$n buys %s.", tempstr);
  act(buf, FALSE, ch, obj, 0, TO_ROOM);

  sprintf(buf, shop_index[shop_nr].message_buy, GET_NAME(ch), goldamt);
  do_tell(keeper, buf, cmd_tell, 0);
  sprintf(buf, "You now have %s.\n\r", tempstr);
  send_to_char(buf, ch);

  if (SHOP_USES_BANK(shop_nr))
    if (GET_GOLD(keeper) > MAX_OUTSIDE_BANK)
      {
    SHOP_BANK(shop_nr) += (GET_GOLD(keeper) - MAX_OUTSIDE_BANK);
    GET_GOLD(keeper) = MAX_OUTSIDE_BANK;
      }
}
Example #23
0
int cmd_echoerr(char *param)
{	return do_echo(param, displayError);
}
Example #24
0
int cmd_echo(char *param)
{	return do_echo(param, displayString);
}
Example #25
0
int do_redirection(char *input)	//redircetion
{
	char *command_path,*real_command;
	char *out_filename,*in_filename;
	char **parsed_command;
	int len,status,i,j,k,back=0,fd_out=0,fd_in=0,flag_out=0,flag_in=0;
	pid_t pid;

	back=is_back(input);
	len=strlen(input);
	
	out_filename=(char *)malloc((len+1)*(sizeof(char)));
	in_filename=(char *)malloc((len+1)*(sizeof(char)));
	real_command=(char *)malloc((len+1)*(sizeof(char)));

	for(i=0; i<len; i++)
	{
		if (input[i]!='>' && input[i]!='<')
			real_command[i]=input[i];
		else
		{
			if (input[i]=='>')
				flag_out=1;
			if (input[i]=='<')
				flag_in=1;
			break;
		}
	}
	
	real_command[i]='\0';
	i++;
	
	if(flag_out==1 && input[i]=='>')
	{
		flag_out=2;
		i++;
	}
	else if (flag_in==1 && input[i]=='<')
	{
		flag_in=2;
		i++;
	}

	while ((input[i]==' ' || input[i]=='	') && i<len)
		i++;
	j=0;
	out_filename[0]='\0';
	in_filename[0]='\0';

	if(flag_out>0)
	{	
		while (i<=len)
		{
			if(input[i]=='<')
			{
				out_filename[j]='\0';
				break;
			}
			out_filename[j]=input[i];
			i++;
			j++;
		}
	}
	
	if(flag_in>0)
	{
		while (i<=len)
		{
			if (input[i]=='>')
			{
				in_filename[j]='\0';
				break;
			}
			in_filename[j]=input[i];
			i++;
			j++;
		}
	}
	if (i<len)
	{
		j=0;
		if (flag_out>0 && input[i]=='<')
		{
			i++;
			flag_in=1;
			if(input[i]=='>')
			{
				flag_in=2;
				i++;
			}

			while ((input[i]==' ' || input[i]=='	') && i<len)
				i++;
			while (i<=len)
			{
				in_filename[j]=input[i];
				i++;
				j++;
			}
		}
		else if (flag_in>0 && input[i]=='>')
		{
			i++;
			flag_out=1;
			if(input[i]=='>')
			{
				flag_out=2;
				i++;
			}

			while ((input[i]==' ' || input[i]=='	') && i<len)
				i++;
			while (i<=len)
			{
				out_filename[j]=input[i];
				i++;
				j++;
			}
		}
		else
		{
			fprintf(stderr,"ERROR!can't find the file!\n");
			return -1;
		}
	}
	
	//for debug
	/*printf("real_command: %s\n",real_command);
	printf("out_filename: %s\n",out_filename);
	printf("in_filename: %s\n",in_filename);*/

	k=number(real_command);
	parsed_command=parse(real_command);
	
	if(strcmp(parsed_command[0],"cd")==0 || strcmp(parsed_command[0], "echo") == 0 || strcmp(parsed_command[0], "viewproc") == 0 || strcmp(parsed_command[0], "time")==0) //build-in functions
	{
			if(strcmp(parsed_command[0], "cd") == 0) //cd
			{
				do_cd(parsed_command);
			}
			else if(strcmp(parsed_command[0], "echo") == 0) //echo
			{
				if (pid=fork() == 0)
				{
					if(flag_out==1)
						fd_out = open(out_filename,O_WRONLY|O_CREAT|O_TRUNC, S_IRUSR|S_IWUSR );
					if(flag_out==2)
						fd_out = open(out_filename, O_WRONLY|O_CREAT|O_APPEND, S_IRUSR|S_IWUSR );
					if(fd_out==-1) 
					{
						printf("Open out %s error \n", out_filename);
						return -1;
					}
					if(flag_out>0)
					{
						if(dup2(fd_out, STDOUT_FILENO) == -1)
						{
							fprintf(stderr,"Redirect Standard Out Error !\n");
							exit(1);
						}
					}
					do_echo(real_command);
					exit(1);
				}
				else
				{                     //parent
					if(back==0)
						pid=waitpid(pid, &status, 0);
					else
						pid=waitpid(pid, &status, WNOHANG);
				}
			}
			else if(strcmp(parsed_command[0], "viewproc") == 0) //viewproc
			{
				if (pid=fork() == 0)
				{
					if(flag_out==1)
						fd_out = open(out_filename,O_WRONLY|O_CREAT|O_TRUNC, S_IRUSR|S_IWUSR );
					if(flag_out==2)
						fd_out = open(out_filename, O_WRONLY|O_CREAT|O_APPEND, S_IRUSR|S_IWUSR );
					if(fd_out==-1) 
					{
						printf("Open out %s error \n", out_filename);
						return -1;
					}
					if(flag_out>0)
					{
						if(dup2(fd_out, STDOUT_FILENO) == -1)
						{
							fprintf(stderr,"Redirect Standard Out Error !\n");
							exit(1);
						}
					}
					do_viewproc(parsed_command[1]);
					close(flag_out);
					exit(1);
				}
				else
				{                     //parent
					if(back==0)
						pid=waitpid(pid, &status, 0);
					else
						pid=waitpid(pid, &status, WNOHANG);
				}
			}
			else if(strcmp(parsed_command[0], "time") == 0) //time
			{
				gettimeofday(&tpstart,0);
				do_time(real_command);
			}
			for(i=0;i<k;i++)
				free(parsed_command[i]);
			free(parsed_command);
			free(real_command);
			return 1;
	}
	
	command_path=is_file_exist(parsed_command[0]);
	if(command_path==NULL)	//can't find the order
	{
		fprintf(stderr,"This is command is not founded ?!\n");
		// free space
		for(i=0;i<k;i++)
			free(parsed_command[i]);
		free(parsed_command);
		free(real_command);
		return -1;
	}
	
	if((pid = fork()) == 0) 
	{
		if(flag_out==1)
			fd_out = open(out_filename,O_WRONLY|O_CREAT|O_TRUNC, S_IRUSR|S_IWUSR );
		if(flag_out==2)
			fd_out = open(out_filename, O_WRONLY|O_CREAT|O_APPEND, S_IRUSR|S_IWUSR );
		if(flag_in==1)
			fd_in = open(in_filename, O_RDONLY, S_IRUSR|S_IWUSR );
		if(flag_in==2)
			fd_in = open(in_filename, O_RDONLY, S_IRUSR|S_IWUSR );
       		if(fd_out==-1) 
		{
			printf("Open out %s error \n", out_filename);
			return -1;
		}
		if(fd_in==-1) 
		{
			fprintf(stderr,"Open in %s error \n", in_filename);
			return -1;
		}

		if(flag_out>0)
		{
			if(dup2(fd_out, STDOUT_FILENO) == -1)
			{
				fprintf(stderr,"Redirect Standard Out Error !\n");
				exit(1);
			}
		}
		if(flag_in>0)
		{
			if (dup2(fd_in,STDIN_FILENO)==-1)
			{
				fprintf(stderr,"Redirect Standard Out Error !\n");
				exit(1);
			}
		}
			execv(command_path,parsed_command);		
			exit(1);
	}		
	else
	{                     //parent
		if(back==0)
			pid=waitpid(pid, &status, 0);
		else
			pid=waitpid(pid, &status, WNOHANG);
	}
	//free space
	free(out_filename);
	free(in_filename);
	free(command_path);
	for(i=0;i<k;i++)   
		free(parsed_command[i]);
	free(parsed_command);
	return 1;
}
Example #26
0
int main(void) {

    struct sockaddr_in serv_addr;
    int listen_sock = socket(AF_INET, SOCK_STREAM, 0);
    linked_fd * fdlist = new_linked_fd();
    
    memset(&serv_addr, 0, sizeof(serv_addr));
    serv_addr.sin_family=AF_INET;
    serv_addr.sin_addr.s_addr=htonl(INADDR_ANY);
    serv_addr.sin_port=htons(5058);
    
    int bind_result = bind(listen_sock,
                           (struct sockaddr*)&serv_addr, sizeof(serv_addr));
    if(bind_result == -1) {
        perror("Failed to bind.");
        return EXIT_FAILURE;
    }
    
    listen(listen_sock, 100);

    fd_set fdset;
    highest_fd = listen_sock;

    do {
        FD_ZERO(&fdset);
        // Add the listening socket to the fdset.
        FD_SET(listen_sock, &fdset);
        // Add stdin to the fileset.
        FD_SET(STDIN_FILENO, &fdset);

        // Add each fd in our fdlist to the set.
        linked_fd_node *current = linked_fd_head(fdlist);
        while(current) {
            int fd = fd_at(current);
            if(fd < 0) {
                return EXIT_FAILURE;
            }
            FD_SET(fd, &fdset);
            current = linked_fd_next(current);
        }

        // Select on every fd in the fdset.
        int x = select(highest_fd + 1, &fdset, NULL, NULL, NULL);
        if(x < 0) {
            return EXIT_FAILURE;
        }

        // If we got something on stdin, close all sockets
        // And exit.
        if(FD_ISSET(STDIN_FILENO, &fdset)) {
            printf("Closing all sockets.\n");
            close(listen_sock);
            close_all(fdlist);
        }

        // If the listen_sock is 'ready', accept a socket and
        // add it to our fd list.
        if(FD_ISSET(listen_sock, &fdset)) {
            accept_sock(listen_sock, fdlist);
        }

        //Handle other fds.
        current = linked_fd_head(fdlist);
        while(current) {
            int fd = fd_at(current);
            // This should never happen. Just precautionary.
            if(fd < 0) {
                return EXIT_FAILURE;
            }
            if(FD_ISSET(fd, &fdset)) {
                do_echo(fd, fdlist);
            }
            current = linked_fd_next(current);
        }
        
    } while(1);
}
Example #27
0
void runProcess( Proc *proc, pid_t pgid, int fg, int inputFile, int outputFile, int errorFile)
{
    // wrzucenie procesu do grupy procesow i danie przekazanie grupy terminalowu jezeli jest to stosowne
    // utowrzenie grupy lub dolaczenie do juz istniejacej
    pid_t pid = getpid();

    if( pgid == 0 )
        pgid = pid;

    setpgid(pid, pgid);

    // jesli w foreground to oddajemy terminal dla grupy procesow
    if(fg == 1)
    {
        tcsetpgrp( shellTerminal, pgid );
    }

    struct sigaction act;
    act.sa_handler = SIG_DFL;  /* set up signal handler */
    act.sa_flags = 0;

    // kiedy shell przejmuje kontrole, powinien ignorowac ponizsze sygnaly, zeby samemu sie przypadkowo nie killnac
    sigaction(SIGINT, &act, NULL);
    // powrot do ustawien domyslnych (przez nasz shell te sygnaly byly ignorowane)
    sigaction(SIGINT, &act, NULL);
    sigaction(SIGQUIT, &act, NULL);
    sigaction(SIGCHLD, &act, NULL);
    sigaction(SIGTSTP, &act, NULL);
    sigaction(SIGTTIN, &act, NULL);
    sigaction(SIGTTOU, &act, NULL);

    // ustawienie standardowego I/O dla nowego procesu
    // jesli wyjscia sa inne niz standardowe to zamieniamy je - przekierowanie wyjscia
    if(inputFile != STDIN_FILENO)
    {
        dup2(inputFile, STDIN_FILENO);
        close(inputFile);
    }

    if(outputFile != STDOUT_FILENO)
    {
        dup2(outputFile, STDOUT_FILENO);
        close(outputFile);
    }

    if(errorFile != STDERR_FILENO)
    {
        dup2(errorFile, STDERR_FILENO);
        close(errorFile);
    }   if(strcmp(proc->argv[0], "pwd") == 0)
    {
        do_pwd();
    }
    else if(strcmp(proc->argv[0], "cd") == 0)
    {
        do_cd(proc->argv[1]);
    }
    else if(strcmp(proc->argv[0], "ls") == 0)
    {
        do_ls(proc->argv[1]);
    }
    else if(strcmp(proc->argv[0], "mkdir") == 0)
    {
        do_mkdir(proc->argv[1]);
    }
    else if(strcmp(proc->argv[0], "rmdir") == 0)
    {
        do_rmdir(proc->argv[1]);
    }
    else if(strcmp(proc->argv[0], "touch") == 0)
    {
        do_touch(proc->argv[1]);
    }
    else if(strcmp(proc->argv[0], "rm") == 0)
    {
        do_rm(proc->argv[1]);
    }
    else if(strcmp(proc->argv[0], "cp") == 0)
    {
        do_cp(proc->argv[1], proc->argv[2]);
    }
    else if(strcmp(proc->argv[0], "echo") == 0)
    {
        do_echo(proc->argv[1]);
    }
	else 
		run(proc->argv[0], proc->argv);
    //execvp(proc->argv[0], proc->argv);
    // nie powinien wykonac exit'a przy poprawnym wykonaniu
    //exit(-1);
}