aboutsummaryrefslogtreecommitdiffstats
path: root/doc/info/mds.texinfo
diff options
context:
space:
mode:
Diffstat (limited to 'doc/info/mds.texinfo')
-rw-r--r--doc/info/mds.texinfo138
1 files changed, 138 insertions, 0 deletions
diff --git a/doc/info/mds.texinfo b/doc/info/mds.texinfo
index a5b5329..25790af 100644
--- a/doc/info/mds.texinfo
+++ b/doc/info/mds.texinfo
@@ -54,6 +54,7 @@ Texts. A copy of the license is included in the section entitled
* Overview:: Brief overview of @command{mds}.
* Architecture:: Architectural overview of @command{mds}.
* Protocol:: The @command{mds} procotol.
+* libmdsserver:: Overview of @command{libmdsserver}.
* GNU Free Documentation License:: Copying and sharing this manual.
@end menu
@@ -758,6 +759,143 @@ Command: keyboard-enumeration\n
+@node libmdsserver
+@chapter libmdsserver
+
+libmdsserver is library written for the reference
+implementation of the @command{mds} servers.
+libmdsserver does not contain support or any
+protocols, rather it contains auxiliary functions,
+macros, data structures such as linked lists and
+hash tables, and support the basics of the message
+passing protocol: receiving message and decode it
+into headers and payloads.
+
+The header file @file{<libmdsserver/macros.h>}
+contains macros for readability and code reduction,
+it also contains macros and definitions for portability;
+they may either provide portability by nature, or
+provide one place to do modifications to port the
+system.
+
+@table @asis
+@item @code{xsnprintf} [(@code{char[] buffer, char* format, ...}) @arrow{} @code{int}]
+This is a wrapper for @code{snprintf} that allows you
+to forget about the buffer size. When you know how long
+a string can be, you should use @code{sprintf}. But when
+you cannot know for sure you should use @code{xsnprintf}.
+@code{xsnprintf} works exactly as @code{sprintf}, but
+it will require that the first argument is defined
+using @code{[]} rather than @code{*} because it will use
+this to find out how large the buffer is so it can call
+@code{snprintf} with that size.
+
+@item @code{eprint} [(@code{const char* format}) @arrow{} @code{int}]
+A wrapper for @code{fprintf} that prints a string prefixed
+with the value value of @code{*argv} to @code{stderr}.
+Because @code{eprintf} naïvely wraps @code{fprintf}, all
+`%':s in the string must be duplicated.
+
+@item @code{eprintf} [(@code{const char* format, ...}) @arrow{} @code{int}]
+@code{eprint} extends @code{eprint} with variadic arguments
+that can be used to insert values into the format string
+just like you can do in @code{fprintf}.
+
+@item @code{with_mutex} [(@code{pthread_mutex_t mutex, instructions})]
+Wraps @code{instructions} with @code{errno = pthread_mutex_lock(mutex);}
+and @code{errno = pthread_mutex_unlock(mutex);}, so a set of
+instructions can be invoked inside mutex protection.
+
+@item @code{with_mutex_if} [(@code{pthread_mutex_t mutex, condition, instructions})]
+An alternative to @code{with_mutex} where @code{instructions}
+is wrapped around @code{if (condition)} which in turn is
+wrapped inside the mutex protection.
+
+@item @code{max} [(@code{a, b})]
+Returns the higher value of @code{a} and @code{b}.
+
+@item @code{min} [(@code{a, b})]
+Returns the lower value of @code{a} and @code{b}.
+
+@item @code{buf_cast} [(@code{char* buffer, type, size_t index})]
+Casts @code{buffer} to a @code{type} buffer and
+subscripts to the @code{index}:th element. You
+can either use this function as a getter or a
+setter.
+
+@item @code{buf_set} [(@code{char* buffer, type, size_t index, type variable}) @arrow{} @code{type}]
+Wrapper for @code{buf_cast} that sets the addressed
+element to the value of @code{variable}.
+
+@item @code{buf_get} [(@code{const char* buffer, type, size_t index, type variable}) @arrow{} @code{type}]
+Wrapper for @code{buf_cast} that sets the value of
+@code{variable} to the value of the addressed element.
+
+@item @code{buf_next} [(@code{char* buffer, type, size_t count}) @arrow{} @code{char*}]
+Increases the pointer @code{buffer} by the size of
+@code{type} @code{count} types.
+
+@item @code{buf_prev} [(@code{char* buffer, type, size_t count}) @arrow{} @code{char*}]
+Decreases the pointer @code{buffer} by the size of
+@code{type} @code{count} types.
+
+@item @code{buf_set_next} [(@code{char* buffer, type, type variable}) @arrow{} @code{type}]
+@example
+buf_set(buffer, type, 0, variable),
+buf_next(buffer, type, 1);
+@end example
+
+@item @code{buf_get_next} [(@code{char* buffer, type, type variable}) @arrow{} @code{type}]
+@example
+buf_get(buffer, type, 0, variable),
+buf_next(buffer, type, 1);
+@end example
+
+@item @code{strequals} [(@code{const char* a, const char* b}) @arrow{} @code{int}]
+Evaluates whether the strings @code{a} and @code{b}
+are equals, neither may be @code{NULL}.
+
+@item @code{startswith} [(@code{const char* haystack, const char* needle}) @arrow{} @code{int}]
+Evaluates whether the string @code{haystack}
+starts with the string @code{needle}, neither
+may be @code{NULL}.
+
+@item @code{drop_privileges} [() @arrow{} @code{int}]
+Sets the effective user to the real user and the
+effective group to the real group. This is used
+by most servers and ensure that they are not
+running with unnecessary privileges. Returns zero
+on and only on success.
+
+@item @code{monotone} [(@code{struct timespec* time_slot}) @arrow{} @code{int}]
+Stores the time of an unspecified monotonic clock
+into @code{time_slot}. Returns zero on and only on
+success.
+
+@item @code{close_files} [(@code{condition}) @arrow{} @code{void}]
+Closes all file descriptors named by a variable
+@code{fd} for which @code{condition} evalutes
+to non-zero.
+
+@item @code{xfree} [(@code{void** array, size_t elements}) @arrow{} @code{void}]
+Calls @code{free} on the first @code{elements}
+elements in @code{array}, and than calls
+@code{free} on @code{array}. This macro
+requires @code{size_t i} is declared.
+
+@item @code{xmalloc} [(@code{type* var, size_t elements, type}) @arrow{} @code{int}]
+@item @code{xcalloc} [(@code{type* var, size_t elements, type}) @arrow{} @code{int}]
+@item @code{xrealloc} [(@code{type* var, size_t elements, type}) @arrow{} @code{int}]
+@item @code{growalloc} [(@code{type* old, type* var, size_t elements, type}) @arrow{} @code{int}]
+@item @code{xperror} [(@code{const char* str}) @arrow{} @code{void}]
+@item @code{fail_if} [(@code{condition}) @arrow{} @code{void}]
+@item @code{exit_if} [(@code{condition, instructions}) @arrow{} @code{void}]
+@end table
+
+@c SIGDANGER SIGUPDATE macro-bits.h
+
+
+
@node GNU Free Documentation License
@appendix GNU Free Documentation License
@include fdl.texinfo