VMM: Sync halting GPCs and interrupt injection
[akaros.git] / user / iplib / announce.c
index d9fd50d..e261585 100755 (executable)
@@ -25,8 +25,7 @@ enum
 /*
  *  announce a network service.
  */
-int
-announce(char *addr, char *dir)
+int announce9(char *addr, char *dir, int flags)
 {
        int ctl, n, m;
        char buf[Maxpath];
@@ -46,12 +45,12 @@ announce(char *addr, char *dir)
         */
        ctl = open(netdir, O_RDWR);
        if(ctl<0){
-               fprintf(stderr,"announce opening %s: %r", netdir);
+               fprintf(stderr,"announce opening %s: %r\n", netdir);
                return -1;
        }
        cp = strrchr(netdir, '/');
        if(cp == NULL){
-               fprintf(stderr,"announce arg format %s", netdir);
+               fprintf(stderr,"announce arg format %s\n", netdir);
                close(ctl);
                return -1;
        }
@@ -63,7 +62,7 @@ announce(char *addr, char *dir)
        n = snprintf(buf, sizeof(buf), "%s/", netdir);
        m = read(ctl, &buf[n], sizeof(buf)-n-1);
        if(m <= 0){
-               fprintf(stderr,"announce reading %s: %r", netdir);
+               fprintf(stderr,"announce reading %s: %r\n", netdir);
                close(ctl);
                return -1;
        }
@@ -74,7 +73,7 @@ announce(char *addr, char *dir)
         */
        n = snprintf(buf2, sizeof(buf2), "announce %s", naddr);
        if(write(ctl, buf2, n)!=n){
-               fprintf(stderr,"announce writing %s: %r", netdir);
+               fprintf(stderr,"announce writing %s: %r\n", netdir);
                close(ctl);
                return -1;
        }
@@ -92,8 +91,7 @@ announce(char *addr, char *dir)
 /*
  *  listen for an incoming call
  */
-int
-listen(char *dir, char *newdir)
+int listen9(char *dir, char *newdir, int flags)
 {
        int ctl, n, m;
        char buf[Maxpath];
@@ -103,9 +101,10 @@ listen(char *dir, char *newdir)
         *  open listen, wait for a call
         */
        snprintf(buf, sizeof(buf), "%s/listen", dir);
-       ctl = open(buf, O_RDWR);
+       ctl = open(buf, O_RDWR | (flags & O_NONBLOCK));
        if(ctl < 0){
-               fprintf(stderr,"listen opening %s: %r", buf);
+               if ((errno != EAGAIN) && (errno != EWOULDBLOCK))
+                       fprintf(stderr,"listen opening %s: %r\n", buf);
                return -1;
        }
 
@@ -117,7 +116,7 @@ listen(char *dir, char *newdir)
        cp = strrchr(buf, '/');
        if(cp == NULL){
                close(ctl);
-               fprintf(stderr,"listen arg format %s", dir);
+               fprintf(stderr,"listen arg format %s\n", dir);
                return -1;
        }
        *++cp = 0;
@@ -125,7 +124,7 @@ listen(char *dir, char *newdir)
        m = read(ctl, cp, sizeof(buf) - n - 1);
        if(m <= 0){
                close(ctl);
-               fprintf(stderr,"listen reading %s/listen: %r", dir);
+               fprintf(stderr,"listen reading %s/listen: %r\n", dir);
                return -1;
        }
        buf[n+m] = 0;
@@ -144,8 +143,7 @@ listen(char *dir, char *newdir)
 /*
  *  accept a call, return an fd to the open data file
  */
-int
-accept(int ctl, char *dir)
+int accept9(int ctl, char *dir)
 {
        char buf[Maxpath];
        char *num;
@@ -167,8 +165,7 @@ accept(int ctl, char *dir)
 /*
  *  reject a call, tell device the reason for the rejection
  */
-int
-reject(int ctl, char *dir, char *cause)
+int reject9(int ctl, char *dir, char *cause)
 {
        char buf[Maxpath];
        char *num;
@@ -226,7 +223,7 @@ nettrans(char *addr, char *naddr, int na, char *file, int nf)
         */
        p = strchr(addr, '!');
        if(p == 0){
-               fprintf(stderr,"bad dial string: %s", addr);
+               fprintf(stderr,"bad dial string: %s\n", addr);
                return -1;
        }
        if(*addr != '/'){
@@ -237,7 +234,7 @@ nettrans(char *addr, char *naddr, int na, char *file, int nf)
                        ;
                i = p2 - addr;
                if(i == 0 || i >= sizeof(netdir)){
-                       fprintf(stderr,"bad dial string: %s", addr);
+                       fprintf(stderr,"bad dial string: %s\n", addr);
                        return -1;
                }
                strncpy(netdir, addr, i);