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; }
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); }