From fdc69e29807be742bcc4dc2d44e81bfee56893a5 Mon Sep 17 00:00:00 2001
From: Eduardo Machado <emm14@inf.ufpr.br>
Date: Sun, 6 Dec 2015 17:15:40 -0200
Subject: [PATCH] lsr aparentemente funcionando C:

---
 include/messages.h  |  2 +-
 src/main.cpp        |  4 +++-
 src/messages.cpp    | 57 ++++++++++++++-------------------------------
 src/submessages.cpp |  3 +--
 4 files changed, 23 insertions(+), 43 deletions(-)

diff --git a/include/messages.h b/include/messages.h
index ebb324a..f7b7ed8 100644
--- a/include/messages.h
+++ b/include/messages.h
@@ -15,7 +15,7 @@ class Message{
 		static int sendLS(unsigned char*);
 		static int sendPUT(unsigned char*);
 		static int sendGET(unsigned char*, char*);
-		static int sendData(unsigned char*); // Método que divide e envia uma mensagem.
+		static int sendData(unsigned char*, int); // Método que divide e envia uma mensagem.
 
 		// Métodos que faz o recebimento e resposta aos comandos
 		static int receiveCD(unsigned char*); // Lida com mensagens tipo CD
diff --git a/src/main.cpp b/src/main.cpp
index 0774bc4..173bc84 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -55,6 +55,7 @@ int main(int argc, char *argv[]) {
         cin >> parameter;
         mainMessage.sendCD((unsigned char*)(parameter.c_str()));
       }else if(command == "lsr"){
+        cin >> parameter;
         mainMessage.sendLS((unsigned char*)(parameter.c_str()));
       }
     }
@@ -62,6 +63,8 @@ int main(int argc, char *argv[]) {
     cout << "Execução em modo servidor iniciada." << endl;
     cout << "===================================" << endl;
     while(1){
+      if ((buff = (char *)malloc((size_t)size)) != NULL)
+        currentPath = getcwd(buff, (size_t)size);
       receiptSize = recv(soquete, receiptMessage, 16, 0);
       if (receiptSize != -1) {
         // Lê começo da mensagem e vê se tem o delimitador de início
@@ -90,7 +93,6 @@ int main(int argc, char *argv[]) {
             } else {
               resposta.setData((unsigned char*)"4",1,0); // Manda um ack
               send(soquete,resposta.objToString(),68, 0);
-              cout << "res " << serverReceive.getData() << endl;
               if(mainMessage.receiveLS(serverReceive.getData(), currentPath)){
                 cout << "ERRO: ls remoto.";
               }
diff --git a/src/messages.cpp b/src/messages.cpp
index a9a4656..2b9614a 100644
--- a/src/messages.cpp
+++ b/src/messages.cpp
@@ -66,7 +66,7 @@ int Message::sendCD(unsigned char* dirName){
 }
 
 int Message::sendLS(unsigned char* options){
-  int error, success, garbage, rv;
+  int error, success = 0, garbage, rv;
   char *receiptMessage = (char*)malloc(sizeof(char*)*68);
   struct pollfd ufds[1]; // usado para timeout em recv
   SubMessage listDir, answer, ack, nack;
@@ -74,15 +74,12 @@ int Message::sendLS(unsigned char* options){
 
   ufds[0].fd = soquete;
   ufds[0].events = POLLIN;
-cout << "lsr ----> 1 " << endl;
   listDir.setData(options,4,0);
-cout << "lsr ----> 1 " << endl;
   while(!success){
     error = send(soquete, listDir.objToString(), 68, 0);
     if (error == -1){
       cout << "Erro ao tentar listar diretorio (messages.cpp::sendLS)" << endl;
     }
-cout << "lsr ----> 1 " << endl;
     garbage = 0;
     success = 0;
     while((garbage < 10) && (!success)){
@@ -106,6 +103,7 @@ cout << "lsr ----> 1 " << endl;
                 showLS = receiveData(10);
                 if(showLS != ""){
                   success = 1;
+                  cout << showLS << endl;
                 }else{
                   success = 0;
                 }
@@ -187,7 +185,7 @@ int Message::sendPUT(unsigned char* fileName){
                     if(answer.getStartMessage() == 0x7E){ // 0x7E = 01111110
                       if(answer.getType() == 8){
                         success = 1;
-                        if(sendData((unsigned char*)fileData.c_str())){
+                        if(sendData((unsigned char*)fileData.c_str(), 13)){
                           cout << "Erro ao mandar dados (messages.cpp::sendPUT)" << endl;
                           return -1;
                         }
@@ -304,7 +302,7 @@ int Message::sendGET(unsigned char* fileName, char* currentPath){
   }
 }
 
-int Message::sendData(unsigned char* stringMessage){
+int Message::sendData(unsigned char* stringMessage, int type){
   int numberOfMessages, sizeLastMessage, size=0;
   int i, j, k, garbage, error, rv, success = 0;
   unsigned char* subData; // a parte da mensagem que vai em cada sequencia
@@ -328,7 +326,7 @@ int Message::sendData(unsigned char* stringMessage){
     numberOfMessages = (size/64);
   }
   sizeLastMessage = size%64;
-  numberOfMessages++;  // +1 = Mensagem de FIM
+  numberOfMessages += 2;  // +1 = Mensagem de FIM
 
   // Cria as sub mensagens
   SubMessage subMensagem[numberOfMessages];
@@ -336,15 +334,13 @@ int Message::sendData(unsigned char* stringMessage){
   // string usada para dividir a mensagem de entrada e colocar na parte de data das SubMessages
   subData = (unsigned char*) malloc(sizeof(unsigned char) * 64);
 
-  int tipo = 13; // 13 = 0xD --> Dados
-
   // Divide a mensagem
   k = 0; // k é a numero da sequencia na submensagem
-  for(i = 0; i < numberOfMessages-1; ++i){
+  for(i = 0; i < numberOfMessages-2; ++i){
     for(j = 0; j < 64; ++j){
       subData[j] = stringMessage[(i*64)+j];
     }
-    subMensagem[i].setData(subData, tipo, k);
+    subMensagem[i].setData(subData, type, k);
     ++k;
     if(k == 64){ // Caso estoure o número de bits de sequencia
       k = 0;
@@ -356,19 +352,19 @@ int Message::sendData(unsigned char* stringMessage){
     for(j = 0; j < sizeLastMessage; ++j){
       subData[j] = stringMessage[(i*64)+j];
     }
-    subMensagem[i].setData(subData, tipo, k);
+    subMensagem[i].setData(subData, type, k);
     ++k;
   }else{
     // Caso contrario continua com o tamanho maior
     for(j = 0; j < 64; ++j){
       subData[j] = stringMessage[(i*64)+j];
     }
-    subMensagem[i].setData(subData, tipo, k);
+    subMensagem[i].setData(subData, type, k);
     ++k;
   }
   // Seta mensagem de FIM
   i++;
-  subMensagem[i].setData((unsigned char*)"FIM", 15, k); // Dados = "FIM", tipo = 0xF, sequencia = proxima
+  subMensagem[i].setData((unsigned char*)"FIM", 15, k); // Dados = "FIM", type = 0xF, sequencia = proxima
 
   i = 0;
   while (i < numberOfMessages){
@@ -446,41 +442,26 @@ int Message::receiveLS(unsigned char* options, char* currentPath){
 	ifstream lsFile;
   unsigned char* lsData;
   int i;
-cout << "-1-" << endl;
   parameter = (char*)options;
-cout << "-parameter- " << parameter << endl;
 	path = currentPath;
-cout << "-3-" << endl;
 	/* Para dar um ls apenas, é necessário escrever "ls ." */
 	/* Precisamos pensar em um jeito de concertar isso. */
 	switch(lsParameter(parameter)){
 		case 1:
-cout << "-case1-" << endl;
 			lsAux = "ls > " + path + "/ls.txt";
-cout << "-case1.1-" << endl;
 			system(lsAux.c_str());
-cout << "-case1.2-" << endl;
 			break;
 		case 2:
-cout << "-case2-" << endl;
 			lsAux = "ls -a > " + path + "/ls.txt";
-cout << "-case2.1-" << endl;
 			system(lsAux.c_str());
-cout << "-case2.2-" << endl;
 			break;
 		case 3:
-cout << "-case3-" << endl;
 			lsAux = "ls -l > " + path + "/ls.txt";
-cout << "-case3.1-" << endl;
 			system(lsAux.c_str());
-cout << "-case3.2-" << endl;
 			break;
 		case 4:
-cout << "-case4-" << endl;
 			lsAux = "ls -la > " + path + "/ls.txt";
-cout << "-case4.1-" << endl;
 			system(lsAux.c_str());
-cout << "-case4.2-" << endl;
 			break;
 		case -1:
 			puts("Parâmetro de ls inválido.");
@@ -509,7 +490,7 @@ cout << "+2+" << endl;
   }
 cout << "+3+" << endl;
 
-  if(sendData(lsData) == 0){
+  if(sendData(lsData, 14) == 0){
 cout << "+return 0+" << endl;
     return 0;
   }else{
@@ -569,7 +550,7 @@ int Message::receiveGET(unsigned char* fileName){
                 return -1;
               } else if(answer.getType() == 8){ // Recebemos um OK, enviar dados
                 success = 1;
-                if(sendData(dados)){
+                if(sendData(dados, 13)){
                   cout << "Erro ao enviar dados, abortando (messages.cpp::receiveGET)" << endl;
                   return -1;
                 } else {
@@ -651,7 +632,7 @@ int Message::receivePUT(unsigned char* fileName, char* currentPath){
 
 string Message::receiveData(int type){
   int numberOfMessages, messagesCounter = 0, seqCounter = 0;
-  int i, garbage, error, rv, success = 0, size = 0;
+  int i, garbage, error, rv, success, size = 0;
   char *receiptMessage = (char*)malloc(sizeof(char*)*68);
   struct pollfd ufds[1];
   SubMessage nack, ack, answer;
@@ -660,8 +641,7 @@ string Message::receiveData(int type){
 
   ufds[0].fd = soquete;
   ufds[0].events = POLLIN;
-
-
+  success = 0;
   while(!success){
     rv = poll(ufds, 1, 500);
     if(rv){
@@ -674,7 +654,7 @@ string Message::receiveData(int type){
         // Lê começo da mensagem e vê se tem o delimitador de início
         if(answer.getStartMessage() == 0x7E){ // 0x7E = 01111110
           if(answer.checkParity()){
-            nack.setData((unsigned char*)answer.getSeq(),0,0); // Manda um nack
+            nack.setData((unsigned char*)"0",0,0); // Manda um nack
             send(soquete,nack.objToString(),68, 0);
           }else{
             if(answer.getType() == type){
@@ -683,21 +663,20 @@ string Message::receiveData(int type){
                 if(answer.getSeq() == 63) seqCounter++;
                 size++;
               }
-              ack.setData((unsigned char*)answer.getSeq(),1,0);
+              ack.setData((unsigned char*)"0",1,0);
               send(soquete, ack.objToString(), 68, 0); // Manda um ACK
             }else if(answer.getType() == 15){
               success = 1;
-              ack.setData((unsigned char*)answer.getSeq(),1,0);
+              ack.setData((unsigned char*)"0",1,0);
               send(soquete, ack.objToString(), 68, 0); // Manda um ACK
             }else{
-              nack.setData((unsigned char*)answer.getSeq(),0,0); // Manda um nack
+              nack.setData((unsigned char*)"0",0,0); // Manda um nack
               send(soquete,nack.objToString(),68, 0);
             }
           }
         }
       }
     }else{
-      cout << "Tempo limite de resposta excedido :c\n" << endl;
       cout << "TIMEOUT ATINGIDO (messages.cpp::receiveData)" << endl;
     }
   }
diff --git a/src/submessages.cpp b/src/submessages.cpp
index 10da429..841cf88 100644
--- a/src/submessages.cpp
+++ b/src/submessages.cpp
@@ -53,7 +53,7 @@ void SubMessage::setSizSeqTyp(int size, int seq, int type){
 void SubMessage::setData(unsigned char* dataBody, int type, int seq){
   int i, tamanho = 1;
 
-  while(dataBody[tamanho-1] != '\0' && tamanho<64) tamanho++;
+  while(dataBody[tamanho-1] != '\0' && tamanho<63) tamanho++;
 
   data = (unsigned char*)realloc(data, sizeof(unsigned char)*tamanho);
 
@@ -158,7 +158,6 @@ int SubMessage::checkParity(){
     // Atribui os bits para parity (variável de paridade do objeto)
     parityTest = (parityTest << 1) | bitsParity[j];
   }
-
   if (parityTest == parity){
     return 0;
   }else{
-- 
GitLab