static TcpSession* _SessionTable_CreateSession( dssl_SessionTable* tbl, DSSL_Pkt* pkt, NM_SessionType s_type ) { TcpSession* sess; _ASSERT( tbl ); _ASSERT( pkt ); if( s_type == eSessionTypeNull ) { _ASSERT( s_type != eSessionTypeNull ); return NULL; } sess = (TcpSession*) malloc( sizeof(*sess) ); /* TODO: handle low memory condition */ if( sess == NULL ) return NULL; if( SessionInit( tbl->env, sess, pkt, s_type ) != DSSL_RC_OK ) { free( sess ); return NULL; } if( tbl->env && tbl->env->session_callback ) { tbl->env->session_callback( tbl->env, sess, DSSL_EVENT_NEW_SESSION ); } _SessionTable_addSession( tbl, sess ); ++ tbl->sessionCount; return sess; }
////////////////////////////////////////////////////////////////////////////// /// @param[in] p_rgMsg Message to send. /// @param[in] p_nMsgSz Size of the message to be sent. /// @retval none ////////////////////////////////////////////////////////////////////////////// void CHartUpLink::WirelessRequest( uint8_t p_rgMsg[], size_t p_nMsgSz, unsigned int p_nHandle=0 ) { if ( m_nLinkState == EUDP_LINK_DISCONNECTED ) return SessionInit() ; HartPDUHdr hdr( CHartUpMatcher::EPKT_WREQUEST ); hdr.SetByteCount( networkorder16(sizeof(HartPDUHdr) + p_nMsgSz) ); ProtocolPacketPtr pkt = ProtocolPacketPtr(new ProtocolPacket) ; pkt->AllocateCopy( (uint8_t*)&hdr, sizeof(hdr), 0, p_nMsgSz ) ; pkt->PushBack(p_rgMsg, p_nMsgSz); if ( p_nHandle ) { HartPDUHdr::access(pkt)->m_ui16TransactId = p_nHandle ; p_nHandle = hostorder16(p_nHandle); //LOG( "%s UpLink.WirelessRequest [BigEndian] (Handle:x%04X)", m_szName, p_nHandle ); } else { HartPDUHdr::access(pkt)->m_ui16TransactId = networkorder16(m_nHandle--) ; //LOG( "%s UpLink.WirelessRequest [LittleEndian] (Handle:x%04X)", m_szName, HartPDUHdr::access(pkt)->m_ui16TransactId ); } unsigned handle = m_pMsgQ->Enque( EQ_UDP_NORMAL, pkt, p_nHandle ); if (handle) { HartPDUHdr::access(pkt)->m_ui16TransactId = networkorder16(handle ); m_pMsgQ->StartXmit() ; } else { // delete pkt; } }
void CHartUpLink::SendAck( uint16_t transactionId ) { if ( m_nLinkState == EUDP_LINK_DISCONNECTED ) return SessionInit() ; HartPDUHdr hdr( CHartUpMatcher::EPKT_WREQUEST ); hdr.m_nMsgFlagType = 0x11; // response hdr.m_nStatus = 0; hdr.SetByteCount( networkorder16(sizeof(HartPDUHdr)) ); ProtocolPacketPtr pkt = ProtocolPacketPtr(new ProtocolPacket) ; pkt->AllocateCopy( (uint8_t*)&hdr, sizeof(hdr), 0, 0 ) ; HartPDUHdr::access(pkt)->m_ui16TransactId = transactionId ; transactionId = hostorder16(transactionId); unsigned handle = m_pMsgQ->Enque( EQ_UDP_KEEP_ALIVE, pkt, transactionId ); if (handle) { m_pMsgQ->StartXmit() ; } }
int main(int argc, char **argv) { int ch, i, loop; struct utsname ubuf; const char *str, *dstr; /* This function runs all the setup for startup, and then * proceeds into the primary event loop at the end. */ /* Init state variable struct */ memset(&Mode, 0, sizeof(EMode)); Mode.wm.master = 1; Mode.wm.pid = getpid(); Mode.wm.exec_name = argv[0]; Mode.wm.startup = 1; Mode.mode = MODE_NONE; EXInit(); Dpy.screen = -1; str = getenv("EDEBUG"); if (str) EDebugInit(str); str = getenv("EDEBUG_COREDUMP"); if (str) Mode.wm.coredump = 1; str = getenv("EDEBUG_EXIT"); if (str) Mode.debug_exit = atoi(str); str = getenv("ECONFNAME"); if (str) EConfNameSet(str); str = getenv("ECONFDIR"); if (str) EDirUserSet(str); str = getenv("ECACHEDIR"); if (str) EDirUserCacheSet(str); srand((unsigned int)time(NULL)); if (!uname(&ubuf)) Mode.wm.machine_name = Estrdup(ubuf.nodename); if (!Mode.wm.machine_name) Mode.wm.machine_name = Estrdup("localhost"); /* Now we're going to interpret any of the commandline parameters * that are passed to it -- Well, at least the ones that we * understand. */ Mode.theme.path = NULL; dstr = NULL; for (loop = 1; loop;) { ch = EoptGet(argc, argv); if (ch <= 0) break; #if 0 Eprintf("Opt: %c: %d - %s\n", ch, eoptind, eoptarg); #endif switch (ch) { default: case '?': printf("e16: Ignoring: "); for (i = eoptind; i < argc; i++) printf("%s ", argv[i]); printf("\n"); loop = 0; break; case 'h': EoptHelp(); exit(0); break; case 'd': dstr = eoptarg; break; case 'f': Mode.wm.restart = 1; break; case 'p': EConfNameSet(eoptarg); break; case 'P': EDirUserSet(eoptarg); break; case 'Q': EDirUserCacheSet(eoptarg); break; case 's': Mode.wm.single = 1; Dpy.screen = strtoul(eoptarg, NULL, 10); break; case 'S': SetSMID(eoptarg); break; case 't': Mode.theme.path = Estrdup(eoptarg); break; case 'V': printf("%s %s\n", e_wm_name, e_wm_version); exit(0); break; case 'v': EDebugSet(EDBUG_TYPE_VERBOSE, 1); break; case 'w': sscanf(eoptarg, "%dx%d", &Mode.wm.win_w, &Mode.wm.win_h); Mode.wm.window = 1; Mode.wm.single = 1; Mode.wm.master = 0; break; #ifdef USE_EXT_INIT_WIN case 'X': ExtInitWinSet(strtoul(eoptarg, NULL, 0)); Mode.wm.restart = 1; break; #endif case 'm': Mode.wm.master = 0; Mode.wm.master_screen = strtoul(eoptarg, NULL, 10); break; } } SignalsSetup(); /* Install signal handlers */ EDirsSetup(); ECheckEprog("epp"); ECheckEprog("eesh"); SetupX(dstr); /* This is where the we fork per screen */ /* X is now running, and we have forked per screen */ ESavePrefixSetup(); /* So far nothing should rely on a selected settings or theme. */ ConfigurationLoad(); /* Load settings */ /* Initialise internationalisation */ LangInit(); /* The theme path must now be available for config file loading. */ ThemePathFind(); /* Set the Environment variables */ Esetenv("EVERSION", e_wm_version); Esetenv("EROOT", EDirRoot()); Esetenv("EBIN", EDirBin()); Esetenv("ECONFDIR", EDirUser()); Esetenv("ECACHEDIR", EDirUserCache()); Esetenv("ETHEME", Mode.theme.path); /* Move elsewhere? */ EImageInit(); HintsInit(); CommsInit(); SessionInit(); SnapshotsLoad(); #if USE_DBUS DbusInit(); #endif if (Mode.wm.window) EMapWindow(VROOT); ModulesSignal(ESIGNAL_INIT, NULL); /* Load the theme */ ThemeConfigLoad(); if (Mode.debug_exit) return 0; /* Do initial configuration */ ModulesSignal(ESIGNAL_CONFIGURE, NULL); /* Set root window cursor */ ECsrApply(ECSR_ROOT, WinGetXwin(VROOT)); #ifdef USE_EXT_INIT_WIN /* Kill the E process owning the "init window" */ ExtInitWinKill(); #endif /* let's make sure we set this up and go to our desk anyways */ DeskGoto(DesksGetCurrent()); ESync(ESYNC_MAIN); #ifdef SIGCONT for (i = 0; i < Mode.wm.child_count; i++) kill(Mode.wm.children[i], SIGCONT); #endif ModulesSignal(ESIGNAL_START, NULL); #if ENABLE_DIALOGS DialogsInit(); #endif EwinsManage(); RunInitPrograms(); SnapshotsSpawn(); if (!Mode.wm.restart) StartupWindowsOpen(); Conf.startup.firsttime = 0; Mode.wm.save_ok = Conf.autosave; Mode.wm.startup = 0; autosave(); /* The primary event loop */ EventsMain(); SessionExit(EEXIT_QUIT, NULL); return 0; }