.ad 8
.bm 8
.fm 4
.bt $Copyright by   Software AG, 1993$$Page %$
.tm 12
.hm 6
.hs 3
.tt 1 $NME$Project Distributed Database System$vos41c$
.tt 2 $$$
.tt 3 $R.Roedling$Create and remove IPC resources$1996-08-06$
***********************************************************
.nf


    ========== licence begin LGPL
    Copyright (C) 2002 SAP AG

    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; either
    version 2.1 of the License, or (at your option) any later version.

    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
    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, write to the Free Software
    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
    ========== licence end

.fo
.nf
.sp
Module  : Create_and_remove_IPC_resources
=========
.sp
Purpose :
.CM *-END-* purpose -------------------------------------
.sp
.cp 3
Define  :

.CM *-END-* define --------------------------------------
.sp;.cp 3
Use     :

.CM *-END-* use -----------------------------------------
.sp;.cp 3
Synonym :

.CM *-END-* synonym -------------------------------------
.sp;.cp 3
Author  : R.Roedling
.sp
.cp 3
Created : 1993-02-01
.sp
.cp 3
Version : 1994-01-27
.sp
.cp 3
Release :  6.2 	 Date : 1996-08-06
.br
.sp
***********************************************************
.sp
.cp 10
.fo
.oc _/1
Specification:

.CM *-END-* specification -------------------------------
.sp 2
***********************************************************
.sp
.cp 10
.fo
.oc _/1
Description:

.CM *-END-* description ---------------------------------
.sp 2
***********************************************************
.sp
.cp 10
.nf
.oc _/1
Structure:

.CM *-END-* structure -----------------------------------
.sp 2
**********************************************************
.sp
.cp 10
.nf
.oc _/1
.CM -lll-
Code    :
/*PRETTY*/

/*
 * INCLUDE FILES
 */


/*
 *  DEFINES
 */
#define MOD__  "VOS41C : "
#define MF__   MOD__"UNDEFINED"

/*
 *  MACROS
 */


/*
 *  LOCAL TYPE AND STRUCT DEFINITIONS
 */


/*
 * EXTERNAL VARIABLES
 */


/*
 *  EXPORTED VARIABLES
 */


/*
 * LOCAL VARIABLES
 */


/*
 * LOCAL FUNCTION PROTOTYPES
 */


/*
 * ========================== GLOBAL FUNCTIONS ================================
 */

LONG sql41c_create_event_sem ( PHEV                 phevSysSem,
                               PSZ                  pszSemPath,
                               PSZ                  pszName,
                               ULONG                flAttr,          // - OS/2
                               BOOL                 fState,          // - OS/2
                               PSECURITY_ATTRIBUTES pSA )            // - WIN32
  {
  #undef  MF__
  #define MF__ MOD__"sql41c_create_event_sem"
  APIRET      rc;
  PATHNAME    szSemName;
  PSZ         pszSemName;
  #if defined(_WIN32)
    HEV       hev;
  #endif

  DBGPAS;

  /*
   * Create Event Semaphore
   */
  if (( pszSemPath != NULL ) && ( pszName != NULL ))
    {
    strcpy (szSemName, pszSemPath);
    strcat (szSemName, pszName);
    pszSemName = szSemName;
    }
  else
    {
    strcpy(szSemName, "UNNAMED" );
    pszSemName = NULL;
    }

  DBG3 ((MF__, "DosCreateEventSem: %s", szSemName));

  #if defined(_WIN32)
    hev = CreateEvent (pSA, FALSE, FALSE, pszSemName);

    rc  = GetLastError ();

    switch ( rc )
      {
      case NO_ERROR:
        *phevSysSem = hev;
        return ( NO_ERROR );

      case ERROR_ALREADY_EXISTS:
        *phevSysSem = (HEV)INVALID_HANDLE_VALUE;
        CloseHandle (hev);
        return (ERROR_DUPLICATE_NAME);

      default:
        *phevSysSem = (HEV)INVALID_HANDLE_VALUE;
        break;
      }

  #else
    rc = DosCreateEventSem(pszSemName, phevSysSem, flAttr, fState);

    switch ( rc )
      {
      case NO_ERROR:             return ( NO_ERROR );
      case ERROR_DUPLICATE_NAME: return (ERROR_DUPLICATE_NAME);
      }
  #endif

  MSGD (( ERR_CREATING_SEM, szSemName, rc));
  DBG1 ((MF__, "Error on creating semaphore: %s, rc = %u\n", szSemName, rc));

  return (rc);
  }

/*------------------------------*/

LONG sql41c_open_event_sem ( PHEV     phevSysSem,
                             PSZ      pszSemPath,
                             PSZ      pszName,
                             ULONG    ulNoMsgRc )
  {
  #undef  MF__
  #define MF__ MOD__"sql41c_open_event_sem"
  APIRET      rc = NO_ERROR;
  PATHNAME    szSemName;
  PSZ         pszSemName;

  DBGPAS;

  /*
   * Open Event Semaphore
   */
  if (( pszSemPath != NULL ) && ( pszName != NULL ))
    {
    strcpy (szSemName, pszSemPath);
    strcat (szSemName, pszName);
    pszSemName = szSemName;
    }
  else
    {
    strcpy(szSemName, "UNNAMED" );
    pszSemName = NULL;
    }


  #if defined(_WIN32)
   *phevSysSem = OpenEvent(EVENT_ALL_ACCESS, FALSE, pszSemName);

   if ( *phevSysSem )
     return (NO_ERROR);
   else
     {
     rc = GetLastError();

     if (( sql02_get_platform_id() != VER_PLATFORM_WIN32_NT ) &&
         ( rc                      == ERROR_INVALID_NAME ))
       return (ERROR_SEM_NOT_FOUND);          // --- no error message
     if ( rc == ERROR_FILE_NOT_FOUND )
       return (ERROR_SEM_NOT_FOUND);          // --- no error message
     if ( ulNoMsgRc == rc )
       return (rc);                           // --- no error message
     }
  #else
   rc = DosOpenEventSem(pszSemName, phevSysSem);

   switch ( rc )
     {
     case NO_ERROR:             return (NO_ERROR);
     case ERROR_SEM_NOT_FOUND : return (rc);  // --- no error message
     case ERROR_INVALID_HANDLE: return (rc);  // --- no error message
     default:
          if ( ulNoMsgRc == rc ) return (rc); // --- no error message
          break;  // --- error
     }
  #endif

  MSGD (( ERR_OPENING_SEM, szSemName, rc));
  DBG1 ((MF__, "Error on opening semaphore '%s', rc = %u\n", szSemName, rc));

  return (rc);
  }

/*------------------------------*/

LONG sql41c_post_event_sem ( HEV hevSysSem, PSZ pszSemDesc )
  {
  #undef  MF__
  #define MF__ MOD__"sql41c_post_event_sem"
  APIRET      rc;

  DBGPAS;

  #if defined(_WIN32)
   if ( SetEvent( hevSysSem ))
     return (NO_ERROR);

   rc = GetLastError();
  #else
   rc = DosPostEventSem ( hevSysSem );
  #endif

  if ((rc != NO_ERROR) && (rc != ERROR_ALREADY_POSTED))
    {
    MSGD (( ERR_POSTING_SEM, pszSemDesc, rc));
    DBG1 ((MF__, "Error on posting semaphore: %s, rc = %u\n", pszSemDesc, rc));
    }

  return (rc);
  }

/*------------------------------*/

LONG sql41c_close_event_sem ( HEV hevSysSem, PSZ pszSemDesc )
  {
  #undef  MF__
  #define MF__ MOD__"sql41c_close_event_sem"
  APIRET      rc;

  DBGPAS;

  #if defined(_WIN32)
   if ( CloseHandle ( hevSysSem ) )
     return (NO_ERROR);

   rc = GetLastError();
  #else
   rc = DosCloseEventSem ( hevSysSem );
  #endif

  if (rc != NO_ERROR)
    {
    MSGD (( ERR_CLOSING_SEM, pszSemDesc, rc));
    DBG1 ((MF__, "Error on closing semaphore: %s, rc = %u\n", pszSemDesc, rc));
    }

  return (rc);
  }

/*------------------------------*/

LONG sql41c_wait_event_sem ( HEV      hevSysSem,
                             ULONG    ulTimeout,
                             PSZ      pszSemDesc )
  {
  #undef  MF__
  #define MF__ MOD__"sql41c_wait_event_sem"
  APIRET      rc;
  #if !defined(_WIN32)
   ULONG       ulPostCt;
  #endif

  DBGPAS;

  #if defined(_WIN32)
   switch (WaitForSingleObject(hevSysSem, ulTimeout))
     {
     case WAIT_OBJECT_0: return (NO_ERROR);
     case WAIT_TIMEOUT:  return (ERROR_TIMEOUT);
     case 0xffffffff:    rc = GetLastError();       break;
     default:            rc = ERROR_INVALID_HANDLE; break;
     }
  #else
   do
     {
     rc = DosWaitEventSem(hevSysSem, ulTimeout);

     if ( rc == ERROR_TIMEOUT )
       return ( rc );

     DosResetEventSem(hevSysSem, &ulPostCt);
     }
   while ( rc == ERROR_INTERRUPT );
  #endif


  if ( rc != NO_ERROR )
    {
    MSGD (( ERR_WAITING_SEM, pszSemDesc, rc ));
    DBG1 ((MF__, "Error on waiting for semaphore '%s', rc = %u", pszSemDesc, rc));
    return (rc);
    }

  return ( rc );
  }

/*------------------------------*/


LONG sql41c_create_shrd_mem ( PPVOID               ppMemBase,
                              ULONG                ulMemSize,
                              PSZ                  pszShrdMemPath,
                              PSZ                  pszName,
                              PSECURITY_ATTRIBUTES pSA,              // - WIN32
                              HANDLE               *phFileMapping)   // - WIN32
  {
  #undef  MF__
  #define MF__ MOD__"sql41c_create_shrd_mem"
  APIRET      rc = NO_ERROR;
  PATHNAME    szShrdMem;
  PSZ         pszShrdMem;
  #if !defined(_WIN32)
    ULONG     AttributeFlags = PAG_WRITE | PAG_READ | PAG_COMMIT;
  #endif

  DBGPAS;

  if (pszShrdMemPath)
    {
    strcpy (szShrdMem, pszShrdMemPath);
    strcat (szShrdMem, pszName);
    pszShrdMem = szShrdMem;
    }
  else
    {
    strcpy (szShrdMem, "UNNAMED");
    pszShrdMem = NULL;

    #if !defined(_WIN32)
      AttributeFlags |= OBJ_GIVEABLE;
    #endif
    }
  DBG3 ((MF__, "DosAllocSharedMem: %s", szShrdMem));

  #if defined(_WIN32)
    if (!(*phFileMapping = CreateFileMapping ( (HANDLE)-1L, pSA,
                                               PAGE_READWRITE | SEC_COMMIT, 0,
                                               ulMemSize, pszShrdMem ) ))
        {
        rc             = GetLastError();
        *ppMemBase     = NULL;
        *phFileMapping = (HEV)INVALID_HANDLE_VALUE;
        DBG1((MF__, "CreateFileMapping failed, rc=%d", rc));
        return (rc);
        }
    if (!(*ppMemBase = MapViewOfFile (*phFileMapping, FILE_MAP_ALL_ACCESS,
                                      0, 0, 0)))
        {
        rc             = GetLastError();
        *ppMemBase     = NULL;
        CloseHandle (*phFileMapping);
        *phFileMapping = (HEV)INVALID_HANDLE_VALUE;
        DBG1((MF__, "MapViewOfFile failed, rc=%d", rc));
        return (rc);
        }
  #else
    rc = DosAllocSharedMem (ppMemBase, pszShrdMem, ulMemSize, AttributeFlags);
  #endif

  if (rc != NO_ERROR)
    {
    MSGD (( ERR_CREATE_SHRD_MEM, szShrdMem, rc ));
    DBG1 ((MF__, "Cannot create shared memory segment: %s, rc = %u\n",
                 szShrdMem, rc));
    *ppMemBase     = NULL;
    *phFileMapping = (HEV)INVALID_HANDLE_VALUE;
    return (rc);
    }

  return (NO_ERROR);
  }

/*------------------------------*/

LONG sql41c_get_named_shrd_mem ( PPVOID   ppMemBase,
                                 PSZ      pszShrdMemPath,
                                 PSZ      pszName,
                                 HANDLE   *phFileMapping )           // - WIN32
  {
  #undef  MF__
  #define MF__ MOD__"sql41c_get_named_shrd_mem"
  APIRET      rc = NO_ERROR;
  PATHNAME    szShrdMem;
  #if !defined(_WIN32)
   ULONG      AttributeFlags;
  #endif

  DBGPAS;

  strcpy (szShrdMem, pszShrdMemPath);
  strcat (szShrdMem, pszName);
  DBG3 ((MF__, "get_named_shrd_mem: %s", szShrdMem));


  #if defined(_WIN32)
   if (!(*phFileMapping = OpenFileMapping( FILE_MAP_ALL_ACCESS,
                                           FALSE, szShrdMem )))
     rc = GetLastError();
   else if (!(*ppMemBase = MapViewOfFile( *phFileMapping, FILE_MAP_ALL_ACCESS,
                                          0, 0, 0 )))
     {
     rc = GetLastError();
     CloseHandle ( *phFileMapping );
     }
  #else
    AttributeFlags = PAG_WRITE | PAG_READ;
    rc = DosGetNamedSharedMem((PPVOID)ppMemBase, szShrdMem, AttributeFlags);
  #endif

  if (rc != NO_ERROR)
    {
    *ppMemBase     = NULL;
    *phFileMapping = (HEV)INVALID_HANDLE_VALUE;

    if (( rc != ERROR_FILE_NOT_FOUND ) && ( rc != ERROR_INVALID_NAME ))
      {
      MSGD (( IERR_GET_SHRD_MEM, szShrdMem, rc ));
      DBG1 ((MF__, "Cannot get named-shared-memory-segment: %s, rc = %u",
                   szShrdMem, rc));
      }
    return (rc);
    }

  return (NO_ERROR);
  }

/*------------------------------*/

LONG sql41c_give_shrd_mem ( PVOID    pMemBase,                       // - OS/2
                            PID      pidDest,
                            HANDLE   hFileMapping,                   // - WIN32
                            HANDLE   *phDestFileMapping )            // - WIN32
  {
  #undef  MF__
  #define MF__ MOD__"sql41c_give_shrd_mem"
  APIRET      rc = NO_ERROR;
  #if defined(_WIN32)
   HANDLE  hProcess;
  #endif

  DBGPAS;

  #if defined(_WIN32)
   hProcess = OpenProcess(PROCESS_DUP_HANDLE, FALSE, pidDest);

   if (!hProcess)
     {
     rc = GetLastError();
     return (rc);
     }

   if ( !DuplicateHandle( GetCurrentProcess(),
                          hFileMapping,
                          hProcess,
                          phDestFileMapping,
                          0, FALSE, DUPLICATE_SAME_ACCESS))
     {
     rc = GetLastError();
     }

   CloseHandle(hProcess);
  #else
   rc = DosGiveSharedMem( pMemBase, pidDest, PAG_READ | PAG_WRITE);
  #endif

  if ( rc != NO_ERROR )
    MSGD (( ERR_CANT_GIVE_SHRD_MEM, rc ));

  return (rc);
  }

/*------------------------------*/

LONG sql41c_free_shrd_mem ( PVOID    pMemBase,
                            HANDLE   hFileMapping )                  // - WIN32
  {
  #undef  MF__
  #define MF__ MOD__"sql41c_free_shrd_mem"
  APIRET      rc = NO_ERROR;

  DBGPAS;

  #if defined(_WIN32)
   if ( !UnmapViewOfFile(pMemBase) || !CloseHandle(hFileMapping) )
     rc = GetLastError();
  #else
    rc = DosFreeMem (pMemBase);
  #endif

  if ( rc != NO_ERROR)
    MSGD (( ERR_FREE_SHRD_MEMORY, rc ));

  return (rc);
  }


/*------------------------------*/

LONG sql41c_create_queue_mailslot ( PHANDLE              phHandle,
                                    PSZ                  pszPath,
                                    PSZ                  pszName,
                                    ULONG                ulReqLen,   // - WIN32
                                    PSECURITY_ATTRIBUTES pSA)        // - WIN32
  {
  #undef  MF__
  #define MF__ MOD__"sql41c_create_queue_mailslot"
  APIRET      rc = NO_ERROR;
  PATHNAME    szName;

  DBGPAS;

  /*
   * create queue/mailslot
   */
  strcpy (szName, pszPath);
  strcat (szName, pszName);

  DBG3 ((MF__, "sql41c_create_queue_mailslot: %s", szName));

  #if defined(_WIN32)

   *phHandle = CreateMailslot ( szName, ulReqLen, MAILSLOT_WAIT_FOREVER, pSA );

   if ( *phHandle == INVALID_HANDLE_VALUE )
     rc = GetLastError ();

  #else

   rc = DosCreateQueue((PHQUEUE)phHandle, QUE_FIFO, szName);

  #endif

  if (rc != NO_ERROR)
    {
    MSGD (( ERR_CREATING_QUEUE_MAILSLOT, szName, rc));
    DBG1 ((MF__, "Error on creating queue/mailslot '%s', rc = %u", szName, rc));
    }

  return (rc);
  }

/*------------------------------*/

LONG sql41c_open_queue_mailslot ( PPID     ppidOwner,                // - OS/2
                                  PHANDLE  phHandle,
                                  PSZ      pszPath,
                                  PSZ      pszName )
  {
  #undef  MF__
  #define MF__ MOD__"sql41c_open_queue_mailslot"
  APIRET      rc = NO_ERROR;
  PATHNAME    szName;

  DBGPAS;

  /*
   * open queue/mailslot
   */
  strcpy (szName, pszPath);
  strcat (szName, pszName);

  DBG3 ((MF__, "sql41c_open_queue_mailslot: %s", szName));

  #if defined(_WIN32)
   *ppidOwner = 0;
   *phHandle  = CreateFile ( szName, GENERIC_WRITE, FILE_SHARE_READ |
                             FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL );

   if ( *phHandle == INVALID_HANDLE_VALUE )
     rc = GetLastError();

  #else

   rc = DosOpenQueue( ppidOwner, (PHQUEUE)phHandle, szName);

   if ( rc == ERROR_QUE_NAME_NOT_EXIST )
     rc = ERROR_FILE_NOT_FOUND;

  #endif

  if (rc != NO_ERROR)
    {
    if ( rc != ERROR_FILE_NOT_FOUND )         // --- no error message
      {
      MSGD (( ERR_OPENING_QUEUE_MAILSLOT, szName, rc));
      DBG1 ((MF__, "Error on opening queue/mailslot '%s', rc = %u", szName,rc));
      }
    }

  return (rc);
  }

/*------------------------------*/

LONG sql41c_write_queue_mailslot ( HANDLE  hHandle,
                                   PVOID   pRequest,
                                   ULONG   ulReqLen,
                                   ULONG   ulDataLen,                // - OS/2
                                   PVOID   pData )                   // - OS/2
  {
  #undef  MF__
  #define MF__ MOD__"sql41c_write_queue_mailslot"
  APIRET              rc = NO_ERROR;
  #if defined(_WIN32)
   ULONG              ulBytesWritten;
  #endif

  DBGPAS;

  #if defined(_WIN32)
   if ( !WriteFile ( hHandle, pRequest, ulReqLen, &ulBytesWritten, NULL))
     rc = GetLastError ();
  #else

   if ( ulReqLen != sizeof ( ULONG ))
     {
     MSGD (( ERR_WRONG_REQ_BUF_SIZE, ulReqLen ));
     DBG1 ((MF__, "Wrong request buffer size: %u", ulReqLen ));
     return ( ERROR_INSUFFICIENT_BUFFER );
     }

   rc = DosWriteQueue( (HQUEUE)hHandle, *(ULONG*)pRequest,
                       ulDataLen, (PBYTE)pData, 0 );
  #endif

  if (rc != NO_ERROR)
    {
    if ( rc != ERROR_HANDLE_EOF )             // --- no error message ?
      {
      MSGD (( ERR_WRITING_QUEUE_MAILSLOT, rc));
      DBG1 ((MF__, "Error while writeng queue/mailslot, rc = %u", rc));
      }
    }

  return (rc);
  }

/*------------------------------*/

LONG sql41c_read_queue_mailslot ( HANDLE  hHandle,
                                  PVOID   pRequest,
                                  ULONG   ulReqLen,
                                  PULONG  pulDataLen,               // - OS/2
                                  PPVOID  ppData )                  // - OS/2
  {
  #undef  MF__
  #define MF__ MOD__"sql41c_read_queue_mailslot"
  APIRET              rc = NO_ERROR;
  #if defined(_WIN32)
   ULONG              ulBytesRead;
   ULONG              ulMessage;
  #else
   BYTE               ElemPriority;       //   Priority of element received
   REQUESTDATA        Request;            //   Request-identification data
  #endif

  DBGPAS;

  #if defined(_WIN32)
   *pulDataLen = 0;
   *ppData     = NULL;

   if ( sql02_get_platform_id () != VER_PLATFORM_WIN32_NT )
     {
     // --- POLLING - Windows 95 workaround !!!!!!!!
     do
       {
       if (!GetMailslotInfo( hHandle, NULL, &ulMessage, NULL, NULL ))
         {
         rc = GetLastError ();
         break;
         }
       else if ( ulMessage == MAILSLOT_NO_MESSAGE )
         {
         SLEEP ( 250 );
         }
       }
     while ( ulMessage == MAILSLOT_NO_MESSAGE );
     }

   if ( rc == NO_ERROR )
    {
    if ( !ReadFile ( hHandle, pRequest, ulReqLen, &ulBytesRead, NULL))
      rc = GetLastError ();
    else if (ulBytesRead != ulReqLen)
      rc = ERROR_INSUFFICIENT_BUFFER;
    }
  #else
   if ( ulReqLen == sizeof ( Request.ulData ))
     {
     rc = DosReadQueue((HQUEUE)hHandle,
                       &Request,
                       pulDataLen,
                       (PPVOID)ppData,
                       0,
                       DCWW_WAIT,
                       &ElemPriority,
                       0);

     *(ULONG*)pRequest = Request.ulData;
     }
   else
     rc = ERROR_INSUFFICIENT_BUFFER;
  #endif

  if (rc != NO_ERROR)
    {
    if ( rc == ERROR_INSUFFICIENT_BUFFER )
      {
      MSGD (( ERR_WRONG_REQ_BUF_SIZE, ulReqLen ));
      DBG1 ((MF__, "Wrong request buffer size: %u", ulReqLen ));
      }
    else
      {
      MSGD (( ERR_READING_QUEUE_MAILSLOT, rc));
      DBG1 ((MF__, "Error while reading from queue/mailslot, rc = %u", rc));
      }
    }

  return (rc);
  }

/*------------------------------*/

LONG sql41c_close_queue_mailslot ( HANDLE  hHandle )
  {
  #undef  MF__
  #define MF__ MOD__"sql41c_close_queue_mailslot"
  APIRET      rc = NO_ERROR;

  DBGPAS;

  #if defined(_WIN32)
   CloseHandle ( hHandle );
  #else
   DosCloseQueue ( (HQUEUE)hHandle );
  #endif

  return ( rc );
  }

/*------------------------------*/

VOID sql41c_build_unique_obj_name ( PIPC_BASE_OBJ_NAME pszClientObjName )
  {
  #undef  MF__
  #define MF__ MOD__"sql41c_get_unique_obj_name"
  ULONG                 ulStrLen;
  ULONG                 ulCurrTime;
  static ULONG          ulIdx = 0;
  static PID            Pid   = (PID)UNDEF;
  TID                   Tid;

  DBGPAS;

  if ( Pid == (PID)UNDEF )
    GETPROCESSID (&Pid);

  Tid        = THREADID;
  ulCurrTime = GetCurrentTime ();

  _ultoa ( (ULONG)Pid, pszClientObjName, 16 );

  ulStrLen = strlen ( pszClientObjName );
  pszClientObjName [ ulStrLen ] = '-';
  _ultoa ( (ULONG)Tid, pszClientObjName + ulStrLen + 1, 16 );

  ulStrLen = strlen ( pszClientObjName );
  pszClientObjName [ ulStrLen ] = '-';
  _ultoa ( ++ulIdx, pszClientObjName + ulStrLen + 1, 16 );

  ulStrLen = strlen ( pszClientObjName );
  pszClientObjName [ ulStrLen ] = '-';
  _ultoa ( ulCurrTime, pszClientObjName + ulStrLen + 1, 16 );

  strupr (pszClientObjName);

  DBG3 (( MF__, "pszClientObjName : '%s'", pszClientObjName ));

  #if 0
   // --- for debug purpose only
   MSGCD (( 0,0, "pszClientObjName: %s", pszClientObjName ));
  #endif

  return;
  }


/*
 * ========================== LOCAL FUNCTIONS =================================
 */


/*
 * =============================== END ========================================
 */
.CM *-END-* code ----------------------------------------
.SP 2
***********************************************************
.PA
