-#define STRING_BUFF_SIZE 256
- // Socket stuff
- struct sockaddr_in addr_srv;
- int port;
- int yes = 1;
- // For reading from socket
- char read_buffer[STRING_BUFF_SIZE];
- int received_length = 0;
- // For parsing read instructions
- char reg[STRING_BUFF_SIZE+1];
- int val;
- // ----
- int status;
- QemuThread socket_accept_thread;
-
-
- mf624_state_t* dev = (mf624_state_t*) ptr;
- // If no client connected, we will know about it
- dev->socket_tmp = -1;
- port = dev->port;
-
- dev->socket_srv = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
- if (dev->socket_srv == -1) {
- perror("socket()");
- goto exit;
- }
-
- if (setsockopt(dev->socket_srv, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(int)) == -1) {
- perror("setsockopt()");
- goto exit;
- }
-
-
- socklen_t len = sizeof(addr_srv);
- memset(&addr_srv, 0, len);
- addr_srv.sin_family = AF_INET;
- addr_srv.sin_addr.s_addr = htonl(INADDR_ANY);
- addr_srv.sin_port = htons(port);
- if(bind(dev->socket_srv, (struct sockaddr*) &addr_srv, len) == -1) {
- perror("bind()");
- goto exit;
- }
-
- if (listen(dev->socket_srv, 5) == -1) {
- perror("listen()");
- goto exit;
- }
-
-
- qemu_thread_create(&socket_accept_thread, socket_accept, (void*) ptr);
-
-
- memset(read_buffer, '\0', STRING_BUFF_SIZE);
- while(1) {
- if (dev->socket_tmp > 0) {
- received_length = read(dev->socket_tmp, read_buffer, STRING_BUFF_SIZE-1);
- if (received_length < 0) {
- perror("read()");
- goto exit_close;
- }
-
- if (received_length == 0) {
- printf("Error while reading from socket. Client disconnected?\n");
- //FIXME For client it is not possible to reconnect
- goto exit_close;
- }
-
- // REG has "same size +1" as READ_BUFFER to avoid buffer overflow
- status = sscanf(read_buffer, "%[A-Z0-9]=%d", reg, &val);
- if (status == 2) {
- if(!strcmp(reg, "DIN")) {
- dev->BAR2.DIN = val;
- }
- else if(!strcmp(reg, "ADC0")) {
- dev->real_world_AD0 = volts_to_adinternal(val);
- }
- else if(!strcmp(reg, "ADC1")) {
- dev->real_world_AD1 = volts_to_adinternal(val);
- }
- else if(!strcmp(reg, "ADC2")) {
- dev->real_world_AD2 = volts_to_adinternal(val);
- }
- else if(!strcmp(reg, "ADC3")) {
- dev->real_world_AD3 = volts_to_adinternal(val);
- }
- else if(!strcmp(reg, "ADC4")) {
- dev->real_world_AD4 = volts_to_adinternal(val);
- }
- else if(!strcmp(reg, "ADC5")) {
- dev->real_world_AD5 = volts_to_adinternal(val);
- }
- else if(!strcmp(reg, "ADC6")) {
- dev->real_world_AD6 = volts_to_adinternal(val);
- }
- else if(!strcmp(reg, "ADC7")) {
- dev->real_world_AD7 = volts_to_adinternal(val);
- }
- else {
- printf("reg = %s; val = %d\n", reg, val);
- }
- }
- }
- else {
- sleep(1);
- }
- }
-
-
-exit_close:
- close(dev->socket_tmp);
-exit:
- return NULL;
+ struct sockaddr_in addr_client;
+ struct sockaddr_in addr_srv;
+ int port;
+ int yes = 1;
+
+ mf624_state_t *dev = (mf624_state_t *) ptr;
+
+ dev->socket_tmp = -1;
+ port = dev->port;
+
+ dev->socket_srv = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
+ if (dev->socket_srv == -1) {
+ perror("socket()");
+ return NULL;
+ }
+
+ if (setsockopt(dev->socket_srv,
+ SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(int)) == -1) {
+ perror("setsockopt()");
+ return NULL;
+ }
+
+
+ socklen_t len = sizeof(addr_srv);
+ memset(&addr_srv, 0, len);
+ addr_srv.sin_family = AF_INET;
+ addr_srv.sin_addr.s_addr = htonl(INADDR_ANY);
+ addr_srv.sin_port = htons(port);
+ if (bind(dev->socket_srv, (struct sockaddr *) &addr_srv, len) == -1) {
+ perror("bind()");
+ return NULL;
+ }
+
+ if (listen(dev->socket_srv, 5) == -1) {
+ perror("listen()");
+ return NULL;
+ }
+
+
+ while (1) {
+ printf("Waiting on port %d for MF624 client to connect\n", dev->port);
+ socklen_t len_client = sizeof(addr_client);
+ dev->socket_tmp = accept(dev->socket_srv,
+ (struct sockaddr *) &addr_client, &len_client);
+ if (dev->socket_tmp == -1) {
+ perror("accept()");
+ return NULL;
+ }
+
+ printf("Client connected\n");
+
+ socket_read(dev); /* should run forever if everything is OK; */
+ /* If error occurs (client disconnected), returns here */
+
+ close(dev->socket_tmp);
+ }
+
+ return NULL;