xref: /netbsd-src/share/examples/puffs/pnullfs/pnullfs.c (revision 31a36acc43c0035357faef124cfea5de6dcd4a5c)
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