diff options
| author | Mattias Andrée <maandree@kth.se> | 2019-04-13 23:42:07 +0200 | 
|---|---|---|
| committer | Mattias Andrée <maandree@kth.se> | 2019-04-13 23:42:07 +0200 | 
| commit | 57174300932b101e7cebe15efc60179fc823ce16 (patch) | |
| tree | b41ffd1589f8a2e771e366888fdd889ab31d8b92 | |
| parent | Add liberror_start and liberror_end (diff) | |
| download | liberror-57174300932b101e7cebe15efc60179fc823ce16.tar.gz liberror-57174300932b101e7cebe15efc60179fc823ce16.tar.bz2 liberror-57174300932b101e7cebe15efc60179fc823ce16.tar.xz | |
Add liberror.h.0
Signed-off-by: Mattias Andrée <maandree@kth.se>
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) | 
