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