Whamcloud - gitweb
LU-6210 utils: Change positional struct initializers to C99
[fs/lustre-release.git] / lustre / utils / mount_utils.c
index 828874d..2027b28 100644 (file)
  *
  * You should have received a copy of the GNU General Public License
  * version 2 along with this program; If not, see
- * http://www.sun.com/software/products/lustre/docs/GPLv2.pdf
- *
- * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
- * CA 95054 USA or visit www.sun.com if you need additional information or
- * have any questions.
+ * http://www.gnu.org/licenses/gpl-2.0.html
  *
  * GPL HEADER END
  */
@@ -27,7 +23,7 @@
  * Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved.
  * Use is subject to license terms.
  *
- * Copyright (c) 2012, 2014, Intel Corporation.
+ * Copyright (c) 2012, 2016, Intel Corporation.
  */
 /*
  * This file is part of Lustre, http://www.lustre.org/
@@ -38,7 +34,8 @@
 #  include "config.h"
 #endif /* HAVE_CONFIG_H */
 
-#include "mount_utils.h"
+#include <inttypes.h>
+#include <limits.h>
 #include <mntent.h>
 #include <stdio.h>
 #include <errno.h>
 #include <sys/stat.h>
 #include <sys/utsname.h>
 #include <linux/loop.h>
+#include <sys/types.h>
+#include <dirent.h>
 #include <dlfcn.h>
 
+#ifdef HAVE_GSS
+#include <keyutils.h>
+#include <lustre/utils/gss/sk_utils.h>
+#endif
+
+#include "mount_utils.h"
+
 extern char *progname;
 extern int verbose;
 
@@ -225,18 +231,16 @@ int check_mtab_entry(char *spec1, char *spec2, char *mtpt, char *type)
        return 0;
 }
 
-#define PROC_DIR       "/proc/"
+#include <sys/vfs.h>
+#include <linux/magic.h>
+
 static int mtab_is_proc(const char *mtab)
 {
-       char path[16];
-
-       if (readlink(mtab, path, sizeof(path)) < 0)
+       struct statfs s;
+       if (statfs(mtab, &s) < 0)
                return 0;
 
-       if (strncmp(path, PROC_DIR, strlen(PROC_DIR)))
-               return 0;
-
-       return 1;
+       return (s.f_type == PROC_SUPER_MAGIC);
 }
 
 #ifdef HAVE_LIBMOUNT
@@ -305,12 +309,12 @@ int update_mtab_entry(char *spec, char *mtpt, char *type, char *opts,
 
        fp = setmntent(MOUNTED, "a+");
        if (fp == NULL) {
-               fprintf(stderr, "%s: setmntent(%s): %s:",
+               fprintf(stderr, "%s: setmntent(%s): %s\n",
                        progname, MOUNTED, strerror (errno));
                rc = 16;
        } else {
                if ((addmntent(fp, &mnt)) == 1) {
-                       fprintf(stderr, "%s: addmntent: %s:",
+                       fprintf(stderr, "%s: addmntent: %s\n",
                                progname, strerror (errno));
                        rc = 16;
                }
@@ -419,6 +423,7 @@ int loop_setup(struct mkfs_opts *mop)
                }
                /* find or allocate a free loop device to use */
                i = ioctl(ret, LOOP_CTL_GET_FREE);
+               close(ret);
                if (i < 0) {
                        fprintf(stderr, "%s: access loop control error\n", progname);
                        return EACCES;
@@ -614,7 +619,7 @@ void unload_backfs_module(struct module_backfs_ops *ops)
 /* Return true if backfs_ops has operations for the given mount_type. */
 int backfs_mount_type_okay(enum ldd_mount_type mount_type)
 {
-       if (unlikely(mount_type >= LDD_MT_LAST || mount_type < 0)) {
+       if (mount_type >= LDD_MT_LAST || mount_type < 0) {
                fatal();
                fprintf(stderr, "fs type out of range %d\n", mount_type);
                return 0;
@@ -636,7 +641,6 @@ int osd_write_ldd(struct mkfs_opts *mop)
 
        if (backfs_mount_type_okay(ldd->ldd_mount_type))
                ret = backfs_ops[ldd->ldd_mount_type]->write_ldd(mop);
-
        else
                ret = EINVAL;
 
@@ -650,7 +654,6 @@ int osd_read_ldd(char *dev, struct lustre_disk_data *ldd)
 
        if (backfs_mount_type_okay(ldd->ldd_mount_type))
                ret = backfs_ops[ldd->ldd_mount_type]->read_ldd(dev, ldd);
-
        else
                ret = EINVAL;
 
@@ -684,7 +687,6 @@ int osd_make_lustre(struct mkfs_opts *mop)
 
        if (backfs_mount_type_okay(ldd->ldd_mount_type))
                ret = backfs_ops[ldd->ldd_mount_type]->make_lustre(mop);
-
        else
                ret = EINVAL;
 
@@ -700,7 +702,6 @@ int osd_prepare_lustre(struct mkfs_opts *mop,
        if (backfs_mount_type_okay(ldd->ldd_mount_type))
                ret = backfs_ops[ldd->ldd_mount_type]->prepare_lustre(mop,
                                                        wanted_mountopts, len);
-
        else
                ret = EINVAL;
 
@@ -728,7 +729,6 @@ int osd_tune_lustre(char *dev, struct mount_opts *mop)
 
        if (backfs_mount_type_okay(ldd->ldd_mount_type))
                ret = backfs_ops[ldd->ldd_mount_type]->tune_lustre(dev, mop);
-
        else
                ret = EINVAL;
 
@@ -742,7 +742,6 @@ int osd_label_lustre(struct mount_opts *mop)
 
        if (backfs_mount_type_okay(ldd->ldd_mount_type))
                ret = backfs_ops[ldd->ldd_mount_type]->label_lustre(mop);
-
        else
                ret = EINVAL;
 
@@ -757,7 +756,6 @@ int osd_enable_quota(struct mkfs_opts *mop)
 
        if (backfs_mount_type_okay(ldd->ldd_mount_type))
                ret = backfs_ops[ldd->ldd_mount_type]->enable_quota(mop);
-
        else
                ret = EINVAL;
 
@@ -876,3 +874,81 @@ int file_create(char *path, __u64 size)
 
        return 0;
 }
+
+#ifdef HAVE_GSS
+#ifdef HAVE_OPENSSL_SSK
+int load_shared_keys(struct mount_opts *mop)
+{
+       DIR *dir;
+       struct dirent *dentry;
+       struct stat sbuf;
+       char fullpath[PATH_MAX];
+       char *path = mop->mo_skpath;
+       int rc;
+
+       /* init logging */
+       sk_init_logging(NULL, 1, 1);
+
+       rc = stat(path, &sbuf);
+       if (rc < 0) {
+               fprintf(stderr, "stat() failed for key %s: %s\n", path,
+                       strerror(errno));
+               return -errno;
+       }
+
+       /* Load individual keys or a directory of them */
+       if (S_ISREG(sbuf.st_mode)) {
+               return sk_load_keyfile(path);
+       } else if (!S_ISDIR(sbuf.st_mode)) {
+               fprintf(stderr, "Invalid shared key path: %s\n", path);
+               return -ENOKEY;
+       }
+
+       dir = opendir(path);
+       if (dir == NULL) {
+               fprintf(stderr, "Unable to open shared key directory: %s\n",
+                       path);
+               return -ENOENT;
+       }
+
+       /* Loop through the files in the directory attempting to load them.
+        * Any issue with loading the keyfile is treated as an error although
+        * the loop continues until all files have been attempted.  This will
+        * allow all errors be reported at once rather then requiring
+        * incremental corrections to fix each one and try again. */
+       while ((dentry = readdir(dir)) != NULL) {
+               if (strcmp(".", dentry->d_name) == 0 ||
+                   strcmp("..", dentry->d_name) == 0)
+                       continue;
+
+               rc = snprintf(fullpath, PATH_MAX, "%s/%s", path,
+                             dentry->d_name);
+               if (rc >= PATH_MAX) {
+                       fprintf(stderr, "Path too long for %s/%s\n",
+                               path, dentry->d_name);
+                       rc = -ENAMETOOLONG;
+                       continue;
+               }
+
+               rc = stat(fullpath, &sbuf);
+               if (rc < 0) {
+                       fprintf(stderr, "Unable to stat %s: %s\n", fullpath,
+                               strerror(errno));
+                       rc = -errno;
+                       continue;
+               }
+
+               if (!S_ISREG(sbuf.st_mode))
+                       continue;
+
+               rc = sk_load_keyfile(fullpath);
+               if (rc) {
+                       fprintf(stderr, "Failed to load key %s\n", fullpath);
+               }
+       }
+       closedir(dir);
+
+       return rc;
+}
+#endif /* HAVE_OPENSSL_SSK */
+#endif /* HAVE_GSS */