On 6 December 2017 at 21:20, Jiri Svoboda <[email protected]> wrote: > Hi Jiri, > > well this is maybe the least important problem that libhttp has. Why don't > you just fix libhttp so that each of its functions either returns errno_t or > an http_error_t that is completely separate type from errno_t? >
Because that would be more difficult, as well as less beneficial in the long run. But of course, it's a possibility. -- jzr > Regards, > Jiri > ---------- Původní e-mail ---------- > Od: Jiří Zárevúcky <[email protected]> > Komu: HelenOS development mailing list <[email protected]> > Datum: 6. 12. 2017 16:19:24 > Předmět: [HelenOS-devel] [RFC] Locally extensible error returns > > 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 > > > _______________________________________________ > HelenOS-devel mailing list > [email protected] > http://lists.modry.cz/listinfo/helenos-devel > _______________________________________________ HelenOS-devel mailing list [email protected] http://lists.modry.cz/listinfo/helenos-devel
