rsc | 056fe1b | 2003-11-23 18:19:58 +0000 | [diff] [blame] | 1 | #include <u.h> |
| 2 | #include <libc.h> |
| 3 | #include <venti.h> |
| 4 | |
| 5 | int |
| 6 | vtsrvhello(VtConn *z) |
| 7 | { |
| 8 | VtFcall tx, rx; |
| 9 | Packet *p; |
| 10 | |
rsc | 361e279 | 2005-01-18 20:15:18 +0000 | [diff] [blame] | 11 | if((p = vtrecv(z)) == nil) |
rsc | 2e965b3 | 2004-05-05 04:22:16 +0000 | [diff] [blame] | 12 | return -1; |
rsc | 056fe1b | 2003-11-23 18:19:58 +0000 | [diff] [blame] | 13 | |
| 14 | if(vtfcallunpack(&tx, p) < 0){ |
| 15 | packetfree(p); |
rsc | 2e965b3 | 2004-05-05 04:22:16 +0000 | [diff] [blame] | 16 | return -1; |
rsc | 056fe1b | 2003-11-23 18:19:58 +0000 | [diff] [blame] | 17 | } |
| 18 | packetfree(p); |
| 19 | |
rsc | 7643b26 | 2005-07-13 10:52:39 +0000 | [diff] [blame] | 20 | if(tx.msgtype != VtThello){ |
rsc | 056fe1b | 2003-11-23 18:19:58 +0000 | [diff] [blame] | 21 | vtfcallclear(&tx); |
rsc | 7643b26 | 2005-07-13 10:52:39 +0000 | [diff] [blame] | 22 | werrstr("bad packet type %d; want Thello %d", tx.msgtype, VtThello); |
rsc | 2e965b3 | 2004-05-05 04:22:16 +0000 | [diff] [blame] | 23 | return -1; |
rsc | 056fe1b | 2003-11-23 18:19:58 +0000 | [diff] [blame] | 24 | } |
| 25 | if(tx.tag != 0){ |
| 26 | vtfcallclear(&tx); |
| 27 | werrstr("bad tag in hello"); |
rsc | 2e965b3 | 2004-05-05 04:22:16 +0000 | [diff] [blame] | 28 | return -1; |
rsc | 056fe1b | 2003-11-23 18:19:58 +0000 | [diff] [blame] | 29 | } |
| 30 | if(strcmp(tx.version, z->version) != 0){ |
| 31 | vtfcallclear(&tx); |
| 32 | werrstr("bad version in hello"); |
rsc | 2e965b3 | 2004-05-05 04:22:16 +0000 | [diff] [blame] | 33 | return -1; |
rsc | 056fe1b | 2003-11-23 18:19:58 +0000 | [diff] [blame] | 34 | } |
| 35 | vtfree(z->uid); |
| 36 | z->uid = tx.uid; |
| 37 | tx.uid = nil; |
| 38 | vtfcallclear(&tx); |
| 39 | |
| 40 | memset(&rx, 0, sizeof rx); |
rsc | 7643b26 | 2005-07-13 10:52:39 +0000 | [diff] [blame] | 41 | rx.msgtype = VtRhello; |
rsc | 056fe1b | 2003-11-23 18:19:58 +0000 | [diff] [blame] | 42 | rx.tag = tx.tag; |
| 43 | rx.sid = "anonymous"; |
| 44 | if((p = vtfcallpack(&rx)) == nil) |
rsc | 2e965b3 | 2004-05-05 04:22:16 +0000 | [diff] [blame] | 45 | return -1; |
rsc | 056fe1b | 2003-11-23 18:19:58 +0000 | [diff] [blame] | 46 | if(vtsend(z, p) < 0) |
rsc | 2e965b3 | 2004-05-05 04:22:16 +0000 | [diff] [blame] | 47 | return -1; |
rsc | 056fe1b | 2003-11-23 18:19:58 +0000 | [diff] [blame] | 48 | |
rsc | 2e965b3 | 2004-05-05 04:22:16 +0000 | [diff] [blame] | 49 | return 0; |
rsc | 056fe1b | 2003-11-23 18:19:58 +0000 | [diff] [blame] | 50 | } |