bool GetNodeInfoMsgEx::processIncoming(struct sockaddr_in* fromAddr, Socket* sock, char* respBuf,
   size_t bufLen, HighResolutionStats* stats)
{
   LogContext log("GetNodeInfoMsg incoming");

   std::string peer = fromAddr ? Socket::ipaddrToStr(&fromAddr->sin_addr) : sock->getPeername();
   LOG_DEBUG_CONTEXT(log, 4, std::string("Received a GetNodeInfoMsg") + peer);

   GeneralNodeInfo info;

   App *app = Program::getApp();

   getCPUInfo(&(info.cpuName), &(info.cpuSpeed), &(info.cpuCount));
   getMemInfo(&(info.memTotal), &(info.memFree));
   info.logFilePath = app->getConfig()->getLogStdFile();

   Node *localNode = app->getLocalNode();
   std::string nodeID = localNode->getID();
   uint16_t nodeNumID = localNode->getNumID();

   GetNodeInfoRespMsg getNodeInfoRespMsg(nodeID.c_str(), nodeNumID, info);
   getNodeInfoRespMsg.serialize(respBuf, bufLen);
   sock->sendto(respBuf, getNodeInfoRespMsg.getMsgLength(), 0, (struct sockaddr*) fromAddr,
      sizeof(struct sockaddr_in));

   LOG_DEBUG_CONTEXT(log, 5, std::string("Sent a message with type: " ) + StringTk::uintToStr(
         getNodeInfoRespMsg.getMsgType() ) + std::string(" to admon"));

   app->getClientOpStats()->updateNodeOp(sock->getPeerIP(), MetaOpCounter_GETNODEINFO);

   return true;
}
bool StatStoragePathMsgEx::processIncoming(struct sockaddr_in* fromAddr, Socket* sock,
   char* respBuf, size_t bufLen, HighResolutionStats* stats)
{
   LogContext log("StatStoragePathMsgEx incoming");

   std::string peer = fromAddr ? Socket::ipaddrToStr(&fromAddr->sin_addr) : sock->getPeername(); 
   LOG_DEBUG_CONTEXT(log, 4, std::string("Received a StatStoragePathMsg from: ") + peer);

   int64_t sizeTotal = 0;
   int64_t sizeFree = 0;
   int64_t inodesTotal = 0;
   int64_t inodesFree = 0;
   
   FhgfsOpsErr statRes = statStoragePath(&sizeTotal, &sizeFree, &inodesTotal, &inodesFree);

   StatStoragePathRespMsg respMsg(statRes, sizeTotal, sizeFree, inodesTotal, inodesFree);
   respMsg.serialize(respBuf, bufLen);
   sock->sendto(respBuf, respMsg.getMsgLength(), 0,
      (struct sockaddr*)fromAddr, sizeof(struct sockaddr_in) );

   App* app = Program::getApp();
   app->getClientOpStats()->updateNodeOp(sock->getPeerIP(), MetaOpCounter_STATFS);

   return true;      
}
bool GetEntryInfoMsgEx::processIncoming(struct sockaddr_in* fromAddr, Socket* sock,
   char* respBuf, size_t bufLen, HighResolutionStats* stats)
{
   #ifdef FHGFS_DEBUG
      const char* logContext = "GetEntryInfoMsg incoming";

      std::string peer = fromAddr ? Socket::ipaddrToStr(&fromAddr->sin_addr) : sock->getPeername();
      LOG_DEBUG(logContext, 4, std::string("Received a GetEntryInfoMsg from: ") + peer);
   #endif // FHGFS_DEBUG

   EntryInfo* entryInfo = this->getEntryInfo();
   LOG_DEBUG(logContext, 5, std::string("ParentEntryID: ") + entryInfo->getParentEntryID() +
      " entryID: " + entryInfo->getParentEntryID() );
   
   StripePattern* pattern = NULL;   
   FhgfsOpsErr getInfoRes;

   
   if(entryInfo->getEntryID().length() == 0 ) // FIXME Bernd: Test
   { // special case: get info for root directory
      getInfoRes = getInfoRoot(&pattern);
   }
   else
   {
      getInfoRes = getInfoRec(entryInfo, &pattern);
   }
   
   
   if(getInfoRes != FhgfsOpsErr_SUCCESS)
   { // error occurred => create a dummy pattern
      UInt16Vector dummyStripeNodes;
      pattern = new Raid0Pattern(1, dummyStripeNodes);
   }

   
   GetEntryInfoRespMsg respMsg(getInfoRes, pattern);
   respMsg.serialize(respBuf, bufLen);
   sock->sendto(respBuf, respMsg.getMsgLength(), 0,
      (struct sockaddr*)fromAddr, sizeof(struct sockaddr_in) );

   // cleanup
   delete(pattern);

   App* app = Program::getApp();
   app->getClientOpStats()->updateNodeOp(sock->getPeerIP(), MetaOpCounter_GETENTRYINFO);

   return true;      
}