Blame


1 056fe1ba 2003-11-23 devnull #include <u.h>
2 056fe1ba 2003-11-23 devnull #include <libc.h>
3 056fe1ba 2003-11-23 devnull #include <venti.h>
4 056fe1ba 2003-11-23 devnull
5 056fe1ba 2003-11-23 devnull static char *okvers[] = {
6 33b446b8 2009-05-25 rsc "04",
7 056fe1ba 2003-11-23 devnull "02",
8 056fe1ba 2003-11-23 devnull nil,
9 056fe1ba 2003-11-23 devnull };
10 056fe1ba 2003-11-23 devnull
11 056fe1ba 2003-11-23 devnull /*
12 056fe1ba 2003-11-23 devnull static char EBigString[] = "string too long";
13 056fe1ba 2003-11-23 devnull static char EBigPacket[] = "packet too long";
14 056fe1ba 2003-11-23 devnull static char ENullString[] = "missing string";
15 056fe1ba 2003-11-23 devnull */
16 056fe1ba 2003-11-23 devnull static char EBadVersion[] = "bad format in version string";
17 056fe1ba 2003-11-23 devnull
18 056fe1ba 2003-11-23 devnull static int
19 056fe1ba 2003-11-23 devnull vtreadversion(VtConn *z, char *q, char *v, int nv)
20 056fe1ba 2003-11-23 devnull {
21 056fe1ba 2003-11-23 devnull int n;
22 056fe1ba 2003-11-23 devnull
23 056fe1ba 2003-11-23 devnull for(;;){
24 056fe1ba 2003-11-23 devnull if(nv <= 1){
25 056fe1ba 2003-11-23 devnull werrstr("version too long");
26 056fe1ba 2003-11-23 devnull return -1;
27 056fe1ba 2003-11-23 devnull }
28 056fe1ba 2003-11-23 devnull n = read(z->infd, v, 1);
29 056fe1ba 2003-11-23 devnull if(n <= 0){
30 056fe1ba 2003-11-23 devnull if(n == 0)
31 056fe1ba 2003-11-23 devnull werrstr("unexpected eof");
32 056fe1ba 2003-11-23 devnull return -1;
33 056fe1ba 2003-11-23 devnull }
34 056fe1ba 2003-11-23 devnull if(*v == '\n'){
35 056fe1ba 2003-11-23 devnull *v = 0;
36 056fe1ba 2003-11-23 devnull break;
37 056fe1ba 2003-11-23 devnull }
38 056fe1ba 2003-11-23 devnull if((uchar)*v < ' ' || (uchar)*v > 0x7f || (*q && *v != *q)){
39 056fe1ba 2003-11-23 devnull werrstr(EBadVersion);
40 056fe1ba 2003-11-23 devnull return -1;
41 056fe1ba 2003-11-23 devnull }
42 056fe1ba 2003-11-23 devnull v++;
43 056fe1ba 2003-11-23 devnull nv--;
44 056fe1ba 2003-11-23 devnull if(*q)
45 056fe1ba 2003-11-23 devnull q++;
46 056fe1ba 2003-11-23 devnull }
47 056fe1ba 2003-11-23 devnull return 0;
48 056fe1ba 2003-11-23 devnull }
49 056fe1ba 2003-11-23 devnull
50 056fe1ba 2003-11-23 devnull int
51 056fe1ba 2003-11-23 devnull vtversion(VtConn *z)
52 056fe1ba 2003-11-23 devnull {
53 056fe1ba 2003-11-23 devnull char buf[VtMaxStringSize], *p, *ep, *prefix, *pp;
54 056fe1ba 2003-11-23 devnull int i;
55 056fe1ba 2003-11-23 devnull
56 056fe1ba 2003-11-23 devnull qlock(&z->lk);
57 056fe1ba 2003-11-23 devnull if(z->state != VtStateAlloc){
58 056fe1ba 2003-11-23 devnull werrstr("bad session state");
59 056fe1ba 2003-11-23 devnull qunlock(&z->lk);
60 056fe1ba 2003-11-23 devnull return -1;
61 056fe1ba 2003-11-23 devnull }
62 056fe1ba 2003-11-23 devnull
63 056fe1ba 2003-11-23 devnull qlock(&z->inlk);
64 056fe1ba 2003-11-23 devnull qlock(&z->outlk);
65 056fe1ba 2003-11-23 devnull
66 056fe1ba 2003-11-23 devnull p = buf;
67 056fe1ba 2003-11-23 devnull ep = buf + sizeof buf;
68 056fe1ba 2003-11-23 devnull prefix = "venti-";
69 056fe1ba 2003-11-23 devnull p = seprint(p, ep, "%s", prefix);
70 056fe1ba 2003-11-23 devnull p += strlen(p);
71 056fe1ba 2003-11-23 devnull for(i=0; okvers[i]; i++)
72 056fe1ba 2003-11-23 devnull p = seprint(p, ep, "%s%s", i ? ":" : "", okvers[i]);
73 056fe1ba 2003-11-23 devnull p = seprint(p, ep, "-libventi\n");
74 056fe1ba 2003-11-23 devnull assert(p-buf < sizeof buf);
75 056fe1ba 2003-11-23 devnull
76 056fe1ba 2003-11-23 devnull if(write(z->outfd, buf, p-buf) != p-buf)
77 056fe1ba 2003-11-23 devnull goto Err;
78 056fe1ba 2003-11-23 devnull vtdebug(z, "version string out: %s", buf);
79 056fe1ba 2003-11-23 devnull
80 056fe1ba 2003-11-23 devnull if(vtreadversion(z, prefix, buf, sizeof buf) < 0)
81 056fe1ba 2003-11-23 devnull goto Err;
82 056fe1ba 2003-11-23 devnull vtdebug(z, "version string in: %s", buf);
83 056fe1ba 2003-11-23 devnull
84 056fe1ba 2003-11-23 devnull p = buf+strlen(prefix);
85 bcac59d8 2005-08-11 devnull for(; *p; p=pp){
86 bcac59d8 2005-08-11 devnull if(*p == ':' || *p == '-')
87 bcac59d8 2005-08-11 devnull p++;
88 056fe1ba 2003-11-23 devnull pp = strpbrk(p, ":-");
89 bcac59d8 2005-08-11 devnull if(pp == nil)
90 bcac59d8 2005-08-11 devnull pp = p+strlen(p);
91 056fe1ba 2003-11-23 devnull for(i=0; okvers[i]; i++)
92 056fe1ba 2003-11-23 devnull if(strlen(okvers[i]) == pp-p && memcmp(okvers[i], p, pp-p) == 0){
93 056fe1ba 2003-11-23 devnull *pp = 0;
94 056fe1ba 2003-11-23 devnull z->version = vtstrdup(p);
95 056fe1ba 2003-11-23 devnull goto Okay;
96 056fe1ba 2003-11-23 devnull }
97 056fe1ba 2003-11-23 devnull }
98 056fe1ba 2003-11-23 devnull werrstr("unable to negotiate version");
99 056fe1ba 2003-11-23 devnull goto Err;
100 056fe1ba 2003-11-23 devnull
101 056fe1ba 2003-11-23 devnull Okay:
102 056fe1ba 2003-11-23 devnull z->state = VtStateConnected;
103 056fe1ba 2003-11-23 devnull qunlock(&z->inlk);
104 056fe1ba 2003-11-23 devnull qunlock(&z->outlk);
105 056fe1ba 2003-11-23 devnull qunlock(&z->lk);
106 056fe1ba 2003-11-23 devnull return 0;
107 056fe1ba 2003-11-23 devnull
108 056fe1ba 2003-11-23 devnull Err:
109 361e279c 2005-01-18 devnull werrstr("vtversion: %r");
110 056fe1ba 2003-11-23 devnull if(z->infd >= 0)
111 056fe1ba 2003-11-23 devnull close(z->infd);
112 056fe1ba 2003-11-23 devnull if(z->outfd >= 0 && z->outfd != z->infd)
113 056fe1ba 2003-11-23 devnull close(z->outfd);
114 056fe1ba 2003-11-23 devnull z->infd = -1;
115 056fe1ba 2003-11-23 devnull z->outfd = -1;
116 056fe1ba 2003-11-23 devnull z->state = VtStateClosed;
117 056fe1ba 2003-11-23 devnull qunlock(&z->inlk);
118 056fe1ba 2003-11-23 devnull qunlock(&z->outlk);
119 056fe1ba 2003-11-23 devnull qunlock(&z->lk);
120 056fe1ba 2003-11-23 devnull return -1;
121 056fe1ba 2003-11-23 devnull }