예제 #1
0
파일: emwin.c 프로젝트: noaaport/npemwin
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);
}
예제 #2
0
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);
}