void CRedirectSOCKS_Thread::StartRedirect() { char svn; if(xRead(m_sClientSocket, &svn, 1)<1) { xClose(m_sClientSocket); return; } switch(svn) { case 69: break; case 4: { struct socks4_hdr hdr4; sockaddr_in addrHost; int sServer; if(xRead(m_sClientSocket,&hdr4.cd,sizeof(hdr4)-2)<1) { xClose(m_sClientSocket); return; } if(hdr4.cd==SOCKS4_CONNECT) { memset(&addrHost, 0, sizeof(addrHost)); addrHost.sin_family=AF_INET; addrHost.sin_port=hdr4.destport; addrHost.sin_addr.s_addr=hdr4.destaddr; sServer=socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if(connect(sServer,(sockaddr*)&addrHost, sizeof(addrHost))==SOCKET_ERROR) { hdr4.vn=0; hdr4.cd=SOCKS4_REJECT; memset(&hdr4.userid, 0, 1024); xWrite(m_sClientSocket, (char*)&hdr4, 8); xClose(m_sClientSocket); return; } hdr4.vn=0; hdr4.cd=SOCKS4_GRANT; memset(&hdr4.userid, 0, 1024); xWrite(m_sClientSocket, (char*)&hdr4, 8); int iLen; char szBuf[1024]; fd_set fd; SET_SOCK_BLOCK(m_sClientSocket, 0); SET_SOCK_BLOCK(sServer, 0); while(true) { iLen=xRead(sServer, szBuf, sizeof(szBuf)); if(!iLen) break; if(iLen<0 && ERRNO!=EWOULDBLOCK) { Sleep(10); continue; } xWrite(m_sClientSocket, szBuf, iLen); iLen=xRead(m_sClientSocket, szBuf, sizeof(szBuf)); if(!iLen) break; if(iLen<0 && ERRNO!=EWOULDBLOCK) { Sleep(10); continue; } xWrite(sServer, szBuf, iLen); } xClose(m_sClientSocket); xClose(sServer); } } break; default: break; } }
char display_extent_page( int64 address) { int32 changed = 0; char flag_names[64]; dtpage_t node; char result; int8 *stbl; if (xRead(address << l2bsize, sizeof(dtpage_t), (char *)&node)) { fprintf(stderr, "display_extent_page: Error reading node\n"); return 'u'; } redisplay5: *flag_names = 0; if (node.header.flag & BT_ROOT) { fputs("display_extent_page: Warning! extent dtree page has BT_ROOT flag set!\n", stderr); strcat(flag_names, "BT_ROOT "); } if (node.header.flag & BT_LEAF) strcat(flag_names, "BT_LEAF "); if (node.header.flag & BT_INTERNAL) strcat(flag_names, "BT_INTERNAL "); if (node.header.flag & BT_RIGHTMOST) strcat(flag_names, "BT_RIGHTMOST "); if (node.header.flag & BT_LEFTMOST) strcat(flag_names, "BT_LEFTMOST "); printf("Internal D-tree node at block %lld\n", address); printf("[1] flag\t0x%02x\t\t%s\n", node.header.flag, flag_names); printf("[2] nextindex\t%3d\n", node.header.nextindex); printf("[3] freecnt\t%3d\t\t", node.header.freecnt); printf("[7] rsrvd\tNOT DISPLAYED\n"); printf("[4] freelist\t%3d\t\t", node.header.freelist); printf("[8] self.len\t0x%06x\n",node.header.self.len); printf("[5] maxslot\t%3d\t\t", node.header.maxslot); printf("[8] self.addr1\t0x%02x\n",node.header.self.addr1); printf("[6] stblindex\t%d\t\t", node.header.stblindex); printf("[9] \t0x%08x\n",node.header.self.addr2); if (node.header.nextindex) { result = prompt("dtree: Hit enter to see entries, [u]p or e[x]it: "); if (result == 'u' || result == 'x') return(result); } else { fputs("display_extent_page: Strange ... empty d-tree node.\n", stderr); return 'u'; } stbl = (int8 *)&(node.slot[node.header.stblindex]); if (node.header.flag & BT_LEAF) result = display_leaf_slots(node.slot, stbl, node.header.nextindex, &changed); else result = display_internal_slots(node.slot, stbl, node.header.nextindex, &changed); if (changed) { if (xWrite(address << l2bsize, sizeof(dtpage_t), (char *)&node)) { fputs("display_extent_page: error writing node\n\n", stderr); return 0; } changed = 0; } if (result == 'u') goto redisplay5; return result; }
char display_internal_xtpage(xad_t xad) { int32 changed = 0; char cmd_line[80]; xtpage_t xtree_area; xtpage_t *xtree=&xtree_area; int32 field; char flag_names[64]; int64 xtpage_address; ino_t inum; char result = 'u'; char *token; ino_t which_table = FILESYSTEM_I; xtpage_address = addressXAD(&xad); xtpage_address = xtpage_address*bsize; if (xRead(xtpage_address, sizeof(xtpage_t), (char *)xtree)) { fputs("xtree: error reading xtpage\n\n", stderr); } else { redisplay: display_xtpage(xtree); retry: if (xtree->header.nextindex > 2) { fputs("xtree: Hit enter to see entries, [m]odify, or e[x]it: ", stdout); } else { fputs("xtree: [m]odify, or e[x]it: ", stdout); } gets(cmd_line); token = strtok(cmd_line, " "); if (token) { if (*token == 'x') return result; if (*token == 'm') { field = m_parse(cmd_line, 6, &token); if (field == 0) goto retry; switch (field) { case 1: xtree->header.flag = strtoul(token, 0, 16); break; case 2: xtree->header.nextindex = strtoul(token, 0, 0); break; case 3: xtree->header.maxentry = strtoul(token, 0, 0); break; case 4: xtree->header.self.len = strtoul(token, 0, 0); break; case 5: xtree->header.self.addr1 = strtoul(token, 0, 0); break; case 6: xtree->header.self.addr2 = strtoul(token, 0, 0); break; } if (xWrite(xtpage_address, sizeof(xtpage_t), (char *)xtree)) { fputs("xtree: error writing xtpage\n\n", stderr); return result; } goto redisplay; } } if (xtree->header.nextindex <= 2) return result; if (xtree->header.flag & BT_LEAF) result = display_leaf_xads(xtree->xad, xtree->header.nextindex, &changed); else result = display_internal_xads(xtree->xad, xtree->header.nextindex, &changed); if (changed) { if (xWrite(xtpage_address, sizeof(xtpage_t), (char *)xtree)) { fputs("xtree: error writing xtpage\n\n", stderr); return result; } changed = 0; } if (result == 'u') goto redisplay; } /* end else */ return result; }
void directory() { char cmd_line[80]; dtpage_t dtree; int32 i; dinode_t inode; int64 inode_address; ino_t inum; int64 node_address; idtentry_t *node_entry; dtroot_t *root; dtslot_t *slot; uint8 *stbl; char *token; ino_t which_table = FILESYSTEM_I; token = strtok(0, " "); if (token == 0) { fputs("directory: Please enter: inum [fileset]\ndirectory> ", stdout); gets(cmd_line); token=strtok(cmd_line, " "); if (token == 0) return; } errno = 0; inum = strtoul(token, 0, 0); if (inum == 0 && errno) { fputs("directory: invalid inum\n\n", stderr); return; } token = strtok(0, " "); if (token) { if (token[0] != '0') { fputs("directory: invalid fileset\n\n", stderr); return; } } if (strtok(0, " ")) { fputs("directory: Too many arguments\n\n", stderr); return; } if (find_inode(inum, which_table, &inode_address) || xRead(inode_address, sizeof(dinode_t), (char *)&inode)) { fputs("directory: error reading inode\n\n", stderr); return; } if ((inode.di_mode & IFMT) != IFDIR) { fputs("directory: Not a directory!\n", stderr); return; } root = (dtroot_t *)&(inode.di_btroot); printf("idotdot = %d\n\n", root->header.idotdot); if (root->header.flag & BT_LEAF) { if (root->header.nextindex == 0) { fputs("Empty directory.\n", stdout); return; } for (i = 0; i < root->header.nextindex; i++) { print_direntry(root->slot, root->header.stbl[i]); } return; } /* Root is not a leaf node, we must descend to the leftmost leaf */ node_entry = (idtentry_t *)&(root->slot[root->header.stbl[0]]); descend: node_address = addressPXD(&(node_entry->xd)) << l2bsize; if (xRead(node_address, sizeof(dtpage_t), (char *)&dtree)) { fputs("Directory: Error reading dtree node\n", stderr); return; } stbl = (uint8 *)&(dtree.slot[dtree.header.stblindex]); if (!(dtree.header.flag & BT_LEAF)) { node_entry = (idtentry_t *)&(dtree.slot[stbl[0]]); goto descend; } /* dtree (contained in node) is the left-most leaf node */ next_leaf: for (i = 0; i < dtree.header.nextindex; i++) { print_direntry(dtree.slot, stbl[i]); } if (dtree.header.next) { if (xRead(dtree.header.next << l2bsize, sizeof(dtpage_t), (char *)&dtree)) { fputs("directory: Error reading leaf node\n", stderr); return; } stbl = (uint8 *)&(dtree.slot[dtree.header.stblindex]); goto next_leaf; } return; }
void xtree() { int32 changed = 0; char cmd_line[80]; xtpage_t *xtree; int32 field; char flag_names[64]; dinode_t inode; int64 inode_address; ino_t inum; char result; char *token; ino_t which_table = FILESYSTEM_I; token = strtok(0, " "); if (token == 0) { fputs("xtree: Please enter: inum [fileset]\ndtree> ",stdout); gets(cmd_line); token=strtok(cmd_line, " "); if (token == 0) return; } errno = 0; inum = strtoul(token, 0, 0); if (inum == 0 && errno) { fputs("xtree: invalid inum\n\n", stderr); return; } token = strtok(0, " "); if (token) { if (token[0] == 'a') which_table = AGGREGATE_I; else if (token[0] == 's') which_table = AGGREGATE_2ND_I; else if (token[0] != '0') { fputs("inode: invalide fileset\n\n", stderr); return; } } if (strtok(0, " ")) { fputs("xtree: Too many arguments\n\n", stderr); return; } if (find_inode(inum, which_table, &inode_address) || xRead(inode_address, sizeof(dinode_t), (char *)&inode)) { fputs("xtree: error reading inode\n\n", stderr); return; } if ((inode.di_mode & IFMT) == IFDIR) { fputs("xtree: INODE IS A DIRECTORY!\n", stderr); return; } xtree = (xtpage_t *)&(inode.di_btroot); redisplay: printf("Root X-Tree Node of inode %d\n\n", inode.di_number); display_xtpage(xtree); retry: if (xtree->header.nextindex > 2) { fputs("xtree: Hit enter to see entries, [m]odify, or e[x]it: ", stdout); } else { fputs("xtree: [m]odify, or e[x]it: ", stdout); } gets(cmd_line); token = strtok(cmd_line, " "); if (token) { if (*token == 'x') return; if (*token == 'm') { field = m_parse(cmd_line, 6, &token); if (field == 0) goto retry; switch (field) { case 1: xtree->header.flag = strtoul(token, 0, 16); break; case 2: xtree->header.nextindex = strtoul(token, 0, 0); break; case 3: xtree->header.maxentry = strtoul(token, 0, 0); break; case 4: xtree->header.self.len = strtoul(token, 0, 0); break; case 5: xtree->header.self.addr1 = strtoul(token, 0, 0); break; case 6: xtree->header.self.addr2 = strtoul(token, 0, 0); break; } if (xWrite(inode_address, sizeof(dinode_t), (char *)&inode)) { fputs("xtree: error writing inode\n\n", stderr); return; } goto redisplay; } } if (xtree->header.nextindex <= 2) return; if (xtree->header.flag & BT_LEAF) result = display_leaf_xads(xtree->xad, xtree->header.nextindex, &changed); else result = display_internal_xads(xtree->xad, xtree->header.nextindex, &changed); if (changed) { if (xWrite(inode_address, sizeof(dinode_t), (char *)&inode)) { fputs("xtree: error writing inode\n\n", stderr); return; } changed = 0; } if (result == 'u') goto redisplay; return; }
void dtree() { int32 changed = 0; char cmd_line[80]; dtpage_t *dtree; int32 field; char flag_names[64]; dinode_t inode; int64 inode_address; ino_t inum; char result; dtroot_t *root; char *token; ino_t which_table = FILESYSTEM_I; token = strtok(0, " "); if (token == 0) { fputs("dtree: Please enter: inum [fileset]\ndtree> ",stdout); gets(cmd_line); token=strtok(cmd_line, " "); if (token == 0) return; } errno = 0; inum = strtoul(token, 0, 0); if (inum == 0 && errno) { fputs("dtree: invalid inum\n\n", stderr); return; } token = strtok(0, " "); if (token) { if (token[0] != '0') { fputs("dtree: invalide fileset\n\n", stderr); return; } } if (strtok(0, " ")) { fputs("dtree: Too many arguments\n\n", stderr); return; } if (find_inode(inum, which_table, &inode_address) || xRead(inode_address, sizeof(dinode_t), (char *)&inode)) { fputs("dtree: error reading inode\n\n", stderr); return; } if ((inode.di_mode & IFMT) != IFDIR) { fputs("dtree: Not a directory!\n", stderr); return; } dtree = (dtpage_t *)&(inode.di_btroot); redisplay: if (!(dtree->header.flag & BT_ROOT)) fputs("dtree: Should be at root of dtree, but BTROOT not set!\n", stderr); root = (dtroot_t *)dtree; *flag_names = 0; if (root->header.flag & BT_ROOT) strcat(flag_names, "BT_ROOT "); if (root->header.flag & BT_LEAF) strcat(flag_names, "BT_LEAF "); if (root->header.flag & BT_INTERNAL) strcat(flag_names, "BT_INTERNAL "); if (root->header.flag & BT_RIGHTMOST) strcat(flag_names, "BT_RIGHTMOST "); if (root->header.flag & BT_LEFTMOST) strcat(flag_names, "BT_LEFTMOST "); printf("Root D-Tree Node of inode %d\n\n", inode.di_number); printf("[1] DASDlimit\t%lld\n", DASDLIMIT(&(root->header.DASD))); /* @F1 */ printf("[2] DASDused\t%lld\n", DASDUSED(&(root->header.DASD))); /* @F1 */ printf("[3] thresh (%%)\t%d\n", root->header.DASD.thresh ); /* @F1 */ printf("[4] delta (%%)\t%d\n", root->header.DASD.delta ); /* @F1 */ printf("\n"); /* @F1 */ printf("[5] flag\t0x%02x\t\t%s\n", root->header.flag, flag_names); /* @F1 */ printf("[6] nextindex\t%d\n", root->header.nextindex); /* @F1 */ printf("[7] freecnt\t%d\n", root->header.freecnt); /* @F1 */ printf("[8] freelist\t%d\n", root->header.freelist); /* @F1 */ printf("[9] idotdot\t%d\n", root->header.idotdot); /* @F1 */ printf("[10] stbl\t{%d,%d,%d,%d,%d,%d,%d,%d}\n", /* @F1 */ root->header.stbl[0], root->header.stbl[1], root->header.stbl[2], root->header.stbl[3], root->header.stbl[4], root->header.stbl[5], root->header.stbl[6], root->header.stbl[7]); retry: if (root->header.nextindex) { fputs("dtree: Hit enter to see entries, [m]odify, or e[x]it: ", stdout); } else { fputs("dtree: [m]odify, or e[x]it: ", stdout); } gets(cmd_line); token = strtok(cmd_line, " "); if (token) { if (*token == 'x') return; if (*token == 'm') { field = m_parse(cmd_line, 9, &token); if (field == 0) goto retry; switch (field) { case 1: /* @F1 */ setDASDLIMIT(&(root->header.DASD), strtoll(token, 0, 0) ); /* @F1 */ break; /* @F1 */ case 2: /* @F1 */ setDASDUSED(&(root->header.DASD), strtoll(token, 0, 0) ); /* @F1 */ break; /* @F1 */ case 3: /* @F1 */ root->header.DASD.thresh = strtoul(token, 0, 0); /* @F1 */ break; /* @F1 */ case 4: /* @F1 */ root->header.DASD.delta = strtoul(token, 0, 0); /* @F1 */ break; /* @F1 */ case 5: /* @F1 */ root->header.flag = strtoul(token, 0, 16); break; case 6: /* @F1 */ root->header.nextindex = strtoul(token, 0, 0); break; case 7: /* @F1 */ root->header.freecnt = strtoul(token, 0, 0); break; case 8: /* @F1 */ root->header.freelist = strtoul(token, 0, 0); break; case 9: /* @F1 */ root->header.idotdot = strtoul(token, 0, 0); break; } if (xWrite(inode_address, sizeof(dinode_t), (char *)&inode)) { fputs("dtree: error writing inode\n\n", stderr); return; } goto redisplay; } } if (root->header.nextindex == 0) return; if (root->header.flag & BT_LEAF) result = display_leaf_slots(root->slot, root->header.stbl, root->header.nextindex, &changed); else result = display_internal_slots(root->slot, root->header.stbl, root->header.nextindex, &changed); if (changed) { if (xWrite(inode_address, sizeof(dinode_t), (char *)&inode)) { fputs("dtree: error writing inode\n\n", stderr); return; } changed = 0; } if (result == 'u') goto redisplay; return; }
void CRedirectHTTP_Thread::StartRedirect() { m_sServerSocket=INVALID_SOCKET; m_iConnections=0; int iErr=1; bool bFinished=false; while(!bFinished) { url uURL; char szBuffer[MAX_PATH]; bool bGet=false; // Receive the proxy request if(!recv_line_irc(m_sClientSocket, szBuffer, MAX_PATH, NULL)) { bFinished=true; break; } CString sBuffer(szBuffer); // Fail if there is no url // if(!sBuffer.Token(1, " ").Compare("")) { bFinished=true; break; } if(!sBuffer.Compare("")) { bFinished=true; break; } if(!sBuffer.Token(0, " ").CompareNoCase("GET")) { // GET method bGet=true; // Parse the url if(!ParseURL(sBuffer.Token(1, " ").CStr(), &uURL)) { bFinished=true; break; } // Fail if the protocol isnt http if(uURL.sProto.Compare("http")) { bFinished=true; break; } } else if(!sBuffer.Token(0, " ").CompareNoCase("CONNECT")) { // CONNECT method bGet=false; // Parse the host uURL.sProto.Assign("connect"); uURL.sReq.Assign(""); uURL.sHost.Assign(sBuffer.Token(1, " ").Token(0, ":")); if(!sBuffer.Token(1, " ").Token(1, ":").CStr()) { bFinished=true; break; } uURL.iPort=atoi(sBuffer.Token(1, " ").Token(1, ":").CStr()); if(!uURL.iPort) uURL.iPort=80; } // Get the rest of the request CString sMethod(sBuffer.Token(0, " ")); if(!sMethod.Compare("")) { bFinished=true; break; } CString sHTTPVer(sBuffer.Token(2, " ")); if(!sHTTPVer.Compare("")) { bFinished=true; break; } CString sOldHost(uURL.sHost); #ifdef DBGCONSOLE if(bGet) g_cMainCtrl.m_cConsDbg.Log(5, "CRedirectHTTP(0x%8.8Xh): %s %s %s...\n", m_pRedirHTTP, sMethod.CStr(), uURL.sReq.CStr(), sHTTPVer.CStr()); else g_cMainCtrl.m_cConsDbg.Log(5, "CRedirectHTTP(0x%8.8Xh): %s %s:%d %s...\n", m_pRedirHTTP, sMethod.CStr(), uURL.sHost.CStr(), uURL.iPort, sHTTPVer.CStr()); #endif char szBuf[4096]; strcpy(szBuf, "bla"); if(bGet) { if(xRead(m_sClientSocket, szBuf, sizeof(szBuf))<1) { xClose(m_sClientSocket); return; } } else { while(strcmp(szBuf, "")) // Loop while headers arent finished if(!recv_line_irc(m_sClientSocket, szBuf, 4096, NULL)) { bFinished=true; break; } if(bFinished) break; } CString sReqBuf; if(bGet) sReqBuf.Format("%s %s %s\r\n%s", sMethod.CStr(), uURL.sReq.CStr(), sHTTPVer.CStr(), szBuf); else sReqBuf.Format("HTTP/1.0 200 Connection established\r\n\r\n"); m_sServerSocket=socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if(m_sServerSocket==SOCKET_ERROR || m_sServerSocket==INVALID_SOCKET) { xClose(m_sClientSocket); return; } // Fill in sockaddr and resolve the host sockaddr_in ssin; memset(&ssin, 0, sizeof(ssin)); ssin.sin_family=AF_INET; ssin.sin_port=htons(uURL.iPort); ssin.sin_addr.s_addr=ResolveAddress(uURL.sHost.CStr()); if(ssin.sin_addr.s_addr==INADDR_NONE) // The host couldn't be resolved, exit { #ifdef DBGCONSOLE g_cMainCtrl.m_cConsDbg.Log(5, "CRedirectHTTP(0x%8.8Xh): %s could not be resolved (%s)...\n", m_pRedirHTTP, uURL.sHost.CStr(), uURL.sReq.CStr()); #endif xClose(m_sClientSocket); xClose(m_sServerSocket); return; } // Connect to the server iErr=connect(m_sServerSocket, (sockaddr*)&ssin, sizeof(sockaddr_in)); if(iErr==SOCKET_ERROR) // Connect failed, exit { #ifdef DBGCONSOLE g_cMainCtrl.m_cConsDbg.Log(5, "CRedirectHTTP(0x%8.8Xh): Cannot connect to %s:%d (%s)...\n", m_pRedirHTTP, uURL.sHost.CStr(), uURL.iPort, uURL.sReq.CStr()); #endif xClose(m_sClientSocket); xClose(m_sServerSocket); return; } if(bGet) { iErr=xWrite(m_sServerSocket, sReqBuf.CStr(), sReqBuf.GetLength()); if(!iErr || iErr==SOCKET_ERROR) { xClose(m_sClientSocket); xClose(m_sServerSocket); return; } } else { iErr=xWrite(m_sClientSocket, sReqBuf.CStr(), sReqBuf.GetLength()); if(!iErr || iErr==SOCKET_ERROR) { xClose(m_sClientSocket); xClose(m_sServerSocket); return; } } int iLen; fd_set fd; SET_SOCK_BLOCK(m_sClientSocket, 0); SET_SOCK_BLOCK(m_sServerSocket, 0); if(bGet) { while(true) { memset(szBuffer, 0, sizeof(szBuffer)); if(!recv_line_irc(m_sClientSocket, szBuffer, sizeof(szBuffer), NULL)) { Sleep(10); break; } if(strcmp(szBuffer, "")) { sBuffer.Assign(szBuffer); if(!sBuffer.Token(0, " ").Compare("GET")) { // Fail if there is no url if(!sBuffer.Token(1, " ").Compare("")) { bFinished=true; break; } // Parse the url if(!ParseURL(sBuffer.Token(1, " ").CStr(), &uURL)) break; // Fail if the protocol isnt http if(uURL.sProto.Compare("http")) { bFinished=true; break; } // Get the rest of the request CString sMethod(sBuffer.Token(0, " ")); if(!sMethod.Compare("")) { bFinished=true; break; } CString sHTTPVer(sBuffer.Token(2, " ")); if(!sHTTPVer.Compare("")) { bFinished=true; break; } sBuffer.Format("%s %s %s\r\n", sMethod.CStr(), uURL.sReq.CStr(), sHTTPVer.CStr()); if(uURL.sHost.Compare(sOldHost)) { xClose(m_sServerSocket); m_sServerSocket=socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if(m_sServerSocket==SOCKET_ERROR || m_sServerSocket==INVALID_SOCKET) { xClose(m_sClientSocket); return; } // Fill in sockaddr and resolve the host sockaddr_in ssin; memset(&ssin, 0, sizeof(ssin)); ssin.sin_family=AF_INET; ssin.sin_port=htons(uURL.iPort); ssin.sin_addr.s_addr=ResolveAddress(uURL.sHost.CStr()); if(ssin.sin_addr.s_addr==INADDR_NONE) // The host couldn't be resolved, exit { #ifdef DBGCONSOLE g_cMainCtrl.m_cConsDbg.Log(5, "CRedirectHTTP(0x%8.8Xh): %s could not be resolved (%s)...\n", m_pRedirHTTP, uURL.sHost.CStr(), uURL.sReq.CStr()); #endif xClose(m_sClientSocket); xClose(m_sServerSocket); return; } // Connect to the server iErr=connect(m_sServerSocket, (sockaddr*)&ssin, sizeof(sockaddr_in)); if(iErr==SOCKET_ERROR) // Connect failed, exit { #ifdef DBGCONSOLE g_cMainCtrl.m_cConsDbg.Log(5, "CRedirectHTTP(0x%8.8Xh): Cannot connect to %s:%d (%s)...\n", m_pRedirHTTP, uURL.sHost.CStr(), uURL.iPort, uURL.sReq.CStr()); #endif xClose(m_sClientSocket); xClose(m_sServerSocket); return; } sOldHost.Assign(uURL.sHost); } } else { sBuffer.Append("\r\n"); } if(xWrite(m_sServerSocket, sBuffer.CStr(), sBuffer.GetLength())<1) break; } iLen=xRead(m_sServerSocket, szBuf, sizeof(szBuf)); if(!iLen) break; if(iLen<0 && ERRNO!=EWOULDBLOCK) { Sleep(10); break; } xWrite(m_sClientSocket, szBuf, iLen); } } else { while(true) { iLen=xRead(m_sClientSocket, szBuf, sizeof(szBuf)); if(!iLen) break; if(iLen<0 && ERRNO!=EWOULDBLOCK) { Sleep(10); break; } xWrite(m_sServerSocket, szBuf, iLen); iLen=xRead(m_sServerSocket, szBuf, sizeof(szBuf)); if(!iLen) break; if(iLen<0 && ERRNO!=EWOULDBLOCK) { Sleep(10); break; } xWrite(m_sClientSocket, szBuf, iLen); } } xClose(m_sClientSocket); xClose(m_sServerSocket); bFinished=true; } }