Changeset 241f1985 in mainline for uspace/srv/sysman/connection_ctl.c
- Timestamp:
- 2019-08-31T10:45:17Z (6 years ago)
- Children:
- 102f641
- Parents:
- f92b315
- git-author:
- Matthieu Riolo <matthieu.riolo@…> (2019-08-23 22:04:34)
- git-committer:
- Matthieu Riolo <matthieu.riolo@…> (2019-08-31 10:45:17)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/srv/sysman/connection_ctl.c
rf92b315 r241f1985 43 43 44 44 // TODO possibly provide as type-safe function + macro in sysman.h for generic boxing 45 static ipc_call id_t *box_callid(ipc_callid_t iid)46 { 47 ipc_call id_t *result = malloc(sizeof(ipc_callid_t));48 if ( result) {49 *result = iid;50 } 51 return result;45 static ipc_call_t *box_callid(ipc_call_t *icall) 46 { 47 ipc_call_t *copy = malloc(sizeof(ipc_call_t)); 48 if (copy) { 49 memcpy(copy, icall, sizeof(ipc_call_t)); 50 } 51 return copy; 52 52 } 53 53 … … 58 58 assert(job->retval != JOB_UNDEFINED_); 59 59 60 ipc_call id_t *iid_ptr= arg;60 ipc_call_t *icall = arg; 61 61 // TODO use descriptive return value (probably refactor job retval) 62 62 sysarg_t retval = (job->retval == JOB_OK) ? EOK : EIO; 63 async_answer_0( *iid_ptr, retval);64 free(i id_ptr);63 async_answer_0(icall, retval); 64 free(icall); 65 65 job_del_ref(&job); 66 66 } 67 67 68 static void sysman_unit_handle(ipc_call id_t iid, ipc_call_t *icall)68 static void sysman_unit_handle(ipc_call_t *icall) 69 69 { 70 70 char *unit_name = NULL; … … 84 84 } 85 85 86 async_answer_1(i id, EOK, unit->handle);86 async_answer_1(icall, EOK, unit->handle); 87 87 goto finish; 88 88 89 89 fail: 90 async_answer_0(i id, retval);90 async_answer_0(icall, retval); 91 91 finish: 92 92 free(unit_name); 93 93 } 94 94 95 static void sysman_unit_start_by_name(ipc_call id_t iid, ipc_call_t *icall)95 static void sysman_unit_start_by_name(ipc_call_t *icall) 96 96 { 97 97 char *unit_name = NULL; … … 105 105 } 106 106 107 int flags = IPC_GET_ARG1(*icall);107 int flags = ipc_get_arg1(icall); 108 108 sysman_log(LVL_DEBUG2, "%s(%s, %x)", __func__, unit_name, flags); 109 109 … … 120 120 } 121 121 122 ipc_call id_t *iid_ptr = box_callid(iid);123 if (i id_ptr== NULL) {122 ipc_call_t *icall_copy = box_callid(icall); 123 if (icall_copy == NULL) { 124 124 retval = ENOMEM; 125 125 goto answer; 126 126 } 127 127 retval = sysman_run_job(unit, STATE_STARTED, 0, &answer_callback, 128 i id_ptr);128 icall_copy); 129 129 if (retval != EOK) { 130 130 goto answer; … … 135 135 136 136 answer: 137 async_answer_0(i id, retval);137 async_answer_0(icall, retval); 138 138 finish: 139 139 free(unit_name); 140 140 } 141 141 142 static void sysman_unit_operation(ipc_callid_t iid, ipc_call_t *icall, 143 unit_state_t state) 142 static void sysman_unit_operation(ipc_call_t *icall, unit_state_t state) 144 143 { 145 144 sysarg_t retval; 146 145 147 unit_handle_t handle = IPC_GET_ARG1(*icall);148 int flags = IPC_GET_ARG2(*icall);149 sysman_log(LVL_DEBUG2, "%s(% i, %x, %i)", __func__,handle, flags, state);146 unit_handle_t handle = ipc_get_arg1(icall); 147 sysarg_t flags = ipc_get_arg2(icall); 148 sysman_log(LVL_DEBUG2, "%s(%p, %lx, %i)", __func__, icall->cap_handle, flags, state); 150 149 151 150 unit_t *unit = repo_find_unit_by_handle(handle); … … 160 159 } 161 160 162 ipc_call id_t *iid_ptr = box_callid(iid);163 if (i id_ptr== NULL) {161 ipc_call_t *icall_copy = box_callid(icall); 162 if (icall_copy == NULL) { 164 163 retval = ENOMEM; 165 164 goto answer; 166 165 } 167 166 retval = sysman_run_job(unit, state, 0, &answer_callback, 168 i id_ptr);167 icall_copy); 169 168 if (retval != EOK) { 170 169 goto answer; … … 175 174 176 175 answer: 177 async_answer_0(i id, retval);178 } 179 180 static void sysman_unit_start(ipc_call id_t iid, ipc_call_t *icall)181 { 182 sysman_unit_operation(i id, icall, STATE_STARTED);183 } 184 185 static void sysman_unit_stop(ipc_call id_t iid, ipc_call_t *icall)186 { 187 sysman_unit_operation(i id, icall, STATE_STOPPED);176 async_answer_0(icall, retval); 177 } 178 179 static void sysman_unit_start(ipc_call_t *icall) 180 { 181 sysman_unit_operation(icall, STATE_STARTED); 182 } 183 184 static void sysman_unit_stop(ipc_call_t *icall) 185 { 186 sysman_unit_operation(icall, STATE_STOPPED); 188 187 } 189 188 … … 210 209 } 211 210 212 static void sysman_get_units(ipc_call id_t iid, ipc_call_t *icall)213 { 214 ipc_call id_t callid;211 static void sysman_get_units(ipc_call_t *icall) 212 { 213 ipc_call_t call; 215 214 size_t size; 216 215 size_t act_size; 217 216 int rc; 218 217 219 if (!async_data_read_receive(&call id, &size)) {220 async_answer_0( callid, EREFUSED);221 async_answer_0(i id, EREFUSED);218 if (!async_data_read_receive(&call, &size)) { 219 async_answer_0(&call, EREFUSED); 220 async_answer_0(icall, EREFUSED); 222 221 return; 223 222 } … … 226 225 unit_handle_t *handles = malloc(size); 227 226 if (handles == NULL && size > 0) { 228 async_answer_0( callid, ENOMEM);229 async_answer_0(i id, ENOMEM);227 async_answer_0(&call, ENOMEM); 228 async_answer_0(icall, ENOMEM); 230 229 return; 231 230 } … … 234 233 rc = fill_handles_buffer(handles, size, &act_size); 235 234 if (rc != EOK) { 236 async_answer_0( callid, rc);237 async_answer_0(i id, rc);235 async_answer_0(&call, rc); 236 async_answer_0(icall, rc); 238 237 return; 239 238 } 240 239 241 240 size_t real_size = min(act_size, size); 242 sysarg_t retval = async_data_read_finalize( callid, handles, real_size);241 sysarg_t retval = async_data_read_finalize(&call, handles, real_size); 243 242 free(handles); 244 243 245 async_answer_1(i id, retval, act_size);246 } 247 248 static void sysman_unit_get_name(ipc_call id_t iid, ipc_call_t *icall)249 { 250 ipc_call id_t callid;244 async_answer_1(icall, retval, act_size); 245 } 246 247 static void sysman_unit_get_name(ipc_call_t *icall) 248 { 249 ipc_call_t call; 251 250 size_t size; 252 251 253 if (!async_data_read_receive(&call id, &size)) {254 async_answer_0( callid, EREFUSED);255 async_answer_0(i id, EREFUSED);256 return; 257 } 258 259 unit_t *u = repo_find_unit_by_handle( IPC_GET_ARG1(*icall));252 if (!async_data_read_receive(&call, &size)) { 253 async_answer_0(&call, EREFUSED); 254 async_answer_0(icall, EREFUSED); 255 return; 256 } 257 258 unit_t *u = repo_find_unit_by_handle(ipc_get_arg1(icall)); 260 259 if (u == NULL) { 261 async_answer_0( callid, ENOENT);262 async_answer_0(i id, ENOENT);260 async_answer_0(&call, ENOENT); 261 async_answer_0(icall, ENOENT); 263 262 return; 264 263 } 265 264 266 265 size_t real_size = min(str_size(u->name) + 1, size); 267 sysarg_t retval = async_data_read_finalize( callid, u->name, real_size);268 269 async_answer_0(i id, retval);270 } 271 272 static void sysman_unit_get_state(ipc_call id_t iid, ipc_call_t *icall)273 { 274 unit_t *u = repo_find_unit_by_handle( IPC_GET_ARG1(*icall));266 sysarg_t retval = async_data_read_finalize(&call, u->name, real_size); 267 268 async_answer_0(icall, retval); 269 } 270 271 static void sysman_unit_get_state(ipc_call_t *icall) 272 { 273 unit_t *u = repo_find_unit_by_handle(ipc_get_arg1(icall)); 275 274 if (u == NULL) { 276 async_answer_0(i id, ENOENT);275 async_answer_0(icall, ENOENT); 277 276 } else { 278 async_answer_1(i id, EOK, u->state);279 } 280 } 281 282 static void sysman_shutdown(ipc_call id_t iid, ipc_call_t *icall)283 { 284 int retval;277 async_answer_1(icall, EOK, u->state); 278 } 279 } 280 281 static void sysman_shutdown(ipc_call_t *icall) 282 { 283 errno_t retval; 285 284 unit_t *u = repo_find_unit_by_name(TARGET_SHUTDOWN); 286 285 if (u == NULL) { … … 293 292 294 293 finish: 295 async_answer_0(i id, retval);296 } 297 298 void sysman_connection_ctl(ipc_call id_t iid, ipc_call_t *icall)294 async_answer_0(icall, retval); 295 } 296 297 void sysman_connection_ctl(ipc_call_t *icall) 299 298 { 300 299 sysman_log(LVL_DEBUG2, "%s", __func__); 301 300 /* First, accept connection */ 302 async_answer_0(i id, EOK);301 async_answer_0(icall, EOK); 303 302 304 303 while (true) { 305 304 ipc_call_t call; 306 ipc_callid_t callid = async_get_call(&call); 307 308 if (!IPC_GET_IMETHOD(call)) { 305 306 if (!async_get_call(&call) || !ipc_get_imethod(&call)) { 309 307 /* Client disconnected */ 310 308 break; 311 309 } 312 310 313 switch ( IPC_GET_IMETHOD(call)) {311 switch (ipc_get_imethod(&call)) { 314 312 case SYSMAN_CTL_UNIT_HANDLE: 315 sysman_unit_handle( callid,&call);313 sysman_unit_handle(&call); 316 314 break; 317 315 case SYSMAN_CTL_UNIT_START_BY_NAME: 318 sysman_unit_start_by_name( callid,&call);316 sysman_unit_start_by_name(&call); 319 317 break; 320 318 case SYSMAN_CTL_UNIT_START: 321 sysman_unit_start( callid,&call);319 sysman_unit_start(&call); 322 320 break; 323 321 case SYSMAN_CTL_UNIT_STOP: 324 sysman_unit_stop( callid,&call);322 sysman_unit_stop(&call); 325 323 break; 326 324 case SYSMAN_CTL_GET_UNITS: 327 sysman_get_units( callid,&call);325 sysman_get_units(&call); 328 326 break; 329 327 case SYSMAN_CTL_UNIT_GET_NAME: 330 sysman_unit_get_name( callid,&call);328 sysman_unit_get_name(&call); 331 329 break; 332 330 case SYSMAN_CTL_UNIT_GET_STATE: 333 sysman_unit_get_state( callid,&call);331 sysman_unit_get_state(&call); 334 332 break; 335 333 case SYSMAN_CTL_SHUTDOWN: 336 sysman_shutdown( callid,&call);334 sysman_shutdown(&call); 337 335 break; 338 336 default: 339 async_answer_0( callid, ENOENT);337 async_answer_0(&call, ENOENT); 340 338 } 341 339 }
Note:
See TracChangeset
for help on using the changeset viewer.