service/comsock.cpp
/**
  In caso di errore, uno dei seguenti valori viene associato a errno:
  - @b ENOTCONN: il peer ha chiuso la connessione
  - @b ENOMEM: problema con la memoria
  - uno dei valori assegnati da read()
  - uno dei valori assegnati da strtoul()
 */
In caso di errore, uno dei seguenti valori viene associato a errno:
@b ENOTCONN: il peer ha chiuso la connessione
@b ENOMEM: problema con la memoria
uno dei valori assegnati da read()
uno dei valori assegnati da strtoul()
In caso di errore uno dei seguenti valori viene associato a errno : @b ENOTCONN : il peer ha chiuso la connessione @b ENOMEM : problema con la memoria uno dei valori assegnati da read () uno dei valori assegnati da strtoul ()
int receiveMessage(int sc, message_t * msg) {
  char type;
  char cbuflen[11]; 
  char *buffer = NULL; 
  int buflen; 
  int r_type = 0, r_cbuflen = 0, r_buffer = 0;
  r_type = readAllChars(sc, &type, 1);
  if(r_type <= 0) {
    errno = (r_type == 0 ? ENOTCONN : errno);
    return -1;
  }
  cbuflen[10] = '\0';
  r_cbuflen = readAllChars(sc, cbuflen, 10);
  if(r_cbuflen <= 0) {
    errno = (r_cbuflen == 0 ? ENOTCONN : errno);
    return -1;
  }
  errno = 0;
  buflen = (int) strtoul(cbuflen, NULL, 10);
  if(errno != 0) return -1;
  if(buflen > 0) {
    buffer = (char*)malloc(sizeof(char) * buflen);
    if(buffer == NULL) return -1;
    r_buffer = readAllChars(sc, buffer, buflen);
    if(r_buffer <= 0) {
      errno = (r_buffer == 0 ? ENOTCONN : errno);
      free(buffer);
      return -1;
    }
  }
  if(msg == NULL) { 
    if(buffer != NULL) {
      free(buffer);
    }
  } else {
    msg->type = type;
    msg->length = buflen;
    msg->buffer = buffer;
  }
  return r_type + r_cbuflen + r_buffer;
}
int receiveMessage ( int sc , message_t * msg ) { char type ; char cbuflen [ 11 ] ; char * buffer = NULL ; int buflen ; int r_type = 0 , r_cbuflen = 0 , r_buffer = 0 ; r_type = readAllChars ( sc , & type , 1 ) ; if ( r_type <= 0 ) { errno = ( r_type == 0 ? ENOTCONN : errno ) ; return -1 ; } cbuflen [ 10 ] = ' \0 ' ; r_cbuflen = readAllChars ( sc , cbuflen , 10 ) ; if ( r_cbuflen <= 0 ) { errno = ( r_cbuflen == 0 ? ENOTCONN : errno ) ; return -1 ; } errno = 0 ; buflen = ( int ) strtoul ( cbuflen , NULL , 10 ) ; if ( errno != 0 ) return -1 ; if ( buflen > 0 ) { buffer = ( char * ) malloc ( sizeof ( char ) * buflen ) ; if ( buffer == NULL ) return -1 ; r_buffer = readAllChars ( sc , buffer , buflen ) ; if ( r_buffer <= 0 ) { errno = ( r_buffer == 0 ? ENOTCONN : errno ) ; free ( buffer ) ; return -1 ; } } if ( msg == NULL ) { if ( buffer != NULL ) { free ( buffer ) ; } } else { msg -> type = type ; msg -> length = buflen ; msg -> buffer = buffer ; } return r_type + r_cbuflen + r_buffer ; }
In caso di errore, uno dei seguenti valori viene associato a errno:
 @b ENOTCONN: il peer ha chiuso la connessione
 @b ENOMEM: problema con la memoria
 uno dei valori assegnati da read()
 uno dei valori assegnati da strtoul()
In caso di errore uno dei seguenti valori viene associato a errno : @b ENOTCONN : il peer ha chiuso la connessione @b ENOMEM : problema con la memoria uno dei valori assegnati da read () uno dei valori assegnati da strtoul ()
/* buffer per leggere msg->length */ /* msg->buffer */ /* msg->length */ /* FIXME Potenzialmente pericoloso! Potremmo allocare una quantità di memoria esagerata */ /* se msg=null, riceve e scarta */