pnullfs.c revision 1.5
1/* $NetBSD: pnullfs.c,v 1.5 2007/02/15 12:54:52 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 statvfs svfsb; 60 struct stat sb; 61 mntoptparse_t mp; 62 int mntflags, pflags, lflags; 63 int ch; 64 65 setprogname(argv[0]); 66 67 if (argc < 3) 68 usage(); 69 70 pflags = lflags = mntflags = 0; 71 while ((ch = getopt(argc, argv, "o:s")) != -1) { 72 switch (ch) { 73 case 'o': 74 mp = getmntopts(optarg, puffsmopts, &mntflags, &pflags); 75 if (mp == NULL) 76 err(1, "getmntopts"); 77 freemntopts(mp); 78 break; 79 case 's': 80 lflags |= PUFFSLOOP_NODAEMON; 81 break; 82 } 83 } 84 pflags |= PUFFS_FLAG_BUILDPATH; 85 argv += optind; 86 argc -= optind; 87 88 if (pflags & PUFFS_FLAG_OPDUMP) 89 lflags = PUFFSLOOP_NODAEMON; 90 91 if (argc != 2) 92 usage(); 93 94 PUFFSOP_INIT(pops); 95 96 PUFFSOP_SET(pops, puffs_null, fs, statvfs); 97 PUFFSOP_SETFSNOP(pops, unmount); 98 PUFFSOP_SETFSNOP(pops, sync); 99 100 PUFFSOP_SET(pops, puffs_null, node, lookup); 101 PUFFSOP_SET(pops, puffs_null, node, create); 102 PUFFSOP_SET(pops, puffs_null, node, mknod); 103 PUFFSOP_SET(pops, puffs_null, node, getattr); 104 PUFFSOP_SET(pops, puffs_null, node, setattr); 105 PUFFSOP_SET(pops, puffs_null, node, fsync); 106 PUFFSOP_SET(pops, puffs_null, node, remove); 107 PUFFSOP_SET(pops, puffs_null, node, link); 108 PUFFSOP_SET(pops, puffs_null, node, rename); 109 PUFFSOP_SET(pops, puffs_null, node, mkdir); 110 PUFFSOP_SET(pops, puffs_null, node, rmdir); 111 PUFFSOP_SET(pops, puffs_null, node, symlink); 112 PUFFSOP_SET(pops, puffs_null, node, readlink); 113 PUFFSOP_SET(pops, puffs_null, node, readdir); 114 PUFFSOP_SET(pops, puffs_null, node, read); 115 PUFFSOP_SET(pops, puffs_null, node, write); 116 PUFFSOP_SET(pops, puffs_null, node, reclaim); 117 118 if ((pu = puffs_mount(pops, argv[1], mntflags, "pnullfs", NULL, 119 pflags, 0)) == NULL) 120 err(1, "mount"); 121 122 if (statvfs(argv[0], &svfsb) == -1) 123 err(1, "statvfs %s", argv[0]); 124 125 pu->pu_pn_root = puffs_pn_new(pu, NULL); 126 if (pu->pu_pn_root == NULL) 127 err(1, "puffs_pn_new"); 128 129 po_root = puffs_getrootpathobj(pu); 130 if (po_root == NULL) 131 err(1, "getrootpathobj"); 132 po_root->po_path = argv[0]; 133 po_root->po_len = strlen(argv[0]); 134 if (stat(argv[0], &sb) == -1) 135 err(1, "stat %s", argv[0]); 136 puffs_stat2vattr(&pu->pu_pn_root->pn_va, &sb); 137 138 if (puffs_start(pu, pu->pu_pn_root, &svfsb) == -1) 139 err(1, "puffs_start"); 140 141 if (puffs_mainloop(pu, lflags) == -1) 142 err(1, "mainloop"); 143 144 return 0; 145} 146