Example #1
0
int TCPIPserver::read(int conn, char* buffer, size_t len){
  if (!connection_exists(conn)) {
    SEQUENCER_ERRORN(SEQUENCER_NETERROR_CRANGE_NUM, "TCPIPserver::read()");
	return 0;
  }
  if (timeout==0) return recv(connections[conn].fd, buffer, len, 0);

  int n, rv;
  fd_set readfds;
  struct timeval tv;

  FD_ZERO(&readfds);
  FD_SET(connections[conn].fd, &readfds);
  n=connections[conn].fd+1;
  tv.tv_sec=timeout;
  rv=select(n, &readfds, NULL, NULL, &tv);
  //std::cout<<rv<<std::endl;
  if (rv==-1) {
    SEQUENCER_ERROR(SEQUENCER_NETERROR_SELECTFAIL_NUM, __format(get_errormessage(SEQUENCER_NETERROR_SELECTFAIL_NUM), strerror(errno)), "TCPIPserver::read()");
	return 0;
  } else if (rv==0) {
    SEQUENCER_ERROR(SEQUENCER_NETERROR_TIMEOUT_NUM, __format(get_errormessage(SEQUENCER_NETERROR_TIMEOUT_NUM), strerror(errno)), "TCPIPserver::read()");
	return 0;
  } else {
    if (FD_ISSET(connections[conn].fd, &readfds)) {
      return recv(connections[conn].fd, buffer, len, 0);
    } else {
	  SEQUENCER_ERROR(SEQUENCER_NETERROR_SELECTFAIL_NUM, __format(get_errormessage(SEQUENCER_NETERROR_SELECTFAIL_NUM), strerror(errno)), "TCPIPserver::read()");
	  return 0;
    }
  }
}
Example #2
0
std::string TCPIPserver::read_str_until(int conn, char endchar){
  if (!connection_exists(conn)) {
    SEQUENCER_ERRORN(SEQUENCER_NETERROR_CRANGE_NUM, "TCPIPserver::read_str_until()");
	return "";
  }
  clock_t start;//, end;
  double cpu_time_used;
  char d;
  int count=0;
  std::string answer="";
  int n, rv;
  fd_set readfds;
  struct timeval tv;

  if (timeout==0) {
    do {
      count = recv(connections[conn].fd, &d, 1, 0);
      if ((count>0)&&(d!=endchar)) answer+=d;
    } while ((count > 0)&&(d!=endchar));
    return answer;
  }

  start = clock();
  cpu_time_used=0;
  do {
    FD_ZERO(&readfds);
    FD_SET(connections[conn].fd, &readfds);
    n=connections[conn].fd+1;
    tv.tv_sec=timeout;
    rv=select(n, &readfds, NULL, NULL, &tv);
    //std::cout<<rv<<std::endl;
    if (rv==-1) {
      SEQUENCER_ERROR(SEQUENCER_NETERROR_SELECTFAIL_NUM, __format(get_errormessage(SEQUENCER_NETERROR_SELECTFAIL_NUM), strerror(errno)), "TCPIPserver::read_char()");
	  return "";
    } else if (rv==0) {
      SEQUENCER_ERROR(SEQUENCER_NETERROR_TIMEOUT_NUM, __format(get_errormessage(SEQUENCER_NETERROR_TIMEOUT_NUM), strerror(errno)), "TCPIPserver::read_char()");
	  return "";
    } else {
      if (FD_ISSET(connections[conn].fd, &readfds)) {
        count=recv(connections[conn].fd, &d, 1, 0);
      } else {
	    SEQUENCER_ERROR(SEQUENCER_NETERROR_SELECTFAIL_NUM, __format(get_errormessage(SEQUENCER_NETERROR_SELECTFAIL_NUM), strerror(errno)), "TCPIPserver::read_char()");
	    return "";
	  }
    }
    if ((count>0)&&(d!=endchar)) answer+=d;
    cpu_time_used = ((double) (clock() - start)) / CLOCKS_PER_SEC;
  } while ((count > 0)&&(d!=endchar)&&(cpu_time_used<(double)timeout));
  if (cpu_time_used<(double)timeout) return answer;
  SEQUENCER_ERROR(SEQUENCER_NETERROR_TIMEOUT_NUM, __format(get_errormessage(SEQUENCER_NETERROR_TIMEOUT_NUM), strerror(errno)), "TCPIPserver::read_str_until()");
  return "";

}
Example #3
0
std::string TCPIPserver::get_version() {
  std::string data="";
  #ifdef __WINDOWS__
    data+="driver: WinSock32";
    data+=" supports ver"+__inttostr(wsaData.wVersion & 0xFF)+"."+__inttostr((wsaData.wVersion & 0xFF00)>>8);
    data+=" to ver"+__inttostr(wsaData.wHighVersion & 0xFF)+"."+__inttostr((wsaData.wHighVersion & 0xFF00)>>8)+"\n";
    data+=__format("description: %s\n", wsaData.szDescription);
    data+=__format("system status: %s\n", wsaData.szSystemStatus);
  #else
    data+="driver: Unix Socket Library  'sys/socket.h'\n";
  #endif
  return data;
};
Example #4
0
std::string TCPIPserver::get_client_name(int conn) {
  if (!connection_exists(conn)) {
    SEQUENCER_ERRORN(SEQUENCER_NETERROR_CRANGE_NUM, "TCPIPserver::get_client_name()");
    return "";
  }  
  return __format("%s", inet_ntoa(connections[conn].client.sin_addr));
};
Example #5
0
void TCPIPserver::write(int conn, char* buffer, size_t len){
  if (!connection_exists(conn)) {
    SEQUENCER_ERRORN(SEQUENCER_NETERROR_CRANGE_NUM, "TCPIPserver::write()");
	return ;
  }
  /*if (send( connections[conn].fd, buffer, len, 0)==-1) {
    SEQUENCER_ERROR(SEQUENCER_NETERROR_SENDFAIL_NUM, __format(get_errormessage(SEQUENCER_NETERROR_SENDFAIL_NUM), strerror(errno)), "TCPIPserver::write()");
  };*/
  size_t total=0;     // what has been send so far
  int bytesleft=len; // what is left to send
  int tobesent=mmin(chunksize, bytesleft);
  int n, m, rv;
  fd_set writefds;
  struct timeval tv;
  while (total<len) {
    tobesent=mmin(chunksize, bytesleft);
    if (timeout>0) {
      FD_ZERO(&writefds);
      FD_SET(connections[conn].fd, &writefds);
      m=connections[conn].fd+1;
      tv.tv_sec=timeout;
      rv=select(m, NULL, &writefds, NULL, &tv);
      if (rv==-1) {
        SEQUENCER_ERROR(SEQUENCER_NETERROR_SELECTFAIL_NUM, __format(get_errormessage(SEQUENCER_NETERROR_SELECTFAIL_NUM), strerror(errno)), "TCPIPserver::write()");
		return;
      } else if (rv==0) {
        SEQUENCER_ERROR(SEQUENCER_NETERROR_TIMEOUT_NUM, __format(get_errormessage(SEQUENCER_NETERROR_TIMEOUT_NUM), strerror(errno)), "TCPIPserver::write()");
		return;
      } else {
        if (FD_ISSET(connections[conn].fd, &writefds)) {
          n = send(connections[conn].fd, buffer+total, tobesent, 0);
        } else {
			SEQUENCER_ERROR(SEQUENCER_NETERROR_SELECTFAIL_NUM, __format(get_errormessage(SEQUENCER_NETERROR_SELECTFAIL_NUM), strerror(errno)), "TCPIPserver::write()");
			return;
		}
      }
    } else {
      n = send(connections[conn].fd, buffer+total, tobesent, 0);
    }
    if (n==-1) {
      SEQUENCER_ERROR(SEQUENCER_NETERROR_SENDFAIL_NUM, __format(get_errormessage(SEQUENCER_NETERROR_SENDFAIL_NUM), strerror(errno)), "TCPIPserver::write()");
	  return;
    }
    total+=n;
    bytesleft-=n;
  }
}
Example #6
0
char TCPIPserver::read_char(int conn){
  if (!connection_exists(conn)) {
    SEQUENCER_ERRORN(SEQUENCER_NETERROR_CRANGE_NUM, "TCPIPserver::read_char()");
	return 0;
  }
  char d;
  int count=0;
  int n, rv;
  fd_set readfds;
  struct timeval tv;

  if (timeout==0) {
    while (count<1) {
      count=recv(connections[conn].fd, &d, 1, 0);
    }
    return d;
  }

  //std::cout<<"reading one char ... ";
  FD_ZERO(&readfds);
  FD_SET(connections[conn].fd, &readfds);
  n=connections[conn].fd+1;
  tv.tv_sec=timeout;
  rv=select(n, &readfds, NULL, NULL, &tv);
  if (rv==-1) {
    SEQUENCER_ERROR(SEQUENCER_NETERROR_SELECTFAIL_NUM, __format(get_errormessage(SEQUENCER_NETERROR_SELECTFAIL_NUM), strerror(errno)), "TCPIPserver::read_char()");
	return 0;
  } else if (rv==0) {
    SEQUENCER_ERROR(SEQUENCER_NETERROR_TIMEOUT_NUM, __format(get_errormessage(SEQUENCER_NETERROR_TIMEOUT_NUM), strerror(errno)), "TCPIPserver::read_char()");
	return 0;
  } else {
    if (FD_ISSET(connections[conn].fd, &readfds)) {
      count=recv(connections[conn].fd, &d, 1, 0);
      //std::cout<<chartostr(d)<<std::endl;
      if (count>0) return d;
    } else {
	  SEQUENCER_ERROR(SEQUENCER_NETERROR_SELECTFAIL_NUM, __format(get_errormessage(SEQUENCER_NETERROR_SELECTFAIL_NUM), strerror(errno)), "TCPIPserver::read_char()");
      return 0;
	}
  }
  return 0;
}
Example #7
0
int TCPIPserver::accept_connection(){
  int num=get_new_connection_num();
  int len = sizeof(connections[num].client);
  connections[num].fd = accept(sockfd, (struct sockaddr*)&connections[num].client, &len);
  if (connections[num].fd < 0) {
    SEQUENCER_ERROR(SEQUENCER_NETERROR_ACCEPTFAIL_NUM, __format(get_errormessage(SEQUENCER_NETERROR_ACCEPTFAIL_NUM), strerror(errno)), "TCPIPserver::accept_connection()");
	return 0;
	return 0;
  }
  return num;
}
Example #8
0
void TCPIPserver::open_socket(){
  // generate a new TCP/IP stream socket
  sockfd=socket(PF_INET, SOCK_STREAM, 0);
  if (sockfd < 0) {
    SEQUENCER_ERROR(SEQUENCER_NETERROR_SOCKETFAIL_NUM, __format(get_errormessage(SEQUENCER_NETERROR_SOCKETFAIL_NUM), strerror(errno)), "TCPIPserver::open_socket()");
	return;
  }
  memset(server.sin_zero, '\0', sizeof(server));
  server.sin_family=AF_INET;
  server.sin_port=htons(port);
  server.sin_addr.s_addr = htonl( INADDR_ANY);

  if (bind(sockfd, (struct sockaddr*)&server, sizeof(server))==-1) {
    SEQUENCER_ERROR(SEQUENCER_NETERROR_BINDFAIL_NUM, __format(get_errormessage(SEQUENCER_NETERROR_BINDFAIL_NUM), strerror(errno)), "TCPIPserver::open_socket()");
	return;
  }
  if (listen(sockfd, backlog) == -1) {
    SEQUENCER_ERROR(SEQUENCER_NETERROR_LISTENFAIL_NUM, __format(get_errormessage(SEQUENCER_NETERROR_LISTENFAIL_NUM), strerror(errno)), "TCPIPserver::open_socket()");
	return;
  }
}
Example #9
0
static void pformat(const char *const fmt, va_list va)
{
    __format(fmt, va, printf_handler, NULL);
}
Example #10
0
std::string TCPIPserver::read_str_until(int conn, const std::string& endstring){
  if (!connection_exists(conn)) {
    SEQUENCER_ERRORN(SEQUENCER_NETERROR_CRANGE_NUM, "TCPIPserver::read_str_until()");
	return "";
  }
  clock_t start;//, end;
  double cpu_time_used;
  char d;
  int count=0;
  std::string answer="";
  int n, rv;
  fd_set readfds;
  struct timeval tv;
  bool done=false;

  if (timeout==0) {    
    do {
      count = recv(connections[conn].fd, &d, 1, 0);
      if ((count>0)) answer+=d;
	  done=false;
	  if (answer.size()>=endstring.size()) {
	    done=true;
	    for (size_t i=0; i<endstring.size(); i++) {
		  if (answer[answer.size()-endstring.size()+i]!=endstring[i]) {
		    done=false;
			break;
		  }
	    }
      }
    } while ((count > 0)&&(!done));
    std::string a;
	  for (size_t i=0; i<answer.size()-endstring.size(); i++) {
	      a=a+answer[i];
	  }
	  return a;
  }

  start = clock();
  cpu_time_used=0;
  do {
    FD_ZERO(&readfds);
    FD_SET(connections[conn].fd, &readfds);
    n=connections[conn].fd+1;
    tv.tv_sec=timeout;
    rv=select(n, &readfds, NULL, NULL, &tv);
    //std::cout<<rv<<std::endl;
    if (rv==-1) {
      SEQUENCER_ERROR(SEQUENCER_NETERROR_SELECTFAIL_NUM, __format(get_errormessage(SEQUENCER_NETERROR_SELECTFAIL_NUM), strerror(errno)), "TCPIPserver::read_char()");
	  return "";
    } else if (rv==0) {
      SEQUENCER_ERROR(SEQUENCER_NETERROR_TIMEOUT_NUM, __format(get_errormessage(SEQUENCER_NETERROR_TIMEOUT_NUM), strerror(errno)), "TCPIPserver::read_char()");
	  return "";
    } else {
      if (FD_ISSET(connections[conn].fd, &readfds)) {
        count=recv(connections[conn].fd, &d, 1, 0);
      } else {
	    SEQUENCER_ERROR(SEQUENCER_NETERROR_SELECTFAIL_NUM, __format(get_errormessage(SEQUENCER_NETERROR_SELECTFAIL_NUM), strerror(errno)), "TCPIPserver::read_char()");
	    return "";
	  }
    }
    if ((count>0)) answer+=d;
	done=false;
    if (answer.size()>=endstring.size()) {
	  done=true;
	  for (size_t i=0; i<endstring.size(); i++) {
	    if (answer[answer.size()-endstring.size()+i]!=endstring[i]) {
  		  done=false;
		  break;
	    }
	  }
    }
    cpu_time_used = ((double) (clock() - start)) / CLOCKS_PER_SEC;
  } while ((count > 0)&&(!done)&&(cpu_time_used<(double)timeout));
  if (cpu_time_used<(double)timeout) {
	  std::string a;
	  for (size_t i=0; i<answer.size()-endstring.size(); i++) {
	      a=a+answer[i];
	  }
	  return a;
  }
  SEQUENCER_ERROR(SEQUENCER_NETERROR_TIMEOUT_NUM, __format(get_errormessage(SEQUENCER_NETERROR_TIMEOUT_NUM), strerror(errno)), "TCPIPserver::read_str_until()");
  return "";

}
Example #11
0
std::string __inttostr(int i) {
    return __format("%d", i);
}
Example #12
0
/*
 * gg_session_handler_search50()
 *
 * zajmuje siê obs³ug± wyniku przeszukiwania katalogu publicznego.
 *
 *  - s - sesja
 *  - e - opis zdarzenia
 */
void gg_session_handler_search50(session_t *s, struct gg_event *e)
{
	gg_private_t *g = session_private_get(s);
	gg_pubdir50_t res = e->event.pubdir50;
	int i, count, all = 0;
	list_t l;
	uin_t last_uin = 0;

	if (!g)
		return;

	if ((count = gg_pubdir50_count(res)) < 1) {
		print("search_not_found");
		return;
	}

	debug_function("gg_session_handler_search50() handle_search50, count = %d\n", gg_pubdir50_count(res));

	for (l = g->searches; l; l = l->next) {
		gg_pubdir50_t req = l->data;

		if (gg_pubdir50_seq(req) == gg_pubdir50_seq(res)) {
			all = 1;
			break;
		}
	}

	for (i = 0; i < count; i++) {
		const char *uin		= gg_pubdir50_get(res, i, "fmnumber");
		const char *__firstname = gg_pubdir50_get(res, i, "firstname");
		const char *__lastname	= gg_pubdir50_get(res, i, "lastname");
		const char *__nickname	= gg_pubdir50_get(res, i, "nickname");
		const char *__fmstatus	= gg_pubdir50_get(res, i, "fmstatus");
		const char *__birthyear = gg_pubdir50_get(res, i, "birthyear");
		const char *__city	= gg_pubdir50_get(res, i, "city");

		char *firstname		= gg_to_core_dup(s, __firstname);
		char *lastname		= gg_to_core_dup(s, __lastname);
		char *nickname		= gg_to_core_dup(s, __nickname);
		char *city		= gg_to_core_dup(s, __city);
		int status		= (__fmstatus)	? atoi(__fmstatus) : GG_STATUS_NOT_AVAIL;
		const char *birthyear	= (__birthyear && xstrcmp(__birthyear, "0")) ? __birthyear : NULL;

		char *name, *active, *gender;
		const char *target = NULL;

		if (count == 1 && !all) {
			xfree(last_search_first_name);
			xfree(last_search_last_name);
			xfree(last_search_nickname);
			xfree(last_search_uid);
			last_search_first_name	= xstrdup(firstname);
			last_search_last_name	= xstrdup(lastname);
			last_search_nickname	= xstrdup(nickname);
			last_search_uid		= saprintf("gg:%s", uin);
		}

		name = saprintf(
			("%s %s"),
					firstname ? firstname : (""), 
					lastname ? lastname : (""));

#define __format(x) ((count == 1 && !all) ? "search_results_single" x : "search_results_multi" x)
		{
			const char *fvalue;
			switch (status) {
				case GG_STATUS_AVAIL:
				case GG_STATUS_AVAIL_DESCR:
					fvalue = format_find(__format("_avail"));
					break;
				case GG_STATUS_BUSY:
				case GG_STATUS_BUSY_DESCR:
					fvalue = format_find(__format("_away"));
					break;
				default:
					fvalue = format_find(__format("_notavail"));
			}
			active = format_string(fvalue, (__firstname) ? __firstname : nickname);
		}
		gender = format_string(format_find(__format("_unknown")), "");

			/* XXX: why do we _exactly_ use it here? can't we just always
			 *	define target and thus display result in right conversation window? */
		for (l = autofinds; l; l = l->next) {
			char *d = (char *) l->data;
		
			if (!xstrcasecmp(d + 3, uin)) {
				target = d;
				break;
			}
		}
		
		print_info(target, s, __format(""), 
			uin		? uin : ("?"), name, 
			nickname	? nickname : (""), 
			city		? city : (""), 
			birthyear	? birthyear : ("-"),
			gender, active);

#undef __format

		xfree(name);
		xfree(active);
		xfree(gender);

		xfree(firstname);
		xfree(lastname);
		xfree(nickname);
		xfree(city);

		last_uin = atoi(uin);
	}

	/* je¶li mieli¶my ,,/find --all'', szukamy dalej */
	for (l = g->searches; l; l = l->next) {
		gg_pubdir50_t req = l->data;
		uin_t next;

		if (gg_pubdir50_seq(req) != gg_pubdir50_seq(res))
			continue;

		/* nie ma dalszych? to dziêkujemy */
		if (!(next = gg_pubdir50_next(res)) || !g->sess || next <= last_uin) {
			list_remove(&g->searches, req, 0);
			gg_pubdir50_free(req);
			break;
		}

		gg_pubdir50_add(req, GG_PUBDIR50_START, ekg_itoa(next));
		gg_pubdir50(g->sess, req);

		break;
	}

}