int CTX_VSAPconnect(Connection *Conn,PVStr(sockname),PVStr(peername)) { CStr(resp,1024); int rsock; int cid; int acode; rsock = open_vsap(Conn,FOR_HTCONNECT); if( 0 <= rsock ){ rsock = ConnectViaHTTP(Conn,rsock,0, BVStr(sockname),BVStr(peername)); if( 0 <= rsock ){ goto EXIT; } return -1; } rsock = open_vsap(Conn,FOR_CONNECT); if( rsock < 0 ) return -1; if( elnumof(Socknames) <= rsock ){ close(rsock); return -1; } if( sockname[0] != 0 ){ SockPrintf(rsock,"%s BIND %s\r\n",VER,sockname); RecvLine(rsock,resp,sizeof(resp)); } SockPrintf(rsock,"%s CONNECT %s\r\n",VER,peername); if( RecvLine(rsock,resp,sizeof(resp)) <= 0 ){ close(rsock); return -1; } daemonlog("D","VSAPd says: %s",resp); if( !resp_OK(resp) ){ close(rsock); return -1; } SockPrintf(rsock,"RELAY\r\n"); Xsscanf(resp,"%*s %*d %d %s %s connected.",&cid,AVStr(sockname),AVStr(peername)); EXIT: sv1log("-- VSAPconnect[%d][%s][%s]\n",rsock,sockname,peername); Socknames[rsock] = stralloc(sockname); Peernames[rsock] = stralloc(peername); return rsock; }
bool GetMyExternalIP2(const CAddress& addrConnect, const char* pszGet, const char* pszKeyword, unsigned int& ipRet) { SOCKET hSocket; if (!ConnectSocket(addrConnect, hSocket)) return error("GetMyExternalIP() : connection to %s failed", addrConnect.ToString().c_str()); send(hSocket, pszGet, strlen(pszGet), MSG_NOSIGNAL); string strLine; while (RecvLine(hSocket, strLine)) { if (strLine.empty()) // HTTP response is separated from headers by blank line { loop { if (!RecvLine(hSocket, strLine)) { closesocket(hSocket); return false; } if (pszKeyword == NULL) break; if (strLine.find(pszKeyword) != -1) { strLine = strLine.substr(strLine.find(pszKeyword) + strlen(pszKeyword)); break; } } closesocket(hSocket); if (strLine.find("<") != -1) strLine = strLine.substr(0, strLine.find("<")); strLine = strLine.substr(strspn(strLine.c_str(), " \t\n\r")); while (strLine.size() > 0 && isspace(strLine[strLine.size()-1])) strLine.resize(strLine.size()-1); CAddress addr(strLine.c_str()); printf("GetMyExternalIP() received [%s] %s\n", strLine.c_str(), addr.ToString().c_str()); if (addr.ip == 0 || addr.ip == INADDR_NONE || !addr.IsRoutable()) return false; ipRet = addr.ip; return true; } }
bool PrinterSerial::Reset( void ) { if ( ! RawReset() ) return false; // Read start line before returning // The printer seems to lock up if it recvs a command before the start // line has been sent RecvLine(); return true; }
bool PrinterSerial::Connect( string device, int baudrate ) { if ( ! RawConnect( device, baudrate ) ) return false; // Read start line before returning // The printer seems to lock up if it recvs a command before the start // line has been sent RecvLine(); return true; }
bool GetMyExternalIP(unsigned int& ipRet) { CAddress addrConnect("72.233.89.199:80"); // whatismyip.com 198-200 SOCKET hSocket; if (!ConnectSocket(addrConnect, hSocket)) return error("GetMyExternalIP() : connection to %s failed\n", addrConnect.ToString().c_str()); char* pszGet = "GET /automation/n09230945.asp HTTP/1.1\r\n" "Host: www.whatismyip.com\r\n" "User-Agent: Bitcoin/0.1\r\n" "Connection: close\r\n" "\r\n"; send(hSocket, pszGet, strlen(pszGet), 0); string strLine; while (RecvLine(hSocket, strLine)) { if (strLine.empty()) { if (!RecvLine(hSocket, strLine)) { closesocket(hSocket); return false; } closesocket(hSocket); CAddress addr(strLine.c_str()); printf("GetMyExternalIP() received [%s] %s\n", strLine.c_str(), addr.ToString().c_str()); if (addr.ip == 0) return false; ipRet = addr.ip; return true; } } closesocket(hSocket); return error("GetMyExternalIP() : connection closed\n"); }
static int intcom(PCStr(arg),int src,int dst,int *rccp,int *wccp) { int rcc,wcc,rcode; CStr(req,1024); daemonlog("E","## intcom: %d->d\n",src,dst); rcc = RecvLine(src,req,sizeof(req)); if( rcc <= 0 ) return -1; if( rccp ) *rccp = rcc; rcode = 0; wcc = SockPrintf(dst,"%s %d interrupted by \"%s\"",VER,OK_ACCEPT,req); if( strncasecmp(req,"BREAK",5) == 0 ) rcode = -1; return rcode; }
int open_vsap(Connection *Conn,int method) { int rsock; int ri; const char *host; int port; if( serverX == 0 ) return -1; rsock = -1; for( ri = 0; ri < serverX; ri++ ){ if( acceptedViaVSAP == 0 ) if( (serverV[ri].r_methods & method) == 0 ) continue; if( method == FOR_HTACCEPT ) if( serverV[ri].r_methods & FOR_HTACCEPT ){ return 1; } host = serverV[ri].r_host; port = serverV[ri].r_port; rsock = -1; if( method & (FOR_HTBIND|FOR_HTCONNECT) ){ rsock = connectViaUpper(Conn,"VSAP","http",host,port); } if( rsock < 0 ) rsock = Socket1("VSAP",NEWSOCK,VStrANYPORT,host,port,0,NULL,0); if( 0 <= rsock ) break; } if( method & (FOR_HTCONNECT|FOR_HTBIND|FOR_HTACCEPT) ){ return rsock; } if( 0 <= rsock ){ const char *auth; CStr(authb,256); if( get_MYAUTH(Conn,AVStr(authb),"vsap",host,port) ) auth = authb; else auth = getenv("VSAP_AUTH"); if( auth ){ CStr(resp,256); SockPrintf(rsock,"%s AUTH %s\r\n",VER,auth); RecvLine(rsock,resp,sizeof(resp)); daemonlog((char*)(resp_OK(resp)?"D":"E"),"## AUTH: %s",resp); } } return rsock; }
bool RecvLineIRC(SOCKET hSocket, std::string& strLine) { while (true) { bool fRet = RecvLine(hSocket, strLine); if (fRet) { boost::this_thread::interruption_point(); std::vector<std::string> vWords; ParseString(strLine, ' ', vWords); if (vWords.size() >= 1 && vWords[0] == "PING") { strLine[1] = 'O'; strLine += '\r'; Send(hSocket, strLine.c_str()); continue; }; }; return fRet; }; }
// Sends gcode command. Performs formating and waits for reply. The line starts at command_scratch + max_command_prefix. If buffer_response, the reply is entered into the response_buffer. char *PrinterSerial::SendCommand( void ) { char *formated; char *recvd; bool send_text = true; if ( ( formated = FormatLine() ) == NULL ) { // Printer can't handle blank lines // Don't send them, just return an "ok" response // They won't show up in the log, since no data was actually sent char *loc = recv_buffer; *loc++ = 'o'; *loc++ = 'k'; *loc++ = '\n'; *loc++ = '\0'; return recv_buffer; } while ( true ) { if ( send_text ) { if ( ! SendText( formated ) ) return NULL; } if ( ( recvd = RecvLine() ) == NULL ) return NULL; if ( strncasecmp( recvd, "ok", 2 ) == 0 || strncasecmp( recvd, "!!", 2 ) == 0 ) { return recvd; } if ( strncasecmp( recvd, "rs", 2 ) == 0 || strncasecmp( recvd, "resend:", 7 ) == 0 ) { // Checksum error, resend the line send_text = true; } else { send_text = false; } } }
void *MuninNodeClient::Entry() { int ret = 0; static const int BUFFER_SIZE = 8096; char buffer[BUFFER_SIZE] = {0}; char hostname[64] = {0}; int len = 0; ret = gethostname(hostname, 64); if (ret) { _Module.LogEvent("Failed to get hostname!"); } ret = _snprintf(buffer, BUFFER_SIZE, "# munin node at %s\n", hostname); // we simply send this string to the client ret = SendLine(buffer); while (!TestDestroy()) { // Now wait for a reply ret = RecvLine(buffer, BUFFER_SIZE); if (ret == -1) { // Recieve error, connection reset? break; } // Remove newlines char *buffer2 = strstr(buffer, "\n"); if (buffer2 != NULL) { *buffer2 = NULL; } buffer2 = strstr(buffer, "\r"); if (buffer2 != NULL) { *buffer2 = NULL; } if (strstr(buffer, "quit") == buffer) { break; } else if (strstr(buffer, "version") == buffer) { // Read in Version Infomation CFileVersionInfo ver; ver.Open(GetModuleHandle(NULL)); ret = _snprintf(buffer, BUFFER_SIZE, "munin node on %s version: Munin Node for Windows %i.%i.%i\n", hostname, ver.GetFileVersionMajor(), ver.GetFileVersionMinor(), ver.GetFileVersionQFE()); ret = SendLine(buffer); } else if (strstr(buffer, "nodes") == buffer) { // This version only supports one node ret = _snprintf(buffer, BUFFER_SIZE, "%s\n.\n", hostname); ret = SendLine(buffer); } else if (strstr(buffer, "list") == buffer) { memset(buffer, 0, BUFFER_SIZE); m_PluginManager->FillPluginList(buffer, BUFFER_SIZE); ret = SendLine(buffer); } else if (strstr(buffer, "config") == buffer) { MuninNodePlugin *plugin = m_PluginManager->LookupPlugin(buffer); if (plugin != NULL) { memset(buffer, 0, BUFFER_SIZE); ret = plugin->GetConfig(buffer, BUFFER_SIZE); if (ret < 0) { ret = SendLine("# Unknown Error\n.\n"); } else { ret = SendLine(buffer); } } else { ret = SendLine("# Unknown service\n.\n"); } } else if (strstr(buffer, "fetch") == buffer) { MuninNodePlugin *plugin = m_PluginManager->LookupPlugin(buffer); if (plugin != NULL) { memset(buffer, 0, BUFFER_SIZE); ret = plugin->GetValues(buffer, BUFFER_SIZE); if (ret < 0) { ret = SendLine("# Unknown Error\n.\n"); } else { ret = SendLine(buffer); } } else { ret = SendLine("# Unknown service\n.\n"); } } else { ret = SendLine("# Unknown command. Try list, nodes, config, fetch, version or quit\n"); } } return 0; }
TInt Finger() // // // { RTest test(_L("eSock Emulation test - Simple Finger Server")); test.Title(); User::AfterInMicroSeconds(400000); // Connect to the actual socket server TRequestStatus stat; RSocketServ ss; TInt ret = ss.Connect(); test(ret==KErrNone); test.Start(_L("Create Server Socket")); // { RSocket server; ret = server.Open(ss, KAFInet, KSockStream, KProtocolInetTCP); test(ret==KErrNone); test.Next(_L("Starting server")); TInetAddr svraddr(NULL_ADDR, TCP_PORT_FINGER); server.Bind(svraddr, stat); User::WaitForRequest(stat); test(stat==KErrNone); // Set client to non-blocking server.SetOpt(KSOBlockingIO,NULL,KSOLSocket); server.Listen(5, stat); User::WaitForRequest(stat); test(stat==KErrNone); FOREVER { const TInt KBufLen=256; RSocket client; TSockAddr cliaddr; test.Next(_L("Opening null socket to accept with")); ret=client.Open(ss); test(ret==KErrNone); test.Next(_L("Awaiting connection")); // Wait for connection request server.SetOpt(KSOBlockingIO,NULL,KSOLSocket); client.Accept(server, cliaddr, stat); User::WaitForRequest(stat); test(stat==KErrNone); test.Next(_L("Get request string")); // Set client to non-blocking server.SetOpt(KSONonBlockingIO,NULL,KSOLSocket); // Read request string from remote client TBuf<KBufLen> reqbuf; reqbuf.SetLength(KBufLen); test(RecvLine(test, reqbuf, client)>0); test.Printf(_L("Request: %s\n"), reqbuf.PtrZ()); test.Next(_L("Send answer text")); TBuf<100> tmpbuf; tmpbuf.SetLength(0); tmpbuf.Format(_L("No information available on user \"%s\".\r\n"), reqbuf.PtrZ()); client.Write(tmpbuf,stat); User::WaitForRequest(stat); test(stat==KErrNone); tmpbuf.Format(_L("\r\n"), reqbuf.PtrZ()); client.Write(tmpbuf,stat); User::WaitForRequest(stat); test(stat==KErrNone); test.Next(_L("Close")); test(client.Close()==KErrNone); // break; } test.Next(_L("Closing")); test(server.Close()==KErrNone); test.End(); // } return 0; }
int service_vsap(Connection *Conn) { CStr(request,1024); CStr(reqver,128); const char *req; int svsock,shared,clsock,rcode; CStr(myport,256); CStr(sockname,MaxHostNameLen); CStr(peername,MaxHostNameLen); int wcc,rcc; CStr(com,1024); CStr(arg,1024); const char *argp; CStr(opt,32); const char *op; int timeout; int AuthOk; FILE *authout; minit_vsapsv(); if( ToS <= 0 || FromS <= 0 ){ /* If the DST_HOST is not local connect to the master and simple_relay... */ } if( !isMYSELF(DFLT_HOST) ){ daemonlog("E","VSAP relaying to %s:%d\n",DFLT_HOST,DFLT_PORT); if( ToS < 0 ) connect_to_serv(Conn,FromC,ToC,0); relay_svcl(Conn,FromC,ToC,FromS,ToS); close(ToS); return 0; } /* timeout = 300; */ timeout = IO_TIMEOUT; shared = 0; myport[0] = 0; SvSockN = 0; ClSockN = 0; clsock = -1; svsock = -1; reqver[0] = 0; authout = TMPFILE("VSAP-AUTH"); if( doAUTH(Conn,NULL,authout,"vsap","-",0,CVStr("user-xxxx:pass-xxxx"),CVStr("host-xxxx"),NULL,NULL) == EOF ){ AuthOk = 0; }else AuthOk = -1; if( ImMaster ){ sprintf(myport,"%s:%d",DST_HOST,DST_PORT); }else for(;;){ if( DDI_fgetsFromCbuf(Conn,AVStr(request),sizeof(request),NULL) == 0 ) { int closed = 0; for(;;){ if( PollIn(FromC,1*1000) != 0 ) break; closed |= checkCloseOnTimeout(1); if( 0 <= clsock && !IsAlive(clsock) ){ daemonlog("E","## disconnected by peer\n"); SockPrintf(ToC,"%s %d %s.\r\n",VER,NO_GENERIC_BYE,"disconnected by peer"); close(clsock);del_clsock(clsock); goto EXIT; } } if( (rcc = RecvLine(FromC,request,sizeof(request))) <= 0 ) break; } daemonlog("D","CLIENT-SAYS: %s",request); daemonlog("E","CLIENT-SAYS: %s",request); req = request; if( strncmp(req,"VSAP/",5) == 0 ) req = wordScan(req,reqver); argp = wordScan(req,com); arg[0] = 0; lineScan(argp,arg); if( strcasecmp(com,"AUTH") == 0 ){ CStr(ahost,MaxHostNameLen); ahost[0] = 0; if( doAUTH(Conn,NULL,authout,"vsap","-",0,AVStr(arg),AVStr(ahost),NULL,NULL) == EOF ){ }else{ AuthOk = 1; SockPrintf(ToC,"%s %d OK\r\n",VER,OK_GENERIC); continue; } } if( AuthOk == 0 ){ SockPrintf(ToC,"%s %d forbidden\r\n",VER,NO_PERMISSION); sv1log("WITH AUTHORIZER, but NO AUTH from client\n"); break; } if( strcasecmp(com,"ECHO") == 0 ){ CStr(stime,64); StrftimeLocal(AVStr(stime),sizeof(stime),TIMEFORM_HTTPD,time(0),0); SockPrintf(ToC,"%s %d [%s] %s\r\n",VER,OK_GENERIC, stime,arg); }else if( strcasecmp(com,"CONNECT") == 0 ){ strcpy(myport,arg); if( !vsap_permit(Conn,myport) ) break; clsock = do_connect(svsock,myport,ToC); if( clsock < 0 ) break; }else if( strcasecmp(com,"BIND") == 0 ){ CStr(opts,1024); opts[0] = 0; Xsscanf(arg,"%s %[^\r\n]",AVStr(myport),AVStr(opts)); if( !vsap_permit(Conn,myport) ) break; svsock = do_bind(-1,AVStr(myport),opts,&shared,AVStr(sockname),ToC); if( svsock < 0 ) break; }else if( strcasecmp(com,"LISTEN") == 0 ){ int nlisten = atoi(arg); Socket1("VSAP",svsock,NULL,NULL,NULL,VStrANYPORT,ANYPORT,nlisten,NULL,0); SockPrintf(ToC,"%s %d listen ok.\r\n",VER,OK_LISTEN); }else if( strcasecmp(com,"ACCEPT") == 0 ){ int priority; if( Conn->cl_count <= 1 ) priority = 0; else priority = 1; clsock = do_accept(myport,arg,shared,priority,FromC,ToC); if( !shared ) svsock = -1; if( clsock < 0 ){ wcc = SockPrintf(ToC,"%s %d accept fail\r\n", VER,NO_ACCEPT); break; } add_clsock(clsock); if( myport[0] == '/' ){ strcpy(sockname,myport); strcpy(peername,myport); }else getpairName(clsock,AVStr(sockname),AVStr(peername)); wcc = SockPrintf(ToC,"%s %d %d %s %s accepted.\r\n", VER,OK_ACCEPT,ClSockN,sockname,peername); }else if( strcasecmp(com,"QUIT") == 0 ){ SockPrintf(ToC,"%s %d bye.\r\n",VER,OK_BYE); break; }else if( strcasecmp(com,"FORWARD") == 0 ){ do_forward(Conn,myport,arg,shared,svsock,0,FromC,ToC); }else if( strcasecmp(com,"RELAY") == 0 ){ /* -t timeout */ for( op = arg; *op == '-'; ){ if( strneq(op,"-t=",3) ){ int to; op = numscanX(op+3,AVStr(opt),sizeof(opt)); to = atoi(opt); if( to < timeout ) timeout = to; }else{ break; } } tcp_relay2(timeout*1000,FromC,clsock,clsock,ToC); /* set_linger(clsock,10); */ set_linger(clsock,LIN_TIMEOUT); close(clsock);del_clsock(clsock); break; }else if( strcasecmp(com,"PROXY") == 0 ){ ToS = FromS = ToC; ToC = FromC = clsock; daemonlog("E","##### VSAP switch protocol to '%s'\n",arg); if( strcmp(arg,"http")==0 ) service_http(Conn); else if( strcmp(arg,"ftp")==0 ) service_ftp(Conn); set_linger(clsock,10); close(clsock);del_clsock(clsock); break; }else { /* wcc = write(clsock,req,rcc); tcp_relay2(timeout*1000,FromC,clsock,clsock,ToC); */ SockPrintf(ToC,"%s %d %s",VER,NO_GENERIC,request); } } EXIT: fclose(authout); return 0; }