492 lines
10 KiB
C
492 lines
10 KiB
C
/* wmbSessionLib.c - RCB session session library */
|
|
|
|
/*
|
|
* Copyright (c) 2001, 2007 Wind River Systems, Inc.
|
|
*
|
|
* The right to copy, distribute, modify or otherwise make use
|
|
* of this software may be licensed only pursuant to the terms
|
|
* of an applicable Wind River license agreement.
|
|
*/
|
|
|
|
/*
|
|
modification history
|
|
--------------------
|
|
01d,09jul10,m_z remove compile warning
|
|
01c,14apr08,m_z declare semSession as PUBLIC (WIND00116756)
|
|
01b,24feb07,msa Correct the apigen comments so they match the actual
|
|
routines. Also fix any apigen errors.
|
|
01a,01aug01,pns written
|
|
*/
|
|
|
|
/*
|
|
DESCRIPTION
|
|
This module implements transaction processing for RCB objects
|
|
|
|
INCLUDE FILES: wm.h wmb.h
|
|
*/
|
|
|
|
/* includes */
|
|
|
|
#include "wm.h"
|
|
#include "wmb.h"
|
|
|
|
#ifdef __SNMP_API_ENABLED__
|
|
#include "mibway.h"
|
|
#include "wmmErrorLog.h"
|
|
#endif
|
|
STATUS wmbSessionValidate
|
|
(
|
|
WMB_SESSION_T * pCliEnv,
|
|
ubyte * pName,
|
|
ubyte * pPassword
|
|
);
|
|
|
|
OS_SEM_T semSession;
|
|
LOCAL ubyte4 sessionID;
|
|
|
|
#ifdef __ENABLE_CUSTOM_STRUCT__
|
|
LOCAL WMB_CUSTOM_CONSTRUCT gp_funcConstructCustom = NULL;
|
|
LOCAL WMB_CUSTOM_DESTRUCT gp_funcDestructCustom = NULL;
|
|
#endif
|
|
|
|
STATUS wmbSessionStart
|
|
(
|
|
void
|
|
)
|
|
{
|
|
sessionID = 0;
|
|
#ifdef __ENABLE_CUSTOM_STRUCT__
|
|
gp_funcConstructCustom = NULL;
|
|
gp_funcDestructCustom = NULL;
|
|
#endif
|
|
return wmosSemCreate(&semSession, 1, 0);
|
|
}
|
|
|
|
|
|
STATUS wmbSessionStop
|
|
(
|
|
void
|
|
)
|
|
{
|
|
return wmosSemDestroy(semSession);
|
|
}
|
|
|
|
|
|
LOCAL ubyte4 wmbSessionIdCreate
|
|
(
|
|
void
|
|
)
|
|
{
|
|
wmosSemTake(semSession, WAIT_FOREVER_K);
|
|
sessionID++;
|
|
wmosSemGive(semSession);
|
|
return sessionID;
|
|
}
|
|
|
|
/**************************************************************************
|
|
*
|
|
* wmbSessionCreate - create a new session
|
|
*
|
|
* RETURNS: OK
|
|
*
|
|
*/
|
|
|
|
|
|
STATUS wmbSessionCreate
|
|
(
|
|
WMB_CID_T component,
|
|
OS_SOCKET_T sock,
|
|
ubyte4 flags,
|
|
WMB_SESSION_T ** ppSession
|
|
)
|
|
{
|
|
if (! wmNew (*ppSession))
|
|
return wmError(ERROR_MEMMGR_NO_MEMORY, "no memory");
|
|
|
|
wmbSessionBless (*ppSession);
|
|
wmbSessionSockSet(*ppSession, sock);
|
|
(*ppSession)->flags = flags;
|
|
|
|
wmbSessionIdSet(*ppSession, wmbSessionIdCreate());
|
|
|
|
if (! wmbComponentBad(component))
|
|
{
|
|
wmbSessionComponentSet (*ppSession, component);
|
|
wmbSessionPoolSet (*ppSession, wmbComponentPoolGet(component));
|
|
}
|
|
|
|
/* Every session has a default transaction */
|
|
|
|
if (0 == ((*ppSession)->flags & WMB_SESSION_NO_DEF_TRANSACTION))
|
|
if (OK != wmbTransactionCreate(*ppSession, 0, 0, &(*ppSession)->tid))
|
|
{
|
|
wmFree(*ppSession);
|
|
return ERROR;
|
|
}
|
|
|
|
#ifdef __ENABLE_CUSTOM_STRUCT__
|
|
if (NULL != gp_funcConstructCustom)
|
|
if (OK != gp_funcConstructCustom(*ppSession, &((*ppSession)->pCustomData)))
|
|
{
|
|
if (0 == ((*ppSession)->flags & WMB_SESSION_NO_DEF_TRANSACTION))
|
|
wmbTransactionEnd((*ppSession)->tid);
|
|
wmFree(*ppSession);
|
|
return ERROR;
|
|
}
|
|
#endif
|
|
|
|
#ifdef __SNMP_API_ENABLED__
|
|
if (OK != wmmSnmpInit(*ppSession))
|
|
{
|
|
#ifdef __ENABLE_CUSTOM_STRUCT__
|
|
if (NULL != gp_funcDestructCustom)
|
|
gp_funcDestructCustom((*ppSession)->pCustomData);
|
|
#endif
|
|
if (0 == ((*ppSession)->flags & WMB_SESSION_NO_DEF_TRANSACTION))
|
|
wmbTransactionEnd((*ppSession)->tid);
|
|
wmFree(*ppSession);
|
|
return ERROR;
|
|
}
|
|
|
|
if (OK != wmmErrorLogStart((INT32)wmbSessionIdGet(*ppSession)))
|
|
wmLogPrintf ("unable to start SNMP error logger\n");
|
|
#endif
|
|
|
|
return OK;
|
|
}
|
|
|
|
|
|
/**************************************************************************
|
|
*
|
|
* wmbSessionDestroy - release session memory and resources
|
|
*
|
|
* RETURNS: OK
|
|
*
|
|
*/
|
|
|
|
STATUS wmbSessionDestroy
|
|
(
|
|
WMB_SESSION_T *pSession
|
|
)
|
|
{
|
|
WMB_TID_T tid1, tid2;
|
|
|
|
if (wmbSessionBad(pSession))
|
|
return wmError(ERROR_WMB_SESSION_INVALID, "wmbSessionDestroy: invalid session");
|
|
|
|
#ifdef __ENABLE_CUSTOM_STRUCT__
|
|
if (NULL != gp_funcDestructCustom)
|
|
gp_funcDestructCustom(pSession->pCustomData);
|
|
#endif
|
|
|
|
tid1 = wmbSessionTidGet(pSession);
|
|
while (!wmbTransactionBad(tid1))
|
|
{
|
|
tid2 = wmbTransactionSessionNextGet(tid1);
|
|
wmbTransactionEnd(tid1);
|
|
tid1 = tid2;
|
|
}
|
|
|
|
#ifdef __SNMP_API_ENABLED__
|
|
|
|
if (OK != wmmErrorLogEnd((INT32)wmbSessionIdGet(pSession)))
|
|
wmLogPrintf ("failed to end SNMP error logger\n");
|
|
|
|
#ifdef ENVOY_STACK_K
|
|
OCSNMP_DestructSnmpEnviron(pSession, NULL);
|
|
|
|
#else
|
|
OCSNMP_DestructSnmpEnviron(pSession);
|
|
#endif
|
|
#endif
|
|
|
|
wmFree(pSession);
|
|
|
|
return OK;
|
|
}
|
|
|
|
|
|
/**************************************************************************
|
|
*
|
|
* wmbSessionBackplaneGet - return backplane for <pSession>
|
|
*
|
|
* RETURNS: WMB_ID_T
|
|
*
|
|
*
|
|
* NOMANUAL
|
|
*/
|
|
|
|
WMB_ID_T wmbSessionBackplaneGet
|
|
(
|
|
WMB_SESSION_T * pSession
|
|
)
|
|
{
|
|
WMB_CID_T cid;
|
|
|
|
if (wmbSessionBad(pSession))
|
|
return wmbBackplaneGet();
|
|
|
|
cid = wmbSessionComponentGet(pSession);
|
|
if (wmbComponentBad(cid))
|
|
return wmbBackplaneGet();
|
|
|
|
return wmbComponentBackplaneGet(cid);
|
|
}
|
|
|
|
|
|
|
|
/**************************************************************************
|
|
*
|
|
* wmbSessionValidate - validate user login and password
|
|
*
|
|
* RETURNS: OK, ERROR
|
|
*
|
|
*
|
|
* NOMANUAL
|
|
*/
|
|
|
|
STATUS wmbSessionValidate
|
|
(
|
|
WMB_SESSION_T * pCliEnv,
|
|
ubyte * pName,
|
|
ubyte * pPassword
|
|
)
|
|
{
|
|
return OK;
|
|
}
|
|
|
|
|
|
#if 0
|
|
|
|
sbyte * wmbSessionEnvironmentGet
|
|
(
|
|
WMB_SESSION_T * pEnv,
|
|
sbyte4 index
|
|
)
|
|
{
|
|
if ((NULL == pEnv) || (SESSION_MAX_ENV <= index))
|
|
return NULL;
|
|
|
|
return pEnv->variables[index];
|
|
}
|
|
|
|
#endif /* 0 */
|
|
|
|
|
|
ubyte4 wmbSessionAddressGet
|
|
(
|
|
WMB_SESSION_T * pSession
|
|
)
|
|
{
|
|
OS_SOCKET_T sock;
|
|
ubyte4 addr;
|
|
|
|
if (wmbSessionBad(pSession))
|
|
return 0;
|
|
|
|
sock = wmbSessionSockGet(pSession);
|
|
|
|
if (OK != wmnetClientAddrGet(sock, &addr))
|
|
addr = 0;
|
|
|
|
return addr;
|
|
}
|
|
|
|
|
|
|
|
/**************************************************************************
|
|
*
|
|
* wmbSessionPrintf - printf to client connection
|
|
*
|
|
* RETURNS: OK, ERROR
|
|
*
|
|
*
|
|
* NOMANUAL
|
|
*/
|
|
|
|
sbyte4 wmbSessionPrintf
|
|
(
|
|
WMB_SESSION_T * pSession, /* session pointer */
|
|
sbyte * pFormat, /* format string */
|
|
...
|
|
)
|
|
{
|
|
va_list args;
|
|
OS_SOCKET_T sock;
|
|
sbyte4 bytes;
|
|
|
|
bytes = 0;
|
|
|
|
if (wmbSessionBad(pSession))
|
|
sock = 0;
|
|
else
|
|
sock = wmbSessionSockGet(pSession);
|
|
|
|
va_start (args, pFormat);
|
|
|
|
if (0 < sock)
|
|
wmnetSocketVprintf(sock, pFormat, args, &bytes);
|
|
else
|
|
bytes = vprintf(pFormat, args);
|
|
|
|
va_end (args);
|
|
|
|
return bytes;
|
|
}
|
|
|
|
|
|
|
|
|
|
/**************************************************************************
|
|
*
|
|
* wmbSessionAccessSet - Sets a user's access level (options?)
|
|
*
|
|
* Sets a user's access level (options?) to <newAccess>.
|
|
*
|
|
*
|
|
* RETURNS:
|
|
*\is
|
|
*\i OK
|
|
*\i ERROR (!rws specific?)
|
|
*
|
|
*\ie
|
|
*/
|
|
|
|
STATUS wmbSessionAccessSet
|
|
(
|
|
WMB_SESSION_T * pEnv, /* user environment struct pointer */
|
|
sbyte * pAccessStr /* access level string pointer !rws */
|
|
)
|
|
{
|
|
WM_ACCESS_T newAccess;
|
|
|
|
if (OK != wmAccessFromString(pAccessStr, &newAccess.read))
|
|
return ERROR;
|
|
|
|
if (OK != wmAccessFromString(pAccessStr, &newAccess.write))
|
|
return ERROR;
|
|
|
|
pEnv->access = newAccess;
|
|
return OK;
|
|
}
|
|
|
|
#if defined __WMB_VIEW_ACCESS_MODEL__
|
|
/**************************************************************************
|
|
*
|
|
* wmbSessionViewSet - Sets a user's accessible views
|
|
*
|
|
*
|
|
*
|
|
* RETURNS: STATUS
|
|
*
|
|
* NOMANUAL
|
|
*/
|
|
STATUS wmbSessionViewSet
|
|
(
|
|
WMB_SESSION_T *pSession, /* [in] Pointer to the session structure */
|
|
sbyte *userName /* [in] Pointer to the user name to set views for */
|
|
)
|
|
{
|
|
STATUS rc = OK;
|
|
WMB_VACM_GROUP_T *pGroup;
|
|
WMB_VACM_ACCESS_T *pAccess;
|
|
|
|
if (wmbSessionBad(pSession))
|
|
return wmError(ERROR_GENERAL_NOT_FOUND, "wmbSessionViewSet: Session Not Found");
|
|
|
|
rc = wmbVACMGroupLookup(ETC_SEC_MODEL_WMB_DEFAULT, userName, (sbyte2)(STRLEN(userName) + 1), &pGroup);
|
|
if ((OK == rc) && (NULL != pGroup))
|
|
{
|
|
rc = wmbVACMAccessFind(pGroup->grp_name, (ubyte2)STRLEN(pGroup->grp_name), NULL, 0,
|
|
ETC_SEC_MODEL_WMB_DEFAULT, ETC_SEC_LEVEL_WMB_DEFAULT, &pAccess);
|
|
if ((OK == rc) && (NULL != pAccess))
|
|
{
|
|
pSession->viewList.viewReadList = WMB_VACM_Access_ReadViewGet(pAccess);
|
|
pSession->viewList.viewWriteList = WMB_VACM_Access_WriteViewGet(pAccess);
|
|
}
|
|
}
|
|
|
|
return rc;
|
|
}
|
|
|
|
|
|
#endif /* __WMB_VIEW_ACCESS_MODEL__ */
|
|
/**************************************************************************
|
|
*
|
|
* wmbSessionTidSet - Sets TID
|
|
*
|
|
*
|
|
*
|
|
* RETURNS: none
|
|
*
|
|
* NOMANUAL
|
|
*/
|
|
void wmbSessionTidSet
|
|
(
|
|
WMB_SESSION_T *pSession, /* [in] Session structure to set */
|
|
WMB_TID_T tid /* [in] TID to append */
|
|
)
|
|
{
|
|
if (wmbTransactionBad(pSession->tid))
|
|
pSession->tid = tid;
|
|
else
|
|
{
|
|
if (tid != pSession->tid)
|
|
wmbTransactionSessionTidAppend(tid, pSession->tid);
|
|
}
|
|
}
|
|
|
|
|
|
sbyte * wmbSessionCwdGet
|
|
(
|
|
WMB_SESSION_T * pSession
|
|
)
|
|
{
|
|
WM_DIR_T * pDir;
|
|
|
|
if (NULL == (pDir = wmbSessionDirGet(pSession)))
|
|
return NULL;
|
|
|
|
return pDir->cwd;
|
|
}
|
|
|
|
#ifdef __ENABLE_CUSTOM_STRUCT__
|
|
|
|
/**************************************************************************
|
|
*
|
|
* wmbSessionCustomVectorSetup - Sets Custom data creation and destruction functions.
|
|
*
|
|
* RETURNS: none
|
|
*
|
|
* NOMANUAL
|
|
*/
|
|
void wmbSessionCustomVectorSetup
|
|
(
|
|
WMB_CUSTOM_CONSTRUCT p_funcConstructCustom, /* [in] Pointer to the custom construct function */
|
|
WMB_CUSTOM_DESTRUCT p_funcDestructCustom /* [in] Pointer to the custom destruct function */
|
|
)
|
|
{
|
|
gp_funcConstructCustom = p_funcConstructCustom;
|
|
gp_funcDestructCustom = p_funcDestructCustom;
|
|
}
|
|
|
|
/**************************************************************************
|
|
*
|
|
* wmbSessionCustomDataPointerGet - Returns custom data pointer.
|
|
*
|
|
* RETURNS: none
|
|
*
|
|
* NOMANUAL
|
|
*/
|
|
void *wmbSessionCustomDataPointerGet
|
|
(
|
|
WMB_SESSION_T* pSession /* [in] Pointer to the session record from which custom data is retrieved */
|
|
)
|
|
{
|
|
return (pSession != NULL ? pSession->pCustomData : NULL);
|
|
}
|
|
|
|
#endif
|
|
|
|
/* eof wmbSessionLib.c */
|