Esempio n. 1
0
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;
}
Esempio n. 2
0
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;
}
Esempio n. 5
0
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");
}
Esempio n. 6
0
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;
}
Esempio n. 7
0
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;
}
Esempio n. 8
0
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;
}
Esempio n. 11
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;
    
    }
Esempio n. 12
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;
}