1 /* $NetBSD: mount_nilfs.c,v 1.3 2016/02/21 22:51:29 christos Exp $ */ 2 3 /* 4 * Copyright (c) 2008, 2009 Reinoud Zandijk 5 * All rights reserved. 6 * 7 * Redistribution and use in source and binary forms, with or without 8 * modification, are permitted provided that the following conditions 9 * are met: 10 * 1. Redistributions of source code must retain the above copyright 11 * notice, this list of conditions and the following disclaimer. 12 * 2. Redistributions in binary form must reproduce the above copyright 13 * notice, this list of conditions and the following disclaimer in the 14 * documentation and/or other materials provided with the distribution. 15 * 3. All advertising materials mentioning features or use of this software 16 * must display the following acknowledgement: 17 * This product includes software developed for the 18 * NetBSD Project. See http://www.NetBSD.org/ for 19 * information about NetBSD. 20 * 4. The name of the author may not be used to endorse or promote products 21 * derived from this software without specific prior written permission. 22 * 23 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 24 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 25 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 26 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 27 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 28 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 29 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 30 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 31 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 32 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 33 * 34 */ 35 36 37 #include <sys/cdefs.h> 38 #ifndef lint 39 __RCSID("$NetBSD: mount_nilfs.c,v 1.3 2016/02/21 22:51:29 christos Exp $"); 40 #endif /* not lint */ 41 42 43 #include <sys/param.h> 44 #include <sys/mount.h> 45 #include <sys/stat.h> 46 47 #include <assert.h> 48 #include <err.h> 49 #include <errno.h> 50 #include <grp.h> 51 #include <pwd.h> 52 #include <stdio.h> 53 #include <stdlib.h> 54 #include <string.h> 55 #include <time.h> 56 #include <unistd.h> 57 #include <util.h> 58 59 60 /* mount specific options */ 61 #include <fs/nilfs/nilfs_mount.h> 62 #include <mntopts.h> 63 64 #include "mountprog.h" 65 #include "mount_nilfs.h" 66 67 /* options to pass on to the `mount' call */ 68 static const struct mntopt mopts[] = { 69 MOPT_STDOPTS, /* `normal' options */ 70 MOPT_ASYNC, /* default */ 71 MOPT_NOATIME, /* dont update access times */ 72 MOPT_RELATIME, /* update access times on change*/ 73 MOPT_UPDATE, /* not yet supported */ 74 MOPT_GETARGS, /* printing */ 75 MOPT_NULL, 76 }; 77 78 79 /* prototypes */ 80 static void usage(void) __dead; 81 82 83 /* code */ 84 85 static void 86 usage(void) 87 { 88 (void)fprintf(stderr, "Usage: %s [-o options] [-c cpno] " 89 "[-t gmtoff] special node\n", getprogname()); 90 exit(EXIT_FAILURE); 91 } 92 93 94 #ifndef MOUNT_NOMAIN 95 int 96 main(int argc, char **argv) 97 { 98 99 setprogname(argv[0]); 100 return mount_nilfs(argc, argv); 101 } 102 #endif 103 104 105 /* main routine */ 106 void 107 mount_nilfs_parseargs(int argc, char **argv, 108 struct nilfs_args *args, int *mntflags, 109 char *canon_dev, char *canon_dir) 110 { 111 struct tm *tm; 112 time_t now; 113 int ch, set_gmtoff; 114 mntoptparse_t mp; 115 116 /* initialise */ 117 (void)memset(args, 0, sizeof(*args)); 118 119 set_gmtoff = *mntflags = 0; 120 121 while ((ch = getopt(argc, argv, "c:o:t:")) != -1) { 122 switch (ch) { 123 case 'o' : 124 /* process generic mount options */ 125 mp = getmntopts(optarg, mopts, mntflags, 0); 126 if (mp == NULL) 127 err(EXIT_FAILURE, "getmntopts"); 128 freemntopts(mp); 129 break; 130 case 'c' : 131 args->cpno = a_num(optarg, "checkpoint number"); 132 break; 133 case 't' : 134 args->gmtoff = a_num(optarg, "gmtoff"); 135 set_gmtoff = 1; 136 break; 137 default : 138 usage(); 139 /* NOTREACHED */ 140 } 141 } 142 143 if (optind + 2 != argc) 144 usage(); 145 146 if (!set_gmtoff) { 147 /* use user's time zone as default */ 148 (void)time(&now); 149 tm = localtime(&now); 150 args->gmtoff = tm->tm_gmtoff; 151 } 152 153 /* get device and directory specifier */ 154 pathadj(argv[optind], canon_dev); 155 pathadj(argv[optind+1], canon_dir); 156 157 args->version = NILFSMNT_VERSION; 158 args->fspec = canon_dev; 159 } 160 161 int 162 mount_nilfs(int argc, char *argv[]) 163 { 164 struct nilfs_args args; 165 char canon_dev[MAXPATHLEN], canon_dir[MAXPATHLEN]; 166 int mntflags; 167 168 mount_nilfs_parseargs(argc, argv, &args, &mntflags, canon_dev, canon_dir); 169 170 /* mount it! :) */ 171 if (mount(MOUNT_NILFS, canon_dir, mntflags, &args, sizeof args) == -1) 172 err(EXIT_FAILURE, "Cannot mount %s on %s", canon_dev,canon_dir); 173 174 if (mntflags & MNT_GETARGS) { 175 char buf[1024]; 176 177 (void)snprintb(buf, sizeof(buf), NILFSMNT_BITS, 178 (uint64_t)args.nilfsmflags); 179 (void)printf("gmtoffset = %d, cpno = %"PRIu64", flags = %s\n", 180 args.gmtoff, args.cpno, buf); 181 } 182 183 return EXIT_SUCCESS; 184 } 185