Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to hide helper functions from public API in c

I'm working on a project and I need to create an API. I am using sockets to communicate between the server (my application) and the clients (the other applications using my API).

This project is in c not C++

I come from a linux background and this is my first project using Windows, Visual Studio 2008, and dll libraries.

I have communication working between the client and server, but I have some that is duplicated on both projects. I would like to create a library (probably a dll file), that both projects can link to so I don't have to maintain extra code.

I also have to create the library that has the API that I need to make available for my clients. Within the API functions that I want public are the calls to these helper functions that are "duplicated code", I don't want to expose these functions to my client, but I do want my server to be able to use those functions. How can I do this?

I will try to clarify with an example. This is what I started with.

Server Project:

int Server_GetPacket(SOCKET sd);
int ReceiveAll(SOCKET sd, char *buf, int len);
int VerifyLen(char *buf);

Client Project:

int Client_SendCommand(int command);
int Client_GetData(int command, char *buf, int len);
int ReceiveAll(SOCKET sd, char *buf, int len);
int VerifyLen(char *buf);

This is kind of what I would like to end up with:

//Server Project:
int Server_GetPacket(SOCKET sd);

// library with public and private types
//  private API (not exposed to my client)
int ReceiveAll(SOCKET sd, char *buf, int len);
int VerifyLen(char *buf);
//  public API (header file available for client)
int Client_SendCommand(int command);
int Client_GetData(int command, char *buf, int len);

Thanks any help would be appreciated.

like image 546
emge Avatar asked Jun 10 '10 16:06

emge


2 Answers

Use

static int ReceiveAll(SOCKET sd, char *buf, int len);

etc to make the functions local to the file / compilation unit.

like image 65
Dirk Eddelbuettel Avatar answered Oct 30 '22 11:10

Dirk Eddelbuettel


If you put the "private" functions in a DLL and make them externally callable by normal means (e.g., callable by a process that loads the library), then they will be "public" for others as well. It is possible to obfuscate the names and things like that, but that is probably not a good solution.

It might be better to put those into a statically linked library as opposed to a DLL. Note, though, that even in this case someone can disassemble the binary obviously and get to the code.

like image 25
Mark Wilkins Avatar answered Oct 30 '22 11:10

Mark Wilkins