I’ve been working on an http server in C as a side project, and while studying the code bases of other C projects, I’ve noticed that there is a tendency to start programming in terms of the project’s own abstractions (structs, functions) at the lowest levels, or “as soon a possible”; e.g., to use a custom file descriptor structs, custom versions of read(2) and write(2) or equivalent “enhanced” functions. What I mean is that I see for example the native FILE or bind/listen/accept once, but then they are either always wrapped or remain encapsulated at a lowest implementation layer.
The way I see it, this effectively maximizes the proportion of your code that speaks in your own abstractions, which certainly makes coding easier (working in your vernacular, so to speak).
Is this intentional, and is there a principle or pattern being applied? For reference, I’ve been looking at ngnix, libuv, livevent, redis and SQLite, the latter two a while back so they may not follow my description.