/* simply a wrapper around bind() */ int mybind(mysocket_t sd, struct sockaddr *addr, int addrlen) { mysock_context_t *ctx = _mysock_get_context(sd); assert(addr); MYSOCK_CHECK(ctx != NULL, EBADF); MYSOCK_CHECK(addr->sa_family == AF_INET, EADDRNOTAVAIL); /* mybind() must precede mylisten() */ assert(!ctx->listening); ctx->bound = TRUE; ctx->network_state.local_addr = *addr; return _network_bind(&ctx->network_state, addr, addrlen); }
/* obtain ephemeral port for the given mysocket */ int _mysock_bind_ephemeral(mysock_context_t *ctx) { struct sockaddr_in sin; int rc; assert(ctx && !ctx->bound); memset(&sin, 0, sizeof(sin)); sin.sin_family = AF_INET; sin.sin_port = 0; sin.sin_addr.s_addr = htonl(INADDR_ANY); if ((rc = _network_bind(&ctx->network_state, (struct sockaddr *) &sin, sizeof(sin))) < 0) { perror("network_bind"); assert(0); return rc; } ctx->bound = TRUE; return 0; }