factor/native/socket.c

68 lines
1.3 KiB
C
Raw Normal View History

#include "factor.h"
int make_server_socket(CHAR port)
{
int sock;
struct sockaddr_in name;
2004-07-24 17:37:42 -04:00
int reuseaddr = 1;
/* Create the socket */
sock = socket(PF_INET, SOCK_STREAM, 0);
if(sock < 0)
2004-08-15 21:50:44 -04:00
io_error(NULL,__FUNCTION__);
2004-07-24 17:37:42 -04:00
/* Reuse port number */
if(setsockopt(sock,SOL_SOCKET,SO_REUSEADDR,&reuseaddr,sizeof(int)) < 0)
2004-08-15 21:50:44 -04:00
io_error(NULL,__FUNCTION__);
/* Give the socket a name */
name.sin_family = AF_INET;
name.sin_port = htons(port);
name.sin_addr.s_addr = htonl(INADDR_ANY);
if(bind(sock,(struct sockaddr *)&name, sizeof(name)) < 0)
2004-07-24 17:37:42 -04:00
{
close(sock);
2004-08-15 21:50:44 -04:00
io_error(NULL,__FUNCTION__);
2004-07-24 17:37:42 -04:00
}
/* Start listening for connections */
if(listen(sock,1) < 0)
2004-07-24 17:37:42 -04:00
{
close(sock);
2004-08-15 21:50:44 -04:00
io_error(NULL,__FUNCTION__);
2004-07-24 17:37:42 -04:00
}
return sock;
}
void primitive_server_socket(void)
{
CHAR p = (CHAR)to_fixnum(dpop());
2004-08-15 21:50:44 -04:00
dpush(tag_object(port(make_server_socket(p))));
}
int accept_connection(int sock)
{
struct sockaddr_in clientname;
size_t size = sizeof(clientname);
int new = accept(sock,(struct sockaddr *)&clientname,&size);
if(new < 0)
2004-08-15 21:50:44 -04:00
io_error(NULL,__FUNCTION__);
2004-08-13 01:38:15 -04:00
printf("Connection from host %s, port %hd.\n",
inet_ntoa(clientname.sin_addr),
ntohs(clientname.sin_port));
return new;
}
void primitive_accept_fd(void)
{
PORT* p = untag_port(dpop());
2004-08-15 21:50:44 -04:00
PORT* new = port(accept_connection(p->fd));
dpush(tag_object(new));
}