245 lines
4.4 KiB
C
245 lines
4.4 KiB
C
|
#include "sscs_ipc.h"
|
||
|
|
||
|
#ifdef SSCS_WIN32_PLAT_F
|
||
|
#include "windows.h"
|
||
|
#define XTIER_RPC_PIPE TEXT("\\\\.\\PIPE\\SS_RPC_PIPE")
|
||
|
|
||
|
// global
|
||
|
int firstReadAfterWrite = 0;
|
||
|
#endif
|
||
|
|
||
|
/*
|
||
|
*/
|
||
|
|
||
|
#ifdef SSCS_LINUX_PLAT_F
|
||
|
int ipc_unx_create()
|
||
|
{
|
||
|
int retVal = 0;
|
||
|
struct sockaddr_un servAddr;
|
||
|
char path[MAX_SOCKET_PATH_LEN];
|
||
|
int sockFd = 0;
|
||
|
do
|
||
|
{
|
||
|
sockFd = socket(AF_UNIX,SOCK_STREAM,0);
|
||
|
if( sockFd < 0 )
|
||
|
{
|
||
|
retVal = sockFd;
|
||
|
break;
|
||
|
}
|
||
|
memset(&servAddr,0,sizeof(servAddr));
|
||
|
servAddr.sun_family = AF_UNIX;
|
||
|
|
||
|
strcpy(servAddr.sun_path,"/tmp/.novellCASA");
|
||
|
retVal = connect(sockFd,(struct sockaddr*)&servAddr, sizeof(servAddr));
|
||
|
if(retVal < 0 )
|
||
|
{
|
||
|
DMSG(("Connect fails : %s\n",strerror(errno)));
|
||
|
DMSG(("Closing socket : %d\n",sockFd));
|
||
|
close(sockFd);
|
||
|
break;
|
||
|
}
|
||
|
else
|
||
|
retVal = sockFd;
|
||
|
}while(0);
|
||
|
return retVal;
|
||
|
}
|
||
|
|
||
|
#else
|
||
|
|
||
|
void * ipc_win_create()
|
||
|
{
|
||
|
|
||
|
//#ifdef SSCS_WIN32_PLAT_F
|
||
|
// connect to the named Pipe
|
||
|
HANDLE hPipe = NULL;
|
||
|
int rcode;
|
||
|
DWORD mode = PIPE_READMODE_MESSAGE;
|
||
|
|
||
|
hPipe = CreateFile(
|
||
|
XTIER_RPC_PIPE,
|
||
|
GENERIC_READ | GENERIC_WRITE,
|
||
|
0,
|
||
|
NULL, //null,
|
||
|
OPEN_EXISTING,
|
||
|
0,
|
||
|
0);
|
||
|
|
||
|
if (hPipe == INVALID_HANDLE_VALUE)
|
||
|
{
|
||
|
rcode = GetLastError();
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
return hPipe;
|
||
|
}
|
||
|
|
||
|
#endif
|
||
|
|
||
|
#ifdef SSCS_LINUX_PLAT_F
|
||
|
int ipc_unx_write(int fd, Byte *pData, int bytes)
|
||
|
{
|
||
|
int retVal = write(fd,pData,bytes);
|
||
|
if( retVal < 0 )
|
||
|
{
|
||
|
DMSG(("Write returns error : %d - %s\n",retVal, strerror(errno)));
|
||
|
}
|
||
|
return retVal;
|
||
|
|
||
|
//#endif
|
||
|
}
|
||
|
|
||
|
#else
|
||
|
|
||
|
int ipc_win_write(HANDLE hPipe, LPCVOID lpBuffer, DWORD bytesToWrite)
|
||
|
{
|
||
|
//#ifdef SSCS_WIN32_PLAT_F
|
||
|
BOOL rcode;
|
||
|
int icode;
|
||
|
DWORD lpBytesWritten = 0;
|
||
|
//LPCVOID msgLen = malloc(4);
|
||
|
|
||
|
|
||
|
|
||
|
// rcode = WaitNamedPipe(
|
||
|
// XTIER_RPC_PIPE,
|
||
|
// NMPWAIT_WAIT_FOREVER);
|
||
|
|
||
|
|
||
|
|
||
|
// the server expects us to first write the number of bytes in the msg we're about to write.
|
||
|
rcode = WriteFile(
|
||
|
hPipe,
|
||
|
(LPCVOID)&bytesToWrite,
|
||
|
4,
|
||
|
&lpBytesWritten,
|
||
|
NULL);
|
||
|
|
||
|
if (!rcode)
|
||
|
{
|
||
|
icode = GetLastError();
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
|
||
|
// rcode = WaitNamedPipe(
|
||
|
// XTIER_RPC_PIPE,
|
||
|
// NMPWAIT_WAIT_FOREVER);
|
||
|
|
||
|
rcode = WriteFile(
|
||
|
hPipe,
|
||
|
lpBuffer, //LPCVOID lpBuffer,
|
||
|
bytesToWrite, //DWORD nNumberOfBytesToWrite,
|
||
|
&lpBytesWritten, // LPDWORD lpNumberOfBytesWritten,
|
||
|
NULL); //LPOVERLAPPED lpOverlapped
|
||
|
|
||
|
if (!rcode)
|
||
|
{
|
||
|
icode = GetLastError();
|
||
|
|
||
|
}
|
||
|
|
||
|
firstReadAfterWrite = 1;
|
||
|
return lpBytesWritten;
|
||
|
}
|
||
|
|
||
|
#endif
|
||
|
|
||
|
/*
|
||
|
*
|
||
|
*/
|
||
|
|
||
|
#ifdef SSCS_LINUX_PLAT_F
|
||
|
|
||
|
int ipc_unx_read(int fd, Byte *pData, int bytes)
|
||
|
{
|
||
|
|
||
|
int bytesToRead = 0; // Keep track of number of bytes to read
|
||
|
int bytesRead = 0; // Number of bytes read
|
||
|
int retVal = 0;
|
||
|
|
||
|
for(bytesToRead = bytes; bytesToRead;)
|
||
|
{
|
||
|
bytesRead = read(fd, pData, bytesToRead);
|
||
|
if(bytesRead < 0)
|
||
|
{
|
||
|
return -1;
|
||
|
}
|
||
|
bytesToRead -= bytesRead;
|
||
|
pData += bytesRead;
|
||
|
}
|
||
|
return bytesRead;
|
||
|
}
|
||
|
//#endif
|
||
|
|
||
|
|
||
|
#else
|
||
|
|
||
|
int ipc_win_read(HANDLE hPipe, LPVOID lpBuffer, DWORD numOfBytesToRead)
|
||
|
{
|
||
|
//#ifdef SSCS_WIN32_PLAT_F
|
||
|
|
||
|
BOOL rcode;
|
||
|
DWORD numBytesRead = 0;
|
||
|
LPVOID pMsgLen = malloc(4);
|
||
|
int icode;
|
||
|
|
||
|
if (firstReadAfterWrite)
|
||
|
{
|
||
|
firstReadAfterWrite = 0;
|
||
|
|
||
|
// server first sends the number of bytes that gets sent.
|
||
|
rcode = ReadFile(
|
||
|
hPipe, //HANDLE hFile,
|
||
|
pMsgLen, //LPVOID lpBuffer,
|
||
|
4, //numOfBytesToRead, //DWORD nNumberOfBytesToRead,
|
||
|
&numBytesRead, //LPDWORD lpNumberOfBytesRead,
|
||
|
NULL); //LPOVERLAPPED lpOverlapped
|
||
|
|
||
|
if (!rcode)
|
||
|
{
|
||
|
icode = GetLastError();
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
rcode = ReadFile(
|
||
|
hPipe, //HANDLE hFile,
|
||
|
lpBuffer, //LPVOID lpBuffer,
|
||
|
numOfBytesToRead, //DWORD nNumberOfBytesToRead,
|
||
|
&numBytesRead, //LPDWORD lpNumberOfBytesRead,
|
||
|
NULL); //LPOVERLAPPED lpOverlapped
|
||
|
|
||
|
|
||
|
if (pMsgLen)
|
||
|
free(pMsgLen);
|
||
|
|
||
|
return numBytesRead;
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
|
||
|
#ifdef SSCS_LINUX_PLAT_F
|
||
|
int ipc_unx_close(int fd)
|
||
|
{
|
||
|
return close(fd);
|
||
|
|
||
|
}
|
||
|
#else
|
||
|
|
||
|
|
||
|
int ipc_win_close(HANDLE hPipe)
|
||
|
{
|
||
|
//#ifdef SSCS_WIN32_PLAT_F
|
||
|
|
||
|
|
||
|
BOOL rcode;
|
||
|
rcode = DisconnectNamedPipe(hPipe);
|
||
|
rcode = CloseHandle(hPipe);
|
||
|
return 0;
|
||
|
|
||
|
}
|
||
|
|
||
|
|
||
|
#endif
|