tconn.c - plan9port - [fork] Plan 9 from user space
git clone git://src.adamsgaard.dk/plan9port
Log
Files
Refs
README
LICENSE
---
tconn.c (1308B)
---
     1 #include 
     2 #include 
     3 #include 
     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 }