|  | #include <u.h> | 
|  | #include <sys/socket.h> | 
|  | #include <netinet/in.h> | 
|  | #include <arpa/inet.h> | 
|  | #include <libc.h> | 
|  | #include "mountnfs.h" | 
|  |  | 
|  | void | 
|  | usage(void) | 
|  | { | 
|  | fprint(2, "usage: vmount [-v] [-h handle] address mountpoint\n"); | 
|  | exits("usage"); | 
|  | } | 
|  |  | 
|  | int handlelen = 20; | 
|  | uchar handle[64] = { | 
|  | /* SHA1("/") */ | 
|  | 0x42, 0x09, 0x9B, 0x4A, 0xF0, 0x21, 0xE5, 0x3F, 0xD8, 0xFD, | 
|  | 0x4E, 0x05, 0x6C, 0x25, 0x68, 0xD7, 0xC2, 0xE3, 0xFF, 0xA8 | 
|  | }; | 
|  |  | 
|  | void | 
|  | main(int argc, char **argv) | 
|  | { | 
|  | char *p, *net, *unx; | 
|  | char host[INET_ADDRSTRLEN]; | 
|  | 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, &sa, &port) < 0) | 
|  | sysfatal("bad address '%s'", p); | 
|  |  | 
|  | if(sa.sin_family != AF_INET) | 
|  | sysfatal("only IPv4 is supported"); | 
|  |  | 
|  | inet_ntop(AF_INET, &(sa.sin_addr), host, INET_ADDRSTRLEN); | 
|  |  | 
|  | if(verbose) | 
|  | print("nfs server is net=%s addr=%s port=%d\n", | 
|  | net, host, 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); | 
|  |  | 
|  | mountnfs(proto, &sa, handle, handlelen, argv[1]); | 
|  | exits(0); | 
|  | } |