IvoSilva

llopen () a 100%

Nov 1st, 2014
186
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 28.83 KB | None | 0 0
  1. #include <fcntl.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <unistd.h>
  5. #include <string.h>
  6. #include <signal.h>
  7. #include <termios.h>
  8. #include <sys/stat.h>
  9. #include <sys/types.h>
  10. #include <sys/ioctl.h>
  11.  
  12. // Variáveis de configuração
  13.  
  14. #define BAUDRATE B38400
  15. #define MODEMDEVICE "/dev/ttyS"
  16. #define RECEIVER 0
  17. #define TRANSMITTER 1
  18. #define alarm_timeout 3
  19. #define numTransmissions 3
  20. #define filename "pinguim.gif"
  21. #define packetsize 100
  22.  
  23. // Variáveis de mensagem
  24.  
  25. #define F 0x7e
  26. #define A 0x03
  27. #define S 0x03
  28. #define U 0x07
  29.  
  30. #define I0 0x00
  31. #define I1 0x40
  32.  
  33. #define RR0 0x05
  34. #define RR1 0x85
  35.  
  36. #define REJ0 0x01
  37. #define REJ1 0x81
  38.  
  39. #define DISC 0x0B
  40.  
  41.  
  42. // Variáveis globais
  43.  
  44. int time_flag, counter = 0;
  45. struct termios oldtio;
  46.  
  47. typedef struct
  48. {
  49.     long int filesize, position;
  50.     unsigned char *filepath;
  51.     unsigned char *filedata;
  52. } imageFile;
  53.  
  54. imageFile ficheiro_de_imagem;
  55.  
  56. typedef struct
  57. {
  58.     int dataSeq, packetSize;
  59.     unsigned char tramaSeq;
  60. } dataConnection;
  61.  
  62. dataConnection dataHandler;
  63.  
  64. // Funções
  65.  
  66. void atende()
  67. {
  68.     time_flag = 1;
  69.     counter++;
  70. }
  71.  
  72. void printBar (unsigned char symbol)
  73. {
  74.     int i;
  75.     struct winsize w;
  76.  
  77.     ioctl(STDOUT_FILENO, TIOCGWINSZ, &w);
  78.  
  79.     for (i = 0; i < w.ws_col; i++)
  80.         printf ("%c", symbol);
  81. }
  82.  
  83. void printm (unsigned char *string, int adjust)
  84. {
  85.     int i;
  86.     struct winsize w;
  87.  
  88.     ioctl(STDOUT_FILENO, TIOCGWINSZ, &w);
  89.  
  90.     for (i = 0; i < (w.ws_col / 2) - (strlen(string) / 2) + adjust ; i++)
  91.         printf (" ");
  92.    
  93.     printf ("%s", string);
  94. }
  95.  
  96. unsigned char * performStuffing(unsigned char *buffer, int length, int *destLength)
  97. {
  98.     unsigned char *stuffed = malloc(length * 2 * sizeof(unsigned char));  //  Worse case scenario!
  99.  
  100.     int i = 0, j = 0;
  101.  
  102.     for (; i < length; i++) {
  103.  
  104.         if (buffer[i] == 0x7e) {
  105.  
  106.             stuffed[j++] = 0x7d;
  107.             stuffed[j++] = 0x5e;
  108.  
  109.         } else if (buffer[i] == 0x7d) {
  110.  
  111.             stuffed[j++] = 0x7d;
  112.             stuffed[j++] = 0x5d;
  113.  
  114.         } else
  115.             stuffed[j++] = buffer[i];
  116.  
  117.     }
  118.  
  119.     (* destLength) = j;
  120.  
  121.     return stuffed;
  122. }
  123.  
  124. unsigned char * performDestuffing(unsigned char *buffer, int length, int *destLength)
  125. {
  126.     unsigned char *destuffed = malloc(length * sizeof(unsigned char));  //  Worse case scenario!
  127.    
  128.     int i = 0, j = 0;
  129.    
  130.     for (; i < length; i++, j++)
  131.     {
  132.        
  133.         if (buffer[i] == 0x7d)
  134.         {
  135.            
  136.             if (buffer[i + 1] == 0x5e)
  137.             {
  138.                
  139.                 destuffed[j] = 0x7e;
  140.                
  141.                 i++;
  142.                
  143.             }
  144.             else if (buffer[i + 1] == 0x5d) {
  145.                
  146.                 destuffed[j] = 0x7d;
  147.                
  148.                 i++;
  149.                
  150.             } else
  151.                 destuffed[j] = 0x7d;
  152.                
  153.         } else
  154.             destuffed[j] = buffer[i];
  155.        
  156.     }
  157.    
  158.     (* destLength) = j;
  159.    
  160.     return destuffed;
  161. }
  162.  
  163. unsigned char *getDataSeq (unsigned char *total_buffer, int total_size, int seq, int *new_size)
  164. {
  165.     int i, j, start;
  166.     unsigned char *buffer;
  167.     printf("size: %d\n", ficheiro_de_imagem.filesize);
  168.  
  169.     if ((seq + 1) * packetsize > ficheiro_de_imagem.filesize)
  170.         *new_size = ficheiro_de_imagem.filesize - seq * packetsize;
  171.     else
  172.         *new_size = (seq + 1) * packetsize;
  173.  
  174.     buffer = (unsigned char *) malloc (sizeof(unsigned char) * packetsize);
  175.  
  176.     if (seq == 0)
  177.         start = 0;
  178.     else
  179.         start = seq * packetsize - 1;
  180.  
  181.     for (j = 0, i = start; i < *new_size; i++, j++)
  182.         buffer[j] = total_buffer[i];
  183.  
  184.     for(j=0 ; j<*new_size; j++)
  185.         printf("buffer[%d]: %x\n", j, buffer[j]);
  186.  
  187.  
  188.     return buffer;
  189. }
  190.  
  191. void create_information (unsigned char *buffer, int *buffer_size, unsigned char c, unsigned char *data, int data_size, unsigned char BCC2)
  192. {
  193.     int i;
  194.  
  195.     *buffer_size = data_size + 6;
  196.  
  197.     /*printm ("Data:", 0);
  198.     printf ("\n");
  199.     for (i = 0; i < data_size; i++)
  200.         printf ("%x |", data[i]);
  201.     printf ("\n");*/
  202.  
  203.     buffer[0] = F;
  204.     buffer[1] = A;
  205.     buffer[2] = c;
  206.     buffer[3] = buffer[1] ^ buffer[2];
  207.  
  208.     for (i = 0; i < data_size; i++)
  209.         buffer[i + 4] = data[i];
  210.  
  211.     if (BCC2 != NULL)
  212.     {
  213.         buffer[data_size + 4] = BCC2;
  214.         buffer[data_size + 5] = F;
  215.     }
  216.     else
  217.     {
  218.         buffer[data_size + 4] = F;
  219.         *buffer_size--;
  220.     }
  221.  
  222.     buffer = performStuffing(buffer, buffer_size, &buffer_size);
  223.  
  224.     /*printm ("Information:", 0);
  225.     printf ("\n");
  226.     for (i = 0; i < *buffer_size; i++)
  227.         printf ("%x |", buffer[i]);
  228.     printf ("\n");*/
  229. }
  230.  
  231. unsigned char create_control_packet (unsigned char *buffer, int *buffer_size , int c, unsigned char *file_name, int filesize)
  232. {
  233.     int i;
  234.     unsigned char BCC2;
  235.  
  236.     *buffer_size = strlen(file_name) + 6;
  237.  
  238.     buffer[0] = (unsigned char) c;
  239.  
  240.     buffer[1] = (unsigned char) 0;
  241.     buffer[2] = (unsigned char) sizeof ((unsigned char) filesize);
  242.     printf("Filesize:  %x\n", (unsigned char ) filesize);
  243.     buffer[3] = (unsigned char) filesize;
  244.  
  245.     buffer[4] = (unsigned char) 1;
  246.     buffer[5] = (unsigned char) (strlen(file_name));
  247.     for (i = 0; i < strlen(file_name); i++)
  248.         buffer[i + 6] = (unsigned char) file_name[i];
  249.  
  250.     for( i=0; i<  strlen(file_name); i++)
  251.         printf("filename[%d]: %x . %c \n", i , file_name[i],  file_name[i]);
  252.     printf("\n");
  253.     for( i=0; i<  strlen(file_name); i++)
  254.         printf("buffer[%d]: %x . %c \n", i , buffer[i+6],  buffer[i+6]);
  255.  
  256.     BCC2 = buffer[0];
  257.     for (i = 1; i < strlen(file_name) + 6; i++)
  258.         BCC2 ^= buffer[i];
  259.  
  260.     printf("BCC: %x\n", BCC2);
  261.     return BCC2;
  262. }
  263.  
  264. // BCC2 = create_data_packet (Nova mensagem, tamanho, N, data, tamanho da data)
  265. unsigned char create_data_packet (unsigned char *buffer, int *buffer_size, int n, unsigned char *file_data, int datasize)
  266. {
  267.     printf("Entrar\n");
  268.     unsigned char BCC2;
  269.     int i, L2 = (int) (packetsize * 8 / 256), L1 = (int) (packetsize * 8) - L2 * 256;
  270.  
  271.     *buffer_size = datasize + 3;
  272.  
  273.     buffer[0] = (unsigned char) n; 
  274.  
  275.     buffer[1] = (unsigned char) L2;
  276.     buffer[2]= (unsigned char) L1;
  277.     for(i = 0; i< datasize; i++)
  278.         printf("datasize[%d]: %x\n",i ,file_data[i] );
  279.  
  280.     for(i = 0; i < datasize; i++)
  281.         buffer[3+i] = file_data[i];
  282.  
  283.     BCC2 = 0x01;
  284.     for (i = 0; i < *buffer_size; i++)
  285.         BCC2 ^= buffer[i];
  286.  
  287.     for(i=0; i< *buffer_size; i++)
  288.         printf("buffer[%d]: %x\n",i, buffer[i] );
  289.  
  290.     return BCC2;
  291. }
  292.  
  293. int menu ()
  294. {
  295.     int op = 0;
  296.  
  297.     system ("clear");
  298.     printBar ('*');
  299.     printm ("Programa iniciado!", 0);
  300.     printf ("\n\n\n");
  301.     printm ("Menu (escolher função do programa):", 0);
  302.     printf ("\n");
  303.     printm ("1. Emissor (llwrite).", 0);
  304.     printf ("\n");
  305.     printm ("2. Receptor (llread).", 0);
  306.     printf ("\n");
  307.     printm ("3. Sair.", 0);
  308.     printf ("\n\n");
  309.     printm ("Opcao: ", 0);
  310.     scanf ("%d", &op);
  311.  
  312.     return op;
  313. }
  314.  
  315. void sair ()
  316. {
  317.     system ("clear");
  318.  
  319.     printBar ('*');
  320.     printm ("Programa a encerrar...", 0);
  321.     printf ("\n");
  322.     printBar ('*');
  323.     sleep (1);
  324. }
  325.  
  326. unsigned char read_control_packet (int fd, unsigned char BCC2, unsigned char *auxFilepath, int *auxFilepathsize, int *auxFilesize)
  327. {  
  328.     unsigned char bit_received, auxFile[30], received_message[255];
  329.     int state = 0, i, res, count = 0;
  330.  
  331.     while (state < 6)
  332.     {
  333.         res = read (fd, &bit_received, 1);
  334.         if(res == -1)
  335.             return NULL;
  336.  
  337.         switch (state)
  338.         {
  339.                 case 0:
  340.                     if (bit_received == 0)
  341.                     {
  342.                         received_message[count] = bit_received;
  343.                         state++;
  344.                         count++;
  345.                     }
  346.                     else
  347.                         return NULL;
  348.                     break;
  349.  
  350.                 case 1:
  351.                     received_message[count] = bit_received;
  352.                     state++;
  353.                     count++;
  354.                     break;
  355.  
  356.                 case 2:
  357.                     auxFile[0] = bit_received;
  358.                     received_message[count++] = bit_received;
  359.                     for(i = 1; i < received_message[state--]; i++, count++)
  360.                     {
  361.                         res = read (fd, &bit_received, 1);
  362.                         if(res == -1)
  363.                             return NULL;
  364.  
  365.                         auxFile[i] = bit_received;
  366.                         received_message[count] = bit_received;
  367.                     }
  368.  
  369.                     *auxFilesize = (int) auxFile;
  370.                     //ficheiro_de_imagem.filesize = (int) auxFile; // Isto tem de ser no llread() caso a mensagem esteja correcta.
  371.  
  372.                     state++;
  373.                     count++;
  374.                     break;
  375.  
  376.                 case 3:
  377.                     if (bit_received == 1)
  378.                     {
  379.                         received_message[count] = bit_received;
  380.                         state++;
  381.                         count++;
  382.                     }
  383.                     else
  384.                         return NULL;
  385.                     break;
  386.                    
  387.                 case 4:
  388.                     received_message[count] = bit_received;
  389.                     state++;
  390.                     count++;
  391.                     break;
  392.  
  393.                 case 5:
  394.                     auxFile[0] = bit_received;
  395.                     received_message[count++] = bit_received;
  396.                     for(i = 1; i < received_message[state--]; i++, count++)
  397.                     {
  398.                         res = read (fd, &bit_received, 1);
  399.                         if(res == -1)
  400.                             return NULL;
  401.  
  402.                         auxFile[i] = bit_received;
  403.                         received_message[count] = bit_received;
  404.                     }
  405.  
  406.                     // Isto tem de ser no llread() caso a mensagem esteja correcta.
  407.                     //ficheiro_de_imagem.filepath = (long int) malloc (received_message[state--]);
  408.                     *auxFilepathsize = received_message[state--];
  409.                     /*for (i = 0; i < *auxFilepathsize; i++)
  410.                         ficheiro_de_imagem.filepath[i] = auxFile[i];*/
  411.  
  412.                     state++;
  413.                     count++;
  414.                     break;
  415.  
  416.                 default:
  417.                     break;
  418.         }
  419.     }
  420.  
  421.     for (i = 0; i < count; i++)
  422.         BCC2 ^= received_message[i];
  423.  
  424.     return BCC2;
  425. }
  426.  
  427. unsigned char read_data_packet (int fd, unsigned char BCC2, unsigned char *data)
  428. {
  429.     int i, count = 0, state = 0, res;
  430.     unsigned char received_message[255], bit_received, auxFile[255];
  431.  
  432.     while (state < 4)
  433.     {
  434.         res = read (fd, &bit_received, 1);
  435.         if(res == -1)
  436.             return NULL;
  437.  
  438.         switch (state)
  439.         {
  440.             case 0:
  441.                 received_message[count] = bit_received;
  442.                 dataHandler.dataSeq = (int) bit_received;
  443.                 state++;
  444.                 count++;
  445.                 break;
  446.            
  447.             case 1:
  448.                 received_message[count] = bit_received;
  449.                 state++;
  450.                 count++;
  451.                 break;
  452.  
  453.             case 2:
  454.                 received_message[count] = bit_received;
  455.                 dataHandler.packetSize = (int) (256 * (int) received_message[count - 1] + (int) received_message[count]);
  456.                 state++;
  457.                 count++;
  458.                 break;
  459.  
  460.             case 3:
  461.                 auxFile[0] = bit_received;
  462.                 received_message[count++] = bit_received;
  463.                 for(i = 1; i < dataHandler.packetSize; i++, count++)
  464.                 {
  465.                     res = read (fd, &bit_received, 1);
  466.                     if(res == -1)
  467.                         return NULL;
  468.  
  469.                     auxFile[i] = bit_received;
  470.                     received_message[count] = bit_received;
  471.                 }
  472.  
  473.                 /*ficheiro_de_imagem->filedata = (unsigned char *) malloc (sizeof(unsigned char) * dataHandler->packetSize);
  474.                 for (i = 0; i < received_message[state--]; i++)
  475.                     ficheiro_de_imagem->filedata[i] = auxFile[i];*/
  476.  
  477.                 state++;
  478.                 count++;
  479.                 break;
  480.         }
  481.     }
  482.     for (i = 0; i < count; i++)
  483.         BCC2 ^= received_message[i];
  484.  
  485.     data = (unsigned char *) malloc (sizeof(unsigned char) * dataHandler.packetSize);
  486.     for(i = 0; i < dataHandler.packetSize; i++)
  487.         data[i] = auxFile[i];
  488.  
  489.     return BCC2;
  490. }
  491.  
  492. void main (int argc, unsigned char** argv)
  493. {
  494.     int op = 0, fd, filesize;
  495.     unsigned char *buffer = NULL;
  496.  
  497.     while (op != 3)
  498.     {
  499.         op = menu();
  500.         switch (op)
  501.         {
  502.             case 1:
  503.                 fd = llopen (0, TRANSMITTER);
  504.                 if (fd != -1)
  505.                 {
  506.                     //filesize = myWrite (buffer);
  507.                     //llwrite(fd, buffer, filesize);
  508.                 }
  509.                 break;
  510.             case 2:
  511.                 fd = llopen (0, RECEIVER);
  512.                 llread(fd, buffer);
  513.                 //saveToFile(buffer);
  514.                 break;
  515.             case 3:
  516.                 llclose (fd);
  517.                 sair();
  518.                 break;
  519.             default:
  520.                 break;
  521.         }
  522.     }  
  523. }
  524.  
  525. int llopen (int porta, int flag)
  526. {
  527.     /* -----    Variáveis  ----- */
  528.  
  529.     unsigned char send_message[5], receive_message[5], bit_received;
  530.     unsigned char buffer[1], gate[10] = MODEMDEVICE;
  531.     int vtime, fd, res[2], return_value, i;
  532.     unsigned int msg_sent = 0, state;
  533.     struct termios newtio;
  534.  
  535.     /* -----    Código     ----- */
  536.  
  537.     sprintf (buffer, "%d", porta);
  538.     strcat (gate, buffer);
  539.  
  540.     system ("clear");
  541.  
  542.     printBar ('*');
  543.     printm ("Função \"llopen(", -7);
  544.     printf ("%d, %d)\" iniciada!\n", porta, flag);
  545.  
  546.     if (flag == TRANSMITTER)
  547.     {
  548.         send_message[0] = F;
  549.         send_message[1] = A;
  550.         send_message[2] = S;
  551.         send_message[3] = send_message[1] ^ send_message[2];
  552.         send_message[4] = F;
  553.  
  554.         vtime = 3;
  555.  
  556.         fd = open(gate, O_RDWR | O_NOCTTY | O_NONBLOCK);
  557.     }
  558.     else if (flag == RECEIVER)
  559.     {
  560.         send_message[0] = F;
  561.         send_message[1] = A;
  562.         send_message[2] = U;
  563.         send_message[3] = send_message[1] ^ send_message[2];
  564.         send_message[4] = F;
  565.  
  566.         vtime = 0;
  567.  
  568.         fd = open(gate, O_RDWR | O_NOCTTY);
  569.     }
  570.     else
  571.         return -1;
  572.  
  573.     if (fd < 0)
  574.             return -1;
  575.  
  576.     // Teste ao apontador para o Pipe.
  577.  
  578.     if (tcgetattr (fd, &oldtio) == -1)
  579.     {
  580.         perror ("tcgetattr");
  581.         return -1;
  582.     }
  583.  
  584.     // Configuração da ligação.
  585.  
  586.     bzero(&newtio, sizeof(newtio));
  587.     newtio.c_cflag = BAUDRATE | CS8 | CLOCAL | CREAD;
  588.     newtio.c_iflag = IGNPAR;
  589.     newtio.c_oflag = 0;
  590.  
  591.     /* set input mode (non-canonical, no echo,...) */
  592.     newtio.c_lflag = 0;
  593.  
  594.     newtio.c_cc[VTIME]    = vtime;   /* inter-unsigned character timer unused */
  595.     newtio.c_cc[VMIN]     = 1;   /* blocking read until 1 unsigned chars received */
  596.  
  597.     /* VTIME e VMIN devem ser alterados de forma a proteger com um temporizador a leitura do(s) próximo(s) caracter(es) */
  598.  
  599.     tcflush(fd, TCIOFLUSH);
  600.     if (tcsetattr (fd, TCSANOW, &newtio) == -1)
  601.     {
  602.         perror ("tcsetattr");
  603.         return -1;
  604.     }
  605.  
  606.     (void) signal(SIGALRM, atende);
  607.  
  608.     if (flag == TRANSMITTER)
  609.     {
  610.         for (time_flag = 1, state = 0, counter = 0; counter < numTransmissions && msg_sent != 1;)
  611.         {
  612.            
  613.             if (time_flag)
  614.             {
  615.                
  616.                
  617.                 //printf("write worked");
  618.            
  619.                 printm ("A enviar SETUP: tentativa #", -1);
  620.                 printf ("%d\n", counter + 1);
  621.  
  622.                 alarm (alarm_timeout);
  623.                 time_flag = 0;
  624.                 /*res[0] = write (fd, send_message, 5);
  625.                 printf("write worked");*/
  626.                
  627.             }
  628.             else
  629.             {              
  630.                 res[0] = write (fd, send_message, 5);
  631.                 while (state < 5)
  632.                 {
  633.                     res[1] = read (fd, &bit_received, 1);
  634.  
  635.                     if(res[1] == -1)
  636.                         break;
  637.                     else
  638.                         printf ("Leu %d bytes.\n", res[1]);
  639.  
  640.                     switch (state)
  641.                     {
  642.                         case 0:
  643.                           if (bit_received == F)
  644.                           {
  645.                             receive_message[state]=bit_received;
  646.                             state++;
  647.                           }
  648.                           break;
  649.  
  650.                         case 1:
  651.                           if (bit_received == A)
  652.                           {
  653.                             receive_message[state]=bit_received;
  654.                             state++;
  655.                           }
  656.                           else if (bit_received != A && bit_received !=F)
  657.                             state--;
  658.                           break;
  659.                  
  660.                         case 2:
  661.                           if (bit_received == U)
  662.                           {
  663.                             receive_message[state]=bit_received;
  664.                             state++;
  665.                           }
  666.                           else if (bit_received == F)
  667.                             state--;
  668.                           else
  669.                             state = 0;
  670.                           break;
  671.  
  672.                         case 3:
  673.                           if (bit_received == (A^U))
  674.                           {
  675.                             receive_message[state]=bit_received;
  676.                             state++;
  677.                           }
  678.                           else
  679.                             state = 0;
  680.                           break;
  681.  
  682.                         case 4:
  683.                           if (bit_received == F)
  684.                           {
  685.                             receive_message[state]=bit_received;
  686.                             state++;
  687.                             msg_sent = 1;
  688.                             time_flag=0;
  689.                             printf("ENVIADO");
  690.                           }
  691.                           else
  692.                             state = 0;
  693.                           break;
  694.  
  695.                         default:
  696.                             break;
  697.                     }
  698.                 }
  699.             }
  700.         }
  701.  
  702.         if (msg_sent == 0)
  703.         {
  704.             printm ("Mensagem não enviada (não recebeu UA).", +3);
  705.             printf ("\n");
  706.             return_value = -1;
  707.         }
  708.         else
  709.         {
  710.             printm ("Mensagem enviada (recebeu UA).", 0);
  711.             printf ("\n");
  712.             printm ("Mensagem UA:", 0);
  713.             printf ("\n");
  714.             printm (" ", -5);
  715.             for(i = 0; i < state; i++)
  716.                 printf("%x", receive_message[i]);
  717.             printf ("\n");
  718.             return_value = fd;
  719.         }
  720.     }
  721.     else if (flag == RECEIVER)
  722.     {
  723.         state = 0;
  724.         while (state < 5)
  725.         {
  726.             res[1] = read (fd, &bit_received, 1);
  727.  
  728.             switch (state)
  729.             {
  730.                     case 0:
  731.                             if (bit_received == F)
  732.                             {
  733.                                     receive_message[state] = bit_received;
  734.                                     state++;
  735.                             }
  736.                             break;
  737.                     case 1:
  738.                             if (bit_received == A)
  739.                             {
  740.                                     receive_message[state] = bit_received;
  741.                                     state++;
  742.                             }
  743.                             else if (bit_received != F && bit_received != A)
  744.                                     state--;
  745.                             break;
  746.                     case 2:
  747.                             if (bit_received == S)
  748.                             {
  749.                                     receive_message[state] = bit_received;
  750.                                     state++;
  751.                             }
  752.                             else if (bit_received == F)
  753.                                     state--;
  754.                             else
  755.                                     state = 0;
  756.                             break;
  757.                     case 3:
  758.                             if (bit_received == (A ^ S))
  759.                             {
  760.                                     receive_message[state] = bit_received;
  761.                                     state++;
  762.                             }
  763.                             else if (bit_received == F)
  764.                                     state = 1;
  765.                             else
  766.                                     state = 0;
  767.                             break;
  768.                     case 4:
  769.                             if (bit_received == F)
  770.                             {
  771.                                     receive_message[state] = bit_received;
  772.                                     state++;
  773.                                     msg_sent = 1;
  774.                             }
  775.                             else
  776.                                     state = 0;
  777.                             break;
  778.                     default:
  779.                         break;
  780.             }
  781.         }
  782.        
  783.         if (msg_sent == 0)
  784.         {
  785.             printm ("Mensagem não enviada (não recebeu SETUP).", +3);
  786.             printf ("\n");
  787.             return_value = -1;
  788.         }
  789.         else
  790.         {
  791.             printm ("Mensagem enviada (recebeu SETUP).", 0);
  792.             printf ("\n");
  793.             printm ("Mensagem SETUP:", 0);
  794.             printf ("\n");
  795.             printm (" ", -5);
  796.             for(i = 0; i < state; i++)
  797.                 printf("%x", receive_message[i]);
  798.             printf ("\n");
  799.  
  800.             res[0] = write(fd, send_message, 5);
  801.             /*if (!res[0])
  802.                 printf("Mensagem (UA) não enviada.\n");
  803.             else
  804.                 printf("%d bytes (UA) enviados.\n", res[0]);*/
  805.  
  806.             return_value = fd;
  807.         }
  808.     }
  809.  
  810.     printf ("\n\n");
  811.     printm ("Função \"llopen(", -7);
  812.     printf ("%d, %d)\" a feunsigned char!\n", porta, flag);
  813.     printm ("Clique numa tecla para voltar ao menu.", 0);
  814.     printf ("\n");
  815.     printBar ('*');
  816.     getchar();
  817.     getchar();
  818.  
  819.     alarm (0);
  820.  
  821.     return return_value;
  822. }
  823.  
  824. int llwrite (int fd, unsigned char * buffer, int length)
  825. {
  826.     unsigned char *cntrl_message;
  827.     unsigned char *new_message, *data_message, *message, *message_received, bit_received, auxCntrl;
  828.     unsigned char BCC2;
  829.     int file_found = 1, i, j, cntrl_size, message_size, msg_error = 0, state, res, buffer_size, denied = 0, new_message_size;
  830.     FILE *pImg;
  831.  
  832.     while (file_found)
  833.     {
  834.         system ("clear");
  835.         printBar ('*');
  836.         printm ("Nome do ficheiro a usar: pinguim.gif", 0);
  837.         printf ("\n");
  838.         printm ("(certifique-se que o ficheiro está na pasta do programa)", 0);
  839.         printf ("\n\n\n");
  840.  
  841.         pImg = fopen (filename, "r");
  842.         if (pImg == NULL)
  843.         {
  844.             printm ("Ficheiro não encontrado.", 0);
  845.             printf ("\n");
  846.             printm ("(certifique-se que o ficheiro está na pasta do programa)", 0);
  847.             printf ("\n");
  848.             printm ("Clique <Enter> para voltar a tentar.", 0);
  849.             getchar ();
  850.         }
  851.         else
  852.         {
  853.             file_found = 0;
  854.             printm ("Ficheiro encontrado.", 0);
  855.             printf ("\n");
  856.             printm ("Clique <Enter> para continuar.", 0);
  857.             getchar ();
  858.         }
  859.     }
  860.  
  861.     // Leitura do conteúdo da imagem para variável "buffer"
  862.     fseek (pImg, 0, SEEK_END);
  863.     length = ftell (pImg);
  864.     fseek (pImg, 0, SEEK_SET);
  865.  
  866.     buffer = (unsigned char *) malloc (sizeof(unsigned char) * length);
  867.  
  868.     for (i = 0; i < length; i++)
  869.         buffer[i] = getc(pImg);
  870.  
  871.     fclose (pImg);
  872.     // Leitura do conteúdo da imagem para variável "buffer"
  873.  
  874.     // Primeira mensagem a enviar: Pacote de controlo (start)
  875.     cntrl_message = (unsigned char *) malloc (sizeof(unsigned char) * (strlen(filename) + 6));
  876.     BCC2 = create_control_packet (cntrl_message, &cntrl_size, 2, "pinguim", length);
  877.    
  878.     message = (unsigned char *) malloc (sizeof(unsigned char) * (cntrl_size + 6));
  879.     create_information (message, &message_size, I0, cntrl_message, cntrl_size, BCC2);
  880.  
  881.     dataHandler.dataSeq = 0;
  882.     // Primeira mensagem a enviar: Pacote de controlo (start)
  883.  
  884.     // Leitura de verificação
  885.     for (time_flag = 1, state = 0, counter = 0; counter < numTransmissions;)
  886.     {
  887.         if (time_flag)
  888.         {
  889.  
  890.             res = write (fd, message, message_size); // envio do pacote de controlo
  891.             alarm (alarm_timeout);
  892.             time_flag = 0;
  893.             if (res != -1)
  894.                 denied = 0;
  895.            
  896.             while (state < 6 || denied != 1)
  897.             {
  898.                 res = read (fd, &bit_received, 1);
  899.                 if(res == -1)
  900.                     break;
  901.  
  902.                 switch (state)
  903.                 {
  904.                     case 0:
  905.                         if (bit_received == F)
  906.                             state++;
  907.                         else
  908.                             denied = 1;
  909.  
  910.                         break;
  911.  
  912.                     case 1:
  913.                         if (bit_received == A)
  914.                             state++;
  915.                         else
  916.                             denied = 1;
  917.  
  918.                         break;
  919.  
  920.                     case 2:
  921.                         auxCntrl = bit_received;
  922.                         state++;
  923.                         break;
  924.  
  925.                     case 3:
  926.                         if (bit_received == auxCntrl ^ A)
  927.                             state++;
  928.                         else
  929.                             denied = 1;
  930.  
  931.                         break;
  932.  
  933.                     case 4:
  934.                         if (bit_received == F)
  935.                             state++;
  936.                         else
  937.                             denied = 1;
  938.  
  939.                         break;
  940.  
  941.                     case 5://verificar rej, rr, disc
  942.                         counter = 0;
  943.                         if (auxCntrl == RR1 && dataHandler.tramaSeq == I0)
  944.                         {
  945.                             printf("RECEBEU BEM\n");
  946.                             dataHandler.tramaSeq = I1;
  947.                             dataHandler.dataSeq++;
  948.                             printf("%d\n",dataHandler.dataSeq );
  949.  
  950.                             data_message = getDataSeq (buffer, i, dataHandler.dataSeq, &new_message_size);
  951.  
  952.                             BCC2 = create_data_packet (new_message, &message_size, dataHandler.dataSeq, data_message, new_message_size);
  953.  
  954.                             create_information (message, &message_size, dataHandler.tramaSeq, new_message, new_message_size, BCC2);
  955.                            
  956.                         }
  957.                         else if(auxCntrl == RR1 && dataHandler.tramaSeq == I1)
  958.                         {
  959.                             denied = 1;
  960.                             break;
  961.                         }
  962.                         else if(auxCntrl == RR0 && dataHandler.tramaSeq == I0)
  963.                         {
  964.                             denied = 1;
  965.                             break;
  966.                         }
  967.                         else if(auxCntrl == RR0 && dataHandler.tramaSeq == I1)
  968.                         {
  969.                             dataHandler.tramaSeq = I0;
  970.                             dataHandler.dataSeq++;
  971.                            
  972.                             data_message = getDataSeq (buffer, i, dataHandler.dataSeq, &new_message_size);
  973.  
  974.                             BCC2 = create_data_packet (new_message, &message_size, dataHandler.dataSeq, data_message, new_message_size);
  975.  
  976.                             create_information (message, &message_size, dataHandler.tramaSeq, new_message, new_message_size, BCC2);
  977.                         }
  978.                         else if(auxCntrl == REJ0 && dataHandler.tramaSeq == I0)
  979.                         {
  980.                             denied = 1;
  981.                             break;
  982.                         }
  983.                         else if(auxCntrl == REJ0 && dataHandler.tramaSeq == I1)
  984.                         {
  985.                             dataHandler.tramaSeq = I0;
  986.                            
  987.                             data_message = getDataSeq (buffer, i, dataHandler.dataSeq - 1, &new_message_size);
  988.  
  989.                             BCC2 = create_data_packet (new_message, &message_size, dataHandler.dataSeq - 1, data_message, new_message_size);
  990.  
  991.                             create_information (message, &message_size, dataHandler.tramaSeq, new_message, new_message_size, BCC2);
  992.                         }
  993.                         else if(auxCntrl == REJ1 && dataHandler.tramaSeq == I0)
  994.                         {
  995.                             dataHandler.tramaSeq = I1;
  996.  
  997.                             data_message = getDataSeq (buffer, i, dataHandler.dataSeq - 1, &new_message_size);
  998.  
  999.                             BCC2 = create_data_packet (new_message, &message_size, dataHandler.dataSeq - 1, data_message, new_message_size);
  1000.  
  1001.                             create_information (message, &message_size, dataHandler.tramaSeq, new_message, new_message_size, BCC2);
  1002.                         }
  1003.                         else if(auxCntrl == REJ1 && dataHandler.tramaSeq == I1)
  1004.                         {
  1005.                             denied = 1;
  1006.                             break;
  1007.                         }
  1008.                         else if(auxCntrl == DISC)
  1009.                         {
  1010.                             // --
  1011.                         }
  1012.                         break;
  1013.  
  1014.                 }
  1015.             }
  1016.         }
  1017.     }  
  1018.     // Leitura de verificação
  1019.  
  1020.     return length;
  1021. }
  1022.  
  1023. /* ----- llread -----
  1024. argumentos
  1025.     fd: identificador da ligação de dados
  1026.     buffer: array de caracteres recebidos
  1027. retorno
  1028.     comprimento do array (número de caracteres lidos)
  1029.     valor negativo em caso de erro
  1030. */
  1031. int llread (int fd, unsigned char *buffer)
  1032. {
  1033.     unsigned char bit_received, *auxFilepath, BCC2, auxCntrl = I0, *msg, auxmsg[255], *data;
  1034.     int msg_wanted = 0, state = 0, res, final = 0, i, j, denied = 1, auxFilesize, auxDatasize, auxFilepathsize, buffer_size;
  1035.  
  1036.     ficheiro_de_imagem.position = 0;
  1037.     dataHandler.tramaSeq = I0;
  1038.     printf("llread OPEN\n");
  1039.  
  1040.     while (auxCntrl != DISC)
  1041.     {
  1042.         i = 0;
  1043.         state = 0;
  1044.  
  1045.         read (fd, &bit_received, 1);
  1046.         if (bit_received == F)
  1047.         {
  1048.             auxmsg[i] = F;
  1049.             while (bit_received != F)
  1050.             {
  1051.                 read (fd, &bit_received, 1);
  1052.                 auxmsg[i++] = bit_received;
  1053.             }
  1054.             denied = 0;
  1055.             msg = performDestuffing (auxmsg, i, &i);
  1056.  
  1057.             for (j = 0; j < i; j++)
  1058.                 printf ("msg[%d]: %x\n", j, msg[j]);
  1059.             printf ("\n\n\n");
  1060.         }
  1061.  
  1062.         while (state < 8 && denied == 0)
  1063.         {
  1064.             switch (state)
  1065.             {
  1066.                     case 0:
  1067.                         if (msg[state] == F)
  1068.                             state++;
  1069.                         else
  1070.                             denied = 1;
  1071.  
  1072.                         break;
  1073.  
  1074.                     case 1:
  1075.                         if (msg[state] == A)
  1076.                             state++;
  1077.                         else
  1078.                             denied = 1;
  1079.  
  1080.                         break;
  1081.  
  1082.                     case 2:
  1083.                         if (msg[state] == dataHandler.tramaSeq)
  1084.                             msg_wanted = 1;
  1085.  
  1086.                         state++;
  1087.  
  1088.                         break;
  1089.  
  1090.                     case 3:
  1091.                         if (msg[state] == A ^ msg[state - 1])
  1092.                             state++;
  1093.                         else
  1094.                             denied = 1;
  1095.  
  1096.                         break;
  1097.  
  1098.                     case 4:
  1099.                         if (msg[state] == 1)
  1100.                         {
  1101.                             BCC2 = read_data_packet (fd, msg[state], data);
  1102.                             state++;
  1103.                         }
  1104.                         else if (msg[state] == 2)
  1105.                         {
  1106.                             BCC2 = read_control_packet (fd, msg[state], auxFilepath, &auxFilepathsize, &auxFilesize);
  1107.                             state++;
  1108.                         }
  1109.                         else if (msg[state] == 3)
  1110.                         {
  1111.                             BCC2 = read_control_packet (fd, msg[state], auxFilepath, &auxFilepathsize, &auxFilesize);
  1112.                             state++;
  1113.                             final = 1;
  1114.                         }
  1115.                         else
  1116.                             denied = 1;
  1117.  
  1118.                         break;
  1119.  
  1120.                     case 5:
  1121.                         if (msg[state] == BCC2)
  1122.                             state++;
  1123.                         else
  1124.                             denied = 1;
  1125.  
  1126.                         break;
  1127.  
  1128.                     case 6:
  1129.                         if (msg[state] == F)
  1130.                             state++;
  1131.                         else
  1132.                             denied = 1;
  1133.  
  1134.                         break;
  1135.  
  1136.                     case 7:
  1137.                         if (msg_wanted && final == 0)
  1138.                         {
  1139.                             if (dataHandler.tramaSeq == I0)
  1140.                             {
  1141.                                 dataHandler.tramaSeq = I1;
  1142.                                 auxCntrl = RR1;
  1143.                             }
  1144.                             else if (dataHandler.tramaSeq == I1)
  1145.                             {
  1146.                                 dataHandler.tramaSeq = I0;
  1147.                                 auxCntrl = RR0;
  1148.                             }
  1149.  
  1150.                             // concatenar data ou guardar filepath e filesize
  1151.  
  1152.                             if (msg[4] == 1) // Concatenar data
  1153.                             {
  1154.                                 for (j = 0; j < auxDatasize; j++, ficheiro_de_imagem.position++)
  1155.                                     ficheiro_de_imagem.filedata[ficheiro_de_imagem.position] = data[j];
  1156.                             }
  1157.                             else if (msg[4] == 2 || msg[4] == 3)
  1158.                             {
  1159.                                 ficheiro_de_imagem.filepath = (unsigned char *) malloc (sizeof(unsigned char) * auxFilepathsize);
  1160.                                 for (j = 0; j < auxFilepathsize; j++)
  1161.                                     ficheiro_de_imagem.filepath[j] = auxFilepath[j];
  1162.  
  1163.                                 ficheiro_de_imagem.filesize = dataHandler.packetSize;
  1164.  
  1165.                                 ficheiro_de_imagem.filedata = (unsigned char *) malloc (sizeof(unsigned char) * ficheiro_de_imagem.filesize);
  1166.                             }
  1167.  
  1168.                         }
  1169.                         else if (msg_wanted && final == 1)
  1170.                         {
  1171.                             auxCntrl = DISC;
  1172.                         }
  1173.                         else if (!msg_wanted)
  1174.                         {
  1175.                             if (dataHandler.tramaSeq == I0)
  1176.                                 auxCntrl = REJ0;
  1177.                             else if (dataHandler.tramaSeq == I1)
  1178.                                 auxCntrl = REJ1;
  1179.                         }
  1180.  
  1181.                         buffer = (unsigned char *) malloc (sizeof(unsigned char) * 5);
  1182.                         create_information (buffer, &buffer_size, auxCntrl, NULL, 0, NULL);
  1183.                         write (fd, buffer, buffer_size);
  1184.  
  1185.                     default:
  1186.                         break;
  1187.  
  1188.             }
  1189.         }
  1190.     }
  1191.     /* --- */
  1192.  
  1193.     // Criação do ficheiro com data
  1194.     for (j = 0; j < ficheiro_de_imagem.filesize; j++)
  1195.         printf ("Byte[%d]: %x\n", j, ficheiro_de_imagem.filedata[j]);
  1196. }
  1197.  
  1198.  
  1199. int llclose (int fd)
  1200. {
  1201.     if (tcgetattr (fd, &oldtio) == -1)
  1202.     {
  1203.         perror ("tcgetattr");
  1204.         return -1;
  1205.     }
  1206.  
  1207.     close (fd);
  1208.  
  1209.     return 0;
  1210. }
Advertisement
Add Comment
Please, Sign In to add comment