Reworked sockets library
This commit is contained in:
@@ -33,22 +33,11 @@ int initTLS() {
|
||||
return 0;
|
||||
}
|
||||
|
||||
Listener *createListener(SocketType type, unsigned short port,
|
||||
int backlog, ...) {
|
||||
int shmid;
|
||||
Listener *createListener(unsigned short port, int backlog) {
|
||||
Listener *ret = malloc(sizeof(Listener));
|
||||
va_list ap;
|
||||
shmid = smalloc(sizeof(Listener));
|
||||
if (shmid < 0)
|
||||
if (ret == NULL)
|
||||
return NULL;
|
||||
ret = saddr(shmid);
|
||||
if (ret == NULL) {
|
||||
sdestroy(shmid);
|
||||
return NULL;
|
||||
}
|
||||
ret->type = type;
|
||||
ret->fd = socket(AF_INET, SOCK_STREAM, 0);
|
||||
ret->shmid = shmid;
|
||||
if (ret->fd < 0) {
|
||||
free(ret);
|
||||
return NULL;
|
||||
@@ -69,23 +58,38 @@ Listener *createListener(SocketType type, unsigned short port,
|
||||
goto error;
|
||||
if (listen(ret->fd, backlog) < 0)
|
||||
goto error;
|
||||
return ret;
|
||||
error:
|
||||
close(ret->fd);
|
||||
free(ret);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
va_start(ap, backlog);
|
||||
Context *createContext(SocketType type, ...) {
|
||||
Context *ret;
|
||||
va_list ap;
|
||||
ret = malloc(sizeof(Context));
|
||||
if (ret == NULL)
|
||||
return NULL;
|
||||
va_start(ap, type);
|
||||
ret->type = type;
|
||||
switch (type) {
|
||||
case TCP: default:
|
||||
case TCP:
|
||||
break;
|
||||
case TLS: {
|
||||
char *keyfile = va_arg(ap, char *);
|
||||
char *certfile = va_arg(ap, char *);
|
||||
char *keyfile, *certfile;
|
||||
keyfile = va_arg(ap, char *);
|
||||
certfile = va_arg(ap, char *);
|
||||
|
||||
if (gnutls_certificate_allocate_credentials(&ret->creds)
|
||||
< 0)
|
||||
< 0)
|
||||
goto error;
|
||||
if (gnutls_certificate_set_x509_key_file(ret->creds,
|
||||
certfile, keyfile,
|
||||
GNUTLS_X509_FMT_PEM) < 0)
|
||||
goto error;
|
||||
if (gnutls_priority_init(&ret->priority,
|
||||
NULL, NULL) < 0)
|
||||
if (gnutls_priority_init(&ret->priority, NULL, NULL)
|
||||
< 0)
|
||||
goto error;
|
||||
#if GNUTLS_VERSION_NUMBER >= 0x030506
|
||||
gnutls_certificate_set_known_dh_params(ret->creds,
|
||||
@@ -97,17 +101,21 @@ Listener *createListener(SocketType type, unsigned short port,
|
||||
va_end(ap);
|
||||
return ret;
|
||||
error:
|
||||
close(ret->fd);
|
||||
sfree(ret);
|
||||
sdestroy(shmid);
|
||||
free(ret);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
Stream *createStream(Listener *listener, int flags, int fd) {
|
||||
int acceptConnection(Listener *listener) {
|
||||
return accept(listener->fd,
|
||||
(struct sockaddr *) &listener->addr,
|
||||
&listener->addrlen);
|
||||
}
|
||||
|
||||
Stream *createStream(Context *context, int flags, int fd) {
|
||||
Stream *ret = malloc(sizeof(Stream));
|
||||
if (ret == NULL)
|
||||
return NULL;
|
||||
ret->type = listener->type;
|
||||
ret->type = context->type;
|
||||
ret->fd = fd;
|
||||
|
||||
{
|
||||
@@ -115,18 +123,18 @@ Stream *createStream(Listener *listener, int flags, int fd) {
|
||||
fcntl(ret->fd, F_SETFL, oldflags | flags);
|
||||
}
|
||||
|
||||
switch (listener->type) {
|
||||
switch (context->type) {
|
||||
case TCP: default:
|
||||
break;
|
||||
case TLS:
|
||||
if (gnutls_init(&ret->session, GNUTLS_SERVER) < 0)
|
||||
goto error;
|
||||
if (gnutls_priority_set(ret->session,
|
||||
listener->priority) < 0)
|
||||
context->priority) < 0)
|
||||
goto error;
|
||||
if (gnutls_credentials_set(ret->session,
|
||||
GNUTLS_CRD_CERTIFICATE,
|
||||
listener->creds) < 0)
|
||||
context->creds) < 0)
|
||||
goto error;
|
||||
gnutls_certificate_server_set_request(ret->session,
|
||||
GNUTLS_CERT_IGNORE);
|
||||
@@ -144,23 +152,15 @@ error:
|
||||
return NULL;
|
||||
}
|
||||
|
||||
Stream *acceptStream(Listener *listener, int flags) {
|
||||
int fd;
|
||||
fd = accept(listener->fd, (struct sockaddr *) &listener->addr,
|
||||
&listener->addrlen);
|
||||
return createStream(listener, flags, fd);
|
||||
void freeListener(Listener *listener) {
|
||||
close(listener->fd);
|
||||
free(listener);
|
||||
}
|
||||
|
||||
void freeListener(Listener *listener) {
|
||||
int shmid;
|
||||
if (listener->type == TLS) {
|
||||
gnutls_certificate_free_credentials(listener->creds);
|
||||
gnutls_priority_deinit(listener->priority);
|
||||
}
|
||||
close(listener->fd);
|
||||
shmid = listener->shmid;
|
||||
sfree(listener);
|
||||
sdestroy(shmid);
|
||||
void freeContext(Context *context) {
|
||||
gnutls_certificate_free_credentials(context->creds);
|
||||
gnutls_priority_deinit(context->priority);
|
||||
free(context);
|
||||
}
|
||||
|
||||
void freeStream(Stream *stream) {
|
||||
|
||||
Reference in New Issue
Block a user