URI:
       txio.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
       ---
       txio.c (2116B)
       ---
            1 #include "std.h"
            2 #include "dat.h"
            3 
            4 static Ioproc *cache[5];
            5 static int ncache;
            6 
            7 static Ioproc*
            8 xioproc(void)
            9 {
           10         Ioproc *c;
           11         int i;
           12 
           13         for(i=0; i<ncache; i++){
           14                 if(c = cache[i]){
           15                         cache[i] = nil;
           16                         return c;
           17                 }
           18         }
           19 
           20         return ioproc();
           21 }
           22 
           23 static void
           24 closexioproc(Ioproc *io)
           25 {
           26         int i;
           27 
           28         for(i=0; i<ncache; i++)
           29                 if(cache[i] == nil){
           30                         cache[i] = io;
           31                         return;
           32                 }
           33 
           34         closeioproc(io);
           35 }
           36 
           37 int
           38 xiodial(char *ds, char *local, char *dir, int *cfdp)
           39 {
           40         int fd;
           41         Ioproc *io;
           42 
           43         if((io = xioproc()) == nil)
           44                 return -1;
           45         fd = iodial(io, ds, local, dir, cfdp);
           46         closexioproc(io);
           47         return fd;
           48 }
           49 
           50 void
           51 xioclose(int fd)
           52 {
           53         Ioproc *io;
           54 
           55         if((io = xioproc()) == nil){
           56                 close(fd);
           57                 return;
           58         }
           59 
           60         ioclose(io, fd);
           61         closexioproc(io);
           62 }
           63 
           64 int
           65 xiowrite(int fd, void *v, int n)
           66 {
           67         int m;
           68         Ioproc *io;
           69 
           70         if((io = xioproc()) == nil)
           71                 return -1;
           72         m = iowrite(io, fd, v, n);
           73         closexioproc(io);
           74         if(m != n)
           75                 return -1;
           76         return n;
           77 }
           78 
           79 static long
           80 _ioauthdial(va_list *arg)
           81 {
           82         char *net;
           83         char *dom;
           84         int fd;
           85 
           86         net = va_arg(*arg, char*);
           87         dom = va_arg(*arg, char*);
           88         fd = _authdial(net, dom);
           89         if(fd < 0)
           90                 fprint(2, "authdial: %r\n");
           91         return fd;
           92 }
           93 
           94 int
           95 xioauthdial(char *net, char *dom)
           96 {
           97         int fd;
           98         Ioproc *io;
           99 
          100         if((io = xioproc()) == nil)
          101                 return -1;
          102         fd = iocall(io, _ioauthdial, net, dom);
          103         closexioproc(io);
          104         return fd;
          105 }
          106 
          107 static long
          108 _ioasrdresp(va_list *arg)
          109 {
          110         int fd;
          111         void *a;
          112         int n;
          113 
          114         fd = va_arg(*arg, int);
          115         a = va_arg(*arg, void*);
          116         n = va_arg(*arg, int);
          117 
          118         return _asrdresp(fd, a, n);
          119 }
          120 
          121 int
          122 xioasrdresp(int fd, void *a, int n)
          123 {
          124         Ioproc *io;
          125 
          126         if((io = xioproc()) == nil)
          127                 return -1;
          128 
          129         n = iocall(io, _ioasrdresp, fd, a, n);
          130         closexioproc(io);
          131         return n;
          132 }
          133 
          134 static long
          135 _ioasgetticket(va_list *arg)
          136 {
          137         int asfd;
          138         char *trbuf;
          139         char *tbuf;
          140 
          141         asfd = va_arg(*arg, int);
          142         trbuf = va_arg(*arg, char*);
          143         tbuf = va_arg(*arg, char*);
          144 
          145         return _asgetticket(asfd, trbuf, tbuf);
          146 }
          147 
          148 int
          149 xioasgetticket(int fd, char *trbuf, char *tbuf)
          150 {
          151         int n;
          152         Ioproc *io;
          153 
          154         if((io = xioproc()) == nil)
          155                 return -1;
          156 
          157         n = iocall(io, _ioasgetticket, fd, trbuf, tbuf);
          158         closexioproc(io);
          159         if(n != 2*TICKETLEN)
          160                 n = -1;
          161         else
          162                 n = 0;
          163         return n;
          164 }