Charles.Forsyth20060303-partialeea662d19 years agoHistory
164 lines · 2.6 KB · C
RawDownload
#define	__EXTENSIONS__#define	_BSD_COMPAT#include <lib9.h>#include 	<sys/types.h>#include	<sys/time.h>#include	<sys/socket.h>#include	<netinet/in.h> #include "styxserver.h"#include "styxaux.h" typedef struct Fdset Fdset; struct Fdset{	fd_set infds, outfds, excfds, r_infds, r_outfds, r_excfds;}; intstyxinitsocket(void){	return 0;} voidstyxendsocket(void){} voidstyxclosesocket(int fd){	close(fd);} intstyxannounce(Styxserver *server, char *port){	struct sockaddr_in sin;	int s, one; 	USED(server);	s = socket(AF_INET, SOCK_STREAM, 0);	if(s < 0)		return s;	one = 1;	if(setsockopt(s, SOL_SOCKET, SO_REUSEADDR, (char*)&one, sizeof(one)) < 0)		fprint(2, "setsockopt failed\n");	memset(&sin, 0, sizeof(sin));	sin.sin_family = AF_INET;	sin.sin_addr.s_addr = 0;	sin.sin_port = htons(atoi(port));	if(bind(s, (struct sockaddr *)&sin, sizeof(sin)) < 0){		close(s);		return -1;	}	if(listen(s, 20) < 0){		close(s);		return -1;	}	return s;} intstyxaccept(Styxserver *server){	struct sockaddr_in sin;	int len, s; 	len = sizeof(sin);	memset(&sin, 0, sizeof(sin));	sin.sin_family = AF_INET;	s = accept(server->connfd, (struct sockaddr *)&sin, &len);	if(s < 0){		if(errno != EINTR)			fprint(2, "error in accept: %s\n", strerror(errno));	}	return s;} voidstyxinitwait(Styxserver *server){	Fdset *fs; 	server->priv = fs = malloc(sizeof(Fdset));	FD_ZERO(&fs->infds);	FD_ZERO(&fs->outfds);	FD_ZERO(&fs->excfds);	FD_SET(server->connfd, &fs->infds);} intstyxnewcall(Styxserver *server){	Fdset *fs; 	fs = server->priv;	return FD_ISSET(server->connfd, &fs->r_infds);} voidstyxnewclient(Styxserver *server, int s){	Fdset *fs; 	fs = server->priv;	FD_SET(s, &fs->infds);} voidstyxfreeclient(Styxserver *server, int s){	Fdset *fs; 	fs = server->priv;	FD_CLR(s, &fs->infds);} intstyxnewmsg(Styxserver *server, int s){	Fdset *fs; 	fs = server->priv;	return FD_ISSET(s, &fs->r_infds) || FD_ISSET(s, &fs->r_excfds);} char*styxwaitmsg(Styxserver *server){	struct timeval seltime;	int nfds;	Fdset *fs; 	fs = server->priv;	fs->r_infds = fs->infds;	fs->r_outfds = fs->outfds;	fs->r_excfds = fs->excfds;	seltime.tv_sec = 10;	seltime.tv_usec = 0L;	nfds = select(sizeof(fd_set)*8, &fs->r_infds, &fs->r_outfds, &fs->r_excfds, &seltime);	if(nfds < 0 && errno != EINTR)		return"error in select";	return nil;} intstyxrecv(Styxserver *server, int fd, char *buf, int n, int m){	return recv(fd, buf, n, m);} intstyxsend(Styxserver *server, int fd, char *buf, int n, int m){	return send(fd, buf, n, m);} voidstyxexit(int n){	exit(n);}