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
