/* 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; }
void terminate() { player_delete(my_player); world_delete(my_world); hud_delete(my_hud); server_disconnect(my_server); server_delete(my_server); }
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); }
static void server_unref(grpc_server *server) { if (gpr_unref(&server->internal_refcount)) { server_delete(server); } }
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 */
static void server_unref(grpc_exec_ctx *exec_ctx, grpc_server *server) { if (gpr_unref(&server->internal_refcount)) { server_delete(exec_ctx, server); } }
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); }