diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/libmdsclient.h | 1 | ||||
-rw-r--r-- | src/libmdsclient/comm.c | 80 | ||||
-rw-r--r-- | src/libmdsclient/comm.h | 87 | ||||
-rw-r--r-- | src/libmdsclient/proto-util.h | 16 |
4 files changed, 179 insertions, 5 deletions
diff --git a/src/libmdsclient.h b/src/libmdsclient.h index 989bdd4..e2347d3 100644 --- a/src/libmdsclient.h +++ b/src/libmdsclient.h @@ -20,6 +20,7 @@ #include "libmdsclient/proto-util.h" +#include "libmdsclient/comm.h" #endif diff --git a/src/libmdsclient/comm.c b/src/libmdsclient/comm.c new file mode 100644 index 0000000..c9cdcde --- /dev/null +++ b/src/libmdsclient/comm.c @@ -0,0 +1,80 @@ +/** + * mds — A micro-display server + * Copyright © 2014, 2015 Mattias Andrée (maandree@member.fsf.org) + * + * 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, either version 3 of the License, or + * (at your option) any later version. + * + * 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 "comm.h" + +#include <stdlib.h> + + + +/** + * Initialise a connection descriptor with the the default values + * + * @param this The connection descriptor + */ +void libmds_connection_initialise(libmds_connection_t* restrict this) +{ + this->socket_fd = -1; + this->message_id = UINT32_MAX; + this->client_id = NULL; +} + + +/** + * Allocate and initialise a connection descriptor + * + * @return The connection descriptor, `NULL` on error + * + * @throws ENOMEM Out of memory, Possibly, the process hit the RLIMIT_AS or + * RLIMIT_DATA limit described in getrlimit(2). + */ +libmds_connection_t* libmds_connection_create(void) +{ + libmds_connection_t* rc = malloc(sizeof(libmds_connection_t)); + if (rc == NULL) + return NULL; + libmds_connection_initialise(rc); + return rc; +} + + +/** + * Release all resources held by a connection descriptor + * + * @param this The connection descriptor, may be `NULL` + */ +void libmds_connection_destroy(libmds_connection_t* restrict this) +{ + if (this == NULL) + return; + + /* TODO */ +} + + +/** + * Release all resources held by a connection descriptor, + * and release the allocation of the connection descriptor + * + * @param this The connection descriptor, may be `NULL` + */ +void libmds_connection_free(libmds_connection_t* restrict this) +{ + libmds_connection_destroy(this); + free(this); +} + diff --git a/src/libmdsclient/comm.h b/src/libmdsclient/comm.h new file mode 100644 index 0000000..9cc3b74 --- /dev/null +++ b/src/libmdsclient/comm.h @@ -0,0 +1,87 @@ +/** + * mds — A micro-display server + * Copyright © 2014, 2015 Mattias Andrée (maandree@member.fsf.org) + * + * 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, either version 3 of the License, or + * (at your option) any later version. + * + * 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/>. + */ +#ifndef MDS_LIBMDSCLIENT_COMM_H +#define MDS_LIBMDSCLIENT_COMM_H + + +#include <stdint.h> +#include <stddef.h> + + + +/** + * A connection to the display server + */ +typedef struct libmds_connection +{ + /** + * The file descriptor of the socket + * connected to the display server, + * -1 if not connected + */ + int socket_fd; + + /** + * The ID of the _previous_ message + */ + uint32_t message_id; + + /** + * The client ID, `NULL` if anonymous + */ + char* client_id; + +} libmds_connection_t; + + +/** + * Initialise a connection descriptor with the the default values + * + * @param this The connection descriptor + */ +__attribute__((nonnull)) +void libmds_connection_initialise(libmds_connection_t* restrict this); + +/** + * Allocate and initialise a connection descriptor + * + * @return The connection descriptor, `NULL` on error + * + * @throws ENOMEM Out of memory, Possibly, the process hit the RLIMIT_AS or + * RLIMIT_DATA limit described in getrlimit(2). + */ +libmds_connection_t* libmds_connection_create(void); + +/** + * Release all resources held by a connection descriptor + * + * @param this The connection descriptor, may be `NULL` + */ +void libmds_connection_destroy(libmds_connection_t* restrict this); + +/** + * Release all resources held by a connection descriptor, + * and release the allocation of the connection descriptor + * + * @param this The connection descriptor, may be `NULL` + */ +void libmds_connection_free(libmds_connection_t* restrict this); + + +#endif + diff --git a/src/libmdsclient/proto-util.h b/src/libmdsclient/proto-util.h index 7bb5615..f381c57 100644 --- a/src/libmdsclient/proto-util.h +++ b/src/libmdsclient/proto-util.h @@ -110,6 +110,7 @@ typedef enum libmds_cherrypick_optimisation * @throws ENOMEM Out of memory, Possibly, the process hit the RLIMIT_AS or * RLIMIT_DATA limit described in getrlimit(2). */ +__attribute__((sentinel)) int libmds_headers_cherrypick(char** restrict headers, size_t header_count, size_t* restrict found, libmds_cherrypick_optimisation_t optimisation, ...); @@ -131,6 +132,7 @@ int libmds_headers_cherrypick(char** restrict headers, size_t header_count, size * more headers in the list, it should be terminated with a `NULL`. * @return The number of found headers of those that were requested */ +__attribute__((sentinel)) size_t libmds_headers_cherrypick_linear_unsorted(char** restrict headers, size_t header_count, ...); #define libmds_headers_cherrypick_linear_unsorted libmds_headers_cherrypick_linear_unsorted @@ -154,6 +156,7 @@ size_t libmds_headers_cherrypick_linear_unsorted(char** restrict headers, size_t * more headers in the list, it should be terminated with a `NULL`. * @return The number of found headers of those that were requested */ +__attribute__((sentinel)) size_t libmds_headers_cherrypick_linear_sorted(char** restrict headers, size_t header_count, ...); #define libmds_headers_cherrypick_linear_sorted libmds_headers_cherrypick_linear_sorted @@ -175,6 +178,7 @@ size_t libmds_headers_cherrypick_linear_sorted(char** restrict headers, size_t h * more headers in the list, it should be terminated with a `NULL`. * @return The number of found headers of those that were requested */ +__attribute__((sentinel)) size_t libmds_headers_cherrypick_binary_unsorted(char** restrict headers, size_t header_count, ...); #define libmds_headers_cherrypick_binary_unsorted libmds_headers_cherrypick_binary_unsorted @@ -197,6 +201,7 @@ size_t libmds_headers_cherrypick_binary_unsorted(char** restrict headers, size_t * more headers in the list, it should be terminated with a `NULL`. * @return The number of found headers of those that were requested */ +__attribute__((sentinel)) size_t libmds_headers_cherrypick_binary_sorted(char** restrict headers, size_t header_count, ...); #define libmds_headers_cherrypick_binary_unsorted libmds_headers_cherrypick_binary_unsorted @@ -365,9 +370,9 @@ void libmds_headers_sort(char** restrict headers, size_t header_count); * @throws ENOMEM Out of memory, Possibly, the process hit the RLIMIT_AS or * RLIMIT_DATA limit described in getrlimit(2). */ +__attribute__((nonnull(1, 2, 3), sentinel)) int libmds_compose(char** restrict buffer, size_t* restrict buffer_size, size_t* restrict length, - const char* restrict payload, const size_t* restrict payload_length, - ...) __attribute__((nonnull(1, 2, 3))); + const char* restrict payload, const size_t* restrict payload_length, ...); /** * Compose a message @@ -411,9 +416,9 @@ int libmds_compose(char** restrict buffer, size_t* restrict buffer_size, size_t* * @throws ENOMEM Out of memory, Possibly, the process hit the RLIMIT_AS or * RLIMIT_DATA limit described in getrlimit(2). */ +__attribute__((nonnull(1, 2, 3))) int libmds_compose_v(char** restrict buffer, size_t* restrict buffer_size, size_t* restrict length, - const char* restrict payload, const size_t* restrict payload_length, - va_list args) __attribute__((nonnull(1, 2, 3))); + const char* restrict payload, const size_t* restrict payload_length, va_list args); /** * Increase the message ID counter @@ -436,8 +441,9 @@ int libmds_compose_v(char** restrict buffer, size_t* restrict buffer_size, size_ * there are no free message ID:s. * @throws Any error that `test` may throw. */ +__attribute__((nonnull(1))) int libmds_next_message_id(uint32_t* restrict message_id, int (*test)(uint32_t message_id, void* data), - void* data) __attribute__((nonnull(1))); + void* data) ; #endif |