xref: /minix3/minix/lib/libpuffs/main.c (revision ba736c796854b82e29da17267614db0a449419db)
1*ba736c79SDavid van Moolenbroek 
2*ba736c79SDavid van Moolenbroek #include "fs.h"
3*ba736c79SDavid van Moolenbroek 
4*ba736c79SDavid van Moolenbroek static message fs_msg;
5*ba736c79SDavid van Moolenbroek static int fs_ipc_status;
6*ba736c79SDavid van Moolenbroek static int fs_pending;
7*ba736c79SDavid van Moolenbroek 
8*ba736c79SDavid van Moolenbroek #define PUFFS_MAX_ARGS 20
9*ba736c79SDavid van Moolenbroek 
10*ba736c79SDavid van Moolenbroek /*===========================================================================*
11*ba736c79SDavid van Moolenbroek  *		            sef_cb_init_fresh                                *
12*ba736c79SDavid van Moolenbroek  *===========================================================================*/
sef_cb_init_fresh(int type,sef_init_info_t * info)13*ba736c79SDavid van Moolenbroek static int sef_cb_init_fresh(int type, sef_init_info_t *info)
14*ba736c79SDavid van Moolenbroek {
15*ba736c79SDavid van Moolenbroek /* Initialize the Minix file server. */
16*ba736c79SDavid van Moolenbroek   return(OK);
17*ba736c79SDavid van Moolenbroek }
18*ba736c79SDavid van Moolenbroek 
19*ba736c79SDavid van Moolenbroek /*===========================================================================*
20*ba736c79SDavid van Moolenbroek  *		           sef_cb_signal_handler                             *
21*ba736c79SDavid van Moolenbroek  *===========================================================================*/
sef_cb_signal_handler(int signo)22*ba736c79SDavid van Moolenbroek static void sef_cb_signal_handler(int signo)
23*ba736c79SDavid van Moolenbroek {
24*ba736c79SDavid van Moolenbroek   /* Only check for termination signal, ignore anything else. */
25*ba736c79SDavid van Moolenbroek   if (signo != SIGTERM) return;
26*ba736c79SDavid van Moolenbroek 
27*ba736c79SDavid van Moolenbroek   exitsignaled = 1;
28*ba736c79SDavid van Moolenbroek   if (mounted)
29*ba736c79SDavid van Moolenbroek 	fs_sync();
30*ba736c79SDavid van Moolenbroek 
31*ba736c79SDavid van Moolenbroek   sef_cancel();
32*ba736c79SDavid van Moolenbroek }
33*ba736c79SDavid van Moolenbroek 
34*ba736c79SDavid van Moolenbroek /*===========================================================================*
35*ba736c79SDavid van Moolenbroek  *			       sef_local_startup			     *
36*ba736c79SDavid van Moolenbroek  *===========================================================================*/
sef_local_startup(void)37*ba736c79SDavid van Moolenbroek static void sef_local_startup(void)
38*ba736c79SDavid van Moolenbroek {
39*ba736c79SDavid van Moolenbroek   /* Register init callbacks. */
40*ba736c79SDavid van Moolenbroek   sef_setcb_init_fresh(sef_cb_init_fresh);
41*ba736c79SDavid van Moolenbroek 
42*ba736c79SDavid van Moolenbroek   /* Register signal callbacks. */
43*ba736c79SDavid van Moolenbroek   sef_setcb_signal_handler(sef_cb_signal_handler);
44*ba736c79SDavid van Moolenbroek 
45*ba736c79SDavid van Moolenbroek   /* Let SEF perform startup. */
46*ba736c79SDavid van Moolenbroek   sef_startup();
47*ba736c79SDavid van Moolenbroek }
48*ba736c79SDavid van Moolenbroek 
49*ba736c79SDavid van Moolenbroek /*===========================================================================*
50*ba736c79SDavid van Moolenbroek  *				get_work				     *
51*ba736c79SDavid van Moolenbroek  *===========================================================================*/
get_work(message * msg,int * ipc_status)52*ba736c79SDavid van Moolenbroek static int get_work(message *msg, int *ipc_status)
53*ba736c79SDavid van Moolenbroek {
54*ba736c79SDavid van Moolenbroek   int r;
55*ba736c79SDavid van Moolenbroek 
56*ba736c79SDavid van Moolenbroek   for (;;) {
57*ba736c79SDavid van Moolenbroek 	if ((r = sef_receive_status(ANY, msg, ipc_status)) != OK) {
58*ba736c79SDavid van Moolenbroek 		if (r == EINTR) /* sef_cancel from signal handler? */
59*ba736c79SDavid van Moolenbroek 			break; /* see if we can exit the main loop */
60*ba736c79SDavid van Moolenbroek 		panic("sef_receive failed: %d", r);
61*ba736c79SDavid van Moolenbroek 	}
62*ba736c79SDavid van Moolenbroek 	if (msg->m_source == VFS_PROC_NR)
63*ba736c79SDavid van Moolenbroek 		break;
64*ba736c79SDavid van Moolenbroek 	lpuffs_debug("libpuffs: unexpected source %d\n", msg->m_source);
65*ba736c79SDavid van Moolenbroek   }
66*ba736c79SDavid van Moolenbroek 
67*ba736c79SDavid van Moolenbroek   return r;
68*ba736c79SDavid van Moolenbroek }
69*ba736c79SDavid van Moolenbroek 
70*ba736c79SDavid van Moolenbroek int __wrap_main(int argc, char *argv[]);
71*ba736c79SDavid van Moolenbroek int __real_main(int argc, char* argv[]);
72*ba736c79SDavid van Moolenbroek 
__wrap_main(int argc,char * argv[])73*ba736c79SDavid van Moolenbroek int __wrap_main(int argc, char *argv[])
74*ba736c79SDavid van Moolenbroek {
75*ba736c79SDavid van Moolenbroek   int i;
76*ba736c79SDavid van Moolenbroek   int new_argc = 0;
77*ba736c79SDavid van Moolenbroek   static char* new_argv[PUFFS_MAX_ARGS];
78*ba736c79SDavid van Moolenbroek   char *name;
79*ba736c79SDavid van Moolenbroek 
80*ba736c79SDavid van Moolenbroek   /* SEF local startup. */
81*ba736c79SDavid van Moolenbroek   env_setargs(argc, argv);
82*ba736c79SDavid van Moolenbroek   sef_local_startup();
83*ba736c79SDavid van Moolenbroek 
84*ba736c79SDavid van Moolenbroek   global_kcred.pkcr_type = PUFFCRED_TYPE_INTERNAL;
85*ba736c79SDavid van Moolenbroek 
86*ba736c79SDavid van Moolenbroek   if (argc < 3) {
87*ba736c79SDavid van Moolenbroek 	panic("Unexpected arguments, use:\
88*ba736c79SDavid van Moolenbroek 		mount -t fs /dev/ /dir [-o option1,option2]\n");
89*ba736c79SDavid van Moolenbroek   }
90*ba736c79SDavid van Moolenbroek 
91*ba736c79SDavid van Moolenbroek   name = argv[0] + strlen(argv[0]);
92*ba736c79SDavid van Moolenbroek   while (*name != '/' && name != argv[0])
93*ba736c79SDavid van Moolenbroek 	  name--;
94*ba736c79SDavid van Moolenbroek   if (name != argv[0])
95*ba736c79SDavid van Moolenbroek 	  name++;
96*ba736c79SDavid van Moolenbroek   strcpy(fs_name, name);
97*ba736c79SDavid van Moolenbroek 
98*ba736c79SDavid van Moolenbroek   new_argv[new_argc] = argv[0];
99*ba736c79SDavid van Moolenbroek   new_argc++;
100*ba736c79SDavid van Moolenbroek 
101*ba736c79SDavid van Moolenbroek   for (i = 1; i < argc; i++) {
102*ba736c79SDavid van Moolenbroek 	if (new_argc >= PUFFS_MAX_ARGS) {
103*ba736c79SDavid van Moolenbroek 		panic("Too many arguments, change PUFFS_MAX_ARGS");
104*ba736c79SDavid van Moolenbroek 	}
105*ba736c79SDavid van Moolenbroek 	new_argv[new_argc] = argv[i];
106*ba736c79SDavid van Moolenbroek 	new_argc++;
107*ba736c79SDavid van Moolenbroek   }
108*ba736c79SDavid van Moolenbroek 
109*ba736c79SDavid van Moolenbroek   assert(new_argc > 0);
110*ba736c79SDavid van Moolenbroek 
111*ba736c79SDavid van Moolenbroek   /* Get the mount request from VFS, so we can deal with it later. */
112*ba736c79SDavid van Moolenbroek   (void)get_work(&fs_msg, &fs_ipc_status);
113*ba736c79SDavid van Moolenbroek   fs_pending = TRUE;
114*ba736c79SDavid van Moolenbroek 
115*ba736c79SDavid van Moolenbroek   return __real_main(new_argc, new_argv);
116*ba736c79SDavid van Moolenbroek }
117*ba736c79SDavid van Moolenbroek 
118*ba736c79SDavid van Moolenbroek /*
119*ba736c79SDavid van Moolenbroek  * Receive a message unless one was already pending.  Process the message, and
120*ba736c79SDavid van Moolenbroek  * send a reply if necessary.  Return whether puffs should keep running.
121*ba736c79SDavid van Moolenbroek  */
122*ba736c79SDavid van Moolenbroek int
lpuffs_pump(void)123*ba736c79SDavid van Moolenbroek lpuffs_pump(void)
124*ba736c79SDavid van Moolenbroek {
125*ba736c79SDavid van Moolenbroek 
126*ba736c79SDavid van Moolenbroek 	if (fs_pending == TRUE || get_work(&fs_msg, &fs_ipc_status) == OK) {
127*ba736c79SDavid van Moolenbroek 		fs_pending = FALSE;
128*ba736c79SDavid van Moolenbroek 
129*ba736c79SDavid van Moolenbroek 		fsdriver_process(&puffs_table, &fs_msg, fs_ipc_status, FALSE);
130*ba736c79SDavid van Moolenbroek 	}
131*ba736c79SDavid van Moolenbroek 
132*ba736c79SDavid van Moolenbroek 	return mounted || !exitsignaled;
133*ba736c79SDavid van Moolenbroek }
134*ba736c79SDavid van Moolenbroek 
135*ba736c79SDavid van Moolenbroek /*
136*ba736c79SDavid van Moolenbroek  * Initialize MINIX3-specific settings.
137*ba736c79SDavid van Moolenbroek  */
138*ba736c79SDavid van Moolenbroek void
lpuffs_init(struct puffs_usermount * pu)139*ba736c79SDavid van Moolenbroek lpuffs_init(struct puffs_usermount * pu)
140*ba736c79SDavid van Moolenbroek {
141*ba736c79SDavid van Moolenbroek 
142*ba736c79SDavid van Moolenbroek 	buildpath = pu->pu_flags & PUFFS_FLAG_BUILDPATH; /* XXX */
143*ba736c79SDavid van Moolenbroek 
144*ba736c79SDavid van Moolenbroek 	LIST_INIT(&pu->pu_pnode_removed_lst);
145*ba736c79SDavid van Moolenbroek 
146*ba736c79SDavid van Moolenbroek 	global_pu = pu;
147*ba736c79SDavid van Moolenbroek }
148