CASA/c_micasacache/sscs_ipc.c
2006-01-31 22:01:47 +00:00

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