Clarification #2: Obviously, such errors cannot pass IPC boundary as
is. I have several ideas how to work around that.

On 6 December 2017 at 16:21, Jiří Zárevúcky <[email protected]> wrote:
> Clarification: this would be used in addition to the errno.h codes,
> not instead of. There would be functions for translating between them.
>
> On 6 December 2017 at 16:17, Jiří Zárevúcky <[email protected]> wrote:
>> Hello,
>> For context: I've been working on fixing our errno.h use for the past
>> two days. It's going very well, I'll probably be done by tomorrow, and
>> I'll write a blog post about the entire process after I'm finished.
>>
>> The issue I'm facing now is simple: libhttp uses errno.h error codes,
>> but also defines its own bunch of error conditions, mixing them with
>> returns from libc functions. Obviously, this is not ideal. Such errors
>> can start conflicting with others on a later date, without any
>> indication that something is wrong, and it's not possible to just use
>> strerror() on such a return value, or return it from an interface that
>> expects libc error codes (for example, imagine a HTTP data transport
>> abstracted as a pipe -- such code would need to translate
>> HTTP-specific error codes, but there is no indication on type level
>> that that's necessary).
>>
>> That much for context. I thought about possible solutions, and this is
>> the best I came up so far. Instead of explaining in words, simplified
>> example of code:
>>
>> ----
>>
>> // libc header
>> typedef struct {
>>     const char *name;
>>     const char *description;
>> } error_t;
>>
>> extern const error_t *E_NOMEM;
>> extern const error_t *E_IO;
>> ----
>> // libhttp header
>> extern const error_t *HTTP_E_HEADERS;
>>
>> ----
>> // libc object file
>>
>> static error_t _NOMEM = { "E_NOMEM", "Out of memory" };
>> const error_t *E_NOMEM = &_NOMEM;
>>
>> static error_t _IO = { "E_IO", "IO failed" };
>> const error_t *E_IO = &_IO;
>>
>> ----
>> // libhttp object file
>>
>> static error_t _HEADERS = {"HTTP_E_HEADERS", "HTTP: Failed processing
>> headers" };
>> const error_t *HTTP_E_HEADERS = &_HEADERS;
>>
>> ----
>> // user
>>
>> const error_t *err = http_func_1(...);
>> if (err == HTTP_E_HEADERS) {
>>    // process error
>> } else if (err == E_IO) {
>>    // process other error
>> } else {
>>    // process all other errors
>>    fprintf(stderr, "Failed http operation: [%s] %s\n", err->name,
>> err->description);
>>    exit(1);
>> }
>>
>>
>>
>>
>>
>>
>>
>> What do you think?
>>
>> -- jzr

_______________________________________________
HelenOS-devel mailing list
[email protected]
http://lists.modry.cz/listinfo/helenos-devel

Reply via email to