Exemplo n.º 1
0
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;
}
Exemplo n.º 2
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;
}