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); }
// 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; }
struct map* map_new(void *context) { return map_new_ex(context, NULL, NULL, NULL, NULL); }
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); }