]> rtime.felk.cvut.cz Git - mf6xx.git/commitdiff
Added controling of cards inputs from client hooked to socket. Seems ok, but needs...
authorRostislav Lisovy <lisovy@gmail.com>
Mon, 4 Apr 2011 21:36:18 +0000 (23:36 +0200)
committerRostislav Lisovy <lisovy@gmail.com>
Mon, 4 Apr 2011 21:36:18 +0000 (23:36 +0200)
src/qemu/hw/mf624.c

index ea648611569f5b2b5b02a795243ed3f0b7115dbe..01040d801738967aef69584df11a1ea4dfff949d 100755 (executable)
@@ -158,17 +158,21 @@ void socket_write(mf624_state_t *s, const char* reg, unsigned int val)
 
 void* init_socket(void* ptr)
 {
-       // Hmm, I dunno. Socket stuff, I guess;
+#define STRING_BUFF_SIZE       256
+       // Socket stuff
        struct sockaddr_in addr_srv;
        struct sockaddr_in addr_client;
        int port = 55555;
        int yes = 1;
        // For reading from socket
-       char read_buffer[256];
+       char read_buffer[STRING_BUFF_SIZE];
        int received_length = 0;
        // For parsing read instructions
-       int reg;
+       char reg[STRING_BUFF_SIZE+1];
        int val;
+       // ----
+       int status;
+
        
        mf624_state_t* dev = (mf624_state_t*) ptr;
        // If no client connected, we will know about it
@@ -212,10 +216,10 @@ void* init_socket(void* ptr)
        }
 
 
-       memset(read_buffer, '\0', 256);
+       memset(read_buffer, '\0', STRING_BUFF_SIZE);
        while(1) {
                //FIXME what if the socket was closed from client? We get no error message
-               received_length = read(dev->socket_tmp, read_buffer, 255);
+               received_length = read(dev->socket_tmp, read_buffer, STRING_BUFF_SIZE-1);
                if (received_length < 0) {
                        perror("read()");
                        goto exit_close;
@@ -226,10 +230,41 @@ void* init_socket(void* ptr)
                        //FIXME For client it is not possible to reconnect
                        goto exit_close;
                }
-               //printf("rec: [%s]\n", read_buffer);
-               //FIXME possible buffer overflow!
-               sscanf(read_buffer, "%u=%u", &reg, &val);
-               printf("reg = %d; val = %d\n", reg, val);
+
+               // REG has "same size +1" as READ_BUFFER to avoid buffer overflow
+               status = sscanf(read_buffer, "%[A-Z]=%u", reg, &val);
+               if (status == 2) {
+                       if(!strcmp(reg, "DIN")) {
+                               dev->BAR2.DIN = val;
+                       }
+                       else if(!strcmp(reg, "ADDATA")) {
+                               dev->real_world_AD[0] = val;
+                       }
+                       else if(!strcmp(reg, "ADDATA1")) {
+                               dev->real_world_AD[1] = val;
+                       }
+                       else if(!strcmp(reg, "ADDATA2")) {
+                               dev->real_world_AD[2] = val;
+                       }
+                       else if(!strcmp(reg, "ADDATA3")) {
+                               dev->real_world_AD[3] = val;
+                       }
+                       else if(!strcmp(reg, "ADDATA4")) {
+                               dev->real_world_AD[4] = val;
+                       }
+                       else if(!strcmp(reg, "ADDATA5")) {
+                               dev->real_world_AD[5] = val;
+                       }
+                       else if(!strcmp(reg, "ADDATA6")) {
+                               dev->real_world_AD[6] = val;
+                       }
+                       else if(!strcmp(reg, "ADDATA7")) {
+                               dev->real_world_AD[7] = val;
+                       }
+                       else {
+                               printf("reg = %s; val = %d\n", reg, val);
+                       } 
+               }
        }