<commit_before>#include "../libs/client_linux_utils.h"


volatile sig_atomic_t shouldStop = 0;
volatile sig_atomic_t shouldSend = 0;
volatile sig_atomic_t shouldWait = 0;
volatile sig_atomic_t onChat = 0;
long int socket_desc;

// Gestione CTRL-C
void kill_handler() {
  shouldStop = 1;
  char* close_command = QUIT;
  size_t close_command_len = strlen(close_command);
  int bytes_written = 0;
  int ret;
  while (1) {
    ret = write(socket_desc,close_command+bytes_written,close_command_len);
    if (ret==-1) {
      if (errno == EINTR) {
        fprintf(stderr,"Errore scrittura dati, ripeto\n");
        continue;
      }
      ERROR_HELPER(ret,"Errore scrittura dati fatale, panico");
    } else if ((bytes_written += ret) == close_command_len) break;
  }
  printf("Chiusura connessione effettuata, bye bye\n");
  exit(EXIT_SUCCESS);
}

// Routine di ricezione dei messaggi
void* receiveMessage(void* arg) {
  int socket_desc = (int)(long)arg;
  char* close_command = QUIT;
  size_t close_command_len = strlen(close_command);
  char* request_command = CONNECT;
  size_t request_command_len = strlen(request_command);
  char* already_used_alert = NAME_ALREADY_USED;
  size_t already_used_alert_len = strlen(already_used_alert);
  char* connect_with_yourself= CONNECT_WITH_YOURSELF;
  size_t connect_with_yourself_len = strlen(connect_with_yourself);

  // Serve settare un intervallo per evitare di intasare la CPU con controlli
  struct timeval timeout;
  fd_set read_descriptors;
  int nfds = socket_desc + 1;

  char buf[BUF_LEN];

  // Codice gestione lettura chat
  int bytes_read;
  int ret;

  while (!shouldStop) {
    // Popolo i valori della struttura del timeout in modo da fare il check ogni 1.5 secondi in modo da lasciare la CPU il più libera possibile
    timeout.tv_sec  = 1;
    timeout.tv_usec = 500000;

    // Inizializzo a 0 i bit del set di file descriptors da passare alla select
    FD_ZERO(&read_descriptors);
    // Imposto nel set di file descriptors il valore del socket descriptor ottenuto dalla connessione del server
    FD_SET(socket_desc, &read_descriptors);

    // Lancio la select
    ret = select(nfds, &read_descriptors, NULL, NULL, &timeout);

    if (ret == -1 && errno == EINTR) continue;
    ERROR_HELPER(ret, "Errore select!");

    if (ret == 0) continue; // Timeout scaduto

    // In questo momento (ret==1) quindi è stato ricevuto il messaggio
    bytes_read = 0;

    while (1) {
      ret = read(socket_desc,buf+bytes_read,1);
      if (ret == -1) {
        if (errno == EINTR) {
          continue;
        }else{
          ERROR_HELPER(ret,"Errore nella read, panico");
        }
      }
      if (ret == 0) {<commit_msg>	modified:   client/linux_client.c<commit_after>#include "../libs/client_linux_utils.h"


volatile sig_atomic_t shouldStop = 0;
volatile sig_atomic_t shouldSend = 0;
volatile sig_atomic_t shouldWait = 0;
volatile sig_atomic_t onChat = 0;
long int socket_desc;

// Gestione CTRL-C
void kill_handler() {
  shouldStop = 1;
  char* close_command = QUIT;
  size_t close_command_len = strlen(close_command);
  int bytes_written = 0;
  int ret;
  while (1) {
    ret = write(socket_desc,close_command+bytes_written,close_command_len);
    if (ret==-1) {
      if (errno == EINTR) {
        fprintf(stderr,"Errore scrittura dati, ripeto\n");
        continue;
      }
      ERROR_HELPER(ret,"Errore scrittura dati fatale, panico");
    } else if ((bytes_written += ret) == close_command_len) break;
  }
  printf("Chiusura connessione effettuata, bye bye\n");
  exit(EXIT_SUCCESS);
}

// Routine di ricezione dei messaggi
void* receiveMessage(void* arg) {
  int socket_desc = (int)(long)arg;
  char* close_command = QUIT;
  size_t close_command_len = strlen(close_command);
  char* request_command = CONNECT;
  size_t request_command_len = strlen(request_command);
  char* already_used_alert = NAME_ALREADY_USED;
  size_t already_used_alert_len = strlen(already_used_alert);
  char* connect_with_yourself= CONNECT_WITH_YOURSELF;
  size_t connect_with_yourself_len = strlen(connect_with_yourself);

  // Serve settare un intervallo per evitare di intasare la CPU con controlli
  struct timeval timeout;
  fd_set read_descriptors;
  int nfds = socket_desc + 1;

  char buf[BUF_LEN];

  // Codice gestione lettura chat
  int bytes_read;
  int ret;

  while (!shouldStop) {
    // Popolo i valori della struttura del timeout in modo da fare il check ogni 1.5 secondi in modo da lasciare la CPU il più libera possibile
    timeout.tv_sec  = 1;
    timeout.tv_usec = 500000;

    // Inizializzo a 0 i bit del set di file descriptors da passare alla select
    FD_ZERO(&read_descriptors);
    // Imposto nel set di file descriptors il valore del socket descriptor ottenuto dalla connessione del server
    FD_SET(socket_desc, &read_descriptors);

    // Lancio la select
    ret = select(nfds, &read_descriptors, NULL, NULL, &timeout);

    if (ret == -1 && errno == EINTR) continue;
    ERROR_HELPER(ret, "Errore select!");

    if (ret == 0) continue; // Timeout scaduto

    // In questo momento (ret==1) quindi è stato ricevuto il messaggio
    bytes_read = 0;

    while (1) {
      ret = read(socket_desc,buf+bytes_read,1);
      printf("stampo dopo read %send",buf);
      if (ret == -1) {
        if (errno == EINTR) {
          continue;
        }else{
          ERROR_HELPER(ret,"Errore nella read, panico");
        }
      }
      if (ret == 0) {
{'fraction_non_alphanumeric': 0.09817309466691271, 'fraction_numerical': 0.009964938180476102, 'mean_word_length': 3.520433694745621, 'pattern_counts': {'":': 0, '<': 3, '<?xml version=': 0, '>': 3, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '1639823', 'n_tokens_mistral': 1929, 'n_tokens_neox': 1831, 'n_words': 516}