1*31a36accSpooka /* $NetBSD: pnullfs.c,v 1.18 2008/11/26 14:03:48 pooka Exp $ */
2cf4b2a37Spooka
3cf4b2a37Spooka /*
4cf4b2a37Spooka * Copyright (c) 2007 Antti Kantee. All Rights Reserved.
5cf4b2a37Spooka *
6cf4b2a37Spooka * Redistribution and use in source and binary forms, with or without
7cf4b2a37Spooka * modification, are permitted provided that the following conditions
8cf4b2a37Spooka * are met:
9cf4b2a37Spooka * 1. Redistributions of source code must retain the above copyright
10cf4b2a37Spooka * notice, this list of conditions and the following disclaimer.
11cf4b2a37Spooka * 2. Redistributions in binary form must reproduce the above copyright
12cf4b2a37Spooka * notice, this list of conditions and the following disclaimer in the
13cf4b2a37Spooka * documentation and/or other materials provided with the distribution.
14cf4b2a37Spooka *
15cf4b2a37Spooka * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
16cf4b2a37Spooka * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
17cf4b2a37Spooka * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
18cf4b2a37Spooka * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
19cf4b2a37Spooka * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20cf4b2a37Spooka * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
21cf4b2a37Spooka * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22cf4b2a37Spooka * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23cf4b2a37Spooka * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24cf4b2a37Spooka * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
25cf4b2a37Spooka * SUCH DAMAGE.
26cf4b2a37Spooka */
27cf4b2a37Spooka
28cf4b2a37Spooka /*
29cf4b2a37Spooka * pnullfs: puffs nullfs example
30cf4b2a37Spooka */
31cf4b2a37Spooka
32cf4b2a37Spooka #include <err.h>
33cf4b2a37Spooka #include <puffs.h>
34cf4b2a37Spooka #include <stdio.h>
35cf4b2a37Spooka #include <stdlib.h>
36cf4b2a37Spooka #include <unistd.h>
37cf4b2a37Spooka
38cf4b2a37Spooka static void usage(void);
39cf4b2a37Spooka
40cf4b2a37Spooka static void
usage()41cf4b2a37Spooka usage()
42cf4b2a37Spooka {
43cf4b2a37Spooka
44fc978808Schristos errx(1, "usage: %s [-s] [-o mntopts] nullpath mountpath",
45dd15744cSpooka getprogname());
46cf4b2a37Spooka }
47cf4b2a37Spooka
48cf4b2a37Spooka int
main(int argc,char * argv[])49cf4b2a37Spooka main(int argc, char *argv[])
50cf4b2a37Spooka {
51cf4b2a37Spooka struct puffs_usermount *pu;
52cf4b2a37Spooka struct puffs_ops *pops;
53e6ea11c9Spooka struct puffs_pathobj *po_root;
5495a18d20Spooka struct puffs_node *pn_root;
55cf4b2a37Spooka struct stat sb;
56cf4b2a37Spooka mntoptparse_t mp;
574b0f2948Spooka int mntflags, pflags;
58cf4b2a37Spooka int ch;
594b0f2948Spooka int detach;
60cf4b2a37Spooka
61cf4b2a37Spooka setprogname(argv[0]);
62cf4b2a37Spooka
63cf4b2a37Spooka if (argc < 3)
64cf4b2a37Spooka usage();
65cf4b2a37Spooka
664b0f2948Spooka pflags = mntflags = 0;
674b0f2948Spooka detach = 1;
68dd15744cSpooka while ((ch = getopt(argc, argv, "o:s")) != -1) {
69cf4b2a37Spooka switch (ch) {
70cf4b2a37Spooka case 'o':
71cf4b2a37Spooka mp = getmntopts(optarg, puffsmopts, &mntflags, &pflags);
72cf4b2a37Spooka if (mp == NULL)
73cf4b2a37Spooka err(1, "getmntopts");
74cf4b2a37Spooka freemntopts(mp);
75cf4b2a37Spooka break;
76dd15744cSpooka case 's':
774b0f2948Spooka detach = 0;
78dd15744cSpooka break;
79cf4b2a37Spooka }
80cf4b2a37Spooka }
81cf4b2a37Spooka pflags |= PUFFS_FLAG_BUILDPATH;
82cf4b2a37Spooka argv += optind;
83cf4b2a37Spooka argc -= optind;
84cf4b2a37Spooka
85764f2241Spooka if (pflags & PUFFS_FLAG_OPDUMP)
864b0f2948Spooka detach = 0;
87764f2241Spooka
88cf4b2a37Spooka if (argc != 2)
89cf4b2a37Spooka usage();
90cf4b2a37Spooka
91c8b0a891Spooka if (lstat(argv[0], &sb) == -1)
92c8b0a891Spooka err(1, "stat %s", argv[0]);
93c8b0a891Spooka if ((sb.st_mode & S_IFDIR) == 0)
94c8b0a891Spooka errx(1, "%s is not a directory", argv[0]);
95c8b0a891Spooka
96cf4b2a37Spooka PUFFSOP_INIT(pops);
970d05db1cSpooka puffs_null_setops(pops);
98cf4b2a37Spooka
9908db7d75Spooka if ((pu = puffs_init(pops, argv[0], "pnullfs", NULL, pflags)) == NULL)
100c8b0a891Spooka err(1, "init");
101cf4b2a37Spooka
10295a18d20Spooka pn_root = puffs_pn_new(pu, NULL);
10395a18d20Spooka if (pn_root == NULL)
104cf4b2a37Spooka err(1, "puffs_pn_new");
10595a18d20Spooka puffs_setroot(pu, pn_root);
106*31a36accSpooka puffs_setfhsize(pu, 0, PUFFS_FHFLAG_PASSTHROUGH);
107e6ea11c9Spooka
108e6ea11c9Spooka po_root = puffs_getrootpathobj(pu);
109e6ea11c9Spooka if (po_root == NULL)
110e6ea11c9Spooka err(1, "getrootpathobj");
111e6ea11c9Spooka po_root->po_path = argv[0];
112e6ea11c9Spooka po_root->po_len = strlen(argv[0]);
11395a18d20Spooka puffs_stat2vattr(&pn_root->pn_va, &sb);
114cf4b2a37Spooka
1154b0f2948Spooka if (detach)
1164462e945Spooka if (puffs_daemon(pu, 1, 1) == -1)
1174462e945Spooka err(1, "puffs_daemon");
1184b0f2948Spooka
119ec865a5bSpooka if (puffs_mount(pu, argv[1], mntflags, pn_root) == -1)
120ec865a5bSpooka err(1, "puffs_mount");
1214b0f2948Spooka if (puffs_mainloop(pu) == -1)
122ec865a5bSpooka err(1, "mainloop");
123cf4b2a37Spooka
124cf4b2a37Spooka return 0;
125cf4b2a37Spooka }
126