int open_emwin_server_network(int type, char *ipstr, char *port, int *gai_code){ /* * The "type" argument is the wx14 or a bb server. * * There can be cases in which the connection is opened, * but the server closes before anything has been read (e.g., * it happens if the server uses libwrap). * Therefore, after a successfull open(), we check that we can * receive a packet (which is discarded). * * Returns: * fd * -1 (system error) * -2 Some other connection error, timed out trying to get packet, * or some other error from get_emwin_packet_xxx(). */ int status = 0; int fd = -1; struct emwin_packet ep; /* * We put a timer here to avoid getting stuck too long trying to * connect to a server. The OS default is something like 70 secs. * If g.connecttimeout_s is 0 or negative the configuration timeout * facility is disabled. Use the OS defaults for the so_snd/so_rcvbuf. */ if(g.connecttimeout_s > 0) fd = tcp_client_open_conn_timed(ipstr, port, g.connecttimeout_s, -1, -1, gai_code); else fd = tcp_client_open_conn(ipstr, port, -1, -1, gai_code); if(fd == -1) return(-1); if(type == EMWIN_SERVER_TYPE_WX14_MSG){ status = emwin_sync_wx14_msg(fd); } else if(type == EMWIN_SERVER_TYPE_WX14_RAW){ status = emwin_sync_wx14_raw(fd); } else status = get_emwin_packet_bb(fd, &ep); if(status != 0){ close(fd); fd = -1; if(status != -1) fd = -2; } return(fd); }
static int process_packets(struct emwin_server *emserver){ int status; int skip = 0; struct emwin_packet ep; int server_fd = emserver->fd; if(server_type_wx14_msg_device(emserver)) status = get_emwin_packet_wx14_msg(server_fd, &ep); else if(server_type_wx14_raw_device(emserver)) status = get_emwin_packet_wx14_raw(server_fd, &ep); else if(server_type_serial_device(emserver)) status = get_emwin_packet_serial(server_fd, &ep); else status = get_emwin_packet_bb(server_fd, &ep); update_emwin_server_stats(status); if(write_emwin_server_stats(g.emwinstatusfile) != 0) log_err2("Error writing status file", g.emwinstatusfile); if(server_type_wx14_msg_device(emserver)){ if(status == -1) log_err2("Error reading packet from WX14 msg device:", emserver->ip); else if(status != 0) log_errx("Error [%d] reading packet from WX14 msg device:", status, emserver->ip); else { if(wx14_signalstatus_write(g.wx14_signal_statusfile, &g.wx14msg) != 0) log_err2("Error writing wx14 file", g.wx14_signal_statusfile); if(wx14_signalstatus_log(g.wx14_signal_logfile, &g.wx14msg) != 0) log_err2("Error writing wx14 file", g.wx14_signal_logfile); } } else { /* * This applies to both the wx14 raw device and a serial device * * server_type_wx14_raw_device(emserver) * server_type_serial_device(emserver) */ if(status == -1) log_err2("Error reading packet from", emserver->ip); else if(status == -2) log_errx("Timedout trying to get packet from %s.", emserver->ip); else if(status == -3) log_info("Connection closed by %s.", emserver->ip); else if(status == 1) log_errx("Short read from %s.", emserver->ip); else if(status == 2) log_errx("Error in header format or unrecognized packet type."); else if(status == 3) log_errx("Checksum error."); else if(status == 4) log_errx("Check file name error: %s", ep.header.filename); else if(status != 0) log_errx("Cannot process packet: unknown error from get_emwin_packet()"); } if(status != 0) return(status); /* * Sends the packet to the queues for retransmission to the clients. */ if(g.f_server_enabled == 1) (void)server_send_client_queues(&ep); if(ep.bbtype == BB_PACKET_TYPE_SRVLIST){ status = save_server_list(&ep); if(status != 0) log_err("Error saving the server list."); else log_info("Received the server list."); return(0); } /* * Handle and save the data packet. */ if(ep.header.blockno == 1){ /* * Only the first block needs to be checked because, if the file * is rejected, it is not inserted in the queue and subsequent blocks * will be discarded. * "filename" is the product name and the extension; e.g., * cfwsjupr.txt */ skip = exec_filter(ep.header.filename); if(skip == 1){ log_verbose(1, "Prefilter is rejecting %s.", ep.header.filename); return(0); } } log_verbose(1, "Received: %s (%d of %d)", ep.header.filename, ep.header.blockno, ep.header.numblocks); status = save_emwin_packet(&ep); if(status == -1) log_err2("Error saving", ep.header.filename); else log_verbose(1, "Saved: %s (%d of %d)", ep.header.filename, ep.header.blockno, ep.header.numblocks); if(status == 0) ++g.packet_count; return(status); }