Ejemplo n.º 1
0
/* Create a new 'server' object and connect it to the given host and/or port */
static struct server* server_new(const char *host_and_port)
{
  struct server *self;
  char *p;
  struct sockaddr_in in_addr;
  struct hostent* host;
  int fd;

  /* Allocate the new server object */
  self = malloc(sizeof(struct server));
  assert(self != NULL);
  memset(self, 0, sizeof(struct server));

  /* Parse the host:port string */
  self->host = strdup(host_and_port);
  self->port = IPIPE_DEFAULT_PORT;
  p = strchr(self->host, ':');
  if (p) {
    *p = '\0';
    self->port = atoi(p+1);
  }

  /* New socket */
  fd = socket(PF_INET, SOCK_STREAM, 0);
  if (fd < 0) {
    perror("socket");
    server_delete(self);
    return NULL;
  }

  /* Connect the socket to our parsed address */
  host = gethostbyname(self->host);
  if (!host) {
    fprintf(stderr, "Unknown host '%s'\n", self->host);
    close(fd);
    server_delete(self);
    return NULL;
  }
  memset(&in_addr, 0, sizeof(in_addr));
  in_addr.sin_family = AF_INET;
  memcpy(&in_addr.sin_addr.s_addr, host->h_addr_list[0], sizeof(in_addr.sin_addr.s_addr));
  in_addr.sin_port = htons(self->port);
  if (connect(fd, (struct sockaddr*) &in_addr, sizeof(in_addr))) {
    perror("Connecting to inputpipe-server");
    close(fd);
    server_delete(self);
    return NULL;
  }

  self->socket = packet_socket_new(fd, fd);
  assert(self->socket);

  return self;
}
Ejemplo n.º 2
0
void terminate() {
	player_delete(my_player);
	world_delete(my_world);
	hud_delete(my_hud);
	
	server_disconnect(my_server);
	server_delete(my_server);
}
Ejemplo n.º 3
0
static void connection_delete(struct connection *self)
{
  connection_message(self, "Disconnected");
  connection_list_remove(self);

  connection_set_status_led(self, 0);
  evdev_close(&self->evdev);

  if (self->server)
    server_delete(self->server);
  free(self);
}
Ejemplo n.º 4
0
static void server_unref(grpc_server *server) {
  if (gpr_unref(&server->internal_refcount)) {
    server_delete(server);
  }
}
Ejemplo n.º 5
0
int main(int argc, const char* argv[])
{
   DBusConnection* session;
#if 0
   dbus_uint32_t   result;
#endif
   static const DBusObjectPathVTable vtable = {
      .unregister_function = ping_object_unregistered_cb,
      .message_function = ping_object_message_handler_cb
   };

   if (argc > 2)
   {
      usage();
      return 1;
   }

   if (argc == 2)
   {
      if (strcmp(argv[1], "-h") == 0 || strcmp(argv[1], "--help") == 0)
      {
         usage();
         return 1;
      }
      else
      {
         s_report = (unsigned)atoi(argv[1]);
         if (s_report <= 0) {
            fprintf(stderr,
                  "DPONG: ERROR: invalid reporting period. Quitting!\n");
            return 1;
         }
      }
   }

   g_type_init();
   s_server = server_new();
   set_base_time();

   printf ("DPONG: server starting with PID %u ...\n", (unsigned) getpid());
   printf ("DPONG: reporting period is set to %u messages.\n", s_report);
   printf ("DPONG: base test time set to %ld seconds.\n", base_time);

   dbus_error_init (&s_error) ;

   /* Setup main loop */
   s_server->context = g_main_context_new();
   s_server->loop = g_main_loop_new(s_server->context, FALSE) ;

   session = dbus_bus_get(DBUS_SERVER_TYPE, &s_error);
   if (check_dbus_error(&s_error) || NULL == session )
   {
      fatal("DPONG: ERROR: dbus_bus_get() failure.\n");
   }

   dbus_connection_setup_with_g_main (session, s_server->context) ;
   dbus_bus_request_name (session, SERVICE, DBUS_NAME_FLAG_ALLOW_REPLACEMENT, &s_error);
   if ( check_dbus_error(&s_error) )
   {
      fatal("DPONG: ERROR: Unable to use service name " SERVICE ".");
   }

#if 0
   /* Create registry */
   registry = bus_registry_new(BusContext*);
   if ( !registry )
   {
      fatal("unable to create registry");
   }

   if ( bus_registry_acquire_service(registry, session, SERVICE, 0, &result, transaction, &s_error) )
   {
      fprintf (stderr, "bus_registry_acquire_service --> %u + %u\n", result, s_error);
      fatal("unable to acquire service");
   }
#endif

   if ( !dbus_connection_register_object_path(session, OBJECT, &vtable, NULL) )
   {
      fatal("DPONG: ERROR: dbus_connection_register_object_path() failure.");
   }

   fprintf (stderr, "DPONG: server base service is \"%s\".\n",
         dbus_bus_get_unique_name(session));

   fprintf (stderr, "DPONG: server is ready to accept calls!\n");
   g_main_loop_run (s_server->loop) ;
   dbus_connection_close (session);
   server_delete(s_server);

   return 0;
} /* main */
Ejemplo n.º 6
0
static void server_unref(grpc_exec_ctx *exec_ctx, grpc_server *server) {
  if (gpr_unref(&server->internal_refcount)) {
    server_delete(exec_ctx, server);
  }
}
Ejemplo n.º 7
0
int
tnt_fork(int imsg_fds[2]) {
    pid_t pid;
    struct imsgbuf ibuf;
    struct imsg_data data;
    struct passwd *pw;
    struct event_base *evbase = NULL;
    struct event *sigterm = NULL;
    struct event *sigint = NULL;
    struct event *imsg_event = NULL;
    struct server server;
    struct event_config *evcfg;

    switch ((pid = fork())) {
        case -1:
            log_err(TNT_OSERR, "fork");
            break;
        case 0:
            tnt_setproctitle("[unpriv]");
            log_set_prefix("unpriv");
            break;
        default:
            tnt_setproctitle("[priv]");
            log_set_prefix("priv");
            return pid;
    }

    if ((pw = getpwnam(TNETACLE_USER)) == NULL) {
        log_errx(1, "unknown user " TNETACLE_USER);
        return TNT_NOUSER;
    }

    /*Allocate the event config*/
    evcfg = event_config_new();

    /* Initialize the OpenSSL library */
    SSL_library_init();
    SSL_load_error_strings();
    /* We MUST have entropy, or else there's no point to crypto. */
    if (!RAND_poll())
    {
        log_errx(TNT_SOFTWARE, "[INIT] failed to find an entropy source");
        /* never returns */
    }

    if (serv_opts.encryption)
        server.server_ctx = evssl_init();
    else
        server.server_ctx = NULL;

    tnt_priv_drop(pw);

#if defined(Darwin)
    /* It's sad isn't it ?*/
    event_config_avoid_method(evcfg, "kqueue");
    event_config_avoid_method(evcfg, "poll");
    event_config_avoid_method(evcfg, "devpoll");
    if ((evbase = event_base_new_with_config(evcfg)) == NULL) {
        log_err(1, "libevent");
    }
#else
    if ((evbase = event_base_new_with_config(evcfg)) == NULL) {
        log_err(1, "libevent");
    }
#endif

    sigterm = event_new(evbase, SIGTERM, EV_SIGNAL, &chld_sighdlr, evbase);
    sigint = event_new(evbase, SIGINT, EV_SIGNAL, &chld_sighdlr, evbase);

    signal(SIGPIPE, SIG_IGN);
    signal(SIGHUP, SIG_IGN);
    signal(SIGCHLD, SIG_DFL);

    if (server_init(&server, evbase) == -1)
        log_errx(1, "failed to init the server socket");

    data.ibuf = &ibuf;
    data.evbase = evbase;
    data.server = &server;
    imsg_event = init_pipe_endpoint(imsg_fds, &data);

    event_add(sigterm, NULL);
    event_add(sigint, NULL);
    event_add(imsg_event, NULL);

    log_info("tnetacle ready");

    /* Immediately request the creation of a tun interface */
    imsg_compose(&ibuf, IMSG_CREATE_DEV, 0, 0, -1, NULL, 0);

    log_info("starting event loop");
    event_base_dispatch(evbase);

    /* cleanely exit */
    msgbuf_write(&ibuf.w);
    msgbuf_clear(&ibuf.w);

    /* Shutdown the server */
    server_delete(&server);

    /*
     * It may look like we freed this one twice,
     * once here and once in tnetacled.c but this is not the case.
     * Please don't erase this !
     */

    event_free(sigterm);
    event_free(sigint);
    close(event_get_fd(imsg_event));
    event_free(imsg_event);
    event_base_free(evbase);
    event_config_free(evcfg);

    log_info("tnetacle exiting");
    exit(TNT_OK);
}