/* This file is in the public domain. */ #include #include #include #include extern const char *__progname; #include "oq.h" #include "util.h" #include "listen.h" #include "structs.h" #include "pollloop.h" #include "netfd.h" typedef struct netfd NETFD; struct netfd { int fd; int ioid; LISTEN *l; char *text; OQ oq; } ; static void netfd_destroy(NETFD *nf) { close(nf->fd); remove_poll_id(nf->ioid); listen_deref(nf->l); free(nf->text); free(nf); } static int rtest_netfd(void *nfv) { return(!nfv); // XXX XXX XXX } static int wtest_netfd(void *nfv) { return(oq_nonempty(&((NETFD *)nfv)->oq)); } static void rd_netfd(void *nfv) { nfv=nfv; // XXX XXX XXX } static void wr_netfd(void *nfv) { NETFD *nf; int w; nf = nfv; w = oq_writev(&nf->oq,nf->fd); if (w < 0) { switch (errno) { case EINTR: case NONBLOCKING: return; break; } fprintf(stderr,"%s: %s: writev: %s\n",__progname,nf->text,strerror(errno)); netfd_destroy(nf); return; } oq_dropdata(&nf->oq,w); } void netfd_new(int fd, LISTEN *l, char *text) { NETFD *nf; listen_ref(l); nf = malloc(sizeof(NETFD)); nf->fd = fd; nf->ioid = add_poll_fd(fd,&rtest_netfd,&wtest_netfd,&rd_netfd,&wr_netfd,nf); nf->l = l; nf->text = text; oq_init(&nf->oq); // next two lines for debuggign help only oq_queue_point(&nf->oq,text,strlen(text)); oq_queue_point(&nf->oq,"\r\n",2); }