pnullfs.c revision 1.6
1/* $NetBSD: pnullfs.c,v 1.6 2007/04/12 15:09:01 pooka Exp $ */ 2 3/* 4 * Copyright (c) 2007 Antti Kantee. All Rights Reserved. 5 * 6 * Redistribution and use in source and binary forms, with or without 7 * modification, are permitted provided that the following conditions 8 * are met: 9 * 1. Redistributions of source code must retain the above copyright 10 * notice, this list of conditions and the following disclaimer. 11 * 2. Redistributions in binary form must reproduce the above copyright 12 * notice, this list of conditions and the following disclaimer in the 13 * documentation and/or other materials provided with the distribution. 14 * 3. The name of the company nor the name of the author may be used to 15 * endorse or promote products derived from this software without specific 16 * prior written permission. 17 * 18 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS 19 * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 20 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 21 * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 22 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 23 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 24 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 25 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 26 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 27 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 28 * SUCH DAMAGE. 29 */ 30 31/* 32 * pnullfs: puffs nullfs example 33 */ 34 35#include <err.h> 36#include <puffs.h> 37#include <stdio.h> 38#include <stdlib.h> 39#include <unistd.h> 40 41PUFFSOP_PROTOS(puffs_null) /* XXX */ 42 43static void usage(void); 44 45static void 46usage() 47{ 48 49 errx(1, "usage: %s [-s]�[-o mntopts]�nullpath mountpath", 50 getprogname()); 51} 52 53int 54main(int argc, char *argv[]) 55{ 56 struct puffs_usermount *pu; 57 struct puffs_ops *pops; 58 struct puffs_pathobj *po_root; 59 struct puffs_node *pn_root; 60 struct statvfs svfsb; 61 struct stat sb; 62 mntoptparse_t mp; 63 int mntflags, pflags, lflags; 64 int ch; 65 66 setprogname(argv[0]); 67 68 if (argc < 3) 69 usage(); 70 71 pflags = lflags = mntflags = 0; 72 while ((ch = getopt(argc, argv, "o:s")) != -1) { 73 switch (ch) { 74 case 'o': 75 mp = getmntopts(optarg, puffsmopts, &mntflags, &pflags); 76 if (mp == NULL) 77 err(1, "getmntopts"); 78 freemntopts(mp); 79 break; 80 case 's': 81 lflags |= PUFFSLOOP_NODAEMON; 82 break; 83 } 84 } 85 pflags |= PUFFS_FLAG_BUILDPATH; 86 argv += optind; 87 argc -= optind; 88 89 if (pflags & PUFFS_FLAG_OPDUMP) 90 lflags = PUFFSLOOP_NODAEMON; 91 92 if (argc != 2) 93 usage(); 94 95 PUFFSOP_INIT(pops); 96 97 PUFFSOP_SET(pops, puffs_null, fs, statvfs); 98 PUFFSOP_SETFSNOP(pops, unmount); 99 PUFFSOP_SETFSNOP(pops, sync); 100 101 PUFFSOP_SET(pops, puffs_null, node, lookup); 102 PUFFSOP_SET(pops, puffs_null, node, create); 103 PUFFSOP_SET(pops, puffs_null, node, mknod); 104 PUFFSOP_SET(pops, puffs_null, node, getattr); 105 PUFFSOP_SET(pops, puffs_null, node, setattr); 106 PUFFSOP_SET(pops, puffs_null, node, fsync); 107 PUFFSOP_SET(pops, puffs_null, node, remove); 108 PUFFSOP_SET(pops, puffs_null, node, link); 109 PUFFSOP_SET(pops, puffs_null, node, rename); 110 PUFFSOP_SET(pops, puffs_null, node, mkdir); 111 PUFFSOP_SET(pops, puffs_null, node, rmdir); 112 PUFFSOP_SET(pops, puffs_null, node, symlink); 113 PUFFSOP_SET(pops, puffs_null, node, readlink); 114 PUFFSOP_SET(pops, puffs_null, node, readdir); 115 PUFFSOP_SET(pops, puffs_null, node, read); 116 PUFFSOP_SET(pops, puffs_null, node, write); 117 PUFFSOP_SET(pops, puffs_null, node, reclaim); 118 119 if ((pu = puffs_mount(pops, argv[1], mntflags, "pnullfs", NULL, 120 pflags, 0)) == NULL) 121 err(1, "mount"); 122 123 if (statvfs(argv[0], &svfsb) == -1) 124 err(1, "statvfs %s", argv[0]); 125 126 pn_root = puffs_pn_new(pu, NULL); 127 if (pn_root == NULL) 128 err(1, "puffs_pn_new"); 129 puffs_setroot(pu, pn_root); 130 131 po_root = puffs_getrootpathobj(pu); 132 if (po_root == NULL) 133 err(1, "getrootpathobj"); 134 po_root->po_path = argv[0]; 135 po_root->po_len = strlen(argv[0]); 136 if (stat(argv[0], &sb) == -1) 137 err(1, "stat %s", argv[0]); 138 puffs_stat2vattr(&pn_root->pn_va, &sb); 139 140 if (puffs_start(pu, pn_root, &svfsb) == -1) 141 err(1, "puffs_start"); 142 143 if (puffs_mainloop(pu, lflags) == -1) 144 err(1, "mainloop"); 145 146 return 0; 147} 148