int b_echo(char **cmd) { int newline; int opt; int id; int ret; ret = 0; id = 1; newline = 1; opt = OPT_DISABLE; if (cmd != NULL && cmd[0] != NULL) { if (check_option(cmd, &opt, &newline, &id) == EXIT_FAILURE) return (EXIT_SUCCESS); while (cmd[id]) { (opt) ? (my_putstr(cmd[id])) : (ret = print_echo(cmd[id])); if (cmd[id + 1] != NULL) my_putchar(' '); id++; } } if (newline && ret == EXIT_SUCCESS) my_putchar('\n'); return (EXIT_SUCCESS); }
static int ping_recv (PING * p) { int dupflag, n; int hops = -1; struct msghdr msg; struct iovec iov; struct icmp6_hdr *icmp6; struct cmsghdr *cmsg; char cmsg_data[1024]; iov.iov_base = p->ping_buffer; iov.iov_len = _PING_BUFLEN (p, USE_IPV6); msg.msg_name = &p->ping_from.ping_sockaddr6; msg.msg_namelen = sizeof (p->ping_from.ping_sockaddr6); msg.msg_iov = &iov; msg.msg_iovlen = 1; msg.msg_control = cmsg_data; msg.msg_controllen = sizeof (cmsg_data); msg.msg_flags = 0; n = recvmsg (p->ping_fd, &msg, 0); if (n < 0) return -1; for (cmsg = CMSG_FIRSTHDR (&msg); cmsg; cmsg = CMSG_NXTHDR (&msg, cmsg)) { if (cmsg->cmsg_level == IPPROTO_IPV6 && cmsg->cmsg_type == IPV6_HOPLIMIT) { hops = *(int *) CMSG_DATA (cmsg); break; } } icmp6 = (struct icmp6_hdr *) p->ping_buffer; if (icmp6->icmp6_type == ICMP6_ECHO_REPLY) { /* We got an echo reply. */ if (ntohs (icmp6->icmp6_id) != p->ping_ident) return -1; /* It's not a response to us. */ if (_PING_TST (p, ntohs (icmp6->icmp6_seq))) { /* We already got the reply for this echo request. */ p->ping_num_rept++; dupflag = 1; } else { _PING_SET (p, ntohs (icmp6->icmp6_seq)); p->ping_num_recv++; dupflag = 0; } print_echo (dupflag, hops, p->ping_closure, &p->ping_dest.ping_sockaddr6, &p->ping_from.ping_sockaddr6, icmp6, n); } else { /* We got an error reply. */ if (!my_echo_reply (p, icmp6)) return -1; /* It's not for us. */ print_icmp_error (&p->ping_from.ping_sockaddr6, icmp6, n); } return 0; }