/*
* Set up a socket
*
* Alan Cox 1990
*
* This software is placed in the public domain
*/
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <errno.h>
#include <fcntl.h>
#include <netinet/in.h>
#include <netdb.h>
#ifdef AMIGA
#include <pragmas/socket_pragmas.h>
#endif
extern int errno;
static struct sockaddr_in myaddress;
static int master_socket;
#ifdef AMIGA
long SocketBase;
int exit_cleanup()
{
if(SocketBase!=NULL)
{
CloseLibrary(SocketBase);
SocketBase=NULL;
}
}
#endif
/*
* Create the server socket
*/
int Make_Socket(port)
int port;
{
char buf[64];
struct hostent *host;
int v;
int tmp=1;
#ifdef AMIGA
if(SocketBase==NULL)
{
SocketBase=OpenLibrary("bsdsocket.library",0);
if(SocketBase==NULL)
{
fprintf(stderr,"Fatal error: AmiTCP is not running.\n");
exit(1);
}
}
#endif
#ifdef PARANOIA
gethostname(buf,63);
host=gethostbyname(buf);
if(host==NULL)
{
fprintf(stderr,"INET: Error can't find '%s'\n",buf);
exit(1);
}
myaddress.sin_family=host->h_addrtype;
#endif
myaddress.sin_port=htons(port);
v=socket(AF_INET,SOCK_STREAM,0);
if(v==-1)
{
fprintf(stderr,"(%d)",errno);
perror("INET: socket, ");
exit(1);
}
setsockopt(v,SOL_SOCKET,SO_REUSEADDR,&tmp,sizeof(tmp));
while(bind(v,(struct sockaddr *)&myaddress,sizeof(myaddress))<0)
{
if(errno != EADDRINUSE)
{
close(v);
fprintf(stderr,"(%d)",errno);
perror("INET: bind, ");
exit(1);
}
printf("Address in use: Retrying...\n");
sleep(5);
}
if(listen(v,5)==-1)
{
fprintf(stderr,"(%d)",errno);
perror("INET: listen,");
exit(1);
}
master_socket=v;
fcntl(v,F_SETFL,O_NDELAY);
return(v);
}