static void export_service(struct gatt_db_attribute *attr, void *user_data)
{
	struct btd_gatt_client *client = user_data;
	struct service *service;

	if (gatt_db_service_get_claimed(attr))
		return;

	service = service_create(attr, client);
	if (!service)
		return;

	if (!create_characteristics(attr, service)) {
		error("Exporting characteristics failed");
		unregister_service(service);
		return;
	}

	queue_push_tail(client->services, service);

	/*
	 * Asynchronously update the "Characteristics" property of the service.
	 * If there are any pending reads to obtain the value of the "Extended
	 * Properties" descriptor then wait until they are complete.
	 */
	if (!service->chrcs_ready && queue_isempty(service->pending_ext_props))
		service->idle_id = g_idle_add(set_chrcs_ready, service);
}
static void cleanup_services(void)
{
	int i;

	DBG("");

	for (i = HAL_SERVICE_ID_MAX; i > HAL_SERVICE_ID_CORE; i--)
		unregister_service(i);
}
static void service_unregister(const void *buf, uint16_t len)
{
	const struct hal_cmd_unregister_module *m = buf;
	uint8_t status;

	if (!unregister_service(m->service_id)) {
		status = HAL_STATUS_FAILED;
		goto failed;
	}

	status = HAL_STATUS_SUCCESS;

	info("Service ID=%u unregistered", m->service_id);

failed:
	ipc_send_rsp(hal_ipc, HAL_SERVICE_ID_CORE, HAL_OP_UNREGISTER_MODULE,
								status);
}
int main(int argc, char *argv[])
{
        SERVICE_TABLE_ENTRY dt[] = {
                { WPASVC_NAME, service_start },
                { NULL, NULL }
        };

        if (argc > 1) {
                if (os_strcmp(argv[1], "reg") == 0) {
                        TCHAR *path;
                        int ret;

                        if (argc < 3) {
                                path = os_malloc(MAX_PATH * sizeof(TCHAR));
                                if (path == NULL)
                                        return -1;
                                if (!GetModuleFileName(NULL, path, MAX_PATH)) {
                                        printf("GetModuleFileName failed: "
                                               "%d\n", (int) GetLastError());
                                        os_free(path);
                                        return -1;
                                }
                        } else {
                                path = wpa_strdup_tchar(argv[2]);
                                if (path == NULL)
                                        return -1;
                        }
                        ret = register_service(path);
                        os_free(path);
                        return ret;
                } else if (os_strcmp(argv[1], "unreg") == 0) {
                        return unregister_service();
                } else if (os_strcmp(argv[1], "app") == 0) {
                        return wpa_supplicant_thread();
                }
        }

        if (!StartServiceCtrlDispatcher(dt)) {
                printf("StartServiceCtrlDispatcher failed: %d\n",
                       (int) GetLastError());
        }

        return 0;
}
int main (int n_args, char ** args) {
	cout << "******* Image storage server *******" << endl << endl;
	
	if (!check_server_arguments (n_args, args)) {
		cerr << "#SERVER > ERROR - Invalid argument" << endl;
		exit(-1);
	}
	if (!socket_initialization_server (&listen_socket, SP_port, (int) BACKLOG_QUEUE)) {
		cerr << "#SERVER > ERROR - Can't create a listen socket correctly" << endl;
		exit(-1);
	}
	
	
	// Registering services
	store_image = new Store_image ("store_image", SP_address, SP_port);
	get_image = new Get_image ("get_image", SP_address, SP_port);
	get_list = new Get_list ("get_list", SP_address, SP_port);
	
	cout << "#SERVER > Registering image_storage server" << endl;
	if (!register_service_provider (SP_address, SP_port)) cerr << "#SERVER > " << SPACER << "ERROR - Can't register the server" << endl;
	else {
		cout << "#SERVER > Registering store_image service" << endl;
		if (!register_service (store_image->get_description())) cerr << "#SERVER > " << SPACER << "ERROR - Can't register the store_image service" << endl;
		
		cout << "#SERVER > Registering get_image service" << endl;
		if (!register_service (get_image->get_description())) cerr << "#SERVER > " << SPACER << "ERROR - Can't register the get_image service" << endl;
	
		cout << "#SERVER > Registering get_list service" << endl;
		if (!register_service (get_list->get_description())) cerr << "#SERVER > " << SPACER << "ERROR - Can't register the get_list service" << endl;
	}
	
	// Initializing mutex
	pthread_mutex_init (&mutex_1, NULL);
	pthread_mutex_init (&mutex_2, NULL);
	pthread_mutex_init (&mutex_thread_free, NULL);
	pthread_cond_init (&cond_thread_free, NULL);
	readers_count = 0;
	
	// Creating threads
	pthread_t thread_ID;
	
	for (int i = 0; i < N_THREADS; i++) {
		if (pthread_create(&thread_ID, NULL, thread_body, (void*) i) != 0) {
			cerr << "#SERVER > ERROR - Can't create a service thread" << endl;
			exit(-1);			
		}
		thread[i].set_ID (thread_ID);
	}
	if (pthread_create(&thread_ID, NULL, control_thread_body, NULL) != 0)  {
		cerr << "#SERVER > ERROR - Can't create the control thread" << endl;
		exit(-1);			
	}
	control_thread.set_ID (thread_ID);
	
	
	cout << "\n#SERVER > Waiting for connections" << endl;
	while (control_thread.is_active()) {
		int client_socket = accept_client_connection (listen_socket);
		if (client_socket == -1)  {
			if (control_thread.is_active()) cerr << "#SERVER > ERROR - Can't accept the connection with the client" << endl;
			continue;
		}
		
		while (!assign_execution_thread (client_socket)) pthread_cond_wait (&cond_thread_free, &mutex_thread_free);
	}

	
	// Closing sockets and threads
	for (int i = 0; i < N_THREADS; i++) {
		thread[i].thread_exit();
		pthread_join(thread[i].get_ID(), NULL);
	}
	pthread_join(control_thread.get_ID(), NULL);
	
	shutdown(listen_socket, SHUT_RDWR);
	close(listen_socket);
	
	
	// Unregistering services - Only unregister_service_provider is needed
	cout << "#SERVER > Unregistering store_image service" << endl;
	if (!unregister_service (store_image->get_description())) cerr << "#SERVER > " << SPACER << "ERROR - Can't unregister the store_image service" << endl;
	delete (store_image);
	
	cout << "#SERVER > Unregistering get_image service" << endl;
	if (!unregister_service (get_image->get_description())) cerr << "#SERVER > " << SPACER << "ERROR - Can't unregister the get_image service" << endl;
	delete (get_image);
	
	cout << "#SERVER > Unregistering get_list service" << endl;
	if (!unregister_service (get_list->get_description())) cerr << "#SERVER > " << SPACER << "ERROR - Can't unregister the get_list service" << endl;
	delete (get_list);
	
	cout << "#SERVER > Unregistering image_storage server" << endl;
	if (!unregister_service_provider (SP_address, SP_port)) cerr << "#SERVER > " << SPACER << "ERROR - Can't unregister the server" << endl;
	
	
	cout << endl << "#SERVER > Server closed" << endl;
	cout << endl << "***********************" << endl;
	exit(0);
}
Exemplo n.º 6
0
int __cdecl
main(int argc, char ** argv)
{
	int i;

	SERVICE_TABLE_ENTRY serviceTable[] = 
	{ 
		{ SERVICE_NAME, (LPSERVICE_MAIN_FUNCTION) ServiceMain},
		{ NULL, NULL }
	};

	BOOL success;

	if (argc == 1)
	{
		//
		// Register with the SCM
		//
		success = StartServiceCtrlDispatcher(serviceTable);
	
		if (!success)
		{
			service_error_handler("StartServiceCtrlDispatcher", GetLastError());
			exit(0);
		}
	}
	else for (i = 1; i < argc; i++)
	{
		if (strcmp(argv[i], "-run") == 0)
		{
			g_console_event = CreateEvent(NULL, FALSE, FALSE, NULL);

			if (g_console_event == NULL)
			{
				sw_debug(SW_LOG_ERROR, "CreateEvent failed: %d\n", GetLastError());
				exit(-1);
			}

			SetConsoleCtrlHandler(console_ctrl_handler, TRUE);

			if (start_mDNSResponder() != S_OK)
			{
				exit(-1);
			}

			WaitForSingleObject(g_console_event, INFINITE);

			CloseHandle(g_console_event);

			stop_mDNSResponder();

			exit(0);
		}
		else if (strcmp(argv[i], "-install") == 0)
		{
			register_service(argc, argv);
			break;
		}
		else if (strcmp(argv[i], "-remove") == 0)
		{
			unregister_service(argc, argv);
			break;
		}
		else if (strcmp(argv[i], "-debug") == 0)
		{
			// sw_debug_enable(1);
		}
		else
		{
			fprintf(stderr, "usage: %s [-run][-install][-remove]\n", argv[0]);
			break;
		}
	}

	return 0;
}