Allow the user to specify the compiler via environment variable
[hmcfgusb] / hmland.c
index f0b07f2..35f8192 100644 (file)
--- a/hmland.c
+++ b/hmland.c
@@ -1,6 +1,6 @@
 /* HM-CFG-LAN emulation for HM-CFG-USB
  *
- * Copyright (c) 2013-15 Michael Gernoth <michael@gernoth.net>
+ * Copyright (c) 2013-16 Michael Gernoth <michael@gernoth.net>
  *
  * Permission is hereby granted, free of charge, to any person obtaining a copy
  * of this software and associated documentation files (the "Software"), to
@@ -47,6 +47,7 @@
 
 #define PID_FILE "/var/run/hmland.pid"
 
+#define POLL_TIMEOUT_MS                250     /* Wake up device/bus at least once every 250ms */
 #define DEFAULT_REBOOT_SECONDS 86400
 #define LAN_READ_CHUNK_SIZE    2048
 /* Don't allow remote clients to consume all of our memory */
@@ -65,6 +66,7 @@ static int reboot_at_minute = -1;
 static int reboot_set = 0;
 static uint8_t *lan_read_buf = NULL;
 static int lan_read_buflen = 0;
+static char *serial = NULL;
 
 struct queued_rx {
        char *rx;
@@ -98,7 +100,7 @@ static void print_timestamp(FILE *f)
        fprintf(f, "%s.%06ld: ", ts, tv.tv_usec);
 }
 
-static void write_log(char *buf, int len, char *fmt, ...)
+static void write_log(const char *buf, int len, const char *fmt, ...)
 {
        va_list ap;
        int i;
@@ -140,12 +142,12 @@ static void write_log(char *buf, int len, char *fmt, ...)
                fflush(logfile);
 }
 
-static int format_part_out(uint8_t **inpos, int inlen, uint8_t **outpos, int outlen, int len, int flags)
+static int format_part_out(uint8_t **inpos, int inlen, uint8_t **outpos, int outlen, size_t len, int flags)
 {
        uint8_t *buf_out = *outpos;
        uint8_t *outend = *outpos + outlen;
        uint8_t *inend = *inpos + inlen;
-       int i;
+       size_t i;
 
        if (flags & FLAG_COMMA_BEFORE) {
                CHECK_SPACE(1);
@@ -200,7 +202,7 @@ static int parse_part_in(uint8_t **inpos, int inlen, uint8_t **outpos, int outle
        uint8_t *inend = *inpos + inlen;
 
        if (flags & FLAG_LENGTH_BYTE) {
-               int len = 0;
+               size_t len = 0;
                uint8_t *ip;
 
                ip = *inpos;
@@ -429,6 +431,7 @@ static int hmlan_parse_one(uint8_t *cmd, int last, void *data)
                        parse_part_in(&inpos, (last-(inpos-cmd)), &outpos, (sizeof(out)-(outpos-out)), 0);
                        parse_part_in(&inpos, (last-(inpos-cmd)), &outpos, (sizeof(out)-(outpos-out)), 0);
                        parse_part_in(&inpos, (last-(inpos-cmd)), &outpos, (sizeof(out)-(outpos-out)), FLAG_LENGTH_BYTE);
+                       break;
                default:
                        parse_part_in(&inpos, (last-(inpos-cmd)), &outpos, (sizeof(out)-(outpos-out)), FLAG_IGNORE_COMMAS);
                        break;
@@ -505,7 +508,7 @@ static int comm(int fd_in, int fd_out, int master_socket, int flags)
 
        hmcfgusb_set_debug(debug);
 
-       dev = hmcfgusb_init(hmlan_format_out, &fd_out);
+       dev = hmcfgusb_init(hmlan_format_out, &fd_out, serial);
        if (!dev) {
                fprintf(stderr, "Can't initialize HM-CFG-USB!\n");
                return 0;
@@ -571,7 +574,7 @@ static int comm(int fd_in, int fd_out, int master_socket, int flags)
        while(!quit) {
                int fd;
 
-               fd = hmcfgusb_poll(dev, 1000);  /* Wakeup device/bus at least once a second */
+               fd = hmcfgusb_poll(dev, POLL_TIMEOUT_MS);
                if (fd >= 0) {
                        if (fd == master_socket) {
                                int client;
@@ -651,7 +654,7 @@ static int socket_server(char *iface, int port, int flags)
                                                exit(EXIT_FAILURE);
                                        }
 
-                                       if (fscanf(pidfile, "%u", &old_pid) != 1) {
+                                       if (fscanf(pidfile, "%d", &old_pid) != 1) {
                                                fclose(pidfile);
                                                fprintf(stderr, "Can't read old PID from " PID_FILE ", already running?\n");
                                                exit(EXIT_FAILURE);
@@ -808,6 +811,7 @@ void hmlan_syntax(char *prog)
        fprintf(stderr, "\t-p n\t\tlisten on port n (default: 1000)\n");
        fprintf(stderr, "\t-r n\t\treboot HM-CFG-USB after n seconds (0: no reboot, default: %u if FW < 0.967, 0 otherwise)\n", DEFAULT_REBOOT_SECONDS);
        fprintf(stderr, "\t   hh:mm\treboot HM-CFG-USB daily at hh:mm\n");
+       fprintf(stderr, "\t-S serial\tuse HM-CFG-USB with given serial (for multiple hmland instances)\n");
        fprintf(stderr, "\t-v\t\tverbose mode\n");
        fprintf(stderr, "\t-V\t\tshow version (" VERSION ")\n");
 
@@ -822,7 +826,7 @@ int main(int argc, char **argv)
        char *ep;
        int opt;
        
-       while((opt = getopt(argc, argv, "DdhIiPp:Rr:l:L:vV")) != -1) {
+       while((opt = getopt(argc, argv, "DdhIiPp:Rr:l:L:S:vV")) != -1) {
                switch (opt) {
                        case 'D':
                                debug = 1;
@@ -880,12 +884,15 @@ int main(int argc, char **argv)
                                        exit(EXIT_FAILURE);
                                }
                                break;
+                       case 'S':
+                               serial = optarg;
+                               break;
                        case 'v':
                                verbose = 1;
                                break;
                        case 'V':
                                printf("hmland " VERSION "\n");
-                               printf("Copyright (c) 2013-15 Michael Gernoth\n\n");
+                               printf("Copyright (c) 2013-16 Michael Gernoth\n\n");
                                exit(EXIT_SUCCESS);
                        case 'h':
                        case ':':
Impressum, Datenschutz