chiark / gitweb /
merge branch, some trivsoundd work. cvs up -j branchpoint-trivsoundd -j branch-close...
authorianmdlvl <ianmdlvl>
Sun, 29 Jun 2003 13:02:35 +0000 (13:02 +0000)
committerianmdlvl <ianmdlvl>
Sun, 29 Jun 2003 13:02:35 +0000 (13:02 +0000)
cprogs/Makefile
cprogs/readbuffer.c
cprogs/rwbuffer.c
cprogs/rwbuffer.h
cprogs/trivsoundd.c
cprogs/wrbufcore.c
cprogs/writebuffer.c
debian/changelog

index 2066d600d2eba9afbd61e6ad5bfaaa42611e5087..fb2d9fb42c326b1ea7e2e4380c4fdf9b1645f856 100644 (file)
@@ -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)
index 2be121c0228e02d1acb9978bbfbea10baa6125b9..6f2bfa138615fac07dfb4d9e2e39f66ce9b72955 100644 (file)
@@ -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) {
     
index cb88027c9361d5168ab2ea85a2437cadedc2cff6..f2ec48da0e5a00086b8884e8e1afc0de36f8d6d7 100644 (file)
@@ -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);
index fe308c18a6fa3f3de5a9a01364900839c261ee3c..1cab7959e937db5e9e069d4517043ba89f37bc8e 100644 (file)
 #include <time.h>
 #include <sys/mman.h>
 #include <sys/socket.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+#include <sys/un.h>
+#include <netdb.h>
 
 #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*/
index 5eda4f7aebd098427c30a439fa8348d60ee9b23a..a7bed2c7021bea537fb01b91188dc8bfc2e2fbf9 100644 (file)
@@ -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();
index 417cb01ac0cef44f7cc03c80f04f0120152fc857..7ed609a00ebfbe1fc97e3637de3a79dc9fcc7281 100644 (file)
 #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<buffersize) FD_SET(rdfd,&readfds);
-
+  if (rdfd>=0 && !seeneof && used+1<buffersize) fdsetset(rdfd,&readfds);
+  
   FD_ZERO(&writefds);
-  if (writing) FD_SET(wrfd,&writefds);
+  if (writing) fdsetset(wrfd,&writefds);
 }
 
 void wrbufcore_afterselect(int rdfd, int wrfd) {
@@ -51,6 +58,7 @@ void wrbufcore_afterselect(int rdfd, int wrfd) {
   if (FD_ISSET(wrfd,&writefds) &&
       !(rdfd>=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) {
index f37edd19718a99a8576d761f50c5d3ca773281c0..c422c9276b99a5f57b1968d94c5985c9b7e6a45c 100644 (file)
@@ -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();
index 5af106bc31fbba5bff2a7ee6e224a4c7abf2204f..7b6b77207a75a42c224191df45ae76f9bceff05b 100644 (file)
@@ -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.