Exemple #1
0
int raise(int sig)
{
	int rc;

	if ( os_signal( sig, &rc ) == NOTIMPLEMENTED )
			os_freakout();

	return rc;
}
int 
main(int argc, char *argv[])
{
	int listenfd;
	int connfd;
	int on = 1;
	struct sockaddr_in serv_addr, cli_addr;
	socklen_t cli_len;
	pid_t childpid;

	if ((listenfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
		fprintf(stderr, "socket error: %s\n", strerror(errno));
		exit(1);
	}

	os_setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on));

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

	if (bind(listenfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0) {
		fprintf(stderr, "bind error: %s\n", strerror(errno));
		exit(1);
	}
	
	if (listen(listenfd,  LISTEN_QUEUE) < 0) {
		fprintf(stderr, "listern error: %s\n", strerror(errno));
		exit(1);
	}

	os_signal(SIGCHLD, sig_chld);

	for (; ;) {
		cli_len = sizeof(cli_addr);
	    if ((connfd = accept(listenfd, (struct sockaddr *)&cli_addr, &cli_len)) < 0) {
			if (errno == EINTR)
				continue;
			else
				os_err_sys("accept error");
		}

			
		if ((childpid = fork()) == 0) {
			close(listenfd);
			echo_string(connfd);
			exit(1);
		}
		close(connfd);
	}
	return 0;
}
Exemple #3
0
// ------------------------------------------------
// Function:        icmp_parse()
// ------------------------------------------------
// Input:           Message buffer
// Output:          -
// ------------------------------------------------
// Description:     Parse a ICMP message
// ------------------------------------------------
void icmp_parse(PPBUF pbuf)
{
    // ---------------------
    // checksum verification
    // ---------------------
    icmp_checksum(pbuf->data, pbuf->size);
    if(chk_H != 0xff) return;
    if(chk_L != 0xff) return;

    // -------------------------------
    // checks recognized message types
    // -------------------------------
    switch(ICMP(pbuf->data)->type) {
        case PING_REQUEST:
            // ---------
            // answer it
            // ---------
            retain_buffer(pbuf);
            ip_answer(pbuf);
            ICMP(pbuf->data)->type = PING_REPLY;

            // ---------------
            // update checksum
            // ---------------
            ICMP(pbuf->data)->checksum = 0;
            icmp_checksum(pbuf->data, pbuf->size);
            ICMP(pbuf->data)->checksum = HTONS(~WORDOF(chk_H, chk_L));

            // ----------------------------
            // sends answer to IP interface
            // ----------------------------
            ip_send(pbuf);
            release_buffer(pbuf);
            break;

        case PING_REPLY:
            // --------------------------------------
            // answer received, signal waiting thread
            // --------------------------------------
            os_signal(SIG_ICMP);
            break;
    }
}