aacba52f5c98b8858a4313a6a33c54804e6b4020
[nfs-utils.git] / support / nfs / getfh.c
1 /*
2  * support/nfs/getfh.c
3  *
4  * Get the FH for a given client and directory. This function takes
5  * the NFS protocol version number as an additional argument.
6  *
7  * This function has nothing in common with the SunOS getfh function,
8  * which is a front-end to the RPC mount call.
9  *
10  * Copyright (C) 1995, 1996 Olaf Kirch <okir@monad.swb.de>
11  */
12
13 #include "config.h"
14
15 #include <string.h>
16 #include <sys/types.h>
17 #include <errno.h>
18 #include "nfslib.h"
19
20 struct nfs_fh_len *
21 getfh_old (struct sockaddr *addr, dev_t dev, ino_t ino)
22 {
23         union nfsctl_res        res;
24         struct nfsctl_arg       arg;
25         static struct nfs_fh_len rfh;
26
27         arg.ca_version = NFSCTL_VERSION;
28         arg.ca_getfh.gf_version = 2;    /* obsolete */
29         arg.ca_getfh.gf_dev = dev;
30         arg.ca_getfh.gf_ino = ino;
31         memcpy(&arg.ca_getfh.gf_addr, addr, sizeof(struct sockaddr_in));
32
33         if (nfsctl(NFSCTL_GETFH, &arg, &res) < 0)
34                 return NULL;
35
36         rfh.fh_size = 32;
37         memcpy(rfh.fh_handle, &res.cr_getfh, 32);
38         return &rfh;
39 }
40
41 struct nfs_fh_len *
42 getfh(struct sockaddr *addr, const char *path)
43 {
44         static union nfsctl_res res;
45         struct nfsctl_arg       arg;
46         static struct nfs_fh_len rfh;
47
48         arg.ca_version = NFSCTL_VERSION;
49         arg.ca_getfd.gd_version = 2;    /* obsolete */
50         strncpy(arg.ca_getfd.gd_path, path,
51                 sizeof(arg.ca_getfd.gd_path) - 1);
52         arg.ca_getfd.gd_path[sizeof (arg.ca_getfd.gd_path) - 1] = '\0';
53         memcpy(&arg.ca_getfd.gd_addr, addr, sizeof(struct sockaddr_in));
54
55         if (nfsctl(NFSCTL_GETFD, &arg, &res) < 0)
56                 return NULL;
57
58         rfh.fh_size = 32;
59         memcpy(rfh.fh_handle, &res.cr_getfh, 32);
60         return &rfh;
61 }
62
63 struct nfs_fh_len *
64 getfh_size(struct sockaddr *addr, const char *path, int size)
65 {
66         static union nfsctl_res res;
67         struct nfsctl_arg       arg;
68
69         arg.ca_version = NFSCTL_VERSION;
70         strncpy(arg.ca_getfs.gd_path, path,
71                 sizeof(arg.ca_getfs.gd_path) - 1);
72         arg.ca_getfs.gd_path[sizeof (arg.ca_getfs.gd_path) - 1] = '\0';
73         memcpy(&arg.ca_getfs.gd_addr, addr, sizeof(struct sockaddr_in));
74         arg.ca_getfs.gd_maxlen = size;
75
76         if (nfsctl(NFSCTL_GETFS, &arg, &res) < 0)
77                 return NULL;
78
79         return &res.cr_getfs;
80 }