Пример #1
0
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);
}
Пример #2
0
Файл: main.c Проект: apple/cups
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 */
}