From 9e194d5bb088d41e7aa29042090b94d23a4ecb79 Mon Sep 17 00:00:00 2001 From: ianmdlvl Date: Sun, 29 Jun 2003 13:02:35 +0000 Subject: [PATCH] merge branch, some trivsoundd work. cvs up -j branchpoint-trivsoundd -j branch-close-trivsoundd --- cprogs/Makefile | 2 +- cprogs/readbuffer.c | 1 + cprogs/rwbuffer.c | 4 +- cprogs/rwbuffer.h | 8 +++- cprogs/trivsoundd.c | 99 ++++++++++++++++++++++++++++++++++++++++---- cprogs/wrbufcore.c | 22 +++++++--- cprogs/writebuffer.c | 2 + debian/changelog | 6 +++ 8 files changed, 128 insertions(+), 16 deletions(-) diff --git a/cprogs/Makefile b/cprogs/Makefile index 2066d60..fb2d9fb 100644 --- a/cprogs/Makefile +++ b/cprogs/Makefile @@ -56,7 +56,7 @@ all: $(TARGETS) readbuffer: readbuffer.o rwbuffer.o writebuffer: writebuffer.o wrbufcore.o rwbuffer.o trivsoundd: trivsoundd.o wrbufcore.o rwbuffer.o -readbuffer.o writebuffer.o rwbuffer.o wrbufcoore.o: rwbuffer.h +readbuffer.o writebuffer.o rwbuffer.o wrbufcore.o trivsoundd.o: rwbuffer.h install: all $(INSTALL_DIRECTORY) $(bindir) $(sbindir) diff --git a/cprogs/readbuffer.c b/cprogs/readbuffer.c index 2be121c..6f2bfa1 100644 --- a/cprogs/readbuffer.c +++ b/cprogs/readbuffer.c @@ -39,6 +39,7 @@ int main(int argc, const char *const *argv) { startup(argv); waitempty= (buffersize*1)/4; reading=1; + maxselfd=2; while (!seeneof || used) { diff --git a/cprogs/rwbuffer.c b/cprogs/rwbuffer.c index cb88027..f2ec48d 100644 --- a/cprogs/rwbuffer.c +++ b/cprogs/rwbuffer.c @@ -38,7 +38,7 @@ #endif unsigned char *buf, *wp, *rp; -int used, seeneof; +int used, seeneof, maxselfd; size_t buffersize; fd_set readfds; fd_set writefds; @@ -113,7 +113,7 @@ void callselect(void) { int r; for (;;) { - r= select(2,&readfds,&writefds,0,0); + r= select(maxselfd,&readfds,&writefds,0,0); if (r != -1) return; if (errno != EINTR) { perror("select"); exit(4); diff --git a/cprogs/rwbuffer.h b/cprogs/rwbuffer.h index fe308c1..1cab795 100644 --- a/cprogs/rwbuffer.h +++ b/cprogs/rwbuffer.h @@ -42,6 +42,10 @@ #include #include #include +#include +#include +#include +#include #include "dlist.h" @@ -56,7 +60,7 @@ void nonblock(int fd, int yesno); extern const char *progname; /* must be defined by main .c file */ extern unsigned char *buf, *wp, *rp; -extern int used, seeneof; +extern int used, seeneof, maxselfd; extern size_t buffersize; extern fd_set readfds; extern fd_set writefds; @@ -65,6 +69,8 @@ extern fd_set writefds; void wrbufcore_startup(void); void wrbufcore_prepselect(int rdfd, int wrfd); void wrbufcore_afterselect(int rdfd, int wrfd); +void fdsetset(int fd, fd_set *set); +void wrbuf_report(const char *m); #endif /*RWBUFFER_H*/ diff --git a/cprogs/trivsoundd.c b/cprogs/trivsoundd.c index 5eda4f7..a7bed2c 100644 --- a/cprogs/trivsoundd.c +++ b/cprogs/trivsoundd.c @@ -40,9 +40,88 @@ struct inqnode { }; static struct { struct inqnode *head, *tail; } inq; -static int sdev; +static int master, sdev; static time_t now; +static void usageerr(const char *m) { + fprintf(stderr,"bad usage: %s\n",m); + exit(12); +} + +static void bindmaster(const char *bindname) { + union { + struct sockaddr sa; + struct sockaddr_in sin; + struct sockaddr_un sun; + } su; + socklen_t sulen; + const char *colon; + char *copy, *ep; + int r; + unsigned long portul; + struct hostent *he; + struct servent *se; + + memset(&su,0,sizeof(su)); + + if (bindname[0]=='/' || bindname[0]=='.') { + + if (strlen(bindname) >= sizeof(su.sun.sun_path)) + usageerr("AF_UNIX bind path too long"); + sulen= sizeof(su.sun); + su.sun.sun_family= AF_UNIX; + strcpy(su.sun.sun_path, bindname); + + } else if (bindname[0] != ':' && (colon= strrchr(bindname,':'))) { + + sulen= sizeof(su.sin); + su.sin.sin_family= AF_INET; + + copy= xmalloc(colon - bindname + 1); + memcpy(copy,bindname, colon - bindname + 1); + copy[colon - bindname]= 0; + portul= strtoul(colon+1,&ep,0); + + if (!*ep) { + if (!portul || portul>=65536) usageerr("invalid port number"); + su.sin.sin_port= htons(portul); + } else { + se= getservbyname(colon+1, "tcp"); + if (!se) { fprintf(stderr,"unknown service `%s'\n",colon+1); exit(4); } + su.sin.sin_port= htons(se->s_port); + } + + if (!strcmp(copy,"any")) { + su.sin.sin_addr.s_addr= INADDR_ANY; + } else if (!inet_aton(copy,&su.sin.sin_addr)) { + he= gethostbyname(copy); + if (!he) { herror(copy); exit(4); } + if (he->h_addrtype != AF_INET || + he->h_length != sizeof(su.sin.sin_addr) || + !he->h_addr_list[0] || + he->h_addr_list[1]) { + fprintf(stderr,"hostname lookup `%s' did not yield" + " exactly one IPv4 address\n",copy); + exit(4); + } + memcpy(&su.sin.sin_addr, he->h_addr_list[0], sizeof(su.sin.sin_addr)); + } + + } else { + usageerr("unknown bind name"); + exit(12); + } + + master= socket(su.sa.sa_family,SOCK_STREAM,0); + if (master<0) { perror("socket"); exit(8); } + + r= bind(master, &su.sa, sulen); + if (r) { perror("bind"); exit(8); } + + r= listen(master, 5); + if (r) { perror("listen"); exit(8); } +} + static void opensounddevice(void) { int r; char cbuf[200]; @@ -55,10 +134,14 @@ static void opensounddevice(void) { r= system(cbuf); if (r) { fprintf(stderr,"sox gave %d\n",r); exit(5); } } +void wrbuf_report(const char *m) { + printf("writing %s\n", m); +} + static void selectcopy(void) { int slave= inq.head ? inq.head->fd : -1; wrbufcore_prepselect(slave, sdev); - FD_SET(0,&readfds); + fdsetset(master,&readfds); callselect(); wrbufcore_afterselect(slave, sdev); } @@ -69,7 +152,7 @@ static void expireoldconns(void) { for (searchold= inq.head ? inq.head->next : 0; searchold; searchold= nextsearchold) { - nextsearchold= searchold; + nextsearchold= searchold->next; if (searchold->accepted < now-maxstartdelay) { printf("expired %p\n",searchold); LIST_UNLINK(inq,searchold); @@ -84,9 +167,9 @@ static void acceptnewconns(void) { int slave; struct inqnode *new; - if (!FD_ISSET(0,&readfds)) return; + if (!FD_ISSET(master,&readfds)) return; - slave= accept(0,0,0); + slave= accept(master,0,0); if (slave < 0) { if (!(errno == EINTR || errno == EAGAIN || @@ -125,13 +208,15 @@ static void switchinput(void) { int main(int argc, const char *const *argv) { assert(argv[0]); - if (argv[1]) { fputs("no arguments allowed\n",stderr); exit(12); } + if (!argv[1] || argv[2] || argv[1][0]=='-') + usageerr("no options allowed, must have one argument (bindname)"); buffersize= 44100*4* 5/*seconds*/; opensounddevice(); + bindmaster(argv[1]); nonblock(sdev,1); - nonblock(0,1); + nonblock(master,1); startupcore(); wrbufcore_startup(); diff --git a/cprogs/wrbufcore.c b/cprogs/wrbufcore.c index 417cb01..7ed609a 100644 --- a/cprogs/wrbufcore.c +++ b/cprogs/wrbufcore.c @@ -30,19 +30,26 @@ #include "rwbuffer.h" static size_t waitfill; -static int writing; + +int writing; void wrbufcore_startup(void) { waitfill= (buffersize*3)/4; writing=0; + maxselfd=0; +} + +void fdsetset(int fd, fd_set *set) { + FD_SET(fd,set); + if (fd >= maxselfd) maxselfd= fd+1; } void wrbufcore_prepselect(int rdfd, int wrfd) { FD_ZERO(&readfds); - if (rdfd>=0 && !seeneof && used+1=0 && !seeneof && used+1=0 && FD_ISSET(rdfd,&readfds)) && !used) { + wrbuf_report("stopping"); writing= 0; FD_CLR(wrfd,&writefds); } @@ -59,6 +67,7 @@ void wrbufcore_afterselect(int rdfd, int wrfd) { r= read(rdfd,rp,min(buffersize-1-used,buf+buffersize-rp)); if (!r) { seeneof=1; writing=1; + wrbuf_report("seeneof"); } else if (r<0) { if (!(errno == EAGAIN || errno == EINTR)) { perror("read"); exit(1); } } else { @@ -66,7 +75,10 @@ void wrbufcore_afterselect(int rdfd, int wrfd) { rp+= r; if (rp == buf+buffersize) rp=buf; } - if (used > waitfill) writing=1; + if (used > waitfill) { + if (!writing) wrbuf_report("starting"); + writing=1; + } } if (FD_ISSET(wrfd,&writefds) && used) { diff --git a/cprogs/writebuffer.c b/cprogs/writebuffer.c index f37edd1..c422c92 100644 --- a/cprogs/writebuffer.c +++ b/cprogs/writebuffer.c @@ -31,6 +31,8 @@ const char *progname= "writebuffer"; +void wrbuf_report(const char *m) { } + int main(int argc, const char *const *argv) { startup(argv); wrbufcore_startup(); diff --git a/debian/changelog b/debian/changelog index 5af106b..7b6b772 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,9 @@ +chiark-utils (3.0.3.99.3) unstable; urgency=low + + * initial work on trivsoundd + + -- + chiark-utils (3.0.3.99.2) unstable; urgency=low * Properly close GZOR and GZOW in increm. -- 2.30.2