]> git.zerfleddert.de Git - hmcfgusb/blobdiff - hmland.c
clarify inet_ntop error (it is fatal!)
[hmcfgusb] / hmland.c
index 1ccc843d23017f87de2ee12d04225c28615212c6..f3b7cf965df00e66f2c2cdfba805bb5f79462a12 100644 (file)
--- a/hmland.c
+++ b/hmland.c
@@ -34,6 +34,7 @@
 #include <sys/socket.h>
 #include <sys/stat.h>
 #include <fcntl.h>
+#include <time.h>
 #include <netinet/in.h>
 #include <arpa/inet.h>
 #include <libusb-1.0/libusb.h>
@@ -68,6 +69,19 @@ static int wait_for_h = 0;
 #define CHECK_SPACE(x)         if ((*outpos + x) > outend) { fprintf(stderr, "Not enough space!\n"); return 0; }
 #define CHECK_AVAIL(x)         if ((*inpos + x) > inend) { fprintf(stderr, "Not enough input available!\n"); return 0; }
 
+static void print_timestamp(FILE *f)
+{
+       struct timeval tv;
+       struct tm *tmp;
+       char ts[32];
+
+       gettimeofday(&tv, NULL);
+       tmp = localtime(&tv.tv_sec);
+       memset(ts, 0, sizeof(ts));
+       strftime(ts, sizeof(ts)-1, "%Y-%m-%d %H:%M:%S", tmp);
+       fprintf(f, "%s.%06ld: ", ts, tv.tv_usec);
+}
+
 static int format_part_out(uint8_t **inpos, int inlen, uint8_t **outpos, int outlen, int len, int flags)
 {
        const uint8_t nibble[16] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
@@ -278,6 +292,7 @@ static int hmlan_format_out(uint8_t *buf, int buf_len, void *data)
        if (verbose) {
                int i;
 
+               print_timestamp(stdout);
                printf("LAN < ");
                for (i = 0; i < outpos-out-2; i++)
                        printf("%c", out[i]);
@@ -290,7 +305,7 @@ static int hmlan_format_out(uint8_t *buf, int buf_len, void *data)
                return 0;
        }
 
-       /* Send al queued packets */
+       /* Send all queued packets */
        if (wait_for_h) {
                struct queued_rx *curr_rx = qrx;
                struct queued_rx *last_rx;
@@ -299,6 +314,7 @@ static int hmlan_format_out(uint8_t *buf, int buf_len, void *data)
                        if (verbose) {
                                int i;
 
+                               print_timestamp(stdout);
                                printf("LAN < ");
                                for (i = 0; i < curr_rx->len-2; i++)
                                        printf("%c", curr_rx->rx[i]);
@@ -308,7 +324,6 @@ static int hmlan_format_out(uint8_t *buf, int buf_len, void *data)
                        w = write(fd, curr_rx->rx, curr_rx->len);
                        if (w <= 0) {
                                perror("write");
-                               return 0;
                        }
                        last_rx = curr_rx;
                        curr_rx = curr_rx->next;
@@ -367,6 +382,7 @@ static int hmlan_parse_in(int fd, void *data)
                                continue;
 
                        if (verbose) {
+                               print_timestamp(stdout);
                                printf("LAN > ");
                                for (i = 0; i < last; i++)
                                        printf("%c", instart[i]);
@@ -398,7 +414,8 @@ static int hmlan_parse_in(int fd, void *data)
                        hmcfgusb_send(dev, out, sizeof(out), 1);
                }
        } else if (r < 0) {
-               perror("read");
+               if (errno != ECONNRESET)
+                       perror("read");
                return r;
        } else {
                return 0;
@@ -438,7 +455,7 @@ static int comm(int fd_in, int fd_out, int master_socket, int flags)
        memset(out, 0, sizeof(out));
        out[0] = 'K';
        wait_for_h = 1;
-       hmcfgusb_send_null_frame(dev);
+       hmcfgusb_send_null_frame(dev, 1);
        hmcfgusb_send(dev, out, sizeof(out), 1);
 
        while(!quit) {
@@ -461,11 +478,18 @@ static int comm(int fd_in, int fd_out, int master_socket, int flags)
                        }
                } else if (fd == -1) {
                        if (errno) {
-                               perror("hmcfgusb_poll");
-                               quit = 1;
-                       } else {
-                               /* periodically wakeup the device */
-                               hmcfgusb_send_null_frame(dev);
+                               if (errno != ETIMEDOUT) {
+                                       perror("hmcfgusb_poll");
+                                       quit = 1;
+                               } else {
+                                       /* periodically wakeup the device */
+                                       hmcfgusb_send_null_frame(dev, 1);
+                                       if (wait_for_h) {
+                                               memset(out, 0, sizeof(out));
+                                               out[0] = 'K';
+                                               hmcfgusb_send(dev, out, sizeof(out), 1);
+                                       }
+                               }
                        }
                }
        }
@@ -586,7 +610,7 @@ static int socket_server(char *iface, int port, int flags)
                sin.sin_addr.s_addr = htonl(INADDR_ANY);
        } else {
                if (inet_pton(AF_INET, iface, &(sin.sin_addr.s_addr)) != 1) {
-                       perror("inet_ntop");
+                       fprintf(stderr, "Can't convert IP %s, aborting!\n", iface);
                        return EXIT_FAILURE;
                }
        }
@@ -619,6 +643,7 @@ static int socket_server(char *iface, int port, int flags)
                client_addr = ntohl(csin.sin_addr.s_addr);
 
                if (verbose) {
+                       print_timestamp(stdout);
                        printf("Client %d.%d.%d.%d connected!\n",
                                        (client_addr & 0xff000000) >> 24,
                                        (client_addr & 0x00ff0000) >> 16,
@@ -632,6 +657,7 @@ static int socket_server(char *iface, int port, int flags)
                close(client);
 
                if (verbose) {
+                       print_timestamp(stdout);
                        printf("Connection to %d.%d.%d.%d closed!\n",
                                        (client_addr & 0xff000000) >> 24,
                                        (client_addr & 0x00ff0000) >> 16,
Impressum, Datenschutz