void* upm_ims_init_str(const char* protocol, const char* params) { fprintf(stderr, "String initialization - not implemented, using i2c bus 0, addr: 0x20: %s\n", __FILENAME__); return ims_init(0, 0x20); }
//--------------------------------------------------------------------- // itm_startup //--------------------------------------------------------------------- int itm_startup(void) { long retval, i; if (itm_mode) return 0; // 异步I/O驱动初始化 retval = apr_poll_install(APDEVICE_AUTO); if (retval) { itm_log(ITML_BASE, "service starting failed: poll device error %d", retval); return -10 + retval; } // 内存节点管理器初始化 imp_init(&itm_fds, sizeof(struct ITMD), NULL); imp_init(&itm_mem, itm_psize, NULL); // 初始化内存增长限制 itm_mem.grow_limit = 4096; // 套接字初始化 retval = itm_socket_create(); if (retval) { itm_log(ITML_BASE, "service starting failed: listen error code=%d errno=%d", retval, apr_errno()); return -20 + retval; } retval = apr_poll_init(&itm_polld, 0x20000); if (retval) { itm_socket_release(); itm_log(ITML_BASE, "service starting failed: poll init error %d", retval); return -30 + retval; } retval = apr_poll_add(itm_polld, itm_outer_sock4, APOLL_IN, &itmd_outer4); if (retval) { itm_socket_release(); apr_poll_destroy(itm_polld); itm_polld = NULL; itm_log(ITML_BASE, "service starting failed: poll event error %d", retval); return -40 + retval; } retval = apr_poll_add(itm_polld, itm_inner_sock4, APOLL_IN, &itmd_inner4); if (retval) { itm_socket_release(); apr_poll_destroy(itm_polld); itm_polld = NULL; itm_log(ITML_BASE, "service starting failed: poll event error %d", retval); return -50 + retval; } retval = apr_poll_add(itm_polld, itm_dgram_sock4, 0, &itmd_dgram4); if (retval) { itm_socket_release(); apr_poll_destroy(itm_polld); itm_polld = NULL; itm_log(ITML_BASE, "service starting failed: poll event error %d", retval); return -60 + retval; } itm_mask(&itmd_dgram4, APOLL_IN, 0); #ifdef AF_INET if (itm_outer_sock6 >= 0) { retval = apr_poll_add(itm_polld, itm_outer_sock6, APOLL_IN, &itmd_outer6); if (retval) { itm_socket_release(); apr_poll_destroy(itm_polld); itm_polld = NULL; itm_log(ITML_BASE, "service starting failed: poll event error %d", retval); return -70 + retval; } } if (itm_inner_sock6 >= 0) { retval = apr_poll_add(itm_polld, itm_inner_sock6, APOLL_IN, &itmd_inner6); if (retval) { itm_socket_release(); apr_poll_destroy(itm_polld); itm_polld = NULL; itm_log(ITML_BASE, "service starting failed: poll event error %d", retval); return -80 + retval; } } if (itm_dgram_sock6 >= 0) { retval = apr_poll_add(itm_polld, itm_dgram_sock6, 0, &itmd_dgram6); if (retval) { itm_socket_release(); apr_poll_destroy(itm_polld); itm_polld = NULL; itm_log(ITML_BASE, "service starting failed: poll event error %d", retval); return -90 + retval; } itm_mask(&itmd_dgram6, APOLL_IN, 0); } #endif idt_init(&itm_timeu, itm_outer_time, NULL); idt_init(&itm_timec, itm_inner_time, NULL); iv_init(&itm_hostv, NULL); iv_init(&itm_datav, NULL); if (itm_datamax < 0x100000) itm_datamax = 0x100000; itm_dsize(itm_datamax + 0x10000); itm_wchannel(32000, NULL); ims_init(&itm_dgramdat4, &itm_mem); ims_init(&itm_dgramdat6, &itm_mem); itm_state = 0; itm_outer_cnt = 0; itm_inner_cnt = 0; itm_wtime = 0; itm_stime = (int)time(NULL); itm_time_start = apr_timex() / 1000; itm_time_current = itm_time_start; itm_time_slap = itm_time_start + ITMD_TIME_CYCLE; itm_notice_slap = 0; itm_notice_cycle = -1; itm_notice_count = 0; itm_version = 0; itm_docsize = 0; itm_document[0] = 0; imp_init(&itm_msg_mem, 4096, NULL); ims_init(&itm_msg_n0, &itm_msg_mem); ims_init(&itm_msg_n1, &itm_msg_mem); apr_mutex_init(&itm_msg_lock); itm_msg_cnt0 = 0; itm_msg_cnt1 = 0; itm_wsize = 0; switch (itm_headmod) { case ITMH_WORDLSB: case ITMH_WORDMSB: case ITMH_EWORDLSB: case ITMH_EWORDMSB: itm_headlen = 12; itm_hdrsize = 2; break; case ITMH_DWORDLSB: case ITMH_DWORDMSB: case ITMH_EDWORDLSB: case ITMH_EDWORDMSB: case ITMH_DWORDMASK: itm_headlen = 14; itm_hdrsize = 4; break; case ITMH_BYTELSB: case ITMH_BYTEMSB: case ITMH_EBYTELSB: case ITMH_EBYTEMSB: itm_headlen = 11; itm_hdrsize = 1; break; case ITMH_RAWDATA: itm_headlen = 14; itm_hdrsize = 4; break; case ITMH_LINESPLIT: itm_headlen = 14; itm_hdrsize = 4; break; default: itm_headmod = ITMH_WORDLSB; itm_headlen = 12; itm_hdrsize = 2; break; } if (itm_headmod < ITMH_EWORDLSB) { itm_headint = itm_headmod; itm_headinc = 0; itm_headmsk = 0; } else if (itm_headmod < ITMH_DWORDMASK) { itm_headint = itm_headmod - 6; itm_headinc = itm_hdrsize; itm_headmsk = 0; } else if (itm_headmod == ITMH_DWORDMASK) { itm_headint = ITMH_DWORDLSB; itm_headinc = 0; itm_headmsk = 1; } else if (itm_headmod == ITMH_RAWDATA) { itm_headint = ITMH_DWORDLSB; itm_headinc = 0; itm_headmsk = 0; } else if (itm_headmod == ITMH_LINESPLIT) { itm_headint = ITMH_DWORDLSB; itm_headinc = 0; itm_headmsk = 0; } else { itm_headint = ITMH_DWORDLSB; itm_headinc = 0; itm_headmsk = 0; } for (i = 0; i < 512; i++) { itm_book[i] = NULL; itm_booklen[i] = 0; iv_init(&itm_bookv[i], NULL); } itm_mode = 1; itm_stat_send = 0; itm_stat_recv = 0; itm_stat_discard = 0; if (itm_limit < itm_inner_blimit * 2) { itm_limit = itm_inner_blimit * 2; } if (itm_dhcp_base < 100) itm_dhcp_base = 100; if (itm_dhcp_high < itm_dhcp_base) itm_dhcp_high = itm_dhcp_base; itm_log(ITML_BASE, "Transmod %x.%d%d (%s, %s) started ....", ITMV_VERSION >> 8, (ITMV_VERSION & 0xf0) >> 4, ITMV_VERSION & 0x0f, __DATE__, __TIME__); return 0; }