X-Git-Url: https://git.zerfleddert.de/cgi-bin/gitweb.cgi/hmcfgusb/blobdiff_plain/1ee8653afbf410ed34f9dbc18ffe4beaf3c159e4..256adf553a043566b5131e718060b918d2075943:/hmland.c diff --git a/hmland.c b/hmland.c index f1f0e3d..35f8192 100644 --- a/hmland.c +++ b/hmland.c @@ -1,6 +1,6 @@ /* HM-CFG-LAN emulation for HM-CFG-USB * - * Copyright (c) 2013-15 Michael Gernoth + * Copyright (c) 2013-16 Michael Gernoth * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to @@ -43,9 +43,11 @@ #include "version.h" #include "hexdump.h" #include "hmcfgusb.h" +#include "util.h" #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 */ @@ -64,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; @@ -97,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; @@ -139,14 +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) { - const uint8_t nibble[16] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', - 'A', 'B', 'C', 'D', 'E', 'F'}; 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); @@ -164,9 +165,9 @@ static int format_part_out(uint8_t **inpos, int inlen, uint8_t **outpos, int out CHECK_AVAIL(len); CHECK_SPACE(len*2); for (i = 0; i < len; i++) { - **outpos = nibble[((**inpos) & 0xf0) >> 4]; + **outpos = nibble_to_ascii(((**inpos) & 0xf0) >> 4); *outpos += 1; - **outpos = nibble[((**inpos) & 0xf)]; + **outpos = nibble_to_ascii(((**inpos) & 0xf)); *inpos += 1; *outpos += 1; } } else { @@ -194,21 +195,6 @@ static int format_part_out(uint8_t **inpos, int inlen, uint8_t **outpos, int out return *outpos - buf_out; } -static uint8_t ascii_to_nibble(uint8_t a) -{ - uint8_t c = 0x00; - - if ((a >= '0') && (a <= '9')) { - c = a - '0'; - } else if ((a >= 'A') && (a <= 'F')) { - c = (a - 'A') + 10; - } else if ((a >= 'a') && (a <= 'f')) { - c = (a - 'a') + 10; - } - - return c; -} - static int parse_part_in(uint8_t **inpos, int inlen, uint8_t **outpos, int outlen, int flags) { uint8_t *buf_out = *outpos; @@ -216,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; @@ -445,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; @@ -521,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; @@ -587,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; @@ -667,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); @@ -824,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"); @@ -838,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; @@ -896,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 ':':