diff options
Diffstat (limited to '')
-rw-r--r-- | Makefile | 6 | ||||
-rw-r--r-- | liberror.7 | 2 | ||||
-rw-r--r-- | liberror.h | 2 | ||||
-rw-r--r-- | liberror.h.0 | 323 |
4 files changed, 331 insertions, 2 deletions
@@ -31,6 +31,9 @@ OBJ =\ set_error_errno.o\ start.o +MAN0 =\ + liberror.h.0 + MAN3 =\ liberror_copy_error.3\ liberror_end.3\ @@ -72,6 +75,7 @@ install: liberror.a liberror.$(LIBEXT) mkdir -p -- "$(DESTDIR)$(PREFIX)/lib" mkdir -p -- "$(DESTDIR)$(PREFIX)/include" mkdir -p -- "$(DESTDIR)$(PREFIX)/share/licenses/liberror" + mkdir -p -- "$(DESTDIR)$(MANPREFIX)/man0" mkdir -p -- "$(DESTDIR)$(MANPREFIX)/man3" mkdir -p -- "$(DESTDIR)$(MANPREFIX)/man7" cp -- liberror.a "$(DESTDIR)$(PREFIX)/lib" @@ -80,6 +84,7 @@ install: liberror.a liberror.$(LIBEXT) ln -sf -- liberror.$(LIBMINOREXT) "$(DESTDIR)$(PREFIX)/lib/liberror.$(LIBEXT)" cp -- liberror.h "$(DESTDIR)$(PREFIX)/include" cp -- LICENSE "$(DESTDIR)$(PREFIX)/share/licenses/liberror" + cp -- $(MAN0) "$(DESTDIR)$(MANPREFIX)/man0" cp -- $(MAN3) "$(DESTDIR)$(MANPREFIX)/man3" cp -- $(MAN7) "$(DESTDIR)$(MANPREFIX)/man7" @@ -87,6 +92,7 @@ uninstall: -rm -f -- "$(DESTDIR)$(PREFIX)/lib/liberror."* -rm -f -- "$(DESTDIR)$(PREFIX)/include/liberror.h" -rm -rf -- "$(DESTDIR)$(PREFIX)/share/licenses/liberror" + -cd -- "$(DESTDIR)$(MANPREFIX)/man0" && rm -f -- $(MAN0) -cd -- "$(DESTDIR)$(MANPREFIX)/man3" && rm -f -- $(MAN3) -cd -- "$(DESTDIR)$(MANPREFIX)/man7" && rm -f -- $(MAN7) @@ -61,8 +61,6 @@ Shall be called when entering a signal handler. .TP .BR liberror_end (3) Shall be called when a signal handler exits. -.SH ERRORS -None. .SH EXAMPLES None. .SH APPLICATION USAGE @@ -220,6 +220,8 @@ struct liberror_error { /** * Saved error state for a thread + * + * This structure shall be regardes as opaque */ struct liberror_state { /** diff --git a/liberror.h.0 b/liberror.h.0 new file mode 100644 index 0000000..7e3e4c0 --- /dev/null +++ b/liberror.h.0 @@ -0,0 +1,323 @@ +.TH LIBERROR.H 0 2019-04-13 liberror +.SH NAME +liberror.h \- single interface for custom and standard errors +.SH SYNOPSIS +.nf +#include <liberror.h> + +struct liberror_backtrace; + +enum liberror_details_type { + LIBERROR_DETAILS_NONE, + LIBERROR_DETAILS_USER, + LIBERROR_DETAILS_ONE_FILE, + LIBERROR_DETAILS_TWO_FILES +}; + +union liberror_details { + struct { + const char *\fIlibrary\fP; + void *\fIdata\fP; + void (*\fIfree_data\fP)(void *); + void *(*\fIcopy_data\fP)(void *); + void (*\fIprint_data\fP)(void *, FILE *, const char *); + } \fIuser\fP; + + struct { + int \fIfd\fP; + char *\fIname\fP; + const char *\fIrole\fP; + } \fIone_file\fP; + + struct { + int \fIfd1\fP, \fIfd2\fP; + char *\fIname1\fP, *\fIname2\fP; + const char *\fIrole1\fP, *\fIrole2\fP; + } \fItwo_files\fP; +}; + +struct liberror_error { + struct liberror_backtrace *\fIbacktrace\fP; + char \fIdescription\fP[256]; + char \fIsource\fP[64]; + char \fIcode_group\fP[64]; + long long int \fIcode\fP; + struct liberror_error *\fIcause\fP; + int \fIfailed_to_allocate_cause\fP; + int \fIdynamically_allocated\fP; + enum liberror_details_type \fIdetails_type\fP; + union liberror_details \fIdetails\fP; +}; + +struct liberror_state { /* fields omitted */ }; + +struct liberror_error *liberror_get_error(void); +struct liberror_error *liberror_copy_error(struct liberror_error *); +void liberror_free_error(struct liberror_error *); +void liberror_reset_error(void); +void liberror_print_backtrace(struct liberror_error *, FILE *, const char *); +int liberror_save_backtrace(struct liberror_error *); +void liberror_set_error(const char[256], const char[64], const char[64], long long int); +void liberror_set_error_errno(const char[256], const char[64], int); +void liberror_print_error(struct liberror_error *, FILE *, int, const char *); +void liberror_start(struct liberror_state *); +void liberror_end(const struct liberror_state *); +.fi +.PP +Link with +.IR \-lerror . +.SH DESCRIPTION +The +.B liberror.h +header defines one transparent structure: +.BR "struct liberror_error" , +its fields are: +.TP +.I backtrace +The backtrace for the error. +.TP +.I description +Textual description of the error; +empty if missing. +.TP +.I source +The function in which the error occurred; +empty if unknown. +.TP +.I code_group +A string that specifies which group of +error codes are used. +.B \(dqerrno\(dq +for +.I errno +values, +.B \(dqaddrinfo\(dq +for errors codes used by the +.BR getaddrinfo (3) +function, and library or application +name of custom error codes. +.TP +.I code +The error code. +.TP +.I cause +The error which caused the error, +.I NULL +if none of if the process could not +allocate enough memory to store it. +.TP +.I failed_to_allocate_cause +Whether the +.I cause +field was set to +.I NULL +because the enough memory cause +not be allocated for it. +.TP +.I dynamically_allocated +Whether the error is dynamically +allocated rather than statically +allocated. This is used by the +.BR liberror_free_error (3) +to determine whether the pointer +to the error shall be deallocated. +.TP +.I details_type +Used to determine which structure in the +.I details +field is used. By default, this is set to +.I LIBERROR_DETAILS_NONE +when a new error is assigned to a thread, +and the function that sets the error must +get the error it created as set this +information manually. +.TP +.I details +Extended information about the error. +.PP +The +.B liberror.h +header defines two opaque structures: +.TP +.B struct liberror_backtrace +Backtrace information for an error. +This is defined as an incomplete type, +it is a flat structure of variable size. +.TP +.B struct liberror_state +Stored error state for a thread. This +is defined as a complete type but should +be regardes as opaque. +.PP +The +.B liberror.h +header defines one enumerated type: +.BR "enum liberror_details_type" , +it is used to specify which structure in +.BR "union liberror_details" . +Its values are: +.TP +.I LIBERROR_DETAILS_NONE +None is used. There is no extended information. +.TP +.I LIBERROR_DETAILS_USER +.I user +is used. There is library- or application-defined +extended information. +.TP +.I LIBERROR_DETAILS_ONE_FILE +.I one_file +is used. There is extended information about one +file or file descriptor. +.TP +.I LIBERROR_DETAILS_TWO_FILES +.I two_files +is used. There is extended information about two +files or file descriptors. +.PP +The +.B liberror.h +header defines one union: +.BR "union liberror_details" , +it is used for extended error information. Its +member structures are: +.TP +.I user +Information defined by a library or the application. +The field +.I library +shall be set to a statically allocated string that +names the library that defines the informations. +If the application defines the information, the +application can choose freely how this field shall +be set as it will not affect other software. The +information it self shall be stored in the field +.IR data , +and the functions stored in the fields, +.IR free_data , +.IR copy_data , +and +.IR print_data , +shall deallocate, copy, and print the extended +information, respective, the value of the +.I data +field is input in these functions' first parameter. +The second parameter of the +.IR print_data +function will be the file the information shall +be printed to and the third parameter will be a +string that shall be printed at the beginning of +each printed line. Neither the second nor the +third parameter will ever be +.IR NULL . +.TP +.I one_file +Information about one file. The value of the +.I fd +field shall either be the file descriptor number +of the file given as input to the function in +which the error occured, or a negative value if +none. The value of the +.I name +field shall either be a dynamically allocated +string containing the file name or any other +identifying string, or +.I NULL +if none or if enough the string could not be +allocated. The value of the +.I role +string shall be a statically allocated string +containing the file's role in the function call, +for example \(dqDirectory\(dq for the +.BR mkdir (3) +function. +.TP +.I two_files +Information about two files. This structure is +similar to that of +.IR one_file , +with the difference that +.I two_files +have two copies of each field in +.IR one_file : +one with the +.B 1 +suffix for the first file parameter and one +with the +.B 2 +suffix for the second file parameter. +.PP +The +.B liberror.h +header defines the following functions: +.TP +.BR liberror_get_error (3) +Get the current error, if any, for the calling thread. +.TP +.BR liberror_copy_error (3) +Create a copy if an error. +.TP +.BR liberror_free_error (3) +Delete a copy if an error. +.TP +.BR liberror_reset_error (3) +Deallocate the calling thread's current error, if any, +and mark that the thread does not have any error. +.TP +.BR liberror_print_backtrace (3) +Print the backtrace for an error. Please see its man +page for more information. +.TP +.BR liberror_save_backtrace (3) +Set the backtrace for an error or the thread's next +error. Please see its man page for more information. +.TP +.BR liberror_set_error (3) +Set the error for the calling thread. +.TP +.BR liberror_set_error_errno (3) +Wrapper for +.BR liberror_set_error (3) +for errors with +.I errno +values. +.TP +.BR liberror_print_error (3) +Print an error, by default the calling thread's +current error, if any, including description, +extended information, backtrace, and cause, +recursively. Optionally deallocate the error +and clear the thread's error. +.TP +.BR liberror_start (3) +This function shall be called at the beginning +of signal handlers and other asynchronously +called functions. +.TP +.BR liberror_end (3) +This function shall be called at the end +of signal handlers and other asynchronously +called functions. +.SH EXAMPLES +None. +.SH APPLICATION USAGE +None. +.SH RATIONALE +None. +.SH FUTURE DIRECTIONS +None. +.SH NOTES +None. +.SH SEE ALSO +.BR liberror (7), +.BR liberror_copy_error (3), +.BR liberror_end (3), +.BR liberror_free_error (3), +.BR liberror_get_error (3), +.BR liberror_print_bactrace (3), +.BR liberror_print_error (3), +.BR liberror_reset_error (3), +.BR liberror_save_backtrace (3), +.BR liberror_set_error (3), +.BR liberror_set_error_errno (3), +.BR liberror_start (3) |