1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
|
#include <u.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <libc.h>
#include "mountnfs.h"
void
usage(void)
{
fprint(2, "usage: vmount [-v] [-h handle] address mountpoint\n");
exits("usage");
}
int handlelen = 1;
uchar handle[64] = {
0x00
};
void
main(int argc, char **argv)
{
char *p, *net, *unx;
u32int host;
int n, port, proto, verbose;
struct sockaddr_in sa;
verbose = 0;
ARGBEGIN{
case 'h':
p = EARGF(usage());
n = strlen(p);
if(n%2)
sysfatal("bad handle '%s'", p);
if(n > 2*sizeof handle)
sysfatal("handle too long '%s'", p);
handlelen = n/2;
if(dec16(handle, n/2, p, n) != n/2)
sysfatal("bad hex in handle '%s'", p);
break;
case 'v':
verbose = 1;
break;
default:
usage();
}ARGEND
if(argc != 2)
usage();
p = p9netmkaddr(argv[0], "udp", "nfs");
if(p9dialparse(strdup(p), &net, &unx, &host, &port) < 0)
sysfatal("bad address '%s'", p);
if(verbose)
print("nfs server is net=%s addr=%d.%d.%d.%d port=%d\n",
net, host&0xFF, (host>>8)&0xFF, (host>>16)&0xFF, host>>24, port);
proto = 0;
if(strcmp(net, "tcp") == 0)
proto = SOCK_STREAM;
else if(strcmp(net, "udp") == 0)
proto = SOCK_DGRAM;
else
sysfatal("bad proto %s: can only handle tcp and udp", net);
memset(&sa, 0, sizeof sa);
memmove(&sa.sin_addr, &host, 4);
sa.sin_family = AF_INET;
sa.sin_port = htons(port);
mountnfs(proto, &sa, handle, handlelen, argv[1]);
exits(0);
}
|