static int pscom_openib_rma_read(pscom_req_t *rendezvous_req, pscom_rendezvous_data_t *rd) { int err, ret; pscom_rendezvous_data_openib_t *psopenib_rd = get_req_data(rd); psoib_rma_req_t *dreq = &psopenib_rd->rma_req; pscom_con_t *con = get_con(rendezvous_req->pub.connection); psoib_con_info_t *ci = con->arch.openib.mcon; perf_add("openib_rma_read"); #ifdef IB_RNDV_USE_PADDING memcpy(rendezvous_req->pub.data, rd->msg.arch.openib.padding_data, rd->msg.arch.openib.padding_size); rendezvous_req->pub.data += rd->msg.arch.openib.padding_size; rendezvous_req->pub.data_len -= rd->msg.arch.openib.padding_size; #endif err = psoib_acquire_rma_mreg(&dreq->mreg, rendezvous_req->pub.data, rendezvous_req->pub.data_len, ci); assert(!err); // ToDo: Catch error dreq->remote_addr = rd->msg.arch.openib.mr_addr; dreq->remote_key = rd->msg.arch.openib.mr_key; dreq->data_len = rendezvous_req->pub.data_len; dreq->ci = ci; dreq->io_done = pscom_openib_rma_read_io_done; dreq->priv = psopenib_rd; psopenib_rd->rendezvous_req = rendezvous_req; err = psoib_post_rma_get(dreq); assert(!err); // ToDo: Catch error return 0; }
static int relay_rcv_padt(struct session* ses, struct pppoe_packet *p_in, struct pppoe_packet **p_out){ int ret; struct pppoe_con *pc; // char tag_buf[32]; struct pppoe_tag *tag = p_in->tags[TAG_RELAY_SID]; if( !tag ) return 0; pc = get_con(ntohs(tag->tag_len),tag->tag_data); if( !pc ) return 0; ret = relay_rcv_pkt(ses,p_in,p_out); if(pc->cl_sock>0){ close(pc->cl_sock); } if(pc->sv_sock>0){ close(pc->sv_sock); } --pc->ref_count; if( pc->ref_count == 0 ){ delete_con(pc->key_len, pc->key); free(pc); } return 1; }
const char *pscom_con_str_reverse(pscom_connection_t *connection) { pscom_con_t *con = get_con(connection); pscom_con_info_t con_info; pscom_con_info(con, &con_info); return pscom_con_info_str2(&con->pub.remote_con_info, &con_info); }
static int relay_rcv_padi(struct session* ses, struct pppoe_packet *p_in, struct pppoe_packet **p_out){ char tag_buf[32]; struct pppoe_con *newpc = NULL; struct pppoe_tag *tag = (struct pppoe_tag *) tag_buf; tag->tag_type = PTT_RELAY_SID; tag->tag_len = htons(ETH_ALEN + sizeof(struct session *)); memcpy(tag->tag_data, p_in->addr.sll_addr, ETH_ALEN); memcpy(tag->tag_data + ETH_ALEN, &ses, sizeof(struct session *)); if(! p_in->tags[TAG_RELAY_SID] ){ copy_tag(p_in, tag); } poe_dbglog(ses, "Recv'd PADI: %P",p_in); poe_dbglog(ses, "Recv'd packet: %P",p_in); newpc = get_con( ntohs(tag->tag_len), tag->tag_data ); if(!newpc){ newpc = (struct pppoe_con *) malloc(sizeof(struct pppoe_con)); memset(newpc , 0, sizeof(struct pppoe_con)); newpc->id = pcid++; newpc->key_len = ntohs(p_in->tags[TAG_RELAY_SID]->tag_len); memcpy(newpc->key, p_in->tags[TAG_RELAY_SID]->tag_data, newpc->key_len); memcpy(newpc->client, p_in->addr.sll_addr, ETH_ALEN); memcpy(newpc->server, MAC_BCAST_ADDR, ETH_ALEN); store_con(newpc); } ++newpc->ref_count; memset(p_in->addr.sll_addr, 0xff, ETH_ALEN); p_in->addr.sll_ifindex = ses->remote.sll_ifindex; send_disc(ses, p_in); return 0; }
void panic(const char *fmt, ...) { set_con(get_con()); va_list args; va_start(args, fmt); disable(); set_color(CRED, CBLACK); puts("\nPANIC: "); set_color(CBRIGHTWHITE, CBLACK); (void)do_printf(fmt, args, kprintf_help, NULL); va_end(args); while(1){ asm("cli\n" "hlt\n"); } }
static int pscom_elan_rma_read(pscom_req_t *rendezvous_req, pscom_rendezvous_data_t *rd) { pscom_rendezvous_data_elan_t *elan_rd = get_req_data(rd); pselan_rdma_req_t *dreq = &elan_rd->rma_req; pscom_con_t *con = get_con(rendezvous_req->pub.connection); pselan_con_info_t *ci = con->arch.elan.ci; dreq->ci = ci; dreq->rmr_context = rd->msg.arch.elan.rmr_context; dreq->rmr_vaddr = rd->msg.arch.elan.rmr_vaddr; dreq->lmr_buf = rendezvous_req->pub.data; dreq->size = rendezvous_req->pub.data_len; dreq->io_done = pscom_elan_rma_read_io_done; dreq->priv = elan_rd; elan_rd->rendezvous_req = rendezvous_req; return pselan_post_rdma_get(dreq); }
static int relay_rcv_pkt(struct session* ses, struct pppoe_packet *p_in, struct pppoe_packet **p_out){ struct pppoe_con *pc; // char tag_buf[32]; struct pppoe_tag *tag = p_in->tags[TAG_RELAY_SID]; if( !tag ) return 0; pc = get_con(ntohs(tag->tag_len),tag->tag_data); if( !pc ) return 0; poe_dbglog(ses, "Recv'd packet: %P",p_in); if( memcmp(pc->client , p_in->addr.sll_addr , ETH_ALEN ) == 0 ){ memcpy(p_in->addr.sll_addr, pc->server, ETH_ALEN); p_in->addr.sll_ifindex = ses->remote.sll_ifindex; }else{ if( memcmp(pc->server, MAC_BCAST_ADDR, ETH_ALEN) == 0 ){ memcpy(pc->server, p_in->addr.sll_addr, ETH_ALEN); }else if( memcmp(pc->server, p_in->addr.sll_addr, ETH_ALEN) !=0){ return 0; } memcpy(p_in->addr.sll_addr, pc->client, ETH_ALEN); p_in->addr.sll_ifindex = ses->local.sll_ifindex; } send_disc(ses, p_in); return 0; }
static int relay_rcv_pads(struct session* ses, struct pppoe_packet *p_in, struct pppoe_packet **p_out){ struct pppoe_con *pc; // char tag_buf[32]; struct pppoe_tag *tag = p_in->tags[TAG_RELAY_SID]; struct sockaddr_pppox sp_cl= { AF_PPPOX, PX_PROTO_OE, {{ p_in->hdr->sid, {0,},{0,}}}}; struct sockaddr_pppox sp_sv= { AF_PPPOX, PX_PROTO_OE, {{ p_in->hdr->sid, {0,},{0,}}}}; int ret; if( !tag ) return 0; pc = get_con(ntohs(tag->tag_len),tag->tag_data); if( !pc ) return 0; if(!pc->connected){ pc->sv_sock = socket( AF_PPPOX, SOCK_DGRAM, PX_PROTO_OE); if( pc->sv_sock < 0){ poe_fatal(ses,"Cannot open PPPoE socket: %i",errno); } pc->cl_sock = socket( AF_PPPOX, SOCK_DGRAM, PX_PROTO_OE); if( pc->cl_sock < 0){ poe_fatal(ses,"Cannot open PPPoE socket: %i",errno); } memcpy( sp_sv.sa_addr.pppoe.dev, ses->fwd_name, IFNAMSIZ); memcpy( sp_sv.sa_addr.pppoe.remote, pc->server, ETH_ALEN); ret = connect( pc->sv_sock, (struct sockaddr*)&sp_sv, sizeof(struct sockaddr_pppox)); if( ret < 0){ poe_fatal(ses,"Cannot connect PPPoE socket: %i",errno); } memcpy( sp_cl.sa_addr.pppoe.dev, ses->name, IFNAMSIZ); memcpy( sp_cl.sa_addr.pppoe.remote, pc->client, ETH_ALEN); ret = connect( pc->cl_sock, (struct sockaddr*)&sp_cl, sizeof(struct sockaddr_pppox)); if( ret < 0){ poe_fatal(ses,"Cannot connect PPPoE socket: %i",errno); } ret = ioctl( pc->sv_sock, PPPOEIOCSFWD, &sp_cl); if( ret < 0){ poe_fatal(ses,"Cannot set forwarding on PPPoE socket: %i",errno); } ret = ioctl( pc->cl_sock, PPPOEIOCSFWD, &sp_sv); if( ret < 0){ poe_fatal(ses,"Cannot set forwarding on PPPoE socket: %i",errno); } pc->connected = 1; } poe_info(ses,"PPPoE relay for %E established to %E (sid=%04x)\n", pc->client,pc->server, p_in->hdr->sid); return relay_rcv_pkt(ses,p_in,p_out); }
int showout() { int i, i2 = 0; char foo[1024]; char tmpfile[STRLEN]; char buf[20]; int notreload = 0; GOPHER newitem; while (1) { if (gopher_position < 0) { return; } print_gophertitle(); printgopher_title(); update_endline(); if (!notreload) { i = 0; if (get_con(g_main[gopher_position]->server, g_main[gopher_position]->port) == -1) { show_message(NULL); free(g_main[gopher_position]); gopher_position--; notreload = 0; continue; } enterdir(g_main[gopher_position]->file); show_message("¶Áȡ׼±¸ÖÐ"); for (i = 0; i < MAXGOPHERITEMS; i++) { if (readfield(a, foo, 1024) <= 0) { break; } if (foo[0] == '.' && foo[1] == '\r' && foo[2] == '\n') { break; } strncpy(newitem.title, foo, 70); if (readfield(a, foo, 1024) == 0) { break; } strncpy(newitem.file, foo, 80); if (readfield(a, foo, 1024) == 0) { break; } strncpy(newitem.server, foo, 40); if (readline(a, foo, 1024) == 0) { break; } newitem.port = atoi(foo); if (newitem.title[0] != newitem.file[0]) { break; } if (newitem.title[0] != '0' && newitem.title[0] != '1') { i--; continue; } refresh(); append_record(gophertmpfile, &newitem, sizeof(GOPHER)); sprintf(buf, "[1;3%dmת[3%dm»»[3%dm×Ê[3%dmÁÏ[3%dmÖÐ[m", (i % 7) + 1 ,((i + 1) % 7) + 1, ((i + 2) % 7) + 1, ((i + 3) % 7) + 1, ((i + 4) % 7) + 1); show_message(buf); } show_message(NULL); } else notreload = 0; if (i <= 0) { move(3, 0); clrtobot(); move(10, 0); clrtoeol(); prints(" [1;31mûÓÐÈκεÄ×ÊÁÏ...[m"); pressanykey(); free(g_main[gopher_position]); gopher_position--; continue; } close(a); move(0, 0); clrtobot(); setlistrange(i); i2 = choose(NA, g_main[gopher_position]->position, print_gophertitle, deal_gopherkey, show_gopher, do_gopher); if (i2 == -1) { free(g_main[gopher_position]); clear_gophertmpfile(); gopher_position--; continue; } g_main[gopher_position]->position = i2; get_record(gophertmpfile, &newitem, sizeof(GOPHER), i2 + 1); tmpitem = &newitem; if (newitem.title[0] == '0') { if (get_con(newitem.server, newitem.port) == -1) continue; enterdir(newitem.file); setuserfile(tmpfile, "gopher.tmp"); savetmpfile(tmpfile); ansimore(tmpfile, YEA); notreload = 1; unlink(tmpfile); continue; } else { GOPHER *newgi; clear_gophertmpfile(); gopher_position++; newgi = (GOPHER *) malloc(sizeof(GOPHER)); strncpy(newgi->server, tmpitem->server, 40); strncpy(newgi->file, tmpitem->file, 80); strncpy(newgi->title, tmpitem->title, 70); newgi->port = tmpitem->port; newgi->position = 0; g_main[gopher_position] = newgi; continue; } } }
int deal_gopherkey(char ch, int allnum, int pagenum) { char fname[STRLEN], fpath[STRLEN]; #ifdef INTERNET_EMAIL struct shortfile fhdr; #endif switch (ch) { case 'h': case 'H': show_help("help/announcereadhelp"); g_refresh(); break; case 'E': case 'e': tmpitem = nth_item(allnum - pagenum); setuserfile(fname, "gopher.tmp"); if (tmpitem->title[0] != '0') { return 1; } if (get_con(tmpitem->server, tmpitem->port) == -1) return 1; enterdir(tmpitem->file); savetmpfile(fname); if (dashf(fname)) { vedit(fname, NA, YEA); unlink(fname); g_refresh(); } show_message(NULL); break; case '=': { tmpitem = nth_item(allnum - pagenum); move(2, 0); clrtobot(); prints("[1;44;37m"); printdash("BBS Gopher Îï¼þ»ù±¾×ÊÁÏ"); prints("[m"); prints("ÀàÐÍ£º%c (%s)\n", tmpitem->title[0], (tmpitem->title[0] == '0') ? "Îļþ" : "Ŀ¼"); prints("±êÌ⣺%s\n", tmpitem->title + 1); prints("·¾¶£º%s\n", tmpitem->file); prints("λÖãº%s\n", tmpitem->server); prints("ʹÓãº%d²º\n", tmpitem->port); pressanykey(); g_refresh(); } break; case Ctrl('P'): tmpitem = nth_item(allnum - pagenum); if (!HAS_PERM(PERM_POST)) break; setuserfile(fname, "gopher.tmp"); if (tmpitem->title[0] != '0') { return 1; } if (get_con(tmpitem->server, tmpitem->port) == -1) return 1; enterdir(tmpitem->file); savetmpfile(fname); if (dashf(fname)) { char bname[30]; clear(); if (get_a_boardname(bname, "ÇëÊäÈëҪתÌùµÄÌÖÂÛÇøÃû³Æ: ")) { move(1, 0); sprintf(fpath, "ÄãÈ·¶¨Òª×ªÌùµ½ %s °åÂð", bname); if (askyn(fpath, NA, NA) == 1) { move(2, 0); Postfile(fname, bname, tmpitem->title + 1, 2); sprintf(fpath, "[1mÒѾ°ïÄãתÌùµ½ %s °åÁË...[m", bname); prints(fpath); refresh(); sleep(1); } } } unlink(fname); g_refresh(); return 1; #ifdef INTERNET_EMAIL case 'U': case 'F': case 'u': case 'f': case 'z': case 'Z': tmpitem = nth_item(allnum - pagenum); setuserfile(fname, "gopher.tmp"); if (tmpitem->title[0] != '0') { return 1; } if (get_con(tmpitem->server, tmpitem->port) == -1) return 1; enterdir(tmpitem->file); savetmpfile(fname); if (dashf(fname)) { strncpy(fhdr.title, tmpitem->title + 1, 70); strncpy(fhdr.filename, "gopher.tmp", STRLEN); sethomepath(fpath, currentuser.userid); // if (ch == 'Z' || ch == 'z') // a_download(fname); // else { switch (doforward(fpath, &fhdr, (ch == 'u' || ch == 'U') ? 1 : 0)) { case 0: show_message("ÎÄÕÂת¼ÄÍê³É!"); break; case -1: show_message("system error!!."); break; case -2: show_message("invalid address."); break; default: show_message("È¡Ïûת¼Ä¶¯×÷."); } // } refresh(); pressanykey(); g_refresh(); unlink(fname); return 1; } else return 1; break; #endif default: return 0; } return 1; }