267 lines
5.4 KiB
C
267 lines
5.4 KiB
C
/***********************************************************************
|
|
*
|
|
* Copyright (C) 2005-2006 Novell, Inc. Inc. All Rights Reserved.
|
|
*
|
|
* This library is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU Lesser General Public
|
|
* License as published by the Free Software Foundation; version 2.1
|
|
* of the License.
|
|
*
|
|
* This library is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
* Library Lesser General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
* License along with this library; if not, Novell, Inc.
|
|
*
|
|
* To contact Novell about this file by physical or electronic mail,
|
|
* you may find current contact information at www.novell.com.
|
|
*
|
|
***********************************************************************/
|
|
|
|
#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
|