#define SOCKET_INIT_SUCCESS 0 #define SOCKET_INIT_FAILED -1 int init_socket( server_socket_t *sckdata, server_config_t *scfg ){ if ( (uint16_t)atoi(scfg->bind_port->valuestring) == 0 ) return SOCKET_INIT_FAILED; if ( scfg->bind_address == NULL || (int64_t)strlen(scfg->bind_address->valuestring) <= 0 || strcmp((const char*)scfg->bind_address->valuestring, "") == 0 ) return SOCKET_INIT_FAILED; sckdata->socket_fd = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP ); if ( sckdata->socket_fd == -1 ) return SOCKET_INIT_FAILED; sckdata->sck_in.sin_family = AF_INET; sckdata->sck_in.sin_port = (in_port_t)htons( (uint16_t)atoi(scfg->bind_port->valuestring) ); sckdata->sck_in.sin_addr.s_addr = (uint32_t)inet_addr( (const char*)scfg->bind_address->valuestring ); int reuseaddr_val = 1; int reuseport_val = 1; if ( setsockopt(sckdata->socket_fd, SOL_SOCKET, SO_REUSEADDR, &reuseaddr_val, (socklen_t)sizeof(reuseaddr_val)) == -1 ) return SOCKET_INIT_FAILED; if ( setsockopt(sckdata->socket_fd, SOL_SOCKET, SO_REUSEPORT, &reuseport_val, (socklen_t)sizeof(reuseport_val)) == -1 ) return SOCKET_INIT_FAILED; if ( bind(sckdata->socket_fd, (struct sockaddr*)&sckdata->sck_in, (socklen_t)sizeof(sckdata->sck_in)) == -1 ) return SOCKET_INIT_FAILED; sckdata->tls_context = SSL_CTX_new( TLS_server_method() ); if ( sckdata->tls_context == NULL ) return SOCKET_INIT_FAILED; if ( SSL_CTX_use_certificate_file(sckdata->tls_context, (const char*)scfg->cert_file->valuestring, SSL_FILETYPE_PEM) != 1 ) return SOCKET_INIT_FAILED; if ( SSL_CTX_use_PrivateKey_file(sckdata->tls_context, (const char*)scfg->cert_key_file->valuestring, SSL_FILETYPE_PEM) != 1 ) return SOCKET_INIT_FAILED; SSL_CTX_set_verify( sckdata->tls_context, SSL_VERIFY_NONE, NULL ); return SOCKET_INIT_SUCCESS; }