int ping_xmit (PING *p) { int i, buflen; if (_ping_setbuf (p)) return -1; buflen = _ping_packetsize (p); /* Mark sequence number as sent */ _PING_CLR (p, p->ping_num_xmit % p->ping_cktab_size); /* Encode ICMP header */ switch (p->ping_type) { case ICMP_ECHO: icmp_echo_encode (p->ping_buffer, buflen, p->ping_ident, p->ping_num_xmit); break; case ICMP_TIMESTAMP: icmp_timestamp_encode (p->ping_buffer, buflen, p->ping_ident, p->ping_num_xmit); break; case ICMP_ADDRESS: icmp_address_encode (p->ping_buffer, buflen, p->ping_ident, p->ping_num_xmit); break; default: icmp_generic_encode (p->ping_buffer, buflen, p->ping_type, p->ping_ident, p->ping_num_xmit); break; } i = sendto (p->ping_fd, (char *)p->ping_buffer, buflen, 0, (struct sockaddr*) &p->ping_dest, sizeof (struct sockaddr_in)); if (i < 0) { perror ("ping: sendto"); } else { p->ping_num_xmit++; if (i != buflen) printf ("ping: wrote %s %d chars, ret=%d\n", p->ping_hostname, buflen, i); } return 0; }
int trace_write (trace_t * t) { int len; assert (t); switch (t->type) { case TRACE_UDP: { char data[] = "SUPERMAN"; len = sendto (t->udpfd, (char *) data, sizeof (data), 0, (struct sockaddr *) &t->to, sizeof (t->to)); if (len < 0) { return 2; } if (gettimeofday (&t->tsent, NULL) < 0) return -1; } break; case TRACE_ICMP: { icmphdr_t hdr; /* FIXME: We could use the pid as the icmp seqno/ident. */ if (icmp_echo_encode ((u_char *) &hdr, sizeof (hdr), pid, pid)) return -1; len = sendto (t->icmpfd, (char *) &hdr, sizeof (hdr), 0, (struct sockaddr *) &t->to, sizeof (t->to)); if (len < 0) { return 2; } if (gettimeofday (&t->tsent, NULL) < 0) return -1; } break; /* FIXME: type according to RFC 1393 */ default: break; } return 0; }