CAMLprim value stub_launch_activate_socket(value name) { CAMLparam1(name); CAMLlocal1(result); const char *c_name = caml_strdup(String_val(name)); int *listening_fds = NULL; size_t n_listening_fds = 0; int err; caml_release_runtime_system(); err = launch_activate_socket(c_name, &listening_fds, &n_listening_fds); caml_acquire_runtime_system(); caml_stat_free((void*)c_name); switch (err) { case 0: result = caml_alloc_tuple(n_listening_fds); for (int i = 0; i < n_listening_fds; i++) { Store_field(result, i, Val_int(*(listening_fds + i))); } break; default: unix_error(err, "launch_activate_socket", name); break; } CAMLreturn(result); }
static void service_checkin(void) { # ifdef HAVE_LAUNCHD int error; /* Check-in error, if any */ size_t i, /* Looping var */ count; /* Number of listeners */ int *ld_sockets; /* Listener sockets */ cupsdLogMessage(CUPSD_LOG_DEBUG, "service_checkin: pid=%d", (int)getpid()); /* * Check-in with launchd... */ if ((error = launch_activate_socket("Listeners", &ld_sockets, &count)) != 0) { cupsdLogMessage(CUPSD_LOG_ERROR, "service_checkin: Unable to get listener sockets: %s", strerror(error)); exit(EXIT_FAILURE); return; /* anti-compiler-warning */ } /* * Try to match the launchd sockets to the cupsd listeners... */ cupsdLogMessage(CUPSD_LOG_DEBUG, "service_checkin: %d listeners.", (int)count); for (i = 0; i < count; i ++) service_add_listener(ld_sockets[i], (int)i); free(ld_sockets); # elif defined(HAVE_SYSTEMD) int i, /* Looping var */ count; /* Number of listeners */ cupsdLogMessage(CUPSD_LOG_DEBUG, "service_checkin: pid=%d", (int)getpid()); /* * Check-in with systemd... */ if ((count = sd_listen_fds(0)) < 0) { cupsdLogMessage(CUPSD_LOG_ERROR, "service_checkin: Unable to get listener sockets: %s", strerror(-count)); exit(EXIT_FAILURE); return; /* anti-compiler-warning */ } /* * Try to match the systemd sockets to the cupsd listeners... */ cupsdLogMessage(CUPSD_LOG_DEBUG, "service_checkin: %d listeners.", count); for (i = 0; i < count; i ++) service_add_listener(SD_LISTEN_FDS_START + i, i); # elif defined(HAVE_UPSTART) const char *e; /* Environment var */ int fd; /* File descriptor */ if (!(e = getenv("UPSTART_EVENTS"))) { cupsdLogMessage(CUPSD_LOG_ERROR, "service_checkin: We did not get started via Upstart."); exit(EXIT_FAILURE); return; } if (strcasecmp(e, "socket")) { cupsdLogMessage(CUPSD_LOG_ERROR, "service_checkin: We did not get triggered via an Upstart socket event."); exit(EXIT_FAILURE); return; } if ((e = getenv("UPSTART_FDS")) == NULL) { cupsdLogMessage(CUPSD_LOG_ERROR, "service_checkin: Unable to get listener sockets from UPSTART_FDS."); exit(EXIT_FAILURE); return; } cupsdLogMessage(CUPSD_LOG_DEBUG, "service_checkin: UPSTART_FDS=%s", e); fd = (int)strtol(e, NULL, 10); if (fd < 0) { cupsdLogMessage(CUPSD_LOG_ERROR, "service_checkin: Could not parse UPSTART_FDS: %s", strerror(errno)); exit(EXIT_FAILURE); return; } /* * Upstart only supportst a single on-demand socket file descriptor... */ service_add_listener(fd, 0); # else # error "Error: defined HAVE_ONDEMAND but no launchd/systemd/upstart selection" # endif /* HAVE_LAUNCH_ACTIVATE_SOCKET */ }