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