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