You are trying to group code according to struct. C grouping is by file. You put all the functions and internal variables in a header or a header and a object ".o" file compiled from a c source file.
It is not necessary to reinvent object-orientation from scratch for a C program, which is not an object oriented language.
I have seen this before. It is a strange thing. Coders, some of them, have an aversion to passing an object they want to change into a function to change it, even though that is the standard way to do so.
I blame C++, because it hid the fact that the class object is always the first parameter in a member function, but it is hidden. So it looks like it is not passing the object into the function, even though it is.
Client.addClient(Client& c); // addClient first parameter is actually
// "this", a pointer to the Client object.
C is flexible and can take passing things by reference.
A C function often returns only a status byte or int and that is often ignored. In your case a proper form might be
err = addClient( container_t cnt, client_t c);
if ( err != 0 )
{ fprintf(stderr, "could not add client (%d) \n", err );
addClient would be in Client.h or Client.c