/*
Copyright 2009 Nathan Phillip Brink
This file is a part of DistRen.
DistRen is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
DistRen is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with DistRen. If not, see .
*/
#include "listen.h"
#include
#include
#include
#include
#include
#include
#include
#include
/* local */
struct distrend_clientset
{
LIST *clients;
/*
for select()
*/
fd_set readfds;
fd_set writefds;
int nfds;
};
int distrend_listen(struct distrend_config *config, struct distrend_clientset **clients)
{
int tmp;
struct sockaddr_in6 sockaddr =
{
.sin6_family = AF_INET6,
.sin6_port = 0,
.sin6_flowinfo = 0,
.sin6_addr = IN6ADDR_ANY_INIT,
.sin6_scope_id = 0
};
*clients = malloc(sizeof(struct distrend_clientset));
(*clients)->clients = list_init();
sockaddr.sin6_port = htonl(4050);
config->listens->sock = socket(AF_INET6, SOCK_STREAM, 0);
tmp = bind(config->listens->sock, (struct sockaddr *)&sockaddr, sizeof(sockaddr));
if(tmp == -1)
{
perror("bind");
free(*clients);
return 1;
}
tmp = listen(config->listens->sock, 1);
FD_ZERO(&(*clients)->readfds);
FD_ZERO(&(*clients)->writefds);
return 0;
}
int distrend_accept_find_client(fd_set *fdset, struct distrend_client *client)
{
if(FD_ISSET(client->sock, fdset))
return FALSE;
return TRUE;
}
int distrend_accept(struct distrend_config *config, struct distrend_clientset *clients, struct distrend_action **action)
{
int tmp;
fd_set readfds;
fd_set writefds;
struct distrend_client *cli;
memcpy(&readfds, &clients->readfds, sizeof(fd_set));
memcpy(&writefds, &clients->writefds, sizeof(fd_set));
tmp = select(clients->nfds, &readfds, &writefds, NULL, (struct timeval *)NULL);
if(tmp == -1)
{
perror("select");
return 1;
}
/**
check if our traversal function found a bit that was set
*/
if(list_traverse(clients->clients, &readfds, &distrend_accept_find_client, LIST_FRNT | LIST_ALTR) == LIST_OK)
{
cli = (struct distrend_client *)list_curr(clients->clients);
fprintf(stderr, "%s:%d: My traversal says that sock %d has data waiting, which is %s\n",
__FILE__, __LINE__,
cli->sock, FD_ISSET(cli->sock, &readfds) ? "true" : "false");
fprintf(stderr, "stub\n");
return 1;
}
return 0;
}
int distrend_unlisten(struct distrend_listen *listens, struct distrend_clientset *clients)
{
fprintf(stderr, "%s:%d: I am a stub that needn't be implemented 'til later\n", __FILE__, __LINE__);
return 1;
}
/**
This is probably just NOT a placeholder for remotio
*/
void remotio_send_to_client()
{
fprintf(stderr, "%s:%d: I am futile! And I'm happy because of it :-D\n", __FILE__, __LINE__);
}