X-Git-Url: https://git.decadent.org.uk/gitweb/?p=nfs-utils.git;a=blobdiff_plain;f=support%2Fnfs%2Fgetfh.c;h=611459ba73c106dfa4649b0ef634d14b9165d657;hp=5a6f1a40552e3ddbd4d19f599ff09fba2e97fe32;hb=05f93b531d59df6e976d9b40c97b51546524040a;hpb=8b7ad01b14df1e7529b9ba8a1ea17df0d6004ef9 diff --git a/support/nfs/getfh.c b/support/nfs/getfh.c index 5a6f1a4..611459b 100644 --- a/support/nfs/getfh.c +++ b/support/nfs/getfh.c @@ -10,46 +10,125 @@ * Copyright (C) 1995, 1996 Olaf Kirch */ -#include "config.h" +#ifdef HAVE_CONFIG_H +#include +#endif #include #include #include #include "nfslib.h" -struct knfs_fh * -getfh_old (struct sockaddr *addr, dev_t dev, ino_t ino) +/** + * getfh_old - ask the kernel for an NFSv2 file handle via nfsctl() + * @sin: pointer to IPv4 address of a client + * @dev: device number of device where requested object resides + * @ino: inode number of requested object + * + * Returns a pointer to an NFSv2 file handle, or NULL if some error + * occurred. errno is set to reflect the specifics of the error. + */ +struct nfs_fh_len * +getfh_old(const struct sockaddr_in *sin, const dev_t dev, const ino_t ino) { - static union nfsctl_res res; + union nfsctl_res res; struct nfsctl_arg arg; + static struct nfs_fh_len rfh; + + if (sin->sin_family != AF_INET) { + errno = EAFNOSUPPORT; + return NULL; + } + + memset(&arg, 0, sizeof(arg)); + memset(&res, 0, sizeof(res)); arg.ca_version = NFSCTL_VERSION; arg.ca_getfh.gf_version = 2; /* obsolete */ arg.ca_getfh.gf_dev = dev; arg.ca_getfh.gf_ino = ino; - memcpy(&arg.ca_getfh.gf_addr, addr, sizeof(struct sockaddr_in)); + memcpy(&arg.ca_getfh.gf_addr, sin, sizeof(*sin)); if (nfsctl(NFSCTL_GETFH, &arg, &res) < 0) return NULL; - return &res.cr_getfh; + memset(&rfh, 0, sizeof(rfh)); + rfh.fh_size = 32; + memcpy(rfh.fh_handle, &res.cr_getfh, 32); + return &rfh; } -struct knfs_fh * -getfh(struct sockaddr *addr, const char *path) +/** + * getfh - ask the kernel for an NFSv2 file handle via nfsctl() + * @sin: pointer to IPv4 address of a client + * @path: pointer to a '\0'-terminated ASCII string containing an pathname + * + * Returns a pointer to an NFSv2 file handle, or NULL if some error + * occurred. errno is set to reflect the specifics of the error. + */ +struct nfs_fh_len * +getfh(const struct sockaddr_in *sin, const char *path) { - static union nfsctl_res res; + static union nfsctl_res res; struct nfsctl_arg arg; + static struct nfs_fh_len rfh; + + if (sin->sin_family != AF_INET) { + errno = EAFNOSUPPORT; + return NULL; + } + + memset(&arg, 0, sizeof(arg)); + memset(&res, 0, sizeof(res)); arg.ca_version = NFSCTL_VERSION; arg.ca_getfd.gd_version = 2; /* obsolete */ strncpy(arg.ca_getfd.gd_path, path, sizeof(arg.ca_getfd.gd_path) - 1); arg.ca_getfd.gd_path[sizeof (arg.ca_getfd.gd_path) - 1] = '\0'; - memcpy(&arg.ca_getfd.gd_addr, addr, sizeof(struct sockaddr_in)); + memcpy(&arg.ca_getfd.gd_addr, sin, sizeof(*sin)); if (nfsctl(NFSCTL_GETFD, &arg, &res) < 0) return NULL; - return &res.cr_getfh; + memset(&rfh, 0, sizeof(rfh)); + rfh.fh_size = 32; + memcpy(rfh.fh_handle, &res.cr_getfh, 32); + return &rfh; +} + +/** + * getfh_size - ask the kernel for a file handle via nfsctl() + * @sin: pointer to IPv4 address of a client + * @path: pointer to a '\0'-terminated ASCII string containing an pathname + * @size: maximum size, in bytes, of the returned file handle + * + * Returns a pointer to an NFSv3 file handle, or NULL if some error + * occurred. errno is set to reflect the specifics of the error. + */ +struct nfs_fh_len * +getfh_size(const struct sockaddr_in *sin, const char *path, const int size) +{ + static union nfsctl_res res; + struct nfsctl_arg arg; + + if (sin->sin_family != AF_INET) { + errno = EAFNOSUPPORT; + return NULL; + } + + memset(&arg, 0, sizeof(arg)); + memset(&res, 0, sizeof(res)); + + arg.ca_version = NFSCTL_VERSION; + strncpy(arg.ca_getfs.gd_path, path, + sizeof(arg.ca_getfs.gd_path) - 1); + arg.ca_getfs.gd_path[sizeof (arg.ca_getfs.gd_path) - 1] = '\0'; + memcpy(&arg.ca_getfs.gd_addr, sin, sizeof(*sin)); + arg.ca_getfs.gd_maxlen = size; + + if (nfsctl(NFSCTL_GETFS, &arg, &res) < 0) + return NULL; + + return &res.cr_getfs; }