void *particle_receiver_loop(void *arg)
{
	int ret;

	ctx = (struct Client_CTX*)arg;

	/* Handle SIGINT signal. The handle_signal function will try to terminate
	 * connection. */
	signal(SIGINT, handle_signal);

	register_cb_func_particle_receiver();

	if((ret = vrs_send_connect_request(ctx->verse.server_name, "12345",
			VRS_SEC_DATA_NONE ,&ctx->verse.session_id))!=VRS_SUCCESS) {
		printf("ERROR: %s\n", vrs_strerror(ret));
		return 0;
	}

	/* Never ending loop */
	while(1) {
		sem_wait(&ctx->timer_sem);
		vrs_callback_update(ctx->verse.session_id);
	}

	return NULL;
}
示例#2
0
/**
 * \brief Main function of verse_client program.
 *
 * \details This program requires one argument (address of Verse server).
 * This function set up handling of signals (SIGINIT). This function register
 * all necessary callback functions and then send connect request to the
 * server. Then callback update function is called 30 times per
 * seconds (30 FPS).
 *
 * \param	argc	number of arguments
 * \param	argv	array of arguments
 *
 * \return	Returns 0, when client is finished successfully and non-zero value,
 * when it is finished with some error.
 */
int main(int argc, char *argv[])
{
	int error_num, opt, ret, flags = VRS_SEC_DATA_NONE;

	/* When client was started with some arguments */
	if(argc>1) {
		/* Parse all options */
		while( (opt = getopt(argc, argv, "hu:p:s:t:d:k")) != -1) {
			switch(opt) {
				case 's':
					if(strcmp(optarg, "none") == 0) {
						flags |= VRS_SEC_DATA_NONE;
						flags &= ~VRS_SEC_DATA_TLS;
					} else if(strcmp(optarg, "tls") == 0) {
						flags &= ~VRS_SEC_DATA_NONE;
						flags |= VRS_SEC_DATA_TLS;
					} else {
						printf("ERROR: unsupported security\n\n");
						print_help(argv[0]);
						exit(EXIT_FAILURE);
					}
					break;
				case 't':
					if(strcmp(optarg, "udp") == 0) {
						flags |= VRS_TP_UDP;
						flags &= ~VRS_TP_TCP;
					} else if(strcmp(optarg, "tcp") == 0) {
						flags &= ~VRS_TP_UDP;
						flags |= VRS_TP_TCP;
					} else {
						printf("ERROR: unsupported transport protocol\n\n");
						print_help(argv[0]);
						exit(EXIT_FAILURE);
					}
					break;
				case 'u':
					my_username = optarg;
					break;
				case 'p':
					my_password = optarg;
					break;
				case 'c':
					if(strcmp(optarg, "none") == 0) {
						flags |= VRS_CMD_CMPR_NONE;
						flags &= ~VRS_CMD_CMPR_ADDR_SHARE;
					} else if(strcmp(optarg, "addrshare") == 0) {
						flags &= ~VRS_CMD_CMPR_NONE;
						flags |= VRS_CMD_CMPR_ADDR_SHARE;
					} else {
						printf("ERROR: unsupported command compression\n\n");
						print_help(argv[0]);
						exit(EXIT_FAILURE);
					}
					break;
				case 'd':
					ret = set_debug_level(optarg);
					if(ret != VRS_SUCCESS) {
						print_help(argv[0]);
						exit(EXIT_FAILURE);
					}
					break;
				case 'k':
#ifdef WITH_KERBEROS
					vrs_set_krb5_use();
					ret = init_krb5_cc();
					if (ret != VRS_SUCCESS) {
						exit(EXIT_FAILURE);
					}
#else
					exit(EXIT_FAILURE);
#endif
					break;
				case 'h':
					print_help(argv[0]);
					exit(EXIT_SUCCESS);
				case ':':
					exit(EXIT_FAILURE);
				case '?':
					exit(EXIT_FAILURE);
			}
		}

		/* The last argument has to be server name, not option */
		if(optind+1 != argc) {
			printf("Error: last argument has to be server name\n\n");
			print_help(argv[0]);
			exit(EXIT_FAILURE);
		}
	} else {
		printf("Error: no server specified\n\n");
		print_help(argv[0]);
		return EXIT_FAILURE;
	}

	/* Handle SIGINT signal. The handle_signal function will try to terminate
	 * connection. */
	signal(SIGINT, handle_signal);

	/* Register callback functions */
	vrs_register_receive_user_authenticate(cb_receive_user_authenticate);
	vrs_register_receive_connect_accept(cb_receive_connect_accept);
	vrs_register_receive_connect_terminate(cb_receive_connect_terminate);

	vrs_register_receive_node_create(cb_receive_node_create);
	vrs_register_receive_node_destroy(cb_receive_node_destroy);

	vrs_register_receive_node_owner(cb_receive_node_owner);
	vrs_register_receive_node_perm(cb_receive_node_perm);

	vrs_register_receive_node_lock(cb_receive_node_lock);
	vrs_register_receive_node_unlock(cb_receive_node_unlock);

	vrs_register_receive_node_link(cb_receive_node_link);

	vrs_register_receive_taggroup_create(cb_receive_taggroup_create);
	vrs_register_receive_taggroup_destroy(cb_receive_taggroup_destroy);

	vrs_register_receive_tag_create(cb_receive_tag_create);
	vrs_register_receive_tag_destroy(cb_receive_tag_destroy);

	vrs_register_receive_tag_set_value(cb_receive_tag_set_value);

	vrs_register_receive_layer_create(cb_receive_layer_create);
	vrs_register_receive_layer_destroy(cb_receive_layer_destroy);

	vrs_register_receive_layer_set_value(cb_receive_layer_set_value);
	vrs_register_receive_layer_unset_value(cb_receive_layer_unset_value);

	/* Set client name and version */
	vrs_set_client_info("Example Verse Client", "0.1");

	/* Send connect request to the server (it will also create independent thread for connection) */
#ifdef WITH_OPENSSL
	/* 12345 is secured port */
	error_num = vrs_send_connect_request(argv[optind], "12345", flags, &session_id);
#else
	/* 12344 is unsecured port */
	error_num = vrs_send_connect_request(argv[optind], "12344", flags, &session_id);
#endif

	if(error_num != VRS_SUCCESS) {
		printf("ERROR: %s\n", vrs_strerror(error_num));
		return EXIT_FAILURE;
	}

	/* Never ending loop */
	while(1) {
		vrs_callback_update(session_id);
		usleep(1000000/FPS);
	}

	return EXIT_SUCCESS;
}