Open System Services Programmer's Guide
fprintf(stderr, "socket() call failed [errno %d]\n", errno);
exit(1);
}
/* Get server port from the command line or use default 12345 */
if (argc > 1)
addr.sin_port = (short)atoi(argv[1]); /* use command line arg */
else
addr.sin_port = 12345; /* use default */
addr.sin_family = AF_INET; /* internet address family */
addr.sin_addr.s_addr = gethostid(); /* assume server on our host */
/* bind socket to address */
if (bind(fd, (const struct sockaddr *)&addr, sizeof(addr)) < 0)
{
fprintf(stderr, "bind() call failed [errno %d]\n", errno);
exit(1);
}
/* make the socket a listening socket */
if (listen(fd, 5) < 0)
{
fprintf(stderr, "listen() call failed [errno %d]\n", errno);
exit(1);
}
/* fd usage
* 0 stdin - not used by dlaunch2, set up for dserver
* 1 stdout - not used by dlaunch2, set up for dserver
* 2 stderr - used by dlaunch2 for messages,
* inherited by dserver
* 3 listenfd - used by dlaunch2 for connections,
* not inherited by dserver
*/
close(STDIN_FILENO);
close(STDOUT_FILENO);
listenfd = fd;
fcntl(listenfd, F_SETFD, FD_CLOEXEC); /* don't propagate fd to children */
FD_ZERO(&fdset);
/* loop until error or timeout */
while (1)
{
/* initialize timeout and bitmask for select() call */
timeval.tv_sec = IDLE_PERIOD;
timeval.tv_usec = 0;
FD_SET(listenfd, &fdset);
readycount = select(listenfd+1, &fdset, NULL, NULL, &timeval);
/* if timeout then exit */
if (readycount == 0)
{
fprintf(stderr, "dlaunch2 stopping - timeout\n");
exit(0);
}
/* accept new connection */
if ((fd = accept(listenfd,(struct sockaddr *)NULL,
(size_t *)NULL)) < 0)
{
fprintf(stderr, "accept() call failed [errno %d]\n", errno);
exit(1);
}
/* setup stdin and stdout */
dup2(fd,STDIN_FILENO); /* fd is already STDIN_FILENO */
dup2(fd,STDOUT_FILENO); /* setup stdout */
/* launch a dserver process to handle the connection */
/* note - spawn is an expensive operation and is more */
Performance Considerations 141