URI:
       tconn.c - plan9port - [fork] Plan 9 from user space
  HTML git clone git://src.adamsgaard.dk/plan9port
   DIR Log
   DIR Files
   DIR Refs
   DIR README
   DIR LICENSE
       ---
       tconn.c (1308B)
       ---
            1 #include <u.h>
            2 #include <libc.h>
            3 #include <venti.h>
            4 #include "queue.h"
            5 
            6 int chattyventi;
            7 
            8 VtConn*
            9 vtconn(int infd, int outfd)
           10 {
           11         VtConn *z;
           12         NetConnInfo *nci;
           13 
           14         z = vtmallocz(sizeof(VtConn));
           15         z->tagrend.l = &z->lk;
           16         z->rpcfork.l = &z->lk;
           17         z->infd = infd;
           18         z->outfd = outfd;
           19         z->part = packetalloc();
           20         nci = getnetconninfo(nil, infd);
           21         if(nci == nil)
           22                 snprint(z->addr, sizeof z->addr, "/dev/fd/%d", infd);
           23         else{
           24                 strecpy(z->addr, z->addr+sizeof z->addr, nci->raddr);
           25                 freenetconninfo(nci);
           26         }
           27         return z;
           28 }
           29 
           30 int
           31 vtreconn(VtConn *z, int infd, int outfd)
           32 {
           33         NetConnInfo *nci;
           34 
           35         z->state = VtStateAlloc;
           36         if(z->infd >= 0)
           37                 close(z->infd);
           38         z->infd = infd;
           39         if(z->outfd >= 0)
           40                 close(z->outfd);
           41         z->outfd = outfd;
           42         nci = getnetconninfo(nil, infd);
           43         if(nci == nil)
           44                 snprint(z->addr, sizeof z->addr, "/dev/fd/%d", infd);
           45         else{
           46                 strecpy(z->addr, z->addr+sizeof z->addr, nci->raddr);
           47                 freenetconninfo(nci);
           48         }
           49         return 0;
           50 }
           51 
           52 void
           53 vtfreeconn(VtConn *z)
           54 {
           55         vthangup(z);
           56         qlock(&z->lk);
           57         /*
           58          * Wait for send and recv procs to notice
           59          * the hangup and clear out the queues.
           60          */
           61         while(z->readq || z->writeq){
           62                 if(z->readq)
           63                         _vtqhangup(z->readq);
           64                 if(z->writeq)
           65                         _vtqhangup(z->writeq);
           66                 rsleep(&z->rpcfork);
           67         }
           68         packetfree(z->part);
           69         vtfree(z->version);
           70         vtfree(z->sid);
           71         qunlock(&z->lk);
           72         vtfree(z);
           73 }