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