-
- /* check state */
- if (desc->service != NULL) {
- /* not an error when onneed */
- if (onneed != 0)
- goto done;
-
- /* already started: it is an error */
- ERROR("Service %s already started", desc->ditf.api);
- return -1;
- }
-
- /* get the initialisation */
- start = desc->binding->init;
- onevent = desc->binding->onevent;
- if (start == NULL && onevent == NULL) {
- /* not an error when onneed */
- if (onneed != 0)
- goto done;
-
- /* no initialisation method */
- ERROR("Binding %s is not a service", desc->ditf.api);
- return -1;
- }
-
- /* get the event handler if any */
- desc->service = afb_svc_create(desc->ditf.api, apiset, share_session, onevent, &desc->data->service);
- if (desc->service == NULL) {
- /* starting error */
- ERROR("Starting service %s failed", desc->ditf.api);
- return -1;
- }
-
- /* Starts the service */
- desc->ditf.state = Daemon_Init;
- rc = afb_svc_start_v2(desc->service, start);
- if (rc < 0) {
- /* initialisation error */
- ERROR("Initialisation of service %s failed (%d): %m", desc->ditf.api, rc);
- afb_svc_destroy(desc->service, &desc->data->service);
- desc->service = NULL;
- return rc;
- }
-
-done:
- desc->ditf.state = Daemon_Run;
- return 0;