If the function definition declares a function static (and you don't declare that function in a header file) then those functions are only accessible from the source file where they are defined.

You can use some tricks such as opaque handles. For example, pass a void pointer around rather than a pointer to SomeStruct. Any code which wants to do anything with the handle directly will either need to call your functions, or somehow convert the handle into a pointer of some type they can legitimately use (and carry the risk if they convert to something else). That doesn't stop a determined programmer from breaking things, but does prevent accidental abuses (which is really all that private and protected attributes do too).

There is no way, in C, of declaring particular members of a struct private or protected: all are implicitly public. C is not designed to support such concepts.