예제 #1
0
파일: struct.c 프로젝트: nqminh/filagree
struct map *map_copy(void *context, const struct map *original)
{
    if (original == NULL)
        return NULL;
    struct map *copy;
    copy = map_new_ex(context, original->comparator, original->hash_func, original->copyor, original->deletor);
    return map_union(copy, original);
}
예제 #2
0
// listens for incoming connections
void *sys_listen2(void *arg)
{
    struct listen_arguments *la = (struct listen_arguments*)arg;
    struct variable *listener = la->listener;
    int serverport = la->serverport;
    
    if (server_listeners == NULL)
        server_listeners = map_new_ex(NULL, &int_compare, &int_hash, &int_copy, &int_del);

    map_insert(server_listeners, (void*)(VOID_INT)serverport, listener);

    node_init();

	// Create and initialize CYASSL_CTX structure
	CYASSL_CTX* ctx;
	if ( (ctx = CyaSSL_CTX_new(CyaTLSv1_server_method())) == NULL)
	{
		fprintf(stderr, "CyaSSL_CTX_new error.\n");
		return NULL;
	}
    
	// Load CA certificates into CYASSL_CTX
	if (CyaSSL_CTX_load_verify_locations(ctx, "./conf/ca-cert.pem", 0) != SSL_SUCCESS)
	{
		fprintf(stderr, "Error loading ca-cert.pem, please check the file.\n");
		return NULL;
	}
    
	// Load server certificate into CYASSL_CTX
	if (CyaSSL_CTX_use_certificate_file(ctx, "conf/server-cert.pem", SSL_FILETYPE_PEM) != SSL_SUCCESS)
	{
		fprintf(stderr, "Error loading server-cert.pem, please check the file.\n");
		return NULL;
	}
    
	// Load server key into CYASSL_CTX
	if (CyaSSL_CTX_use_PrivateKey_file(ctx, "conf/server-key.pem", SSL_FILETYPE_PEM) != SSL_SUCCESS)
	{
		fprintf(stderr, "Error loading server-key.pem, please check the file.\n");
		return NULL;
	}

	// open the server socket over specified port 8080 to accept client connections
	int listenfd = socket(AF_INET, SOCK_STREAM, 0);

	// setsockopt: Eliminates "ERROR on binding: Address already in use" error.
	int optval = 1;
	setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, (const void *)&optval, sizeof(int));

	struct sockaddr_in servaddr;
	bzero(&servaddr, sizeof(servaddr));
	servaddr.sin_family      = AF_INET;
	servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
	servaddr.sin_port        = htons(serverport);

	bind(listenfd, (struct sockaddr *) &servaddr, sizeof(servaddr));
	listen(listenfd, 5);

	// create thread for processing each client request
	struct sockaddr_in client_addr;
	socklen_t sin_size = sizeof (struct sockaddr_in);

    for(;;)
	{
		int connfd = accept(listenfd, (struct sockaddr *) &client_addr, &sin_size );
		DEBUGPRINT("\n Got a connection from (%s , %d)\n", inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port));

		// Create CYASSL Object
		CYASSL* ssl;
		if ((ssl = CyaSSL_new(ctx)) == NULL) {
            fprintf(stderr, "CyaSSL_new error");
            return NULL;
		}

		CyaSSL_set_fd(ssl, connfd);
        struct thread_argument *ta = (struct thread_argument *)malloc(sizeof(struct thread_argument));
        ta->find = la->find;
        ta->listener = listener;
        ta->ssl = ssl;
        ta->fd = connfd;
        ta->cya = ctx;

        DEBUGPRINT("listenting on %d - %p\n", connfd, ta->ssl);
        pthread_t child;
        pthread_create(&child, NULL, incoming_connection, &ta);
	}
    return NULL;
}
예제 #3
0
파일: struct.c 프로젝트: nqminh/filagree
struct map* map_new(void *context) {
    return map_new_ex(context, NULL, NULL, NULL, NULL);
}
예제 #4
0
struct variable *sys_connect(struct context *context)
{
    struct variable *arguments = (struct variable*)stack_pop(context->operand_stack);
    const char *serveraddr = param_str(arguments, 1);
    const int32_t serverport = param_int(arguments, 2);
    struct variable *listener = ((struct variable*)array_get(arguments->list, 2));

	int sockfd;
	struct sockaddr_in servaddr;
	CYASSL_CTX* ctx;
	CYASSL* ssl;

	node_init();

	// Create and initialize CYASSL_CTX structure
	if ( (ctx = CyaSSL_CTX_new(CyaTLSv1_client_method())) == NULL)
	{
        context->vm_exception = variable_new_str(context, byte_array_from_string("SSL_CTX_new error"));
        CyaSSL_Cleanup();
        return NULL;
	}

	// Load CA certificates into CYASSL_CTX
	if (CyaSSL_CTX_load_verify_locations(ctx, "./conf/ca-cert.pem", 0) != SSL_SUCCESS)
	{
        context->vm_exception = variable_new_str(context, byte_array_from_string("Error loading ca-cert.pem, please check the file.\n"));
        CyaSSL_CTX_free(ctx);
        CyaSSL_Cleanup();
        return NULL;
	}

	// Create Socket file descriptor
	sockfd = socket(AF_INET, SOCK_STREAM, 0);

	bzero(&servaddr, sizeof(servaddr));
	servaddr.sin_family = AF_INET;
	servaddr.sin_port = htons(serverport);
	inet_pton(AF_INET, serveraddr, &servaddr.sin_addr);

	// Blocking Connect to socket file descriptor
	connect(sockfd, (struct sockaddr *) &servaddr, sizeof(servaddr));

	// Create CYASSL object
	if ((ssl = CyaSSL_new(ctx)) == NULL)
	{
        context->vm_exception = variable_new_str(context, byte_array_from_string("CyaSSL_new error"));
        CyaSSL_CTX_free(ctx);
        CyaSSL_Cleanup();
        return NULL;
	}

	CyaSSL_set_fd(ssl, sockfd);
	fprintf(stderr, "Connected on %d -- %p\n", sockfd, ssl);

    struct thread_argument *ta = (struct thread_argument *)malloc(sizeof(struct thread_argument));
    ta->find = context->find;
    ta->listener = listener;
    ta->ssl = ssl;
    ta->fd = sockfd;
    ta->cya = ctx;

    if (socket_listeners == NULL)
        socket_listeners = map_new_ex(NULL, &int_compare, &int_hash, &int_copy, &int_del);
    map_insert(socket_listeners, (void*)(VOID_INT)sockfd, (void*)(VOID_INT)ta);

    return variable_new_int(context, sockfd);
}