I'm working on 1.5 jdk certification on 5.4 and 6.0. One of the jck
tests hangs on 5.4 but works ok on 6.0. I've reduced the problem
down to the following C program that hangs on 5.4 but works fine
(finishes) on 6.0 and 4.11.

I could use some assistance with finding a work-around to the
problem or an explanation as to why the program hangs on 5.4.

Thank you,
-Kurt

#include <stdio.h>
#include <unistd.h>
#include <netdb.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/param.h>
#include <netinet/in.h>

void
buildAddr4(struct sockaddr_in *addr4, int address, short port) {
  memset((char *) addr4, 0, sizeof(struct sockaddr_in));
  addr4->sin_port = htons(port);
  addr4->sin_addr.s_addr = (uint32_t) htonl(address);
  addr4->sin_family = AF_INET;
}

void
setAddress(struct sockaddr_in *addr4, int address) {
  addr4->sin_addr.s_addr = (uint32_t) htonl(address);
}

int
getHostAddress() {
  char hostname[MAXHOSTNAMELEN];
  struct addrinfo  hints, *res;
  int address = 0;

  if (gethostname(hostname, MAXHOSTNAMELEN) != 0)
    exit(1);

  memset(&hints, 0, sizeof(hints));
  hints.ai_flags = AI_CANONNAME;
  hints.ai_family = AF_INET;

  if(getaddrinfo(hostname, "domain", &hints, &res) != 0)
    exit(1);

  while( res != NULL ) {
    if (res->ai_family == AF_INET) {
      address = ntohl(((struct sockaddr_in*)(res->ai_addr))->sin_addr.s_addr);
      break;
    }
    res = res->ai_next;
  }

  return address;
}

int
main() {
  int sock1, sock2;
  int optval = 1;
  struct sockaddr addr;
  struct sockaddr sock1Addr, sock2Addr;
  int sock1AddrLen, sock2AddrLen;
  short port1, port2;
  char sendBuf, readBuf;
  int hostAddress;

  if ((hostAddress = getHostAddress()) == 0)
    exit(1);

  buildAddr4((struct sockaddr_in *)&addr, 0, 0);

  if ((sock1 = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
    exit(1);
  if (setsockopt(sock1, SOL_SOCKET, SO_BROADCAST, (char*) &optval, 
sizeof(optval)) != 0)
    exit(1);
  if (bind(sock1, (struct sockaddr *)&addr, sizeof(struct sockaddr_in)) != 0)
    exit(1);
  if (getsockname(sock1, &sock1Addr, &sock1AddrLen) != 0)
    exit(1);
  setAddress((struct sockaddr_in *)&sock1Addr, hostAddress);

  if ((sock2 = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
    exit(1);
  if (bind(sock2, (struct sockaddr *)&addr, sizeof(struct sockaddr_in)) != 0)
    exit(1);
  if (getsockname(sock2, &sock2Addr, &sock2AddrLen) != 0)
    exit(1);
  setAddress((struct sockaddr_in *)&sock2Addr, hostAddress);
  if (connect(sock2, &sock1Addr, sock1AddrLen) != 0)
    exit(1);

  sendBuf = 22;
  if (sendto(sock1, &sendBuf, 1, 0, &sock2Addr, sock2AddrLen) != 1)
    exit(1);

  if (read(sock2, &readBuf, 1) != 1)
    exit(1);

  printf("no hang\n");
}
_______________________________________________
[email protected] mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-hackers
To unsubscribe, send any mail to "[EMAIL PROTECTED]"

Reply via email to