Ejemplo n.º 1
0
int main (int nargs, char ** args)
{
  int sockfd, port, waited, rd,n;   
  char buf[64]; 
  char * hostn; 
  struct hostent * host; 
  struct sockaddr_in addr; 
  ups_action_t action = STATUS; 


  setbuf(stdout,0); 
  memset(buf,0,sizeof(buf));

  if (nargs < 2) 
  {
    usage(); 
    return RETURN_BADINPUT; 
  }

  n = 1;  // keeps track of the argument index

  if (args[n][0]=='-')
  {

    if (strcmp(args[n],"-start") == 0)  
    {
      action = START; 
    }
    else if (strcmp(args[n],"-stop") == 0)  
    {
      action = STOP; 
    }
    else if (strcmp(args[n],"-status") == 0)  
    {
      action = STATUS; 
    }
    else
    {
      fprintf(stderr,"Invalid argument: '%s'; assuming action is status\n",args[n]); 
    }

    n++; 
  }

  hostn = args[n++]; 
  host = (struct hostent *) gethostbyname(hostn); 
  if (host == NULL) 
  {
    fprintf(stderr,"Could not gethostbyname on %s\n",hostn); 
    return RETURN_HOST; 
  }


  port = DEFAULT_PORT; 
  if(nargs > n)
  { 
    port = atoi(args[n]); 
    if (port == 0)
    {
      fprintf(stderr,"Could not parse port string '%s' using default port %d\n",args[n], DEFAULT_PORT); 
      port = DEFAULT_PORT; 
    }
    n++; 
  } 
 
  // Open a socket
  sockfd = socket(AF_INET,SOCK_STREAM,0); 
  if (sockfd < 0)
  {
    fprintf(stderr,"Could not open socket\n"); 
    return RETURN_SOCKET; 
  }

  if (DEBUG) printf("Socket open\n");

  //Set up the addr struct 
  memset(&addr,0,sizeof(addr)); 
  addr.sin_family = AF_INET; 
  addr.sin_port = htons(port); //Use network byte order
  memcpy(&addr.sin_addr.s_addr, host->h_addr, host->h_length); 

  //Attempt to connect to the UPS
  if (connect_nonblock(sockfd,(struct sockaddr *) &addr,sizeof(addr)) < 0)
  {
    fprintf(stderr,"Could not connect to host %s\n",hostn); 
    return RETURN_NOREACH; 
  }

  char * user = DEFAULT_USER;
  char * pw = DEFAULT_PASS;
  if (nargs > n)
    user = args[n++]; 
  if (nargs > n)
    pw = args[n++]; 

  //Try to log in
  
  if (DEBUG) printf("Logging in\n");
  if (wait_for_string(sockfd,"User Name :"))
  {
    fprintf(stderr,"Timeout waiting for username: This probably means that someone else is logged in\n"); 
    return RETURN_BUSY; 
  }

  write(sockfd,user,strlen(user)); 
  write(sockfd,"\r\n",2); 

  if (DEBUG) printf("Sent username: %s\n",user);

  if (wait_for_string(sockfd,"Password  :"******"Timeout waiting for password\n"); 
    return RETURN_TIMEOUT; 
  }

  write(sockfd,pw,strlen(pw)); 
  write(sockfd,"\r\n",2); 
  if (DEBUG) printf("Sent password: %s\n",pw);

  if (wait_for_string(sockfd,"apc>"))
  {
    fprintf(stderr,"Auth failure or timeout waiting for prompt\n"); 
    return RETURN_AUTH; 
  }

  if (action == STOP || action == START)
  {
    if (action == STOP)
    {
      strcpy(buf,"ups -c Off");  
    }
    else if (action == START)
    {
      strcpy(buf,"ups -c On");  
    }

    write(sockfd,buf,strlen(buf)); 
    write(sockfd,"\r\n",2); 
  
    if (wait_for_string(sockfd,"E"))
    {
      fprintf(stderr,"Action '%s' timeout",buf); 
      return RETURN_TIMEOUT; 
    }
  }

  // Try to bring up the status
  strcpy(buf,"ups -st");  
  write(sockfd,buf,strlen(buf)); 
  write(sockfd,"\r\n",2); 

  if (wait_for_string(sockfd,"State: "))
  {
    fprintf(stderr,"Timeout or UPS not responding to ups -st\n"); 
    return RETURN_TIMEOUT; 
  }

  memset(buf,0,sizeof(buf)); 
  rd = 0; 
  waited = 0; 
  //Read the state
  while (waited < TIMEOUT * 1e6)
  {
    rd += read(sockfd,buf+rd,sizeof(buf)-rd); 

    if (strstr(buf,"On Line") != NULL)
    {
      printline(stdout,buf); 
      return RETURN_LINE;
    }
    else if (strstr(buf,"On Battery") != NULL)
    {
      printline(stdout,buf); 
      return RETURN_BATTERY; 
    }
    else if (strstr(buf,"Discharged") != NULL)
    {
      printline(stdout,buf); 
      return RETURN_DISCHARGED; 
    }
    else if (strstr(buf,"Off") != NULL)
    {
      printline(stdout,buf); 
      return RETURN_OFF; 
    }

    waited+= SLEEP_AMT;
    usleep(SLEEP_AMT); 
  }

  fprintf(stderr,"Timeout or Bad Status: %s\n",buf); 
  return RETURN_TIMEOUT; 
}
Ejemplo n.º 2
0
static void main_loop(const char *serverIp, Uint16 port)
{
	int sockTcp = socket_tcp_server(56790, 5);
	assert(sockTcp >= 0);
	int sockUdp = socket_udp_server(56790);
	assert(sockUdp >= 0);

	int err = set_sock_send_timeout(sockTcp, 5);
	err |= set_sock_recv_timeout(sockTcp, 5);
	assert(err == 0);

	err = set_sock_buf_size(sockUdp, 512 * 1024, 512 * 1024);
	err |= set_sock_linger(sockUdp, TRUE, 2);
	err |= set_sock_block(sockUdp, FALSE);
	DBG("err = %d", err);
	assert(err == 0);

	close(sockTcp);
	close(sockUdp);

	sockTcp = socket(AF_INET, SOCK_STREAM, 0);
	struct sockaddr_in addr;
	init_sock_addr(&addr, serverIp, port);

	err = connect_nonblock(sockTcp, (struct sockaddr *)&addr, sizeof(addr), 5000);
	if(err < 0) {
		ERR("Connect nonblocking server failed.");
		goto exit;
	} else {
		DBG("Connect to %s:%u success!", serverIp, port);
	}

	close(sockTcp);
	close(sockUdp);
	sockTcp = sockUdp = -1;
	
	sockTcp = socket(AF_INET, SOCK_STREAM, 0);
	err = connect(sockTcp, (struct sockaddr *)&addr, sizeof(addr));
	if(err < 0) {
		ERR("Connect server failed.");
		goto exit;
	} else {
		DBG("Connect to %s:%u success!", serverIp, port);
	}

	sockUdp = socket(AF_INET, SOCK_DGRAM, 0);
	char *sendLine = "Hello";
	err = sendto(sockUdp, sendLine, strlen(sendLine), 0, (struct sockaddr *)&addr, sizeof(addr));
	if(err < 0)
		ERR("Send to failed.");
	else
		DBG("Sendto ok...");

	char ipBuf[32];

	err = get_local_ip(ipBuf, sizeof(ipBuf));
	assert(err == E_NO);
	DBG("get local ip: %s", ipBuf);

	Uint8 macAddr[6];
	err = sys_get_mac("eth0", macAddr, sizeof(macAddr));
	assert(err == E_NO);
	DBG("get mac addr: %02X-%02X-%02X-%02X-%02X-%02X", 
		macAddr[0], macAddr[1], macAddr[2], macAddr[3], macAddr[4], macAddr[5]);

exit:

	if(sockTcp > 0)
		close(sockTcp);
	if(sockUdp > 0)
		close(sockUdp);
	
}