aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--Makefile2
-rw-r--r--src/libmdsclient.h1
-rw-r--r--src/libmdsclient/comm.c80
-rw-r--r--src/libmdsclient/comm.h87
-rw-r--r--src/libmdsclient/proto-util.h16
5 files changed, 180 insertions, 6 deletions
diff --git a/Makefile b/Makefile
index 219a2e4..228b2ac 100644
--- a/Makefile
+++ b/Makefile
@@ -15,7 +15,7 @@ INFOPARTS = 1 2 3
SERVEROBJ = linked-list client-list hash-table fd-table mds-message util
# Object files for the client libary.
-CLIENTOBJ = proto-util
+CLIENTOBJ = proto-util comm
# Servers and utilities.
SERVERS = mds mds-respawn mds-server mds-echo mds-registry mds-clipboard \
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