| #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 = 1; | 
 | uchar handle[64] = { | 
 | 	0x00 | 
 | }; | 
 |  | 
 | 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); | 
 | } |