pkgin_all: script to auto-install all packages
[minix.git] / lib / libsys / sef_init.c
blob049009ccd450c54d52e418986ff0434873447161
1 #include "syslib.h"
2 #include <assert.h>
3 #include <unistd.h>
4 #include <minix/sysutil.h>
6 /* SEF Init callbacks. */
7 static struct sef_cbs {
8 sef_cb_init_t sef_cb_init_fresh;
9 sef_cb_init_t sef_cb_init_lu;
10 sef_cb_init_t sef_cb_init_restart;
11 sef_cb_init_response_t sef_cb_init_response;
12 } sef_cbs = {
13 SEF_CB_INIT_FRESH_DEFAULT,
14 SEF_CB_INIT_LU_DEFAULT,
15 SEF_CB_INIT_RESTART_DEFAULT,
16 SEF_CB_INIT_RESPONSE_DEFAULT
19 /* SEF Init prototypes for sef_startup(). */
20 int do_sef_rs_init(endpoint_t old_endpoint);
21 int do_sef_init_request(message *m_ptr);
23 /* Debug. */
24 EXTERN char* sef_debug_header(void);
26 /* Information about SELF. */
27 EXTERN endpoint_t sef_self_endpoint;
28 EXTERN endpoint_t sef_self_priv_flags;
30 /*===========================================================================*
31 * process_init *
32 *===========================================================================*/
33 static int process_init(int type, sef_init_info_t *info)
35 /* Process initialization. */
36 int r, result;
37 message m;
39 /* Debug. */
40 #if SEF_INIT_DEBUG
41 sef_init_debug_begin();
42 sef_init_dprint("%s. Got a SEF Init request of type: %d. About to init.\n",
43 sef_debug_header(), type);
44 sef_init_debug_end();
45 #endif
47 /* Let the callback code handle the specific initialization type. */
48 switch(type) {
49 case SEF_INIT_FRESH:
50 result = sef_cbs.sef_cb_init_fresh(type, info);
51 break;
52 case SEF_INIT_LU:
53 result = sef_cbs.sef_cb_init_lu(type, info);
54 break;
55 case SEF_INIT_RESTART:
56 result = sef_cbs.sef_cb_init_restart(type, info);
57 break;
59 default:
60 /* Not a valid SEF init type. */
61 result = EINVAL;
62 break;
65 m.m_source = sef_self_endpoint;
66 m.m_type = RS_INIT;
67 m.RS_INIT_RESULT = result;
68 r = sef_cbs.sef_cb_init_response(&m);
70 return r;
73 /*===========================================================================*
74 * do_sef_rs_init *
75 *===========================================================================*/
76 int do_sef_rs_init(endpoint_t old_endpoint)
78 /* Special SEF Init for RS. */
79 int r;
80 int type;
81 sef_init_info_t info;
83 /* Get init parameters from SEF. */
84 type = SEF_INIT_FRESH;
85 if(sef_self_priv_flags & LU_SYS_PROC) {
86 type = SEF_INIT_LU;
88 else if(sef_self_priv_flags & RST_SYS_PROC) {
89 type = SEF_INIT_RESTART;
91 info.rproctab_gid = -1;
92 info.endpoint = sef_self_endpoint;
93 info.old_endpoint = old_endpoint;
95 /* Peform initialization. */
96 r = process_init(type, &info);
98 return r;
101 /*===========================================================================*
102 * do_sef_init_request *
103 *===========================================================================*/
104 int do_sef_init_request(message *m_ptr)
106 /* Handle a SEF Init request. */
107 int r;
108 int type;
109 sef_init_info_t info;
111 /* Get init parameters from message. */
112 type = m_ptr->RS_INIT_TYPE;
113 info.rproctab_gid = m_ptr->RS_INIT_RPROCTAB_GID;
114 info.endpoint = sef_self_endpoint;
115 info.old_endpoint = m_ptr->RS_INIT_OLD_ENDPOINT;
117 /* Peform initialization. */
118 r = process_init(type, &info);
120 return r;
123 /*===========================================================================*
124 * sef_setcb_init_fresh *
125 *===========================================================================*/
126 void sef_setcb_init_fresh(sef_cb_init_t cb)
128 assert(cb != NULL);
129 sef_cbs.sef_cb_init_fresh = cb;
132 /*===========================================================================*
133 * sef_setcb_init_lu *
134 *===========================================================================*/
135 void sef_setcb_init_lu(sef_cb_init_t cb)
137 assert(cb != NULL);
138 sef_cbs.sef_cb_init_lu = cb;
141 /*===========================================================================*
142 * sef_setcb_init_restart *
143 *===========================================================================*/
144 void sef_setcb_init_restart(sef_cb_init_t cb)
146 assert(cb != NULL);
147 sef_cbs.sef_cb_init_restart = cb;
150 /*===========================================================================*
151 * sef_setcb_init_response *
152 *===========================================================================*/
153 void sef_setcb_init_response(sef_cb_init_response_t cb)
155 assert(cb != NULL);
156 sef_cbs.sef_cb_init_response = cb;
159 /*===========================================================================*
160 * sef_cb_init_null *
161 *===========================================================================*/
162 int sef_cb_init_null(int UNUSED(type),
163 sef_init_info_t *UNUSED(info))
165 return OK;
168 /*===========================================================================*
169 * sef_cb_init_response_null *
170 *===========================================================================*/
171 int sef_cb_init_response_null(message * UNUSED(m_ptr))
173 return ENOSYS;
176 /*===========================================================================*
177 * sef_cb_init_fail *
178 *===========================================================================*/
179 int sef_cb_init_fail(int UNUSED(type), sef_init_info_t *UNUSED(info))
181 return ENOSYS;
184 /*===========================================================================*
185 * sef_cb_init_reset *
186 *===========================================================================*/
187 int sef_cb_init_reset(int UNUSED(type), sef_init_info_t *UNUSED(info))
189 /* Tell RS to reincarnate us, with no old resources, and a new endpoint. */
190 return ERESTART;
193 /*===========================================================================*
194 * sef_cb_init_crash *
195 *===========================================================================*/
196 int sef_cb_init_crash(int UNUSED(type), sef_init_info_t *UNUSED(info))
198 panic("Simulating a crash at initialization time...");
200 return OK;
203 /*===========================================================================*
204 * sef_cb_init_response_rs_reply *
205 *===========================================================================*/
206 int sef_cb_init_response_rs_reply(message *m_ptr)
208 int r;
210 /* Inform RS that we completed initialization with the given result. */
211 r = sendrec(RS_PROC_NR, m_ptr);
213 return r;