plan9port

fork of plan9port with libvec, libstr and libsdb
Log | Files | Refs | README | LICENSE

xio.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 }