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