Moving OpenSSL support to a separate folder (should fix embedded builds)

This commit is contained in:
Pierre Pronchery 2012-10-14 22:22:38 +00:00
parent 2167d39890
commit 6f5a991d81
5 changed files with 4 additions and 235 deletions

View File

@ -52,7 +52,6 @@ dist:
$(PACKAGE)-$(VERSION)/src/apptransport.h \
$(PACKAGE)-$(VERSION)/src/common.h \
$(PACKAGE)-$(VERSION)/src/project.conf \
$(PACKAGE)-$(VERSION)/src/transport/openssl.c \
$(PACKAGE)-$(VERSION)/src/transport/tcp.c \
$(PACKAGE)-$(VERSION)/src/transport/udp.c \
$(PACKAGE)-$(VERSION)/src/transport/project.conf \

View File

@ -1,5 +1,5 @@
prefix=@PREFIX@
includedir=${prefix}/include
includedir=${prefix}/include/System
exec_prefix=${prefix}
libdir=${exec_prefix}/lib

View File

@ -1,4 +1,4 @@
TARGETS = openssl.so tcp.so udp.so
TARGETS = tcp.so udp.so
PREFIX = /usr/local
DESTDIR =
LIBDIR = $(PREFIX)/lib
@ -18,13 +18,6 @@ INSTALL ?= install
all: $(TARGETS)
openssl_OBJS = openssl.o
openssl_CFLAGS = $(CPPFLAGSF) $(CPPFLAGS) $(CFLAGSF) $(CFLAGS)
openssl_LDFLAGS = $(LDFLAGSF) $(LDFLAGS)
openssl.so: $(openssl_OBJS)
$(CCSHARED) -o openssl.so $(openssl_OBJS) $(openssl_LDFLAGS)
tcp_OBJS = tcp.o
tcp_CFLAGS = $(CPPFLAGSF) $(CPPFLAGS) $(CFLAGSF) $(CFLAGS)
tcp_LDFLAGS = $(LDFLAGSF) $(LDFLAGS)
@ -39,9 +32,6 @@ udp_LDFLAGS = $(LDFLAGSF) $(LDFLAGS)
udp.so: $(udp_OBJS)
$(CCSHARED) -o udp.so $(udp_OBJS) $(udp_LDFLAGS)
openssl.o: openssl.c ../../config.h
$(CC) $(openssl_CFLAGS) -c openssl.c
tcp.o: tcp.c
$(CC) $(tcp_CFLAGS) -c tcp.c
@ -49,21 +39,18 @@ udp.o: udp.c
$(CC) $(udp_CFLAGS) -c udp.c
clean:
$(RM) -- $(openssl_OBJS) $(tcp_OBJS) $(udp_OBJS)
$(RM) -- $(tcp_OBJS) $(udp_OBJS)
distclean: clean
$(RM) -- $(TARGETS)
install: $(TARGETS)
$(MKDIR) $(DESTDIR)$(LIBDIR)/App/transport
$(INSTALL) -m 0644 -- openssl.so $(DESTDIR)$(LIBDIR)/App/transport/openssl.so
$(MKDIR) $(DESTDIR)$(LIBDIR)/App/transport
$(INSTALL) -m 0644 -- tcp.so $(DESTDIR)$(LIBDIR)/App/transport/tcp.so
$(MKDIR) $(DESTDIR)$(LIBDIR)/App/transport
$(INSTALL) -m 0644 -- udp.so $(DESTDIR)$(LIBDIR)/App/transport/udp.so
uninstall:
$(RM) -- $(DESTDIR)$(LIBDIR)/App/transport/openssl.so
$(RM) -- $(DESTDIR)$(LIBDIR)/App/transport/tcp.so
$(RM) -- $(DESTDIR)$(LIBDIR)/App/transport/udp.so

View File

@ -1,209 +0,0 @@
/* $Id$ */
/* Copyright (c) 2012 Pierre Pronchery <khorben@defora.org> */
/* This file is part of DeforaOS System libApp */
/* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, version 3 of the License.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. */
#include <sys/socket.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>
#include <netinet/in.h>
#include <System.h>
#include <openssl/ssl.h>
#include <openssl/err.h>
#include "App/apptransport.h"
#include "../../config.h"
#ifndef PREFIX
# define PREFIX "/usr/local"
#endif
#ifndef SYSCONFDIR
# define SYSCONFDIR PREFIX "/etc"
#endif
/* OpenSSL */
/* private */
/* types */
typedef struct _AppTransportPlugin OpenSSL;
struct _AppTransportPlugin
{
AppTransportPluginHelper * helper;
int fd;
SSL_CTX * ssl_ctx;
/* client */
SSL * ssl;
};
/* protected */
/* prototypes */
/* plug-in */
static OpenSSL * _openssl_init(AppTransportPluginHelper * helper,
AppTransportMode mode, char const * name);
static void _openssl_destroy(OpenSSL * openssl);
/* private */
/* prototypes */
static int _openssl_error(char const * message, int code);
static int _openssl_error_ssl(int code);
/* callbacks */
static int _openssl_callback_accept(int fd, OpenSSL * openssl);
/* public */
/* constants */
/* plug-in */
AppTransportPluginDefinition definition =
{
"OpenSSL",
NULL,
_openssl_init,
_openssl_destroy,
NULL
};
/* protected */
/* functions */
/* plug-in */
/* openssl_init */
static int _init_client(OpenSSL * openssl, char const * name);
static int _init_server(OpenSSL * openssl, char const * name);
static OpenSSL * _openssl_init(AppTransportPluginHelper * helper,
AppTransportMode mode, char const * name)
{
OpenSSL * openssl;
int res = -1;
if((openssl = object_new(sizeof(*openssl))) == NULL)
return NULL;
openssl->helper = helper;
openssl->fd = -1;
openssl->ssl_ctx = NULL;
openssl->ssl = NULL;
switch(mode)
{
case ATM_CLIENT:
res = _init_client(openssl, name);
break;
case ATM_SERVER:
res = _init_server(openssl, name);
break;
}
/* check for errors */
if(res != 0)
{
_openssl_destroy(openssl);
return NULL;
}
return openssl;
}
static int _init_client(OpenSSL * openssl, char const * name)
{
if((openssl->ssl_ctx = SSL_CTX_new(SSLv3_client_method())) == NULL
|| SSL_CTX_set_cipher_list(openssl->ssl_ctx,
SSL_DEFAULT_CIPHER_LIST) != 1
|| (openssl->ssl = SSL_new(openssl->ssl_ctx)) == NULL)
return -_openssl_error_ssl(1);
if((openssl->fd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
return -_openssl_error("socket", 1);
/* FIXME implement the rest */
return 0;
}
static int _init_server(OpenSSL * openssl, char const * name)
{
String * crt;
struct sockaddr_in sa;
if((crt = string_new_append(SYSCONFDIR, "/AppServer/", name, ".crt"))
== NULL)
return -1;
if((openssl->ssl_ctx = SSL_CTX_new(SSLv3_server_method())) == NULL
|| SSL_CTX_set_cipher_list(openssl->ssl_ctx,
SSL_DEFAULT_CIPHER_LIST) != 1
|| SSL_CTX_use_certificate_file(openssl->ssl_ctx, crt,
SSL_FILETYPE_PEM) == 0
|| SSL_CTX_use_PrivateKey_file(openssl->ssl_ctx, crt,
SSL_FILETYPE_PEM) == 0)
{
string_delete(crt);
return -_openssl_error_ssl(1);
}
string_delete(crt);
if((openssl->fd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
return -_openssl_error("socket", 1);
sa.sin_family = AF_INET;
sa.sin_port = htons(4242); /* XXX hard-coded */
sa.sin_addr.s_addr = htonl(INADDR_ANY);
if(bind(openssl->fd, (struct sockaddr *)&sa, sizeof(sa)) != 0)
return -_openssl_error("bind", 1);
if(listen(openssl->fd, 5) != 0)
return -_openssl_error("listen", 1);
event_register_io_read(openssl->helper->event, openssl->fd,
(EventIOFunc)_openssl_callback_accept, openssl);
return 0;
}
/* openssl_destroy */
static void _openssl_destroy(OpenSSL * openssl)
{
if(openssl->ssl != NULL)
SSL_free(openssl->ssl);
if(openssl->fd != -1)
close(openssl->fd);
if(openssl->ssl_ctx != NULL)
SSL_CTX_free(openssl->ssl_ctx);
object_delete(openssl);
}
/* private */
/* functions */
/* openssl_error */
static int _openssl_error(char const * message, int code)
{
return error_set_code(code, "%s%s%s", (message != NULL) ? message : "",
(message != NULL) ? ": " : "", strerror(errno));
}
/* openssl_error_ssl */
static int _openssl_error_ssl(int code)
{
return error_set_code(code, "%s", ERR_error_string(ERR_get_error(),
NULL));
}
/* callbacks */
static int _openssl_callback_accept(int fd, OpenSSL * openssl)
{
struct sockaddr_in sa;
socklen_t sa_size = sizeof(sa);
int newfd;
if((newfd = accept(fd, (struct sockaddr *)&sa, &sa_size)) < 0)
return error_set_code(1, "%s%s", "accept: ", strerror(errno));
/* FIXME really implement */
close(newfd);
return 0;
}

View File

@ -1,16 +1,8 @@
targets=openssl,tcp,udp
targets=tcp,udp
cppflags=-I ../../include
cflags_force=-W
cflags=-Wall -g -O2 -pedantic -fPIC
[openssl]
type=plugin
sources=openssl.c
install=$(LIBDIR)/App/transport
[openssl.c]
depends=../../config.h
[tcp]
type=plugin
sources=tcp.c