/* * ip_clrtoeol -- * Clear from the current cursor to the end of the line. * * PUBLIC: int ip_clrtoeol __P((SCR *)); */ int ip_clrtoeol(SCR *sp) { IP_BUF ipb; IP_PRIVATE *ipp = IPP(sp); /* Temporary hack until we can pass screen pointers * or name screens */ if (IS_VSPLIT(sp)) { size_t x, y, spcnt; IP_PRIVATE *ipp; int error; ipp = IPP(sp); y = ipp->row; x = ipp->col; error = 0; for (spcnt = sp->cols - x; spcnt > 0 && ! error; --spcnt) error = ip_addstr(sp, " ", 1); if (sp->coff == 0) error |= ip_addstr(sp, "|", 1); error |= ip_move(sp, y, x); return error; } ipb.code = SI_CLRTOEOL; return (vi_send(ipp->o_fd, NULL, &ipb)); }
/* * ip_addstr -- * Add len bytes from the string at the cursor, advancing the cursor. * * PUBLIC: int ip_addstr __P((SCR *, const char *, size_t)); */ int ip_addstr(SCR *sp, const char *str, size_t len) { IP_BUF ipb; IP_PRIVATE *ipp; int iv, rval; ipp = IPP(sp); /* * If ex isn't in control, it's the last line of the screen and * it's a split screen, use inverse video. */ iv = 0; if (!F_ISSET(sp, SC_SCR_EXWROTE) && ipp->row == LASTLINE(sp) && IS_SPLIT(sp)) { iv = 1; ip_attr(sp, SA_INVERSE, 1); } ipb.code = SI_ADDSTR; ipb.len1 = len; ipb.str1 = str; rval = vi_send(ipp->o_fd, "a", &ipb); /* XXXX */ ipp->col += len; if (iv) ip_attr(sp, SA_INVERSE, 0); return (rval); }
static int replace_network_address(struct sdp_chopper *chop, struct network_address *address, struct packet_stream *ps, struct sdp_ng_flags *flags) { char buf[64]; int len; struct packet_stream *sink = packet_stream_sink(ps); if (is_addr_unspecified(&address->parsed) && !(sink && is_trickle_ice_address(&sink->advertised_endpoint))) return 0; if (copy_up_to(chop, &address->address_type)) return -1; if (flags->media_address.s && is_addr_unspecified(&flags->parsed_media_address)) __parse_address(&flags->parsed_media_address, NULL, NULL, &flags->media_address); if (!is_addr_unspecified(&flags->parsed_media_address)) { if (IN6_IS_ADDR_V4MAPPED(&flags->parsed_media_address)) len = sprintf(buf, "IP4 " IPF, IPP(flags->parsed_media_address.s6_addr32[3])); else { memcpy(buf, "IP6 ", 4); inet_ntop(AF_INET6, &flags->parsed_media_address, buf + 4, sizeof(buf)-4); len = strlen(buf); } } else call_stream_address(buf, ps, SAF_NG, &len); chopper_append_dup(chop, buf, len); if (skip_over(chop, &address->address)) return -1; return 0; }
/* * ip_deleteln -- * Delete the current line, scrolling all lines below it. * * PUBLIC: int ip_deleteln __P((SCR *)); */ int ip_deleteln(SCR *sp) { IP_BUF ipb; IP_PRIVATE *ipp = IPP(sp); /* * This clause is required because the curses screen uses reverse * video to delimit split screens. If the screen does not do this, * this code won't be necessary. * * If the bottom line was in reverse video, rewrite it in normal * video before it's scrolled. */ if (!F_ISSET(sp, SC_SCR_EXWROTE) && IS_SPLIT(sp)) { ipb.code = SI_REWRITE; ipb.val1 = RLNO(sp, LASTLINE(sp)); if (vi_send(ipp->o_fd, "1", &ipb)) return (1); } /* * The bottom line is expected to be blank after this operation, * and other screens must support that semantic. */ ipb.code = SI_DELETELN; return (vi_send(ipp->o_fd, NULL, &ipb)); }
static str *call_update_lookup_udp(char **out, struct callmaster *m, enum call_opmode opmode) { struct call *c; struct call_monologue *monologue; GQueue q = G_QUEUE_INIT; struct stream_params sp; str *ret, callid, viabranch, fromtag, totag = STR_NULL; int i; str_init(&callid, out[RE_UDP_UL_CALLID]); str_init(&viabranch, out[RE_UDP_UL_VIABRANCH]); str_init(&fromtag, out[RE_UDP_UL_FROMTAG]); if (opmode == OP_ANSWER) str_init(&totag, out[RE_UDP_UL_TOTAG]); c = call_get_opmode(&callid, m, opmode); if (!c) { ilog(LOG_WARNING, "["STR_FORMAT"] Got UDP LOOKUP for unknown call-id", STR_FMT(&callid)); return str_sprintf("%s 0 " IPF "\n", out[RE_UDP_COOKIE], IPP(m->conf.ipv4)); } monologue = call_get_mono_dialogue(c, &fromtag, &totag); if (!monologue) goto ml_fail; if (addr_parse_udp(&sp, out)) goto addr_fail; g_queue_push_tail(&q, &sp); i = monologue_offer_answer(monologue, &q, NULL); g_queue_clear(&q); if (i) goto unlock_fail; ret = streams_print(&monologue->active_dialogue->medias, sp.index, sp.index, out[RE_UDP_COOKIE], SAF_UDP); rwlock_unlock_w(&c->master_lock); redis_update(c, m->conf.redis); ilog(LOG_INFO, "Returning to SIP proxy: "STR_FORMAT"", STR_FMT(ret)); goto out; ml_fail: ilog(LOG_ERR, "Invalid dialogue association"); goto unlock_fail; addr_fail: ilog(LOG_ERR, "Failed to parse a media stream: %s/%s:%s", out[RE_UDP_UL_ADDR4], out[RE_UDP_UL_ADDR6], out[RE_UDP_UL_PORT]); goto unlock_fail; unlock_fail: rwlock_unlock_w(&c->master_lock); ret = str_sprintf("%s E8\n", out[RE_UDP_COOKIE]); out: obj_put(c); return ret; }
/* * ip_insertln -- * Push down the current line, discarding the bottom line. * * PUBLIC: int ip_insertln __P((SCR *)); */ int ip_insertln(SCR *sp) { IP_BUF ipb; IP_PRIVATE *ipp = IPP(sp); ipb.code = SI_INSERTLN; return (vi_send(ipp->o_fd, NULL, &ipb)); }
/* * ip_cursor -- * Return the current cursor position. * * PUBLIC: int ip_cursor __P((SCR *, size_t *, size_t *)); */ int ip_cursor(SCR *sp, size_t *yp, size_t *xp) { IP_PRIVATE *ipp; ipp = IPP(sp); *yp = ipp->row; *xp = ipp->col; return (0); }
/* * ip_bell -- * Ring the bell/flash the screen. * * PUBLIC: int ip_bell __P((SCR *)); */ int ip_bell(SCR *sp) { IP_BUF ipb; IP_PRIVATE *ipp = IPP(sp); ipb.code = SI_BELL; return (vi_send(ipp->o_fd, NULL, &ipb)); }
/* * ip_rename -- * Rename the file. * * PUBLIC: int ip_rename __P((SCR *, char *, int)); */ int ip_rename(SCR *sp, char *name, int on) { IP_BUF ipb; IP_PRIVATE *ipp = IPP(sp); ipb.code = SI_RENAME; ipb.str1 = name; ipb.len1 = name ? strlen(name) : 0; return (vi_send(ipp->o_fd, "a", &ipb)); }
/* * ip_reply -- * Reply to a message. * * PUBLIC: int ip_reply __P((SCR *, int, char *)); */ int ip_reply(SCR *sp, int status, char *msg) { IP_BUF ipb; IP_PRIVATE *ipp = IPP(sp); ipb.code = SI_REPLY; ipb.val1 = status; ipb.str1 = msg == NULL ? "" : msg; ipb.len1 = strlen(ipb.str1); return (vi_send(ipp->o_fd, "1a", &ipb)); }
/* * PUBLIC: void ip_msg __P((SCR *, mtype_t, char *, size_t)); */ void ip_msg(SCR *sp, mtype_t mtype, char *line, size_t len) { IP_PRIVATE *ipp = IPP(sp); if (F_ISSET(ipp, IP_ON_ALTERNATE)) vs_msg(sp, mtype, line, len); else { write(ipp->t_fd, line, len); F_CLR(sp, SC_EX_WAIT_NO); } }
/* * ip_child -- * Prepare child. * * PUBLIC: int ip_child __P((SCR *)); */ int ip_child(SCR *sp) { IP_PRIVATE *ipp = IPP(sp); if (ipp->t_fd != -1) { dup2(ipp->t_fd, 0); dup2(ipp->t_fd, 1); dup2(ipp->t_fd, 2); close(ipp->t_fd); } return 0; }
/* * ip_move -- * Move the cursor. * * PUBLIC: int ip_move __P((SCR *, size_t, size_t)); */ int ip_move(SCR *sp, size_t lno, size_t cno) { IP_PRIVATE *ipp; IP_BUF ipb; ipp = IPP(sp); ipp->row = lno; ipp->col = cno; ipb.code = SI_MOVE; ipb.val1 = RLNO(sp, lno); ipb.val2 = RCNO(sp, cno); return (vi_send(ipp->o_fd, "12", &ipb)); }
/* * ip_attr -- * Toggle a screen attribute on/off. * * PUBLIC: int ip_attr __P((SCR *, scr_attr_t, int)); */ int ip_attr(SCR *sp, scr_attr_t attribute, int on) { IP_BUF ipb; IP_PRIVATE *ipp = IPP(sp); if (attribute == SA_ALTERNATE) { if (on) F_SET(ipp, IP_ON_ALTERNATE); else F_CLR(ipp, IP_ON_ALTERNATE); } ipb.code = SI_ATTRIBUTE; ipb.val1 = attribute; ipb.val2 = on; return (vi_send(ipp->o_fd, "12", &ipb)); }
/* * ip_addstr -- * Add len bytes from the string at the cursor, advancing the cursor. * * PUBLIC: int ip_waddstr __P((SCR *, const CHAR_T *, size_t)); */ int ip_waddstr(SCR *sp, const CHAR_T *str, size_t len) { IP_BUF ipb; IP_PRIVATE *ipp; int iv, rval; ipp = IPP(sp); ipb.code = SI_WADDSTR; ipb.len1 = len * sizeof(CHAR_T); ipb.str1 = (char *)str; rval = vi_send(ipp->o_fd, "a", &ipb); /* XXXX */ ipp->col += len; return (rval); }
/* * ip_refresh -- * Refresh the screen. * * PUBLIC: int ip_refresh __P((SCR *, int)); */ int ip_refresh(SCR *sp, int repaint) { IP_BUF ipb; IP_PRIVATE *ipp; db_recno_t total; ipp = IPP(sp); /* * If the scroll bar information has changed since we last sent * it, resend it. Currently, we send three values: * * top The line number of the first line in the screen. * num The number of lines visible on the screen. * total The number of lines in the file. * * XXX * This is a gross violation of layering... we're looking at data * structures at which we have absolutely no business whatsoever * looking... */ ipb.val1 = HMAP->lno; ipb.val2 = TMAP->lno - HMAP->lno; if (sp->ep != NULL && sp->ep->db != NULL) (void)db_last(sp, &total); ipb.val3 = total == 0 ? 1 : total; if (ipb.val1 != ipp->sb_top || ipb.val2 != ipp->sb_num || ipb.val3 != ipp->sb_total) { ipb.code = SI_SCROLLBAR; (void)vi_send(ipp->o_fd, "123", &ipb); ipp->sb_top = ipb.val1; ipp->sb_num = ipb.val2; ipp->sb_total = ipb.val3; } /* Refresh/repaint the screen. */ ipb.code = repaint ? SI_REDRAW : SI_REFRESH; return (vi_send(ipp->o_fd, NULL, &ipb)); }
/* * ip_busy -- * Display a busy message. * * PUBLIC: void ip_busy __P((SCR *, const char *, busy_t)); */ void ip_busy(SCR *sp, const char *str, busy_t bval) { IP_BUF ipb; IP_PRIVATE *ipp = IPP(sp); switch (bval) { case BUSY_ON: ipb.code = SI_BUSY_ON; ipb.str1 = str; ipb.len1 = strlen(str); (void)vi_send(ipp->o_fd, "a", &ipb); break; case BUSY_OFF: ipb.code = SI_BUSY_OFF; (void)vi_send(ipp->o_fd, NULL, &ipb); break; case BUSY_UPDATE: break; } return; }
#include "nplog.h" #include "rpc_serve.h" #include "PCC_CenterSession.h" #include "pcc_startup.h" int g_majorVer = 1; int g_minorVer = 0; int g_thirdVer = 0; char g_compileNumInfo[32] = { "ISCMComp" // 8个开始标识字符 "-1\0\0\0\0\0\0\0\0\0\0\0\0\0\0" // 共16个字符用于存放编译号(svn号,由外部工具写入) "ISCMNum" // 8个结束标识字符(包括最后的'\0') }; BOOL g_exitFlag = false; IPP g_serveIPP = IPP(INADDR_ANY, 9011); static void LogPrint__(void* /*param*/, const char* txt) { NPLogInfo(("%s", txt)); } int main(int argc, const char* argv[]) { // 分析命令行选项 CmdArgParser cmdParser("", TCtoC_str(CStrFormat(_T("服务版本: %d.%d.%d"), g_majorVer, g_minorVer, g_thirdVer))); CStringA sip; VERIFY(cmdParser.AddStr( sip, "-ip", "", "IP", "服务的TCP监听IP,默认监听本机所有IP" ));
/* * XXX probably better to require new_window to send size * so we never have to call ip_wevent with sp == NULL * * ip_wevent -- * Return a single event. * * PUBLIC: int ip_wevent __P((WIN *, SCR *, EVENT *, u_int32_t, int)); */ int ip_wevent(WIN *wp, SCR *sp, EVENT *evp, u_int32_t flags, int ms) { IP_PRIVATE *ipp; struct timeval t, *tp; int termread; int nr = 0; if (LF_ISSET(EC_INTERRUPT)) { /* XXX */ evp->e_event = E_TIMEOUT; return (0); } ipp = sp == NULL ? WIPP(wp) : IPP(sp); /* Discard the last command. */ if (ipp->iskip != 0) { ipp->iblen -= ipp->iskip; memmove(ipp->ibuf, ipp->ibuf + ipp->iskip, ipp->iblen); ipp->iskip = 0; } termread = F_ISSET(ipp, IP_IN_EX) || (sp && F_ISSET(sp, SC_SCR_EXWROTE)); /* Process possible remaining commands */ if (!termread && ipp->iblen >= IPO_CODE_LEN && ip_trans(sp, ipp, evp)) return 0; /* Set timer. */ if (ms == 0) tp = NULL; else { t.tv_sec = ms / 1000; t.tv_usec = (ms % 1000) * 1000; tp = &t; } /* Read input events. */ for (;;) { switch (ip_read(sp, ipp, tp, termread, &nr)) { case INP_OK: if (termread) { evp->e_csp = ipp->tbuf; evp->e_len = nr; evp->e_event = E_STRING; } else if (!ip_trans(sp, ipp, evp)) continue; break; case INP_EOF: evp->e_event = E_EOF; break; case INP_ERR: evp->e_event = E_ERR; break; case INP_TIMEOUT: evp->e_event = E_TIMEOUT; break; default: abort(); } break; } return (0); }