Skip to content

Instantly share code, notes, and snippets.

@ncopa
Created April 24, 2014 14:10
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ncopa/11255971 to your computer and use it in GitHub Desktop.
Save ncopa/11255971 to your computer and use it in GitHub Desktop.
int
statd_get_socket(void)
{
struct sockaddr_in sin;
struct servent *se;
const int loopcnt = 100;
int i, tmp_sockets[loopcnt];
if (sockfd >= 0)
return sockfd;
for (i = 0; i < loopcnt; ++i) {
if ((sockfd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0) {
xlog(L_ERROR, "%s: Can't create socket: %m", __func__);
break;
}
memset(&sin, 0, sizeof(sin));
sin.sin_family = AF_INET;
sin.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
if (bindresvport(sockfd, &sin) < 0) {
xlog(D_GENERAL, "%s: can't bind to reserved port",
__func__);
break;
}
se = getservbyport(sin.sin_port, "udp");
if (se == NULL)
break;
/* rather not use that port, try again */
printf("DEBUG: skipping port %i, (%i/%s)\n", sin.sin_port, se->s_port, se->s_name);
tmp_sockets[i] = sockfd;
}
while (--i >= 0)
close(tmp_sockets[i]);
if (sockfd < 0)
return -1;
FD_SET(sockfd, &SVC_FDSET);
printf("DEBUG: socket is %i\n", sockfd);
exit(1);
return sockfd;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment