| #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); |
| } |